Merge keystone/android12-5.10-keystone-qcom-release.43+ (55a2446
) into msm-5.10
* refs/heads/tmp-55a2446: ANDROID: ABI: update allowed list for galaxy FROMGIT: f2fs: add sysfs nodes to get GC info for each GC mode ANDROID: abi_gki_aarch64_qcom: Add android_debug_for_each_module ANDROID: debug_symbols: Add android_debug_for_each_module ANDROID: ABI: Update ABI for symbol list updates ANDROID: GKI: Update symbols to symbol list ANDROID: Update symbol list for mtk UPSTREAM: block, bfq: set next_rq to waker_bfqq->next_rq in waker injection UPSTREAM: mm/mremap: hold the rmap lock in write mode when moving page table entries. ANDROID: pstore/ram: Add backward compatibility for ramoops reserved region ANDROID: Update symbol list for mtk ANDROID: vendor_hooks: Modify the function name BACKPORT: FROMLIST: kasan: add memzero int for unaligned size at DEBUG BACKPORT: FROMLIST: mm: move helper to check slub_debug_enabled ANDROID: ABI: initial update allowed list for galaxy ANDROID: GKI: 7/14/2021 KMI update ANDROID: Update the ABI symbol list FROMLIST: arm64: avoid double ISB on kernel entry FROMLIST: arm64: mte: optimize GCR_EL1 modification on kernel entry/exit BACKPORT: FROMLIST: arm64: mte: avoid TFSR related operations unless in async mode FROMLIST: Documentation: document the preferred tag checking mode feature FROMLIST: arm64: mte: introduce a per-CPU tag checking mode preference FROMLIST: arm64: move preemption disablement to prctl handlers FROMLIST: arm64: mte: change ASYNC and SYNC TCF settings into bitfields FROMLIST: arm64: mte: rename gcr_user_excl to mte_ctrl BACKPORT: arm64: pac: Optimize kernel entry/exit key installation code paths BACKPORT: arm64: Introduce prctl(PR_PAC_{SET,GET}_ENABLED_KEYS) ANDROID: cleancache: add oem data to cleancache_ops ANDROID: blkdev: add oem data to block_device_operations FROMLIST: psi: stop relying on timer_pending for poll_work rescheduling ANDROID: GKI: Enable CONFIG_MEMCG ANDROID: GKI: net: add vendor hooks for 'struct sock' lifecycle ANDROID: GKI: net: add vendor hooks for 'struct nf_conn' lifecycle ANDROID: GKI: add vendor padding variable in struct sock ANDROID: GKI: add vendor padding variable in struct nf_conn ANDROID: vendor_hooks: add a field in mem_cgroup ANDROID: vendor_hooks: add a field in pglist_data FROMLIST: usb: dwc3: avoid NULL access of usb_gadget_driver FROMGIT: usb: dwc3: dwc3-qcom: Enable tx-fifo-resize property by default FROMGIT: usb: dwc3: Resize TX FIFOs to meet EP bursting requirements FROMGIT: usb: gadget: configfs: Check USB configuration before adding FROMGIT: usb: gadget: udc: core: Introduce check_config to verify USB configuration ANDROID: GKI: fscrypt: add OEM data to struct fscrypt_operations ANDROID: GKI: fscrypt: add ABI padding to struct fscrypt_operations ANDROID: mm: provision to add shmem pages to inactive file lru head ANDROID: GKI: Enable CONFIG_CGROUP_NET_PRIO ANDROID: Delete the DMA-BUF attachment sysfs statistics ANDROID: android: Add symbols to debug_symbols driver UPSTREAM: USB: UDC core: Add udc_async_callbacks gadget op ANDROID: vendor_hooks: Add oem data to file struct ANDROID: add kabi padding for structures for the android12 release ANDROID: GKI: device.h: add Android ABI padding to some structures ANDROID: GKI: elevator: add Android ABI padding to some structures ANDROID: GKI: scsi: add Android ABI padding to some structures ANDROID: GKI: workqueue.h: add Android ABI padding to some structures ANDROID: GKI: sched: add Android ABI padding to some structures ANDROID: GKI: phy: add Android ABI padding to some structures ANDROID: GKI: fs.h: add Android ABI padding to some structures ANDROID: GKI: dentry: add Android ABI padding to some structures ANDROID: GKI: bio: add Android ABI padding to some structures ANDROID: GKI: ufs: add Android ABI padding to some structures ANDROID: Update the generic symbol list ANDROID: mm: cma do not sleep for __GFP_NORETRY ANDROID: mm: cma: skip problematic pageblock ANDROID: mm: bail out tlb free batching on page zapping when cma is going on ANDROID: mm: lru_cache_disable skips lru cache drainnig ANDROID: mm: do not try test_page_isoalte if migration fails ANDROID: mm: add cma allocation statistics UPSTREAM: mm, page_alloc: move draining pcplists to page isolation users ANDROID: ALSA: compress: add vendor hook to support pause in draining ANDROID: vendor_hooks: add vendor hook in blk_mq_rq_ctx_init() ANDROID: abi_gki_aarch64_qcom: Add I3C core symbols to qcom tree ANDROID: vendor_hooks: add vendor hook in blk_mq_alloc_rqs() ANDROID: GKI: Export put_task_stack symbol ANDROID: abi_gki_aarch64_qcom: Add idr_alloc_u32 ANDROID: sound: usb: add vendor hook for cpu suspend support ANDROID: mm: page_pinner: use EXPORT_SYMBOL_GPL ANDROID: GKI: update allowed GKI symbol for Exynosauto SoC ANDROID: GKI: sync allowed list for exynosauto SoC ANDROID: ABI: add new symbols required by fips140.ko ANDROID: fips140: add/update module help text ANDROID: fips140: add power-up cryptographic self-tests ANDROID: arm64: disable LSE when building the FIPS140 module ANDROID: jump_label: disable jump labels in fips140.ko ANDROID: ipv6: add vendor hook for gen ipv6 link-local addr ANDROID: Revert "scsi: block: Do not accept any requests while suspended" ANDROID: abi_gki_aarch64_qcom: whitelist vm_event_states ANDROID: ashmem: Export is_ashmem_file ANDROID: usb: gadget: fix NULL pointer dereference in android_setup ANDROID: GKI: Disable kmem cgroup accounting FROMLIST: mm, memcg: inline swap-related functions to improve disabled memcg config BACKPORT: FROMLIST: mm, memcg: inline mem_cgroup_{charge/uncharge} to improve disabled memcg config FROMLIST: mm, memcg: add mem_cgroup_disabled checks in vmpressure and swap-related functions UPSTREAM: mm/memcg: bail early from swap accounting if memcg disabled UPSTREAM: procfs/dmabuf: add inode number to /proc/*/fdinfo UPSTREAM: procfs: allow reading fdinfo with PTRACE_MODE_READ Revert "FROMLIST: procfs: Allow reading fdinfo with PTRACE_MODE_READ" Revert "FROMLIST: BACKPORT: procfs/dmabuf: Add inode number to /..." UPSTREAM: f2fs: initialize page->private when using for our internal use ANDROID: mm: page_pinner: report test_page_isolation_failure ANDROID: mm: page_pinner: add state of page_pinner ANDROID: mm: page_pinner: add more struct page fields ANDROID: mm: page_pinner: change timestamp format ANDROID: mm: page_pinner: print_page_pinner refactoring ANDROID: mm: page_pinner: remove shared_count ANDROID: mm: page_pinner: remove WARN_ON_ONCE ANDROID: mm: page_pinner: fix typos ANDROID: mm: page_pinner: reset migration failed page ANDROID: mm: page_pinner: record every put_page ANDROID: mm: page_pinner: change function names ANDROID: Allow vendor module to reclaim a memcg ANDROID: Export memcg functions to allow module to add new files FROMGIT: dt-bindings: usb: dwc3: Update dwc3 TX fifo properties UPSTREAM: dt-bindings: usb: Convert DWC USB3 bindings to DT schema FROMGIT: of: Add stub for of_add_property() Conflicts: Documentation/devicetree/bindings include/linux/usb/gadget.h Change-Id: If14a2b17ab5f0c3d7a0d11363cb49ddb82131313 Signed-off-by: Ivaylo Georgiev <irgeorgiev@codeaurora.org>
This commit is contained in:
commit
299e9991f5
@ -648,3 +648,21 @@ Description: SPURR ticks for cpuX when it was idle.
|
||||
|
||||
This sysfs interface exposes the number of SPURR ticks
|
||||
for cpuX when it was idle.
|
||||
|
||||
What: /sys/devices/system/cpu/cpuX/mte_tcf_preferred
|
||||
Date: July 2021
|
||||
Contact: Linux ARM Kernel Mailing list <linux-arm-kernel@lists.infradead.org>
|
||||
Description: Preferred MTE tag checking mode
|
||||
|
||||
When a user program specifies more than one MTE tag checking
|
||||
mode, this sysfs node is used to specify which mode should
|
||||
be preferred when running on that CPU. Possible values:
|
||||
|
||||
================ ==============================================
|
||||
"sync" Prefer synchronous mode
|
||||
"async" Prefer asynchronous mode
|
||||
================ ==============================================
|
||||
|
||||
Changes to this sysfs node may not take effect immediately.
|
||||
|
||||
See also: Documentation/arm64/memory-tagging-extension.rst
|
||||
|
@ -493,3 +493,17 @@ Contact: "Chao Yu" <yuchao0@huawei.com>
|
||||
Description: When ATGC is on, it controls age threshold to bypass GCing young
|
||||
candidates whose age is not beyond the threshold, by default it was
|
||||
initialized as 604800 seconds (equals to 7 days).
|
||||
|
||||
What: /sys/fs/f2fs/<disk>/gc_reclaimed_segments
|
||||
Date: July 2021
|
||||
Contact: "Daeho Jeong" <daehojeong@google.com>
|
||||
Description: Show how many segments have been reclaimed by GC during a specific
|
||||
GC mode (0: GC normal, 1: GC idle CB, 2: GC idle greedy,
|
||||
3: GC idle AT, 4: GC urgent high, 5: GC urgent low)
|
||||
You can re-initialize this value to "0".
|
||||
|
||||
What: /sys/fs/f2fs/<disk>/gc_segment_mode
|
||||
Date: July 2021
|
||||
Contact: "Daeho Jeong" <daehojeong@google.com>
|
||||
Description: You can control for which gc mode the "gc_reclaimed_segments" node shows.
|
||||
Refer to the description of the modes in "gc_reclaimed_segments".
|
||||
|
@ -22,31 +22,3 @@ KernelVersion: v5.12
|
||||
Contact: Hridya Valsaraju <hridya@google.com>
|
||||
Description: This file is read-only and specifies the size of the DMA-BUF in
|
||||
bytes.
|
||||
|
||||
What: /sys/kernel/dmabuf/buffers/<inode_number>/attachments
|
||||
Date: January 2021
|
||||
KernelVersion: v5.12
|
||||
Contact: Hridya Valsaraju <hridya@google.com>
|
||||
Description: This directory will contain subdirectories representing every
|
||||
attachment of the DMA-BUF.
|
||||
|
||||
What: /sys/kernel/dmabuf/buffers/<inode_number>/attachments/<attachment_uid>
|
||||
Date: January 2021
|
||||
KernelVersion: v5.12
|
||||
Contact: Hridya Valsaraju <hridya@google.com>
|
||||
Description: This directory will contain information on the attaching device
|
||||
and the number of current distinct device mappings.
|
||||
|
||||
What: /sys/kernel/dmabuf/buffers/<inode_number>/attachments/<attachment_uid>/device
|
||||
Date: January 2021
|
||||
KernelVersion: v5.12
|
||||
Contact: Hridya Valsaraju <hridya@google.com>
|
||||
Description: This file is read-only and is a symlink to the attaching devices's
|
||||
sysfs entry.
|
||||
|
||||
What: /sys/kernel/dmabuf/buffers/<inode_number>/attachments/<attachment_uid>/map_counter
|
||||
Date: January 2021
|
||||
KernelVersion: v5.12
|
||||
Contact: Hridya Valsaraju <hridya@google.com>
|
||||
Description: This file is read-only and contains a map_counter indicating the
|
||||
number of distinct device mappings of the attachment.
|
||||
|
@ -77,14 +77,20 @@ configurable behaviours:
|
||||
address is unknown).
|
||||
|
||||
The user can select the above modes, per thread, using the
|
||||
``prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0)`` system call where
|
||||
``flags`` contain one of the following values in the ``PR_MTE_TCF_MASK``
|
||||
``prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0)`` system call where ``flags``
|
||||
contains any number of the following values in the ``PR_MTE_TCF_MASK``
|
||||
bit-field:
|
||||
|
||||
- ``PR_MTE_TCF_NONE`` - *Ignore* tag check faults
|
||||
- ``PR_MTE_TCF_NONE`` - *Ignore* tag check faults
|
||||
(ignored if combined with other options)
|
||||
- ``PR_MTE_TCF_SYNC`` - *Synchronous* tag check fault mode
|
||||
- ``PR_MTE_TCF_ASYNC`` - *Asynchronous* tag check fault mode
|
||||
|
||||
If no modes are specified, tag check faults are ignored. If a single
|
||||
mode is specified, the program will run in that mode. If multiple
|
||||
modes are specified, the mode is selected as described in the "Per-CPU
|
||||
preferred tag checking modes" section below.
|
||||
|
||||
The current tag check fault mode can be read using the
|
||||
``prctl(PR_GET_TAGGED_ADDR_CTRL, 0, 0, 0, 0)`` system call.
|
||||
|
||||
@ -120,13 +126,39 @@ in the ``PR_MTE_TAG_MASK`` bit-field.
|
||||
interface provides an include mask. An include mask of ``0`` (exclusion
|
||||
mask ``0xffff``) results in the CPU always generating tag ``0``.
|
||||
|
||||
Per-CPU preferred tag checking mode
|
||||
-----------------------------------
|
||||
|
||||
On some CPUs the performance of MTE in stricter tag checking modes
|
||||
is similar to that of less strict tag checking modes. This makes it
|
||||
worthwhile to enable stricter checks on those CPUs when a less strict
|
||||
checking mode is requested, in order to gain the error detection
|
||||
benefits of the stricter checks without the performance downsides. To
|
||||
support this scenario, a privileged user may configure a stricter
|
||||
tag checking mode as the CPU's preferred tag checking mode.
|
||||
|
||||
The preferred tag checking mode for each CPU is controlled by
|
||||
``/sys/devices/system/cpu/cpu<N>/mte_tcf_preferred``, to which a
|
||||
privileged user may write the value ``async`` or ``sync``. The default
|
||||
preferred mode for each CPU is ``async``.
|
||||
|
||||
To allow a program to potentially run in the CPU's preferred tag
|
||||
checking mode, the user program may set multiple tag check fault mode
|
||||
bits in the ``flags`` argument to the ``prctl(PR_SET_TAGGED_ADDR_CTRL,
|
||||
flags, 0, 0, 0)`` system call. If the CPU's preferred tag checking
|
||||
mode is in the task's set of provided tag checking modes (this will
|
||||
always be the case at present because the kernel only supports two
|
||||
tag checking modes, but future kernels may support more modes), that
|
||||
mode will be selected. Otherwise, one of the modes in the task's mode
|
||||
set will be selected in a currently unspecified manner.
|
||||
|
||||
Initial process state
|
||||
---------------------
|
||||
|
||||
On ``execve()``, the new process has the following configuration:
|
||||
|
||||
- ``PR_TAGGED_ADDR_ENABLE`` set to 0 (disabled)
|
||||
- Tag checking mode set to ``PR_MTE_TCF_NONE``
|
||||
- No tag checking modes are selected (tag check faults ignored)
|
||||
- ``PR_MTE_TAG_MASK`` set to 0 (all tags excluded)
|
||||
- ``PSTATE.TCO`` set to 0
|
||||
- ``PROT_MTE`` not set on any of the initial memory maps
|
||||
@ -251,11 +283,13 @@ Example of correct usage
|
||||
return EXIT_FAILURE;
|
||||
|
||||
/*
|
||||
* Enable the tagged address ABI, synchronous MTE tag check faults and
|
||||
* allow all non-zero tags in the randomly generated set.
|
||||
* Enable the tagged address ABI, synchronous or asynchronous MTE
|
||||
* tag check faults (based on per-CPU preference) and allow all
|
||||
* non-zero tags in the randomly generated set.
|
||||
*/
|
||||
if (prctl(PR_SET_TAGGED_ADDR_CTRL,
|
||||
PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | (0xfffe << PR_MTE_TAG_SHIFT),
|
||||
PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC |
|
||||
(0xfffe << PR_MTE_TAG_SHIFT),
|
||||
0, 0, 0)) {
|
||||
perror("prctl() failed");
|
||||
return EXIT_FAILURE;
|
||||
|
@ -107,3 +107,37 @@ filter out the Pointer Authentication system key registers from
|
||||
KVM_GET/SET_REG_* ioctls and mask those features from cpufeature ID
|
||||
register. Any attempt to use the Pointer Authentication instructions will
|
||||
result in an UNDEFINED exception being injected into the guest.
|
||||
|
||||
|
||||
Enabling and disabling keys
|
||||
---------------------------
|
||||
|
||||
The prctl PR_PAC_SET_ENABLED_KEYS allows the user program to control which
|
||||
PAC keys are enabled in a particular task. It takes two arguments, the
|
||||
first being a bitmask of PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY
|
||||
and PR_PAC_APDBKEY specifying which keys shall be affected by this prctl,
|
||||
and the second being a bitmask of the same bits specifying whether the key
|
||||
should be enabled or disabled. For example::
|
||||
|
||||
prctl(PR_PAC_SET_ENABLED_KEYS,
|
||||
PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY | PR_PAC_APDBKEY,
|
||||
PR_PAC_APIBKEY, 0, 0);
|
||||
|
||||
disables all keys except the IB key.
|
||||
|
||||
The main reason why this is useful is to enable a userspace ABI that uses PAC
|
||||
instructions to sign and authenticate function pointers and other pointers
|
||||
exposed outside of the function, while still allowing binaries conforming to
|
||||
the ABI to interoperate with legacy binaries that do not sign or authenticate
|
||||
pointers.
|
||||
|
||||
The idea is that a dynamic loader or early startup code would issue this
|
||||
prctl very early after establishing that a process may load legacy binaries,
|
||||
but before executing any PAC instructions.
|
||||
|
||||
For compatibility with previous kernel versions, processes start up with IA,
|
||||
IB, DA and DB enabled, and are reset to this state on exec(). Processes created
|
||||
via fork() and clone() inherit the key enabled state from the calling process.
|
||||
|
||||
It is recommended to avoid disabling the IA key, as this has higher performance
|
||||
overhead than disabling any of the other keys.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -120,6 +120,7 @@
|
||||
dma_buf_unmap_attachment
|
||||
dma_buf_vmap
|
||||
dma_buf_vunmap
|
||||
dmaengine_unmap_put
|
||||
dma_fence_add_callback
|
||||
dma_fence_context_alloc
|
||||
dma_fence_default_wait
|
||||
@ -338,6 +339,7 @@
|
||||
of_property_read_string
|
||||
of_property_read_string_helper
|
||||
of_property_read_u32_index
|
||||
of_property_read_variable_u16_array
|
||||
of_property_read_variable_u32_array
|
||||
of_property_read_variable_u8_array
|
||||
of_prop_next_string
|
||||
@ -348,6 +350,7 @@
|
||||
panic_notifier_list
|
||||
param_ops_bool
|
||||
param_ops_int
|
||||
param_ops_string
|
||||
param_ops_uint
|
||||
PDE_DATA
|
||||
__per_cpu_offset
|
||||
@ -358,7 +361,6 @@
|
||||
pinctrl_lookup_state
|
||||
pinctrl_select_state
|
||||
platform_bus_type
|
||||
platform_device_unregister
|
||||
__platform_driver_register
|
||||
platform_driver_unregister
|
||||
platform_get_irq
|
||||
@ -563,6 +565,7 @@
|
||||
wait_for_completion_timeout
|
||||
__wake_up
|
||||
wake_up_process
|
||||
wakeup_source_register
|
||||
wakeup_source_unregister
|
||||
__warn_printk
|
||||
work_busy
|
||||
@ -598,6 +601,20 @@
|
||||
debugfs_create_x32
|
||||
kernel_kobj
|
||||
|
||||
# required by dmatest.ko
|
||||
dmaengine_get_unmap_data
|
||||
__dma_request_channel
|
||||
dma_sync_wait
|
||||
kthread_should_stop
|
||||
param_get_bool
|
||||
param_get_string
|
||||
param_set_bool
|
||||
param_set_copystring
|
||||
prandom_bytes
|
||||
set_freezable
|
||||
set_user_nice
|
||||
strim
|
||||
|
||||
# required by dss.ko
|
||||
android_debug_symbol
|
||||
arch_timer_read_counter
|
||||
@ -657,6 +674,7 @@
|
||||
platform_device_alloc
|
||||
platform_device_del
|
||||
platform_device_put
|
||||
platform_device_unregister
|
||||
platform_get_irq_byname_optional
|
||||
__pm_relax
|
||||
pm_runtime_allow
|
||||
@ -723,16 +741,20 @@
|
||||
__drm_atomic_helper_plane_destroy_state
|
||||
__drm_atomic_helper_plane_duplicate_state
|
||||
__drm_atomic_helper_plane_reset
|
||||
__drm_atomic_helper_private_obj_duplicate_state
|
||||
drm_atomic_helper_set_config
|
||||
drm_atomic_helper_shutdown
|
||||
drm_atomic_helper_update_plane
|
||||
drm_atomic_helper_wait_for_vblanks
|
||||
drm_atomic_normalize_zpos
|
||||
drm_atomic_private_obj_init
|
||||
drm_bridge_attach
|
||||
drm_compat_ioctl
|
||||
drm_connector_list_iter_begin
|
||||
drm_connector_list_iter_end
|
||||
drm_connector_list_iter_next
|
||||
drm_connector_set_path_property
|
||||
drm_connector_set_tile_property
|
||||
drm_connector_unregister
|
||||
drm_crtc_arm_vblank_event
|
||||
drm_crtc_cleanup
|
||||
@ -758,7 +780,9 @@
|
||||
drm_dp_aux_register
|
||||
drm_dp_aux_unregister
|
||||
drm_dp_bw_code_to_link_rate
|
||||
drm_dp_calc_pbn_mode
|
||||
drm_dp_channel_eq_ok
|
||||
drm_dp_check_act_status
|
||||
drm_dp_clock_recovery_ok
|
||||
drm_dp_downstream_debug
|
||||
drm_dp_dpcd_read
|
||||
@ -766,11 +790,23 @@
|
||||
drm_dp_dpcd_write
|
||||
drm_dp_dsc_sink_line_buf_depth
|
||||
drm_dp_dsc_sink_max_slice_count
|
||||
drm_dp_find_vcpi_slots
|
||||
drm_dp_get_adjust_request_pre_emphasis
|
||||
drm_dp_get_adjust_request_voltage
|
||||
drm_dp_link_train_channel_eq_delay
|
||||
drm_dp_link_train_clock_recovery_delay
|
||||
drm_dp_mst_allocate_vcpi
|
||||
drm_dp_mst_deallocate_vcpi
|
||||
drm_dp_mst_detect_port
|
||||
drm_dp_mst_dump_topology
|
||||
drm_dp_mst_get_port_malloc
|
||||
drm_dp_mst_hpd_irq
|
||||
drm_dp_mst_put_port_malloc
|
||||
drm_dp_mst_reset_vcpi_slots
|
||||
drm_dp_mst_topology_mgr_init
|
||||
drm_dp_mst_topology_mgr_set_mst
|
||||
drm_dp_update_payload_part1
|
||||
drm_dp_update_payload_part2
|
||||
drm_dsc_compute_rc_parameters
|
||||
drm_dsc_pps_payload_pack
|
||||
drm_encoder_cleanup
|
||||
@ -798,6 +834,7 @@
|
||||
drm_helper_connector_dpms
|
||||
drm_helper_hpd_irq_event
|
||||
drm_helper_mode_fill_fb_struct
|
||||
drm_helper_probe_detect
|
||||
drm_ioctl
|
||||
drm_kms_helper_poll_fini
|
||||
drm_kms_helper_poll_init
|
||||
@ -831,9 +868,11 @@
|
||||
kstrtobool
|
||||
mipi_dsi_host_register
|
||||
mipi_dsi_host_unregister
|
||||
mutex_is_locked
|
||||
of_drm_find_bridge
|
||||
of_drm_find_panel
|
||||
of_graph_get_endpoint_by_regs
|
||||
of_graph_get_endpoint_count
|
||||
of_graph_get_next_endpoint
|
||||
of_graph_get_port_by_id
|
||||
of_graph_get_remote_port
|
||||
@ -841,9 +880,7 @@
|
||||
of_graph_parse_endpoint
|
||||
of_phandle_iterator_init
|
||||
of_phandle_iterator_next
|
||||
platform_find_device_by_driver
|
||||
seq_hex_dump
|
||||
strnstr
|
||||
|
||||
# required by exynos_mfc.ko
|
||||
iommu_dma_reserve_iova
|
||||
@ -857,6 +894,13 @@
|
||||
_raw_write_lock_irqsave
|
||||
_raw_write_unlock_irqrestore
|
||||
|
||||
# required by exynos_thermal.ko
|
||||
of_thermal_get_ntrips
|
||||
of_thermal_is_trip_valid
|
||||
thermal_zone_device_update
|
||||
thermal_zone_of_sensor_register
|
||||
thermal_zone_of_sensor_unregister
|
||||
|
||||
# required by exynos_tty.ko
|
||||
dma_get_slave_caps
|
||||
do_SAK
|
||||
@ -901,10 +945,6 @@
|
||||
# required by i2c-exynosauto.ko
|
||||
i2c_del_adapter
|
||||
|
||||
# required by lt8912.ko
|
||||
drm_mode_duplicate
|
||||
of_get_drm_display_mode
|
||||
|
||||
# required by mali_kbase.ko
|
||||
anon_inode_getfd
|
||||
__arch_clear_user
|
||||
@ -1065,7 +1105,6 @@
|
||||
dma_async_device_register
|
||||
dma_async_device_unregister
|
||||
dma_async_tx_descriptor_init
|
||||
dmaengine_unmap_put
|
||||
dma_get_slave_channel
|
||||
dma_map_resource
|
||||
dma_unmap_resource
|
||||
@ -1125,7 +1164,6 @@
|
||||
kthread_flush_work
|
||||
kthread_flush_worker
|
||||
ktime_get_with_offset
|
||||
param_ops_string
|
||||
phy_configure
|
||||
pm_relax
|
||||
pm_stay_awake
|
||||
@ -1371,14 +1409,11 @@
|
||||
|
||||
# required by ufs-exynosauto-core.ko
|
||||
blk_ksm_init_passthrough
|
||||
of_property_read_variable_u16_array
|
||||
__traceiter_android_vh_ufs_fill_prdt
|
||||
__tracepoint_android_vh_ufs_fill_prdt
|
||||
ufshcd_alloc_host
|
||||
ufshcd_config_pwr_mode
|
||||
ufshcd_dme_get_attr
|
||||
ufshcd_dme_set_attr
|
||||
ufshcd_init
|
||||
ufshcd_link_recovery
|
||||
ufshcd_pltfrm_init
|
||||
ufshcd_remove
|
||||
@ -1386,9 +1421,6 @@
|
||||
ufshcd_system_resume
|
||||
ufshcd_system_suspend
|
||||
|
||||
# required by vbpipe-module.ko
|
||||
wakeup_source_register
|
||||
|
||||
# required by vbufq-be-module.ko
|
||||
drain_workqueue
|
||||
radix_tree_delete
|
||||
|
@ -1,12 +1,17 @@
|
||||
[abi_symbol_list]
|
||||
# commonly used symbols
|
||||
module_layout
|
||||
__put_task_struct
|
||||
|
||||
# required by fips140.ko
|
||||
add_random_ready_callback
|
||||
aead_register_instance
|
||||
arm64_const_caps_ready
|
||||
bcmp
|
||||
cancel_work_sync
|
||||
__cfi_slowpath
|
||||
cpu_have_feature
|
||||
cpu_hwcap_keys
|
||||
crypto_aead_decrypt
|
||||
crypto_aead_encrypt
|
||||
crypto_aead_setauthsize
|
||||
@ -16,11 +21,14 @@
|
||||
crypto_alg_list
|
||||
crypto_alg_mod_lookup
|
||||
crypto_alg_sem
|
||||
crypto_alloc_aead
|
||||
crypto_alloc_base
|
||||
crypto_alloc_rng
|
||||
crypto_alloc_shash
|
||||
crypto_alloc_skcipher
|
||||
crypto_attr_alg_name
|
||||
crypto_check_attr_type
|
||||
crypto_cipher_decrypt_one
|
||||
crypto_cipher_encrypt_one
|
||||
crypto_cipher_setkey
|
||||
crypto_destroy_tfm
|
||||
@ -43,6 +51,7 @@
|
||||
crypto_remove_final
|
||||
crypto_remove_spawns
|
||||
crypto_req_done
|
||||
crypto_rng_reset
|
||||
crypto_shash_alg_has_setkey
|
||||
crypto_shash_digest
|
||||
crypto_shash_final
|
||||
@ -77,6 +86,7 @@
|
||||
kmalloc_caches
|
||||
kmalloc_order_trace
|
||||
kmem_cache_alloc_trace
|
||||
kmemdup
|
||||
__list_add_valid
|
||||
__list_del_entry_valid
|
||||
memcpy
|
||||
@ -89,6 +99,7 @@
|
||||
preempt_schedule_notrace
|
||||
printk
|
||||
queue_work_on
|
||||
refcount_warn_saturate
|
||||
scatterwalk_ffwd
|
||||
scatterwalk_map_and_copy
|
||||
sg_init_one
|
||||
|
4374
android/abi_gki_aarch64_galaxy
Normal file
4374
android/abi_gki_aarch64_galaxy
Normal file
File diff suppressed because it is too large
Load Diff
@ -24,6 +24,8 @@
|
||||
amba_driver_unregister
|
||||
android_rvh_probe_register
|
||||
anon_inode_getfd
|
||||
arc4_crypt
|
||||
arc4_setkey
|
||||
__arch_clear_user
|
||||
__arch_copy_from_user
|
||||
__arch_copy_in_user
|
||||
@ -105,6 +107,7 @@
|
||||
bus_unregister
|
||||
bus_unregister_notifier
|
||||
cache_line_size
|
||||
call_rcu
|
||||
cancel_delayed_work
|
||||
cancel_delayed_work_sync
|
||||
cancel_work_sync
|
||||
@ -225,6 +228,8 @@
|
||||
cpus_read_lock
|
||||
cpus_read_unlock
|
||||
cpu_subsys
|
||||
crc32_be
|
||||
crc32_le
|
||||
crc8
|
||||
crc8_populate_msb
|
||||
crypto_aead_decrypt
|
||||
@ -234,19 +239,24 @@
|
||||
crypto_alloc_aead
|
||||
crypto_alloc_base
|
||||
crypto_alloc_shash
|
||||
crypto_alloc_skcipher
|
||||
crypto_alloc_sync_skcipher
|
||||
crypto_comp_compress
|
||||
crypto_comp_decompress
|
||||
crypto_destroy_tfm
|
||||
__crypto_memneq
|
||||
crypto_register_alg
|
||||
crypto_register_scomp
|
||||
crypto_shash_digest
|
||||
crypto_shash_finup
|
||||
crypto_shash_setkey
|
||||
crypto_shash_update
|
||||
crypto_skcipher_decrypt
|
||||
crypto_skcipher_encrypt
|
||||
crypto_skcipher_setkey
|
||||
crypto_unregister_alg
|
||||
crypto_unregister_scomp
|
||||
__crypto_xor
|
||||
csum_ipv6_magic
|
||||
csum_tcpudp_nofold
|
||||
_ctype
|
||||
@ -264,6 +274,7 @@
|
||||
debugfs_create_x32
|
||||
debugfs_lookup
|
||||
debugfs_remove
|
||||
debugfs_rename
|
||||
dec_zone_page_state
|
||||
default_llseek
|
||||
deferred_free
|
||||
@ -273,11 +284,14 @@
|
||||
del_timer_sync
|
||||
desc_to_gpio
|
||||
destroy_workqueue
|
||||
dev_alloc_name
|
||||
dev_change_net_namespace
|
||||
dev_close
|
||||
_dev_crit
|
||||
dev_driver_string
|
||||
_dev_emerg
|
||||
_dev_err
|
||||
dev_fetch_sw_netstats
|
||||
devfreq_add_device
|
||||
devfreq_add_governor
|
||||
devfreq_monitor_resume
|
||||
@ -290,12 +304,16 @@
|
||||
devfreq_unregister_opp_notifier
|
||||
devfreq_update_interval
|
||||
dev_fwnode
|
||||
__dev_get_by_index
|
||||
dev_get_by_index
|
||||
dev_get_by_name
|
||||
device_add
|
||||
device_add_disk
|
||||
device_add_groups
|
||||
device_create
|
||||
device_create_file
|
||||
device_create_with_groups
|
||||
device_del
|
||||
device_destroy
|
||||
device_find_child
|
||||
device_for_each_child
|
||||
@ -311,6 +329,7 @@
|
||||
device_register
|
||||
device_remove_file
|
||||
device_remove_groups
|
||||
device_rename
|
||||
device_set_wakeup_capable
|
||||
device_set_wakeup_enable
|
||||
device_unregister
|
||||
@ -390,6 +409,8 @@
|
||||
devm_thermal_zone_of_sensor_unregister
|
||||
devm_usb_get_phy_by_phandle
|
||||
_dev_notice
|
||||
dev_pm_domain_attach_by_name
|
||||
dev_pm_domain_detach
|
||||
dev_pm_opp_add
|
||||
dev_pm_opp_disable
|
||||
dev_pm_opp_find_freq_ceil
|
||||
@ -406,6 +427,7 @@
|
||||
dev_pm_opp_set_regulators
|
||||
dev_pm_qos_read_value
|
||||
dev_pm_qos_update_request
|
||||
dev_printk
|
||||
dev_printk_emit
|
||||
dev_queue_xmit
|
||||
devres_add
|
||||
@ -690,6 +712,9 @@
|
||||
emergency_restart
|
||||
enable_irq
|
||||
enable_percpu_irq
|
||||
ether_setup
|
||||
eth_mac_addr
|
||||
ethtool_op_get_link
|
||||
eth_type_trans
|
||||
eventfd_ctx_fdget
|
||||
eventfd_ctx_put
|
||||
@ -719,6 +744,7 @@
|
||||
find_vma
|
||||
finish_wait
|
||||
flush_dcache_page
|
||||
flush_delayed_work
|
||||
flush_work
|
||||
flush_workqueue
|
||||
fput
|
||||
@ -745,6 +771,7 @@
|
||||
generic_file_llseek
|
||||
generic_handle_irq
|
||||
generic_iommu_put_resv_regions
|
||||
genlmsg_multicast_allns
|
||||
genlmsg_put
|
||||
genl_register_family
|
||||
genl_unregister_family
|
||||
@ -763,6 +790,8 @@
|
||||
get_device
|
||||
__get_free_pages
|
||||
get_governor_parent_kobj
|
||||
get_net_ns_by_fd
|
||||
get_net_ns_by_pid
|
||||
get_pid_task
|
||||
get_random_bytes
|
||||
get_random_bytes_arch
|
||||
@ -830,6 +859,9 @@
|
||||
hrtimer_sleeper_start_expires
|
||||
hrtimer_start_range_ns
|
||||
hrtimer_try_to_cancel
|
||||
__hw_addr_init
|
||||
__hw_addr_sync
|
||||
__hw_addr_unsync
|
||||
hwrng_register
|
||||
hwrng_unregister
|
||||
i2c_adapter_type
|
||||
@ -858,6 +890,7 @@
|
||||
idr_destroy
|
||||
idr_find
|
||||
idr_for_each
|
||||
idr_get_next
|
||||
idr_preload
|
||||
idr_remove
|
||||
iio_device_unregister
|
||||
@ -865,6 +898,7 @@
|
||||
in6_pton
|
||||
in_aton
|
||||
inc_zone_page_state
|
||||
inet_csk_get_port
|
||||
init_dummy_netdev
|
||||
init_net
|
||||
init_pseudo
|
||||
@ -872,6 +906,7 @@
|
||||
__init_swait_queue_head
|
||||
init_task
|
||||
init_timer_key
|
||||
init_uts_ns
|
||||
init_wait_entry
|
||||
__init_waitqueue_head
|
||||
input_allocate_device
|
||||
@ -960,9 +995,14 @@
|
||||
kasprintf
|
||||
kernel_cpustat
|
||||
kernel_kobj
|
||||
kernel_param_lock
|
||||
kernel_param_unlock
|
||||
kernel_restart
|
||||
kern_mount
|
||||
kern_unmount
|
||||
key_create_or_update
|
||||
key_put
|
||||
keyring_alloc
|
||||
__kfifo_alloc
|
||||
__kfifo_free
|
||||
__kfifo_in
|
||||
@ -971,6 +1011,7 @@
|
||||
kfree
|
||||
kfree_sensitive
|
||||
kfree_skb
|
||||
kfree_skb_list
|
||||
kill_anon_super
|
||||
kill_fasync
|
||||
kimage_voffset
|
||||
@ -1026,11 +1067,13 @@
|
||||
kthread_stop
|
||||
kthread_worker_fn
|
||||
ktime_get
|
||||
ktime_get_coarse_with_offset
|
||||
ktime_get_mono_fast_ns
|
||||
ktime_get_raw
|
||||
ktime_get_raw_ts64
|
||||
ktime_get_real_seconds
|
||||
ktime_get_real_ts64
|
||||
ktime_get_seconds
|
||||
ktime_get_ts64
|
||||
ktime_get_with_offset
|
||||
kvfree
|
||||
@ -1049,6 +1092,8 @@
|
||||
log_threaded_irq_wakeup_reason
|
||||
__log_write_mmio
|
||||
loops_per_jiffy
|
||||
lru_cache_disable
|
||||
lru_cache_enable
|
||||
lzo1x_1_compress
|
||||
lzo1x_decompress_safe
|
||||
lzorle1x_1_compress
|
||||
@ -1116,19 +1161,31 @@
|
||||
__napi_schedule
|
||||
napi_schedule_prep
|
||||
__netdev_alloc_skb
|
||||
netdev_err
|
||||
netdev_info
|
||||
netdev_set_default_ethtool_ops
|
||||
netdev_state_change
|
||||
netdev_update_features
|
||||
netif_carrier_off
|
||||
netif_carrier_on
|
||||
netif_napi_add
|
||||
__netif_napi_del
|
||||
netif_receive_skb
|
||||
netif_receive_skb_list
|
||||
netif_rx
|
||||
netif_rx_ni
|
||||
netif_tx_stop_all_queues
|
||||
netif_tx_wake_queue
|
||||
netlink_broadcast
|
||||
__netlink_kernel_create
|
||||
netlink_kernel_release
|
||||
netlink_register_notifier
|
||||
netlink_unicast
|
||||
netlink_unregister_notifier
|
||||
net_ns_type_operations
|
||||
net_ratelimit
|
||||
nla_append
|
||||
nla_find
|
||||
nla_memcpy
|
||||
__nla_parse
|
||||
nla_put
|
||||
@ -1136,6 +1193,7 @@
|
||||
nla_put_nohdr
|
||||
nla_reserve
|
||||
nla_strlcpy
|
||||
__nla_validate
|
||||
__nlmsg_put
|
||||
no_llseek
|
||||
nonseekable_open
|
||||
@ -1370,8 +1428,10 @@
|
||||
proc_remove
|
||||
pskb_expand_head
|
||||
__pskb_pull_tail
|
||||
___pskb_trim
|
||||
put_device
|
||||
put_disk
|
||||
__put_net
|
||||
__put_page
|
||||
put_sg_io_hdr
|
||||
__put_task_struct
|
||||
@ -1409,6 +1469,7 @@
|
||||
rb_next
|
||||
rb_prev
|
||||
rb_replace_node
|
||||
rcu_barrier
|
||||
__rcu_read_lock
|
||||
__rcu_read_unlock
|
||||
rdev_get_drvdata
|
||||
@ -1430,6 +1491,7 @@
|
||||
register_netdev
|
||||
register_netdevice
|
||||
register_netdevice_notifier
|
||||
register_pernet_device
|
||||
register_pernet_subsys
|
||||
register_pm_notifier
|
||||
register_reboot_notifier
|
||||
@ -1489,11 +1551,24 @@
|
||||
return_address
|
||||
revalidate_disk_size
|
||||
rfkill_alloc
|
||||
rfkill_blocked
|
||||
rfkill_destroy
|
||||
rfkill_init_sw_state
|
||||
rfkill_pause_polling
|
||||
rfkill_register
|
||||
rfkill_resume_polling
|
||||
rfkill_set_hw_state
|
||||
rfkill_unregister
|
||||
rhashtable_free_and_destroy
|
||||
rhashtable_insert_slow
|
||||
rhltable_init
|
||||
__rht_bucket_nested
|
||||
rht_bucket_nested
|
||||
rht_bucket_nested_insert
|
||||
root_task_group
|
||||
round_jiffies
|
||||
round_jiffies_relative
|
||||
round_jiffies_up
|
||||
rps_needed
|
||||
rtc_class_close
|
||||
rtc_class_open
|
||||
@ -1583,11 +1658,20 @@
|
||||
single_open
|
||||
single_open_size
|
||||
single_release
|
||||
skb_add_rx_frag
|
||||
skb_checksum
|
||||
skb_checksum_help
|
||||
skb_clone
|
||||
skb_clone_sk
|
||||
skb_complete_wifi_ack
|
||||
skb_copy
|
||||
skb_copy_bits
|
||||
skb_copy_expand
|
||||
skb_dequeue
|
||||
skb_dequeue_tail
|
||||
skb_ensure_writable
|
||||
__skb_get_hash
|
||||
__skb_gso_segment
|
||||
skb_pull
|
||||
skb_push
|
||||
skb_put
|
||||
@ -1677,6 +1761,8 @@
|
||||
snd_soc_unregister_component
|
||||
snprintf
|
||||
soc_device_register
|
||||
__sock_create
|
||||
sock_release
|
||||
sock_wfree
|
||||
softnet_data
|
||||
sort
|
||||
@ -1735,8 +1821,10 @@
|
||||
submit_bio
|
||||
submit_bio_wait
|
||||
subsys_system_register
|
||||
__sw_hweight16
|
||||
__sw_hweight32
|
||||
__sw_hweight64
|
||||
__sw_hweight8
|
||||
sync_file_create
|
||||
sync_file_get_fence
|
||||
synchronize_irq
|
||||
@ -1761,6 +1849,7 @@
|
||||
sysfs_streq
|
||||
sysfs_update_group
|
||||
sysrq_mask
|
||||
system_freezable_wq
|
||||
system_freezing_cnt
|
||||
system_highpri_wq
|
||||
system_long_wq
|
||||
@ -1821,6 +1910,7 @@
|
||||
__traceiter_android_rvh_post_init_entity_util_avg
|
||||
__traceiter_android_rvh_preempt_disable
|
||||
__traceiter_android_rvh_preempt_enable
|
||||
__traceiter_android_rvh_sched_fork
|
||||
__traceiter_android_rvh_select_task_rq_rt
|
||||
__traceiter_android_rvh_set_iowait
|
||||
__traceiter_android_rvh_typec_tcpci_chk_contaminant
|
||||
@ -1841,6 +1931,8 @@
|
||||
__traceiter_android_vh_pagecache_get_page
|
||||
__traceiter_android_vh_rmqueue
|
||||
__traceiter_android_vh_setscheduler_uclamp
|
||||
__traceiter_android_vh_snd_compr_use_pause_in_drain
|
||||
__traceiter_android_vh_sound_usb_support_cpu_suspend
|
||||
__traceiter_android_vh_thermal_pm_notify_suspend
|
||||
__traceiter_android_vh_timerfd_create
|
||||
__traceiter_android_vh_typec_store_partner_src_caps
|
||||
@ -1891,6 +1983,7 @@
|
||||
__tracepoint_android_rvh_post_init_entity_util_avg
|
||||
__tracepoint_android_rvh_preempt_disable
|
||||
__tracepoint_android_rvh_preempt_enable
|
||||
__tracepoint_android_rvh_sched_fork
|
||||
__tracepoint_android_rvh_select_task_rq_rt
|
||||
__tracepoint_android_rvh_set_iowait
|
||||
__tracepoint_android_rvh_typec_tcpci_chk_contaminant
|
||||
@ -1911,6 +2004,8 @@
|
||||
__tracepoint_android_vh_pagecache_get_page
|
||||
__tracepoint_android_vh_rmqueue
|
||||
__tracepoint_android_vh_setscheduler_uclamp
|
||||
__tracepoint_android_vh_snd_compr_use_pause_in_drain
|
||||
__tracepoint_android_vh_sound_usb_support_cpu_suspend
|
||||
__tracepoint_android_vh_thermal_pm_notify_suspend
|
||||
__tracepoint_android_vh_timerfd_create
|
||||
__tracepoint_android_vh_typec_store_partner_src_caps
|
||||
@ -2004,8 +2099,10 @@
|
||||
unregister_inet6addr_notifier
|
||||
unregister_inetaddr_notifier
|
||||
unregister_netdev
|
||||
unregister_netdevice_many
|
||||
unregister_netdevice_notifier
|
||||
unregister_netdevice_queue
|
||||
unregister_pernet_device
|
||||
unregister_pernet_subsys
|
||||
unregister_pm_notifier
|
||||
unregister_reboot_notifier
|
||||
@ -2113,6 +2210,7 @@
|
||||
vb2_streamon
|
||||
vb2_vmalloc_memops
|
||||
vb2_wait_for_all_buffers
|
||||
verify_pkcs7_signature
|
||||
vfree
|
||||
video_devdata
|
||||
video_device_alloc
|
||||
@ -2164,6 +2262,7 @@
|
||||
watchdog_register_device
|
||||
watchdog_set_restart_priority
|
||||
watchdog_unregister_device
|
||||
wireless_nlevent_flush
|
||||
woken_wake_function
|
||||
work_busy
|
||||
__xfrm_state_destroy
|
||||
@ -2178,6 +2277,7 @@
|
||||
xhci_handle_event
|
||||
xhci_init_driver
|
||||
xhci_resume
|
||||
xhci_ring_alloc
|
||||
xhci_ring_free
|
||||
xhci_run
|
||||
xhci_suspend
|
||||
|
@ -15,15 +15,19 @@
|
||||
__alloc_disk_node
|
||||
alloc_etherdev_mqs
|
||||
alloc_io_pgtable_ops
|
||||
alloc_netdev_mqs
|
||||
alloc_pages_exact
|
||||
__alloc_pages_nodemask
|
||||
__alloc_percpu
|
||||
__alloc_percpu_gfp
|
||||
__alloc_skb
|
||||
alloc_workqueue
|
||||
android_debug_symbol
|
||||
android_rvh_probe_register
|
||||
anon_inode_getfd
|
||||
anon_inode_getfile
|
||||
arc4_crypt
|
||||
arc4_setkey
|
||||
__arch_copy_from_user
|
||||
__arch_copy_to_user
|
||||
arch_timer_read_counter
|
||||
@ -32,6 +36,7 @@
|
||||
__arm_smccc_hvc
|
||||
__arm_smccc_smc
|
||||
arp_tbl
|
||||
async_schedule_node
|
||||
atomic_notifier_call_chain
|
||||
atomic_notifier_chain_register
|
||||
atomic_notifier_chain_unregister
|
||||
@ -65,6 +70,7 @@
|
||||
blocking_notifier_call_chain
|
||||
blocking_notifier_chain_register
|
||||
blocking_notifier_chain_unregister
|
||||
bpf_trace_run10
|
||||
bpf_trace_run12
|
||||
bpf_trace_run1
|
||||
bpf_trace_run2
|
||||
@ -78,6 +84,7 @@
|
||||
bus_register
|
||||
bus_set_iommu
|
||||
bus_unregister
|
||||
call_rcu
|
||||
cancel_delayed_work
|
||||
cancel_delayed_work_sync
|
||||
cancel_work_sync
|
||||
@ -88,8 +95,6 @@
|
||||
cdev_device_del
|
||||
cdev_init
|
||||
__cfi_slowpath
|
||||
cgroup_taskset_first
|
||||
cgroup_taskset_next
|
||||
__check_object_size
|
||||
check_preempt_curr
|
||||
__class_create
|
||||
@ -212,21 +217,36 @@
|
||||
cpus_read_unlock
|
||||
cpu_subsys
|
||||
cpu_topology
|
||||
crc32_be
|
||||
crc32_le
|
||||
crc8
|
||||
crc8_populate_msb
|
||||
crypto_aead_decrypt
|
||||
crypto_aead_encrypt
|
||||
crypto_aead_setauthsize
|
||||
crypto_aead_setkey
|
||||
crypto_alloc_aead
|
||||
crypto_alloc_base
|
||||
crypto_alloc_shash
|
||||
crypto_alloc_skcipher
|
||||
crypto_comp_compress
|
||||
crypto_comp_decompress
|
||||
crypto_destroy_tfm
|
||||
crypto_has_alg
|
||||
__crypto_memneq
|
||||
crypto_register_alg
|
||||
crypto_register_scomp
|
||||
crypto_shash_digest
|
||||
crypto_shash_final
|
||||
crypto_shash_finup
|
||||
crypto_shash_setkey
|
||||
crypto_shash_update
|
||||
crypto_skcipher_decrypt
|
||||
crypto_skcipher_encrypt
|
||||
crypto_skcipher_setkey
|
||||
crypto_unregister_alg
|
||||
crypto_unregister_scomp
|
||||
__crypto_xor
|
||||
_ctype
|
||||
dapm_clock_event
|
||||
dapm_kcontrol_get_value
|
||||
@ -244,9 +264,11 @@
|
||||
debugfs_create_u16
|
||||
debugfs_create_u32
|
||||
debugfs_create_u64
|
||||
debugfs_create_u8
|
||||
debugfs_create_x32
|
||||
debugfs_lookup
|
||||
debugfs_remove
|
||||
debugfs_rename
|
||||
dec_zone_page_state
|
||||
default_llseek
|
||||
deferred_free
|
||||
@ -255,11 +277,15 @@
|
||||
del_timer
|
||||
del_timer_sync
|
||||
destroy_workqueue
|
||||
dev_alloc_name
|
||||
dev_base_lock
|
||||
dev_change_net_namespace
|
||||
dev_close
|
||||
dev_driver_string
|
||||
_dev_emerg
|
||||
_dev_err
|
||||
dev_err_probe
|
||||
dev_fetch_sw_netstats
|
||||
devfreq_add_governor
|
||||
devfreq_get_devfreq_by_phandle
|
||||
devfreq_monitor_resume
|
||||
@ -273,6 +299,8 @@
|
||||
devfreq_suspend_device
|
||||
devfreq_update_interval
|
||||
dev_fwnode
|
||||
__dev_get_by_index
|
||||
dev_get_by_index
|
||||
dev_get_regmap
|
||||
dev_get_stats
|
||||
device_add
|
||||
@ -354,6 +382,7 @@
|
||||
devm_phy_create
|
||||
devm_phy_get
|
||||
devm_pinctrl_get
|
||||
devm_pinctrl_put
|
||||
devm_pinctrl_register_and_init
|
||||
devm_platform_ioremap_resource
|
||||
devm_platform_ioremap_resource_byname
|
||||
@ -381,6 +410,7 @@
|
||||
devm_thermal_zone_of_sensor_register
|
||||
devm_watchdog_register_device
|
||||
_dev_notice
|
||||
dev_pm_domain_attach_by_id
|
||||
dev_pm_domain_attach_by_name
|
||||
dev_pm_domain_detach
|
||||
dev_pm_genpd_add_notifier
|
||||
@ -484,6 +514,7 @@
|
||||
down_write
|
||||
d_path
|
||||
dput
|
||||
drain_workqueue
|
||||
driver_create_file
|
||||
driver_remove_file
|
||||
driver_unregister
|
||||
@ -611,6 +642,7 @@
|
||||
em_dev_register_perf_domain
|
||||
enable_irq
|
||||
enable_percpu_irq
|
||||
ether_setup
|
||||
eth_header
|
||||
eth_header_cache
|
||||
eth_header_cache_update
|
||||
@ -619,6 +651,7 @@
|
||||
eth_platform_get_mac_address
|
||||
ethtool_op_get_link
|
||||
ethtool_op_get_ts_info
|
||||
eth_type_trans
|
||||
eth_validate_addr
|
||||
event_triggers_call
|
||||
extcon_get_edev_by_phandle
|
||||
@ -660,16 +693,35 @@
|
||||
freq_qos_add_request
|
||||
freq_qos_remove_request
|
||||
freq_qos_update_request
|
||||
fsg_common_create_luns
|
||||
fsg_common_set_cdev
|
||||
fsg_common_set_inquiry_string
|
||||
fsg_common_set_sysfs
|
||||
fsg_config_from_params
|
||||
fsync_bdev
|
||||
fwnode_device_is_available
|
||||
fwnode_get_name
|
||||
fwnode_graph_get_next_endpoint
|
||||
fwnode_graph_get_port_parent
|
||||
fwnode_graph_get_remote_endpoint
|
||||
fwnode_graph_get_remote_port_parent
|
||||
fwnode_graph_parse_endpoint
|
||||
fwnode_handle_get
|
||||
fwnode_handle_put
|
||||
fwnode_property_get_reference_args
|
||||
fwnode_property_present
|
||||
fwnode_property_read_string
|
||||
fwnode_property_read_u32_array
|
||||
fwnode_property_read_u64_array
|
||||
gcd
|
||||
generic_file_llseek
|
||||
generic_handle_irq
|
||||
generic_iommu_put_resv_regions
|
||||
generic_mii_ioctl
|
||||
genlmsg_multicast_allns
|
||||
genlmsg_put
|
||||
genl_register_family
|
||||
genl_unregister_family
|
||||
genphy_resume
|
||||
gen_pool_add_owner
|
||||
gen_pool_alloc_algo_owner
|
||||
@ -692,6 +744,8 @@
|
||||
__get_free_pages
|
||||
get_governor_parent_kobj
|
||||
get_kernel_pages
|
||||
get_net_ns_by_fd
|
||||
get_net_ns_by_pid
|
||||
get_pid_task
|
||||
get_random_bytes
|
||||
get_random_u32
|
||||
@ -739,6 +793,9 @@
|
||||
hrtimer_init
|
||||
hrtimer_start_range_ns
|
||||
hrtimer_try_to_cancel
|
||||
__hw_addr_init
|
||||
__hw_addr_sync
|
||||
__hw_addr_unsync
|
||||
i2c_add_adapter
|
||||
i2c_del_adapter
|
||||
i2c_del_driver
|
||||
@ -789,6 +846,7 @@
|
||||
iio_trigger_notify_done
|
||||
inc_zone_page_state
|
||||
in_egroup_p
|
||||
inet_csk_get_port
|
||||
init_net
|
||||
init_pseudo
|
||||
__init_rwsem
|
||||
@ -862,12 +920,17 @@
|
||||
kasprintf
|
||||
kernel_cpustat
|
||||
kernel_kobj
|
||||
kernel_param_lock
|
||||
kernel_param_unlock
|
||||
kernel_power_off
|
||||
kernel_restart
|
||||
kernel_sigaction
|
||||
kernfs_path_from_node
|
||||
kern_mount
|
||||
kern_unmount
|
||||
key_create_or_update
|
||||
key_put
|
||||
keyring_alloc
|
||||
__kfifo_alloc
|
||||
__kfifo_free
|
||||
__kfifo_in
|
||||
@ -877,6 +940,7 @@
|
||||
kfree_const
|
||||
kfree_sensitive
|
||||
kfree_skb
|
||||
kfree_skb_list
|
||||
kill_anon_super
|
||||
kimage_vaddr
|
||||
kimage_voffset
|
||||
@ -888,6 +952,7 @@
|
||||
kmem_cache_create
|
||||
kmem_cache_destroy
|
||||
kmem_cache_free
|
||||
kmemdup
|
||||
kobject_add
|
||||
kobject_create_and_add
|
||||
kobject_init
|
||||
@ -930,9 +995,11 @@
|
||||
kthread_stop
|
||||
kthread_worker_fn
|
||||
ktime_get
|
||||
ktime_get_coarse_with_offset
|
||||
ktime_get_mono_fast_ns
|
||||
ktime_get_raw_ts64
|
||||
ktime_get_real_ts64
|
||||
ktime_get_seconds
|
||||
ktime_get_ts64
|
||||
ktime_get_with_offset
|
||||
kvfree
|
||||
@ -986,9 +1053,16 @@
|
||||
media_devnode_create
|
||||
media_devnode_remove
|
||||
media_entity_pads_init
|
||||
media_entity_remote_pad
|
||||
media_entity_remove_links
|
||||
__media_entity_setup_link
|
||||
media_graph_walk_next
|
||||
media_graph_walk_start
|
||||
media_pipeline_start
|
||||
media_pipeline_stop
|
||||
media_request_get_by_fd
|
||||
media_request_object_complete
|
||||
media_request_put
|
||||
memblock_end_of_DRAM
|
||||
memchr
|
||||
memcmp
|
||||
@ -1066,6 +1140,7 @@
|
||||
__netdev_alloc_skb
|
||||
netdev_err
|
||||
netdev_info
|
||||
netdev_set_default_ethtool_ops
|
||||
netdev_warn
|
||||
netif_carrier_off
|
||||
netif_carrier_on
|
||||
@ -1074,12 +1149,25 @@
|
||||
netif_receive_skb_list
|
||||
netif_rx
|
||||
netif_rx_ni
|
||||
netif_tx_stop_all_queues
|
||||
netif_tx_wake_queue
|
||||
netlink_broadcast
|
||||
__netlink_kernel_create
|
||||
netlink_register_notifier
|
||||
netlink_unicast
|
||||
netlink_unregister_notifier
|
||||
net_namespace_list
|
||||
net_ns_type_operations
|
||||
net_ratelimit
|
||||
nf_register_net_hooks
|
||||
nf_unregister_net_hooks
|
||||
nla_find
|
||||
nla_memcpy
|
||||
__nla_parse
|
||||
nla_put_64bit
|
||||
nla_put
|
||||
nla_reserve
|
||||
__nla_validate
|
||||
__nlmsg_put
|
||||
no_llseek
|
||||
nonseekable_open
|
||||
@ -1183,6 +1271,7 @@
|
||||
__page_pinner_migration_failed
|
||||
panic
|
||||
panic_notifier_list
|
||||
param_array_ops
|
||||
param_get_bool
|
||||
param_get_charp
|
||||
param_get_int
|
||||
@ -1252,6 +1341,7 @@
|
||||
platform_device_unregister
|
||||
__platform_driver_register
|
||||
platform_driver_unregister
|
||||
platform_find_device_by_driver
|
||||
platform_get_irq
|
||||
platform_get_irq_byname
|
||||
platform_get_irq_byname_optional
|
||||
@ -1292,6 +1382,8 @@
|
||||
power_supply_register
|
||||
power_supply_reg_notifier
|
||||
power_supply_set_property
|
||||
prandom_bytes
|
||||
prandom_u32
|
||||
preempt_schedule
|
||||
preempt_schedule_notrace
|
||||
prepare_to_wait_event
|
||||
@ -1305,10 +1397,14 @@
|
||||
proc_remove
|
||||
proc_set_user
|
||||
pskb_expand_head
|
||||
__pskb_pull_tail
|
||||
___pskb_trim
|
||||
put_device
|
||||
put_disk
|
||||
__put_net
|
||||
__put_page
|
||||
put_pid
|
||||
put_task_stack
|
||||
__put_task_struct
|
||||
put_unused_fd
|
||||
put_vaddr_frames
|
||||
@ -1347,6 +1443,7 @@
|
||||
rb_first
|
||||
rb_insert_color
|
||||
rb_next
|
||||
rcu_barrier
|
||||
rcu_idle_enter
|
||||
rcu_idle_exit
|
||||
__rcu_read_lock
|
||||
@ -1364,10 +1461,15 @@
|
||||
__register_chrdev
|
||||
register_chrdev_region
|
||||
register_die_notifier
|
||||
register_inet6addr_notifier
|
||||
register_inetaddr_notifier
|
||||
register_kprobe
|
||||
register_module_notifier
|
||||
register_netdev
|
||||
register_netdevice
|
||||
register_netdevice_notifier
|
||||
register_oom_notifier
|
||||
register_pernet_device
|
||||
register_pernet_subsys
|
||||
register_pm_notifier
|
||||
register_reboot_notifier
|
||||
@ -1425,6 +1527,7 @@
|
||||
remove_proc_subtree
|
||||
remove_wait_queue
|
||||
request_firmware
|
||||
request_firmware_nowait
|
||||
__request_percpu_irq
|
||||
request_threaded_irq
|
||||
reset_control_assert
|
||||
@ -1433,8 +1536,26 @@
|
||||
reset_control_reset
|
||||
resume_cpus
|
||||
revalidate_disk_size
|
||||
rfkill_alloc
|
||||
rfkill_blocked
|
||||
rfkill_destroy
|
||||
rfkill_pause_polling
|
||||
rfkill_register
|
||||
rfkill_resume_polling
|
||||
rfkill_set_hw_state
|
||||
rfkill_unregister
|
||||
rhashtable_free_and_destroy
|
||||
rhashtable_insert_slow
|
||||
rhltable_init
|
||||
__rht_bucket_nested
|
||||
rht_bucket_nested
|
||||
rht_bucket_nested_insert
|
||||
round_jiffies
|
||||
round_jiffies_relative
|
||||
round_jiffies_up
|
||||
rpmsg_create_ept
|
||||
rpmsg_destroy_ept
|
||||
rpmsg_find_device
|
||||
rpmsg_register_device
|
||||
rpmsg_send
|
||||
rpmsg_trysend
|
||||
@ -1442,9 +1563,14 @@
|
||||
rproc_add
|
||||
rproc_add_subdev
|
||||
rproc_alloc
|
||||
rproc_boot
|
||||
rproc_del
|
||||
rproc_free
|
||||
rproc_get_by_phandle
|
||||
rproc_put
|
||||
rproc_remove_subdev
|
||||
rproc_report_crash
|
||||
rproc_shutdown
|
||||
rps_needed
|
||||
rtc_ktime_to_tm
|
||||
rtc_nvmem_register
|
||||
@ -1454,6 +1580,9 @@
|
||||
rtc_tm_to_time64
|
||||
rtc_update_irq
|
||||
rtc_valid_tm
|
||||
rtnl_is_locked
|
||||
rtnl_lock
|
||||
rtnl_unlock
|
||||
runqueues
|
||||
sched_clock
|
||||
sched_feat_keys
|
||||
@ -1469,8 +1598,14 @@
|
||||
scmi_driver_unregister
|
||||
scmi_protocol_register
|
||||
scnprintf
|
||||
scsi_autopm_get_device
|
||||
scsi_autopm_put_device
|
||||
scsi_device_get
|
||||
scsi_device_put
|
||||
scsi_device_quiesce
|
||||
__scsi_execute
|
||||
__scsi_iterate_devices
|
||||
scsi_print_sense_hdr
|
||||
sdio_signal_irq
|
||||
send_sig
|
||||
seq_hex_dump
|
||||
@ -1522,16 +1657,24 @@
|
||||
single_open
|
||||
single_release
|
||||
skb_add_rx_frag
|
||||
skb_checksum_help
|
||||
skb_clone
|
||||
skb_clone_sk
|
||||
skb_complete_wifi_ack
|
||||
skb_copy
|
||||
skb_copy_bits
|
||||
skb_copy_expand
|
||||
skb_dequeue
|
||||
skb_ensure_writable
|
||||
__skb_get_hash
|
||||
__skb_gso_segment
|
||||
skb_pull
|
||||
skb_push
|
||||
skb_put
|
||||
skb_queue_head
|
||||
skb_queue_purge
|
||||
skb_queue_tail
|
||||
skb_trim
|
||||
smp_call_function
|
||||
smp_call_function_single
|
||||
snd_card_add_dev_attr
|
||||
snd_ctl_boolean_mono_info
|
||||
snd_jack_set_key
|
||||
@ -1585,6 +1728,8 @@
|
||||
snprintf
|
||||
soc_device_register
|
||||
soc_device_unregister
|
||||
__sock_create
|
||||
sock_release
|
||||
sort
|
||||
__spi_alloc_controller
|
||||
spi_bus_type
|
||||
@ -1615,11 +1760,13 @@
|
||||
static_key_slow_dec
|
||||
static_key_slow_inc
|
||||
stop_one_cpu_nowait
|
||||
stpcpy
|
||||
strcasecmp
|
||||
strchr
|
||||
strcmp
|
||||
strcpy
|
||||
strcspn
|
||||
strim
|
||||
strlcat
|
||||
strlcpy
|
||||
strlen
|
||||
@ -1636,8 +1783,10 @@
|
||||
strsep
|
||||
strstr
|
||||
suspend_set_ops
|
||||
__sw_hweight16
|
||||
__sw_hweight32
|
||||
__sw_hweight64
|
||||
__sw_hweight8
|
||||
sync_file_create
|
||||
sync_file_get_fence
|
||||
synchronize_irq
|
||||
@ -1658,6 +1807,7 @@
|
||||
sysfs_remove_link
|
||||
sysfs_streq
|
||||
system_freezable_power_efficient_wq
|
||||
system_freezable_wq
|
||||
system_freezing_cnt
|
||||
system_highpri_wq
|
||||
system_power_efficient_wq
|
||||
@ -1713,16 +1863,18 @@
|
||||
__traceiter_android_vh_binder_restore_priority
|
||||
__traceiter_android_vh_binder_set_priority
|
||||
__traceiter_android_vh_binder_transaction_init
|
||||
__traceiter_android_vh_cgroup_attach
|
||||
__traceiter_android_vh_cgroup_set_task
|
||||
__traceiter_android_vh_clear_mask_adjust
|
||||
__traceiter_android_vh_clear_reserved_fmt_fields
|
||||
__traceiter_android_vh_commit_creds
|
||||
__traceiter_android_vh_em_cpu_energy
|
||||
__traceiter_android_vh_exit_creds
|
||||
__traceiter_android_vh_fill_ext_fmtdesc
|
||||
__traceiter_android_vh_finish_update_load_avg_se
|
||||
__traceiter_android_vh_iommu_alloc_iova
|
||||
__traceiter_android_vh_iommu_free_iova
|
||||
__traceiter_android_vh_is_fpsimd_save
|
||||
__traceiter_android_vh_logbuf
|
||||
__traceiter_android_vh_media_device_setup_link
|
||||
__traceiter_android_vh_override_creds
|
||||
__traceiter_android_vh_prepare_update_load_avg_se
|
||||
__traceiter_android_vh_revert_creds
|
||||
@ -1743,13 +1895,15 @@
|
||||
__traceiter_android_vh_set_module_permit_before_init
|
||||
__traceiter_android_vh_set_wake_flags
|
||||
__traceiter_android_vh_syscall_prctl_finished
|
||||
__traceiter_android_vh_v4l2subdev_set_fmt
|
||||
__traceiter_android_vh_v4l2subdev_set_frame_interval
|
||||
__traceiter_android_vh_v4l2subdev_set_selection
|
||||
__traceiter_cpu_frequency
|
||||
__traceiter_pelt_se_tp
|
||||
__traceiter_rwmmio_post_read
|
||||
__traceiter_rwmmio_read
|
||||
__traceiter_rwmmio_write
|
||||
__traceiter_sched_update_nr_running_tp
|
||||
__traceiter_task_newtask
|
||||
__tracepoint_android_rvh_cpu_overutilized
|
||||
__tracepoint_android_rvh_dequeue_task
|
||||
__tracepoint_android_rvh_dequeue_task_fair
|
||||
@ -1771,16 +1925,18 @@
|
||||
__tracepoint_android_vh_binder_restore_priority
|
||||
__tracepoint_android_vh_binder_set_priority
|
||||
__tracepoint_android_vh_binder_transaction_init
|
||||
__tracepoint_android_vh_cgroup_attach
|
||||
__tracepoint_android_vh_cgroup_set_task
|
||||
__tracepoint_android_vh_clear_mask_adjust
|
||||
__tracepoint_android_vh_clear_reserved_fmt_fields
|
||||
__tracepoint_android_vh_commit_creds
|
||||
__tracepoint_android_vh_em_cpu_energy
|
||||
__tracepoint_android_vh_exit_creds
|
||||
__tracepoint_android_vh_fill_ext_fmtdesc
|
||||
__tracepoint_android_vh_finish_update_load_avg_se
|
||||
__tracepoint_android_vh_iommu_alloc_iova
|
||||
__tracepoint_android_vh_iommu_free_iova
|
||||
__tracepoint_android_vh_is_fpsimd_save
|
||||
__tracepoint_android_vh_logbuf
|
||||
__tracepoint_android_vh_media_device_setup_link
|
||||
__tracepoint_android_vh_override_creds
|
||||
__tracepoint_android_vh_prepare_update_load_avg_se
|
||||
__tracepoint_android_vh_revert_creds
|
||||
@ -1801,6 +1957,9 @@
|
||||
__tracepoint_android_vh_set_module_permit_before_init
|
||||
__tracepoint_android_vh_set_wake_flags
|
||||
__tracepoint_android_vh_syscall_prctl_finished
|
||||
__tracepoint_android_vh_v4l2subdev_set_fmt
|
||||
__tracepoint_android_vh_v4l2subdev_set_frame_interval
|
||||
__tracepoint_android_vh_v4l2subdev_set_selection
|
||||
__tracepoint_cpu_frequency
|
||||
__tracepoint_pelt_se_tp
|
||||
tracepoint_probe_register
|
||||
@ -1810,7 +1969,6 @@
|
||||
__tracepoint_rwmmio_write
|
||||
__tracepoint_sched_update_nr_running_tp
|
||||
tracepoint_srcu
|
||||
__tracepoint_task_newtask
|
||||
trace_print_array_seq
|
||||
trace_print_symbols_seq
|
||||
__trace_puts
|
||||
@ -1862,6 +2020,7 @@
|
||||
ufshcd_pltfrm_runtime_resume
|
||||
ufshcd_pltfrm_runtime_suspend
|
||||
ufshcd_pltfrm_suspend
|
||||
ufshcd_read_desc_param
|
||||
ufshcd_remove
|
||||
ufshcd_shutdown
|
||||
ufshcd_uic_hibern8_exit
|
||||
@ -1871,10 +2030,16 @@
|
||||
__unregister_chrdev
|
||||
unregister_chrdev_region
|
||||
unregister_die_notifier
|
||||
unregister_inet6addr_notifier
|
||||
unregister_inetaddr_notifier
|
||||
unregister_kprobe
|
||||
unregister_module_notifier
|
||||
unregister_netdev
|
||||
unregister_netdevice_many
|
||||
unregister_netdevice_notifier
|
||||
unregister_netdevice_queue
|
||||
unregister_oom_notifier
|
||||
unregister_pernet_device
|
||||
unregister_pernet_subsys
|
||||
unregister_pm_notifier
|
||||
unregister_reboot_notifier
|
||||
@ -1887,9 +2052,12 @@
|
||||
update_rq_clock
|
||||
up_read
|
||||
up_write
|
||||
usb_add_config
|
||||
usb_add_function
|
||||
usb_add_gadget_udc
|
||||
usb_add_hcd
|
||||
usb_composite_probe
|
||||
usb_composite_unregister
|
||||
usb_copy_descriptors
|
||||
usb_create_hcd
|
||||
usb_create_shared_hcd
|
||||
@ -1908,11 +2076,17 @@
|
||||
usb_ep_set_maxpacket_limit
|
||||
usb_function_register
|
||||
usb_function_unregister
|
||||
usb_gadget_connect
|
||||
usb_gadget_disconnect
|
||||
usb_gadget_giveback_request
|
||||
usb_gadget_map_request
|
||||
usb_gadget_probe_driver
|
||||
usb_gadget_set_selfpowered
|
||||
usb_gadget_set_state
|
||||
usb_gadget_unmap_request
|
||||
usb_get_dr_mode
|
||||
usb_get_function
|
||||
usb_get_function_instance
|
||||
usb_get_maximum_speed
|
||||
usb_hcd_is_primary_hcd
|
||||
usb_hcd_poll_rh_status
|
||||
@ -1944,9 +2118,11 @@
|
||||
usbnet_write_cmd
|
||||
usbnet_write_cmd_async
|
||||
usbnet_write_cmd_nopm
|
||||
usb_put_function
|
||||
usb_put_function_instance
|
||||
usb_put_hcd
|
||||
usb_register_driver
|
||||
usb_remove_function
|
||||
usb_remove_hcd
|
||||
usb_role_switch_get
|
||||
usb_role_switch_get_drvdata
|
||||
@ -1959,20 +2135,30 @@
|
||||
usleep_range
|
||||
uuid_null
|
||||
v4l2_async_notifier_add_fwnode_subdev
|
||||
v4l2_async_notifier_add_subdev
|
||||
v4l2_async_notifier_cleanup
|
||||
v4l2_async_notifier_init
|
||||
v4l2_async_notifier_register
|
||||
v4l2_async_notifier_unregister
|
||||
v4l2_async_register_subdev
|
||||
v4l2_async_subdev_notifier_register
|
||||
v4l2_async_unregister_subdev
|
||||
v4l2_compat_ioctl32
|
||||
v4l2_ctrl_find
|
||||
v4l2_ctrl_g_ctrl
|
||||
v4l2_ctrl_g_ctrl_int64
|
||||
v4l2_ctrl_handler_free
|
||||
v4l2_ctrl_handler_init_class
|
||||
v4l2_ctrl_handler_setup
|
||||
__v4l2_ctrl_modify_range
|
||||
v4l2_ctrl_new_custom
|
||||
v4l2_ctrl_new_std
|
||||
v4l2_ctrl_new_std_menu
|
||||
v4l2_ctrl_new_std_menu_items
|
||||
v4l2_ctrl_request_complete
|
||||
v4l2_ctrl_request_setup
|
||||
__v4l2_ctrl_s_ctrl
|
||||
v4l2_ctrl_subdev_subscribe_event
|
||||
v4l2_ctrl_subscribe_event
|
||||
v4l2_device_register
|
||||
v4l2_device_register_subdev
|
||||
@ -1990,6 +2176,9 @@
|
||||
v4l2_fh_init
|
||||
v4l2_fh_is_singular
|
||||
v4l2_fh_open
|
||||
__v4l2_find_nearest_size
|
||||
v4l2_format_info
|
||||
v4l2_i2c_subdev_init
|
||||
v4l2_m2m_buf_queue
|
||||
v4l2_m2m_buf_remove
|
||||
v4l2_m2m_ctx_init
|
||||
@ -2017,6 +2206,7 @@
|
||||
v4l2_m2m_streamoff
|
||||
v4l2_m2m_suspend
|
||||
v4l2_m2m_try_schedule
|
||||
v4l2_pipeline_link_notify
|
||||
v4l2_src_change_event_subscribe
|
||||
v4l2_subdev_call_wrappers
|
||||
v4l2_subdev_init
|
||||
@ -2054,6 +2244,7 @@
|
||||
vchan_init
|
||||
vchan_tx_desc_free
|
||||
vchan_tx_submit
|
||||
verify_pkcs7_signature
|
||||
vfree
|
||||
video_devdata
|
||||
video_device_alloc
|
||||
@ -2105,6 +2296,7 @@
|
||||
__warn_printk
|
||||
watchdog_init_timeout
|
||||
watchdog_set_restart_priority
|
||||
wireless_nlevent_flush
|
||||
woken_wake_function
|
||||
work_busy
|
||||
work_on_cpu
|
||||
@ -2120,7 +2312,6 @@
|
||||
xhci_reset_bandwidth
|
||||
|
||||
# preserved by --additions-only
|
||||
alloc_netdev_mqs
|
||||
all_vm_events
|
||||
__arch_clear_user
|
||||
bio_add_pc_page
|
||||
@ -2131,12 +2322,13 @@
|
||||
blk_mq_sched_mark_restart_hctx
|
||||
blk_rq_append_bio
|
||||
cache_line_size
|
||||
cgroup_taskset_first
|
||||
cgroup_taskset_next
|
||||
class_create_file_ns
|
||||
class_remove_file_ns
|
||||
clear_page
|
||||
cpu_pm_register_notifier
|
||||
cpu_pm_unregister_notifier
|
||||
debugfs_create_u8
|
||||
debug_locks_off
|
||||
devfreq_add_device
|
||||
devfreq_cooling_unregister
|
||||
@ -2144,7 +2336,6 @@
|
||||
devfreq_unregister_opp_notifier
|
||||
dev_get_by_name
|
||||
devm_of_pwm_get
|
||||
devm_pinctrl_put
|
||||
devm_rc_allocate_device
|
||||
devm_rc_register_device
|
||||
dev_pm_opp_find_freq_exact
|
||||
@ -2156,17 +2347,6 @@
|
||||
dma_sync_single_for_device
|
||||
downgrade_write
|
||||
down_read_trylock
|
||||
ether_setup
|
||||
eth_type_trans
|
||||
fsg_common_create_luns
|
||||
fsg_common_set_cdev
|
||||
fsg_common_set_inquiry_string
|
||||
fsg_common_set_sysfs
|
||||
fsg_config_from_params
|
||||
gcd
|
||||
genlmsg_put
|
||||
genl_register_family
|
||||
genl_unregister_family
|
||||
get_freelist_nr_pages
|
||||
get_user_pages_fast
|
||||
gpiod_set_raw_value
|
||||
@ -2187,30 +2367,19 @@
|
||||
memdup_user
|
||||
__mmdrop
|
||||
module_put
|
||||
netif_tx_stop_all_queues
|
||||
netlink_kernel_release
|
||||
__nla_parse
|
||||
nla_put
|
||||
nla_put_nohdr
|
||||
n_tty_ioctl_helper
|
||||
of_devfreq_cooling_register_power
|
||||
of_root
|
||||
param_array_ops
|
||||
param_ops_byte
|
||||
param_ops_string
|
||||
perf_num_counters
|
||||
pin_user_pages_remote
|
||||
rb_prev
|
||||
rb_replace_node
|
||||
register_inetaddr_notifier
|
||||
register_netdevice
|
||||
register_netdevice_notifier
|
||||
__release_region
|
||||
request_firmware_nowait
|
||||
__request_region
|
||||
rtnl_is_locked
|
||||
rtnl_lock
|
||||
rtnl_unlock
|
||||
__sbitmap_queue_get
|
||||
sdio_claim_host
|
||||
sdio_claim_irq
|
||||
@ -2234,25 +2403,28 @@
|
||||
send_sig_info
|
||||
shmem_file_setup
|
||||
si_meminfo
|
||||
skb_dequeue
|
||||
skb_pull_rcsum
|
||||
skb_queue_head
|
||||
skb_queue_purge
|
||||
skb_realloc_headroom
|
||||
smp_call_function
|
||||
smp_call_function_single
|
||||
snd_soc_component_test_bits
|
||||
sprint_symbol_no_offset
|
||||
stpcpy
|
||||
strim
|
||||
strpbrk
|
||||
strspn
|
||||
syscore_resume
|
||||
syscore_suspend
|
||||
system_long_wq
|
||||
thermal_zone_device_update
|
||||
__traceiter_android_vh_cgroup_attach
|
||||
__traceiter_android_vh_is_fpsimd_save
|
||||
__traceiter_gpu_mem_total
|
||||
__traceiter_task_newtask
|
||||
trace_output_call
|
||||
__tracepoint_android_vh_cgroup_attach
|
||||
__tracepoint_android_vh_is_fpsimd_save
|
||||
__tracepoint_android_vh_ufs_update_sdev
|
||||
__tracepoint_gpu_mem_total
|
||||
__tracepoint_task_newtask
|
||||
trace_print_flags_seq
|
||||
try_module_get
|
||||
tty_driver_flush_buffer
|
||||
@ -2261,21 +2433,7 @@
|
||||
ufshcd_pltfrm_shutdown
|
||||
unmap_mapping_range
|
||||
unpin_user_page
|
||||
unregister_inetaddr_notifier
|
||||
unregister_netdevice_notifier
|
||||
unregister_netdevice_queue
|
||||
unregister_syscore_ops
|
||||
usb_add_config
|
||||
usb_composite_probe
|
||||
usb_composite_unregister
|
||||
usb_gadget_connect
|
||||
usb_gadget_disconnect
|
||||
usb_gadget_probe_driver
|
||||
usb_gadget_set_selfpowered
|
||||
usb_get_function
|
||||
usb_get_function_instance
|
||||
usb_put_function
|
||||
usb_remove_function
|
||||
v4l2_m2m_buf_copy_metadata
|
||||
v4l2_m2m_buf_remove_by_buf
|
||||
v4l2_m2m_register_media_controller
|
||||
|
2023
android/abi_gki_aarch64_oplus
Normal file
2023
android/abi_gki_aarch64_oplus
Normal file
File diff suppressed because it is too large
Load Diff
@ -31,6 +31,7 @@
|
||||
amba_bustype
|
||||
amba_driver_register
|
||||
amba_driver_unregister
|
||||
android_debug_for_each_module
|
||||
android_debug_per_cpu_symbol
|
||||
android_debug_symbol
|
||||
android_rvh_probe_register
|
||||
@ -1052,6 +1053,20 @@
|
||||
i2c_register_driver
|
||||
i2c_transfer
|
||||
i2c_transfer_buffer_flags
|
||||
i3c_generic_ibi_alloc_pool
|
||||
i3c_generic_ibi_free_pool
|
||||
i3c_generic_ibi_get_free_slot
|
||||
i3c_generic_ibi_recycle_slot
|
||||
i3c_master_add_i3c_dev_locked
|
||||
i3c_master_disec_locked
|
||||
i3c_master_do_daa
|
||||
i3c_master_enec_locked
|
||||
i3c_master_entdaa_locked
|
||||
i3c_master_get_free_addr
|
||||
i3c_master_queue_ibi
|
||||
i3c_master_register
|
||||
i3c_master_set_info
|
||||
i3c_master_unregister
|
||||
icc_disable
|
||||
icc_enable
|
||||
icc_get
|
||||
@ -1069,6 +1084,7 @@
|
||||
ida_free
|
||||
idr_alloc
|
||||
idr_alloc_cyclic
|
||||
idr_alloc_u32
|
||||
idr_destroy
|
||||
idr_find
|
||||
idr_for_each
|
||||
@ -2923,6 +2939,7 @@
|
||||
vmalloc_to_pfn
|
||||
vmap
|
||||
vmemdup_user
|
||||
vm_event_states
|
||||
vmf_insert_mixed
|
||||
vmf_insert_pfn
|
||||
vm_get_page_prot
|
||||
|
@ -15,6 +15,7 @@ CONFIG_IKHEADERS=y
|
||||
CONFIG_UCLAMP_TASK=y
|
||||
CONFIG_UCLAMP_BUCKETS_COUNT=20
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_MEMCG=y
|
||||
CONFIG_BLK_CGROUP=y
|
||||
CONFIG_CGROUP_SCHED=y
|
||||
CONFIG_UCLAMP_TASK_GROUP=y
|
||||
@ -60,7 +61,7 @@ CONFIG_CP15_BARRIER_EMULATION=y
|
||||
CONFIG_SETEND_EMULATION=y
|
||||
CONFIG_RANDOMIZE_BASE=y
|
||||
# CONFIG_RANDOMIZE_MODULE_REGION_FULL is not set
|
||||
CONFIG_CMDLINE="stack_depot_disable=on kasan.stacktrace=off kvm-arm.mode=protected cgroup_disable=pressure"
|
||||
CONFIG_CMDLINE="stack_depot_disable=on kasan.stacktrace=off kvm-arm.mode=protected cgroup_disable=pressure cgroup.memory=nokmem"
|
||||
CONFIG_CMDLINE_EXTEND=y
|
||||
# CONFIG_DMI is not set
|
||||
CONFIG_PM_WAKELOCKS=y
|
||||
@ -257,6 +258,7 @@ CONFIG_NET_ACT_GACT=y
|
||||
CONFIG_NET_ACT_MIRRED=y
|
||||
CONFIG_NET_ACT_SKBEDIT=y
|
||||
CONFIG_VSOCKETS=y
|
||||
CONFIG_CGROUP_NET_PRIO=y
|
||||
CONFIG_BPF_JIT=y
|
||||
CONFIG_CAN=y
|
||||
CONFIG_BT=y
|
||||
|
@ -13,30 +13,12 @@
|
||||
* so use the base value of ldp as thread.keys_user and offset as
|
||||
* thread.keys_user.ap*.
|
||||
*/
|
||||
.macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
|
||||
.macro __ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
|
||||
mov \tmp1, #THREAD_KEYS_USER
|
||||
add \tmp1, \tsk, \tmp1
|
||||
alternative_if_not ARM64_HAS_ADDRESS_AUTH
|
||||
b .Laddr_auth_skip_\@
|
||||
alternative_else_nop_endif
|
||||
ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIA]
|
||||
msr_s SYS_APIAKEYLO_EL1, \tmp2
|
||||
msr_s SYS_APIAKEYHI_EL1, \tmp3
|
||||
ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIB]
|
||||
msr_s SYS_APIBKEYLO_EL1, \tmp2
|
||||
msr_s SYS_APIBKEYHI_EL1, \tmp3
|
||||
ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APDA]
|
||||
msr_s SYS_APDAKEYLO_EL1, \tmp2
|
||||
msr_s SYS_APDAKEYHI_EL1, \tmp3
|
||||
ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APDB]
|
||||
msr_s SYS_APDBKEYLO_EL1, \tmp2
|
||||
msr_s SYS_APDBKEYHI_EL1, \tmp3
|
||||
.Laddr_auth_skip_\@:
|
||||
alternative_if ARM64_HAS_GENERIC_AUTH
|
||||
ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APGA]
|
||||
msr_s SYS_APGAKEYLO_EL1, \tmp2
|
||||
msr_s SYS_APGAKEYHI_EL1, \tmp3
|
||||
alternative_else_nop_endif
|
||||
.endm
|
||||
|
||||
.macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
#include <asm/atomic_ll_sc.h>
|
||||
|
||||
#ifdef CONFIG_ARM64_LSE_ATOMICS
|
||||
#if defined(CONFIG_ARM64_LSE_ATOMICS) && !defined(BUILD_FIPS140_KO)
|
||||
|
||||
#define __LSE_PREAMBLE ".arch_extension lse\n"
|
||||
|
||||
|
@ -40,7 +40,7 @@ void mte_free_tag_storage(char *storage);
|
||||
void mte_zero_clear_page_tags(void *addr);
|
||||
void mte_sync_tags(pte_t *ptep, pte_t pte);
|
||||
void mte_copy_page_tags(void *kto, const void *kfrom);
|
||||
void flush_mte_state(void);
|
||||
void mte_thread_init_user(void);
|
||||
void mte_thread_switch(struct task_struct *next);
|
||||
void mte_suspend_enter(void);
|
||||
void mte_suspend_exit(void);
|
||||
@ -63,7 +63,7 @@ static inline void mte_sync_tags(pte_t *ptep, pte_t pte)
|
||||
static inline void mte_copy_page_tags(void *kto, const void *kfrom)
|
||||
{
|
||||
}
|
||||
static inline void flush_mte_state(void)
|
||||
static inline void mte_thread_init_user(void)
|
||||
{
|
||||
}
|
||||
static inline void mte_thread_switch(struct task_struct *next)
|
||||
|
@ -3,12 +3,16 @@
|
||||
#define __ASM_POINTER_AUTH_H
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/prctl.h>
|
||||
#include <linux/random.h>
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/sysreg.h>
|
||||
|
||||
#define PR_PAC_ENABLED_KEYS_MASK \
|
||||
(PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY | PR_PAC_APDBKEY)
|
||||
|
||||
#ifdef CONFIG_ARM64_PTR_AUTH
|
||||
/*
|
||||
* Each key is a 128-bit quantity which is split across a pair of 64-bit
|
||||
@ -34,6 +38,25 @@ struct ptrauth_keys_kernel {
|
||||
struct ptrauth_key apia;
|
||||
};
|
||||
|
||||
#define __ptrauth_key_install_nosync(k, v) \
|
||||
do { \
|
||||
struct ptrauth_key __pki_v = (v); \
|
||||
write_sysreg_s(__pki_v.lo, SYS_ ## k ## KEYLO_EL1); \
|
||||
write_sysreg_s(__pki_v.hi, SYS_ ## k ## KEYHI_EL1); \
|
||||
} while (0)
|
||||
|
||||
static inline void ptrauth_keys_install_user(struct ptrauth_keys_user *keys)
|
||||
{
|
||||
if (system_supports_address_auth()) {
|
||||
__ptrauth_key_install_nosync(APIB, keys->apib);
|
||||
__ptrauth_key_install_nosync(APDA, keys->apda);
|
||||
__ptrauth_key_install_nosync(APDB, keys->apdb);
|
||||
}
|
||||
|
||||
if (system_supports_generic_auth())
|
||||
__ptrauth_key_install_nosync(APGA, keys->apga);
|
||||
}
|
||||
|
||||
static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys)
|
||||
{
|
||||
if (system_supports_address_auth()) {
|
||||
@ -45,14 +68,9 @@ static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys)
|
||||
|
||||
if (system_supports_generic_auth())
|
||||
get_random_bytes(&keys->apga, sizeof(keys->apga));
|
||||
}
|
||||
|
||||
#define __ptrauth_key_install_nosync(k, v) \
|
||||
do { \
|
||||
struct ptrauth_key __pki_v = (v); \
|
||||
write_sysreg_s(__pki_v.lo, SYS_ ## k ## KEYLO_EL1); \
|
||||
write_sysreg_s(__pki_v.hi, SYS_ ## k ## KEYHI_EL1); \
|
||||
} while (0)
|
||||
ptrauth_keys_install_user(keys);
|
||||
}
|
||||
|
||||
static __always_inline void ptrauth_keys_init_kernel(struct ptrauth_keys_kernel *keys)
|
||||
{
|
||||
@ -71,6 +89,10 @@ static __always_inline void ptrauth_keys_switch_kernel(struct ptrauth_keys_kerne
|
||||
|
||||
extern int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg);
|
||||
|
||||
extern int ptrauth_set_enabled_keys(struct task_struct *tsk, unsigned long keys,
|
||||
unsigned long enabled);
|
||||
extern int ptrauth_get_enabled_keys(struct task_struct *tsk);
|
||||
|
||||
static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr)
|
||||
{
|
||||
return ptrauth_clear_pac(ptr);
|
||||
@ -85,8 +107,23 @@ static __always_inline void ptrauth_enable(void)
|
||||
isb();
|
||||
}
|
||||
|
||||
#define ptrauth_thread_init_user(tsk) \
|
||||
ptrauth_keys_init_user(&(tsk)->thread.keys_user)
|
||||
#define ptrauth_suspend_exit() \
|
||||
ptrauth_keys_install_user(¤t->thread.keys_user)
|
||||
|
||||
#define ptrauth_thread_init_user() \
|
||||
do { \
|
||||
ptrauth_keys_init_user(¤t->thread.keys_user); \
|
||||
\
|
||||
/* enable all keys */ \
|
||||
if (system_supports_address_auth()) \
|
||||
ptrauth_set_enabled_keys(current, \
|
||||
PR_PAC_ENABLED_KEYS_MASK, \
|
||||
PR_PAC_ENABLED_KEYS_MASK); \
|
||||
} while (0)
|
||||
|
||||
#define ptrauth_thread_switch_user(tsk) \
|
||||
ptrauth_keys_install_user(&(tsk)->thread.keys_user)
|
||||
|
||||
#define ptrauth_thread_init_kernel(tsk) \
|
||||
ptrauth_keys_init_kernel(&(tsk)->thread.keys_kernel)
|
||||
#define ptrauth_thread_switch_kernel(tsk) \
|
||||
@ -95,9 +132,13 @@ static __always_inline void ptrauth_enable(void)
|
||||
#else /* CONFIG_ARM64_PTR_AUTH */
|
||||
#define ptrauth_enable()
|
||||
#define ptrauth_prctl_reset_keys(tsk, arg) (-EINVAL)
|
||||
#define ptrauth_set_enabled_keys(tsk, keys, enabled) (-EINVAL)
|
||||
#define ptrauth_get_enabled_keys(tsk) (-EINVAL)
|
||||
#define ptrauth_strip_insn_pac(lr) (lr)
|
||||
#define ptrauth_thread_init_user(tsk)
|
||||
#define ptrauth_suspend_exit()
|
||||
#define ptrauth_thread_init_user()
|
||||
#define ptrauth_thread_init_kernel(tsk)
|
||||
#define ptrauth_thread_switch_user(tsk)
|
||||
#define ptrauth_thread_switch_kernel(tsk)
|
||||
#endif /* CONFIG_ARM64_PTR_AUTH */
|
||||
|
||||
|
@ -19,6 +19,12 @@
|
||||
*/
|
||||
#define NET_IP_ALIGN 0
|
||||
|
||||
#define MTE_CTRL_GCR_USER_EXCL_SHIFT 0
|
||||
#define MTE_CTRL_GCR_USER_EXCL_MASK 0xffff
|
||||
|
||||
#define MTE_CTRL_TCF_SYNC (1UL << 16)
|
||||
#define MTE_CTRL_TCF_ASYNC (1UL << 17)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/build_bug.h>
|
||||
@ -156,12 +162,14 @@ struct thread_struct {
|
||||
struct ptrauth_keys_kernel keys_kernel;
|
||||
#endif
|
||||
#ifdef CONFIG_ARM64_MTE
|
||||
u64 gcr_user_excl;
|
||||
u64 mte_ctrl;
|
||||
#endif
|
||||
u64 sctlr_user;
|
||||
};
|
||||
|
||||
#define SCTLR_USER_MASK SCTLR_EL1_TCF0_MASK
|
||||
#define SCTLR_USER_MASK \
|
||||
(SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | SCTLR_ELx_ENDA | SCTLR_ELx_ENDB | \
|
||||
SCTLR_EL1_TCF0_MASK)
|
||||
|
||||
static inline void arch_thread_struct_whitelist(unsigned long *offset,
|
||||
unsigned long *size)
|
||||
@ -254,7 +262,7 @@ extern void release_thread(struct task_struct *);
|
||||
|
||||
unsigned long get_wchan(struct task_struct *p);
|
||||
|
||||
void set_task_sctlr_el1(u64 sctlr);
|
||||
void update_sctlr_el1(u64 sctlr);
|
||||
|
||||
/* Thread switching */
|
||||
extern struct task_struct *cpu_switch_to(struct task_struct *prev,
|
||||
@ -310,6 +318,11 @@ extern void __init minsigstksz_setup(void);
|
||||
/* PR_PAC_RESET_KEYS prctl */
|
||||
#define PAC_RESET_KEYS(tsk, arg) ptrauth_prctl_reset_keys(tsk, arg)
|
||||
|
||||
/* PR_PAC_{SET,GET}_ENABLED_KEYS prctl */
|
||||
#define PAC_SET_ENABLED_KEYS(tsk, keys, enabled) \
|
||||
ptrauth_set_enabled_keys(tsk, keys, enabled)
|
||||
#define PAC_GET_ENABLED_KEYS(tsk) ptrauth_get_enabled_keys(tsk)
|
||||
|
||||
#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
|
||||
/* PR_{SET,GET}_TAGGED_ADDR_CTRL prctl */
|
||||
long set_tagged_addr_ctrl(struct task_struct *task, unsigned long arg);
|
||||
|
@ -610,8 +610,10 @@
|
||||
#define SCTLR_ELx_TCF_ASYNC (UL(0x2) << SCTLR_ELx_TCF_SHIFT)
|
||||
#define SCTLR_ELx_TCF_MASK (UL(0x3) << SCTLR_ELx_TCF_SHIFT)
|
||||
|
||||
#define SCTLR_ELx_ENIA_SHIFT 31
|
||||
|
||||
#define SCTLR_ELx_ITFSB (BIT(37))
|
||||
#define SCTLR_ELx_ENIA (BIT(31))
|
||||
#define SCTLR_ELx_ENIA (BIT(SCTLR_ELx_ENIA_SHIFT))
|
||||
#define SCTLR_ELx_ENIB (BIT(30))
|
||||
#define SCTLR_ELx_ENDA (BIT(27))
|
||||
#define SCTLR_ELx_EE (BIT(25))
|
||||
|
@ -44,12 +44,13 @@ int main(void)
|
||||
#endif
|
||||
BLANK();
|
||||
DEFINE(THREAD_CPU_CONTEXT, offsetof(struct task_struct, thread.cpu_context));
|
||||
DEFINE(THREAD_SCTLR_USER, offsetof(struct task_struct, thread.sctlr_user));
|
||||
#ifdef CONFIG_ARM64_PTR_AUTH
|
||||
DEFINE(THREAD_KEYS_USER, offsetof(struct task_struct, thread.keys_user));
|
||||
DEFINE(THREAD_KEYS_KERNEL, offsetof(struct task_struct, thread.keys_kernel));
|
||||
#endif
|
||||
#ifdef CONFIG_ARM64_MTE
|
||||
DEFINE(THREAD_GCR_EL1_USER, offsetof(struct task_struct, thread.gcr_user_excl));
|
||||
DEFINE(THREAD_MTE_CTRL, offsetof(struct task_struct, thread.mte_ctrl));
|
||||
#endif
|
||||
BLANK();
|
||||
DEFINE(S_X0, offsetof(struct pt_regs, regs[0]));
|
||||
@ -153,10 +154,6 @@ int main(void)
|
||||
#endif
|
||||
#ifdef CONFIG_ARM64_PTR_AUTH
|
||||
DEFINE(PTRAUTH_USER_KEY_APIA, offsetof(struct ptrauth_keys_user, apia));
|
||||
DEFINE(PTRAUTH_USER_KEY_APIB, offsetof(struct ptrauth_keys_user, apib));
|
||||
DEFINE(PTRAUTH_USER_KEY_APDA, offsetof(struct ptrauth_keys_user, apda));
|
||||
DEFINE(PTRAUTH_USER_KEY_APDB, offsetof(struct ptrauth_keys_user, apdb));
|
||||
DEFINE(PTRAUTH_USER_KEY_APGA, offsetof(struct ptrauth_keys_user, apga));
|
||||
DEFINE(PTRAUTH_KERNEL_KEY_APIA, offsetof(struct ptrauth_keys_kernel, apia));
|
||||
BLANK();
|
||||
#endif
|
||||
|
@ -148,42 +148,46 @@ alternative_cb_end
|
||||
.endm
|
||||
|
||||
/* Check for MTE asynchronous tag check faults */
|
||||
.macro check_mte_async_tcf, tmp, ti_flags
|
||||
.macro check_mte_async_tcf, tmp, ti_flags, thread_sctlr
|
||||
#ifdef CONFIG_ARM64_MTE
|
||||
.arch_extension lse
|
||||
alternative_if_not ARM64_MTE
|
||||
b 1f
|
||||
alternative_else_nop_endif
|
||||
/*
|
||||
* Asynchronous tag check faults are only possible in ASYNC (2) or
|
||||
* ASYM (3) modes. In each of these modes bit 1 of SCTLR_EL1.TCF0 is
|
||||
* set, so skip the check if it is unset.
|
||||
*/
|
||||
tbz \thread_sctlr, #(SCTLR_EL1_TCF0_SHIFT + 1), 1f
|
||||
mrs_s \tmp, SYS_TFSRE0_EL1
|
||||
tbz \tmp, #SYS_TFSR_EL1_TF0_SHIFT, 1f
|
||||
/* Asynchronous TCF occurred for TTBR0 access, set the TI flag */
|
||||
mov \tmp, #_TIF_MTE_ASYNC_FAULT
|
||||
add \ti_flags, tsk, #TSK_TI_FLAGS
|
||||
stset \tmp, [\ti_flags]
|
||||
msr_s SYS_TFSRE0_EL1, xzr
|
||||
1:
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/* Clear the MTE asynchronous tag check faults */
|
||||
.macro clear_mte_async_tcf
|
||||
.macro clear_mte_async_tcf thread_sctlr
|
||||
#ifdef CONFIG_ARM64_MTE
|
||||
alternative_if ARM64_MTE
|
||||
/* See comment in check_mte_async_tcf above. */
|
||||
tbz \thread_sctlr, #(SCTLR_EL1_TCF0_SHIFT + 1), 1f
|
||||
dsb ish
|
||||
msr_s SYS_TFSRE0_EL1, xzr
|
||||
1:
|
||||
alternative_else_nop_endif
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro mte_set_gcr, tmp, tmp2
|
||||
.macro mte_set_gcr, mte_ctrl, tmp
|
||||
#ifdef CONFIG_ARM64_MTE
|
||||
/*
|
||||
* Calculate and set the exclude mask preserving
|
||||
* the RRND (bit[16]) setting.
|
||||
*/
|
||||
mrs_s \tmp2, SYS_GCR_EL1
|
||||
bfi \tmp2, \tmp, #0, #16
|
||||
msr_s SYS_GCR_EL1, \tmp2
|
||||
ubfx \tmp, \mte_ctrl, #MTE_CTRL_GCR_USER_EXCL_SHIFT, #16
|
||||
orr \tmp, \tmp, #SYS_GCR_EL1_RRND
|
||||
msr_s SYS_GCR_EL1, \tmp
|
||||
#endif
|
||||
.endm
|
||||
|
||||
@ -195,7 +199,6 @@ alternative_else_nop_endif
|
||||
ldr_l \tmp, gcr_kernel_excl
|
||||
|
||||
mte_set_gcr \tmp, \tmp2
|
||||
isb
|
||||
1:
|
||||
#endif
|
||||
.endm
|
||||
@ -205,7 +208,7 @@ alternative_else_nop_endif
|
||||
alternative_if_not ARM64_MTE
|
||||
b 1f
|
||||
alternative_else_nop_endif
|
||||
ldr \tmp, [\tsk, #THREAD_GCR_EL1_USER]
|
||||
ldr \tmp, [\tsk, #THREAD_MTE_CTRL]
|
||||
|
||||
mte_set_gcr \tmp, \tmp2
|
||||
1:
|
||||
@ -246,13 +249,48 @@ alternative_else_nop_endif
|
||||
disable_step_tsk x19, x20
|
||||
|
||||
/* Check for asynchronous tag check faults in user space */
|
||||
check_mte_async_tcf x22, x23
|
||||
ldr x0, [tsk, THREAD_SCTLR_USER]
|
||||
check_mte_async_tcf x22, x23, x0
|
||||
|
||||
#ifdef CONFIG_ARM64_PTR_AUTH
|
||||
alternative_if ARM64_HAS_ADDRESS_AUTH
|
||||
/*
|
||||
* Enable IA for in-kernel PAC if the task had it disabled. Although
|
||||
* this could be implemented with an unconditional MRS which would avoid
|
||||
* a load, this was measured to be slower on Cortex-A75 and Cortex-A76.
|
||||
*
|
||||
* Install the kernel IA key only if IA was enabled in the task. If IA
|
||||
* was disabled on kernel exit then we would have left the kernel IA
|
||||
* installed so there is no need to install it again.
|
||||
*/
|
||||
tbz x0, SCTLR_ELx_ENIA_SHIFT, 1f
|
||||
__ptrauth_keys_install_kernel_nosync tsk, x20, x22, x23
|
||||
b 2f
|
||||
1:
|
||||
mrs x0, sctlr_el1
|
||||
orr x0, x0, SCTLR_ELx_ENIA
|
||||
msr sctlr_el1, x0
|
||||
2:
|
||||
alternative_else_nop_endif
|
||||
#endif
|
||||
|
||||
apply_ssbd 1, x22, x23
|
||||
|
||||
ptrauth_keys_install_kernel tsk, x20, x22, x23
|
||||
|
||||
mte_set_kernel_gcr x22, x23
|
||||
|
||||
/*
|
||||
* Any non-self-synchronizing system register updates required for
|
||||
* kernel entry should be placed before this point.
|
||||
*/
|
||||
alternative_if ARM64_MTE
|
||||
isb
|
||||
b 1f
|
||||
alternative_else_nop_endif
|
||||
alternative_if ARM64_HAS_ADDRESS_AUTH
|
||||
isb
|
||||
alternative_else_nop_endif
|
||||
1:
|
||||
|
||||
scs_load tsk, x20
|
||||
.else
|
||||
add x21, sp, #S_FRAME_SIZE
|
||||
@ -367,8 +405,29 @@ alternative_else_nop_endif
|
||||
3:
|
||||
scs_save tsk, x0
|
||||
|
||||
/* No kernel C function calls after this as user keys are set. */
|
||||
ptrauth_keys_install_user tsk, x0, x1, x2
|
||||
/* Ignore asynchronous tag check faults in the uaccess routines */
|
||||
ldr x0, [tsk, THREAD_SCTLR_USER]
|
||||
clear_mte_async_tcf x0
|
||||
|
||||
#ifdef CONFIG_ARM64_PTR_AUTH
|
||||
alternative_if ARM64_HAS_ADDRESS_AUTH
|
||||
/*
|
||||
* IA was enabled for in-kernel PAC. Disable it now if needed, or
|
||||
* alternatively install the user's IA. All other per-task keys and
|
||||
* SCTLR bits were updated on task switch.
|
||||
*
|
||||
* No kernel C function calls after this.
|
||||
*/
|
||||
tbz x0, SCTLR_ELx_ENIA_SHIFT, 1f
|
||||
__ptrauth_keys_install_user tsk, x0, x1, x2
|
||||
b 2f
|
||||
1:
|
||||
mrs x0, sctlr_el1
|
||||
bic x0, x0, SCTLR_ELx_ENIA
|
||||
msr sctlr_el1, x0
|
||||
2:
|
||||
alternative_else_nop_endif
|
||||
#endif
|
||||
|
||||
mte_set_user_gcr tsk, x0, x1
|
||||
|
||||
@ -784,8 +843,6 @@ SYM_CODE_START_LOCAL(ret_to_user)
|
||||
cbnz x2, work_pending
|
||||
finish_ret_to_user:
|
||||
user_enter_irqoff
|
||||
/* Ignore asynchronous tag check faults in the uaccess routines */
|
||||
clear_mte_async_tcf
|
||||
enable_step_tsk x19, x2
|
||||
#ifdef CONFIG_GCC_PLUGIN_STACKLEAK
|
||||
bl stackleak_erase
|
||||
|
@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/prctl.h>
|
||||
@ -26,6 +27,8 @@ u64 gcr_kernel_excl __ro_after_init;
|
||||
|
||||
static bool report_fault_once = true;
|
||||
|
||||
static DEFINE_PER_CPU_READ_MOSTLY(u64, mte_tcf_preferred);
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
/* Whether the MTE asynchronous mode is enabled. */
|
||||
DEFINE_STATIC_KEY_FALSE(mte_async_mode);
|
||||
@ -197,17 +200,29 @@ static void update_gcr_el1_excl(u64 excl)
|
||||
sysreg_clear_set_s(SYS_GCR_EL1, SYS_GCR_EL1_EXCL_MASK, excl);
|
||||
}
|
||||
|
||||
static void set_gcr_el1_excl(u64 excl)
|
||||
static void mte_update_sctlr_user(struct task_struct *task)
|
||||
{
|
||||
current->thread.gcr_user_excl = excl;
|
||||
|
||||
/*
|
||||
* SYS_GCR_EL1 will be set to current->thread.gcr_user_excl value
|
||||
* by mte_set_user_gcr() in kernel_exit,
|
||||
* This must be called with preemption disabled and can only be called
|
||||
* on the current or next task since the CPU must match where the thread
|
||||
* is going to run. The caller is responsible for calling
|
||||
* update_sctlr_el1() later in the same preemption disabled block.
|
||||
*/
|
||||
unsigned long sctlr = task->thread.sctlr_user;
|
||||
unsigned long mte_ctrl = task->thread.mte_ctrl;
|
||||
unsigned long pref, resolved_mte_tcf;
|
||||
|
||||
pref = __this_cpu_read(mte_tcf_preferred);
|
||||
resolved_mte_tcf = (mte_ctrl & pref) ? pref : mte_ctrl;
|
||||
sctlr &= ~SCTLR_EL1_TCF0_MASK;
|
||||
if (resolved_mte_tcf & MTE_CTRL_TCF_ASYNC)
|
||||
sctlr |= SCTLR_EL1_TCF0_ASYNC;
|
||||
else if (resolved_mte_tcf & MTE_CTRL_TCF_SYNC)
|
||||
sctlr |= SCTLR_EL1_TCF0_SYNC;
|
||||
task->thread.sctlr_user = sctlr;
|
||||
}
|
||||
|
||||
void flush_mte_state(void)
|
||||
void mte_thread_init_user(void)
|
||||
{
|
||||
if (!system_supports_mte())
|
||||
return;
|
||||
@ -216,15 +231,14 @@ void flush_mte_state(void)
|
||||
dsb(ish);
|
||||
write_sysreg_s(0, SYS_TFSRE0_EL1);
|
||||
clear_thread_flag(TIF_MTE_ASYNC_FAULT);
|
||||
/* disable tag checking */
|
||||
set_task_sctlr_el1((current->thread.sctlr_user & ~SCTLR_EL1_TCF0_MASK) |
|
||||
SCTLR_EL1_TCF0_NONE);
|
||||
/* reset tag generation mask */
|
||||
set_gcr_el1_excl(SYS_GCR_EL1_EXCL_MASK);
|
||||
/* disable tag checking and reset tag generation mask */
|
||||
set_mte_ctrl(current, 0);
|
||||
}
|
||||
|
||||
void mte_thread_switch(struct task_struct *next)
|
||||
{
|
||||
mte_update_sctlr_user(next);
|
||||
|
||||
/*
|
||||
* Check if an async tag exception occurred at EL1.
|
||||
*
|
||||
@ -262,33 +276,23 @@ void mte_suspend_exit(void)
|
||||
|
||||
long set_mte_ctrl(struct task_struct *task, unsigned long arg)
|
||||
{
|
||||
u64 sctlr = task->thread.sctlr_user & ~SCTLR_EL1_TCF0_MASK;
|
||||
u64 gcr_excl = ~((arg & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT) &
|
||||
SYS_GCR_EL1_EXCL_MASK;
|
||||
u64 mte_ctrl = (~((arg & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT) &
|
||||
SYS_GCR_EL1_EXCL_MASK) << MTE_CTRL_GCR_USER_EXCL_SHIFT;
|
||||
|
||||
if (!system_supports_mte())
|
||||
return 0;
|
||||
|
||||
switch (arg & PR_MTE_TCF_MASK) {
|
||||
case PR_MTE_TCF_NONE:
|
||||
sctlr |= SCTLR_EL1_TCF0_NONE;
|
||||
break;
|
||||
case PR_MTE_TCF_SYNC:
|
||||
sctlr |= SCTLR_EL1_TCF0_SYNC;
|
||||
break;
|
||||
case PR_MTE_TCF_ASYNC:
|
||||
sctlr |= SCTLR_EL1_TCF0_ASYNC;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
if (arg & PR_MTE_TCF_ASYNC)
|
||||
mte_ctrl |= MTE_CTRL_TCF_ASYNC;
|
||||
if (arg & PR_MTE_TCF_SYNC)
|
||||
mte_ctrl |= MTE_CTRL_TCF_SYNC;
|
||||
|
||||
if (task != current) {
|
||||
task->thread.sctlr_user = sctlr;
|
||||
task->thread.gcr_user_excl = gcr_excl;
|
||||
} else {
|
||||
set_task_sctlr_el1(sctlr);
|
||||
set_gcr_el1_excl(gcr_excl);
|
||||
task->thread.mte_ctrl = mte_ctrl;
|
||||
if (task == current) {
|
||||
preempt_disable();
|
||||
mte_update_sctlr_user(task);
|
||||
update_sctlr_el1(task->thread.sctlr_user);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -297,24 +301,18 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg)
|
||||
long get_mte_ctrl(struct task_struct *task)
|
||||
{
|
||||
unsigned long ret;
|
||||
u64 incl = ~task->thread.gcr_user_excl & SYS_GCR_EL1_EXCL_MASK;
|
||||
u64 mte_ctrl = task->thread.mte_ctrl;
|
||||
u64 incl = (~mte_ctrl >> MTE_CTRL_GCR_USER_EXCL_SHIFT) &
|
||||
SYS_GCR_EL1_EXCL_MASK;
|
||||
|
||||
if (!system_supports_mte())
|
||||
return 0;
|
||||
|
||||
ret = incl << PR_MTE_TAG_SHIFT;
|
||||
|
||||
switch (task->thread.sctlr_user & SCTLR_EL1_TCF0_MASK) {
|
||||
case SCTLR_EL1_TCF0_NONE:
|
||||
ret |= PR_MTE_TCF_NONE;
|
||||
break;
|
||||
case SCTLR_EL1_TCF0_SYNC:
|
||||
ret |= PR_MTE_TCF_SYNC;
|
||||
break;
|
||||
case SCTLR_EL1_TCF0_ASYNC:
|
||||
if (mte_ctrl & MTE_CTRL_TCF_ASYNC)
|
||||
ret |= PR_MTE_TCF_ASYNC;
|
||||
break;
|
||||
}
|
||||
if (mte_ctrl & MTE_CTRL_TCF_SYNC)
|
||||
ret |= PR_MTE_TCF_SYNC;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -453,3 +451,54 @@ int mte_ptrace_copy_tags(struct task_struct *child, long request,
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t mte_tcf_preferred_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
switch (per_cpu(mte_tcf_preferred, dev->id)) {
|
||||
case MTE_CTRL_TCF_ASYNC:
|
||||
return sysfs_emit(buf, "async\n");
|
||||
case MTE_CTRL_TCF_SYNC:
|
||||
return sysfs_emit(buf, "sync\n");
|
||||
default:
|
||||
return sysfs_emit(buf, "???\n");
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t mte_tcf_preferred_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
u64 tcf;
|
||||
|
||||
if (sysfs_streq(buf, "async"))
|
||||
tcf = MTE_CTRL_TCF_ASYNC;
|
||||
else if (sysfs_streq(buf, "sync"))
|
||||
tcf = MTE_CTRL_TCF_SYNC;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
device_lock(dev);
|
||||
per_cpu(mte_tcf_preferred, dev->id) = tcf;
|
||||
device_unlock(dev);
|
||||
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR_RW(mte_tcf_preferred);
|
||||
|
||||
static int register_mte_tcf_preferred_sysctl(void)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
if (!system_supports_mte())
|
||||
return 0;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
per_cpu(mte_tcf_preferred, cpu) = MTE_CTRL_TCF_ASYNC;
|
||||
device_create_file(get_cpu_device(cpu),
|
||||
&dev_attr_mte_tcf_preferred);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(register_mte_tcf_preferred_sysctl);
|
||||
|
@ -43,6 +43,71 @@ int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg)
|
||||
get_random_bytes(&keys->apdb, sizeof(keys->apdb));
|
||||
if (arg & PR_PAC_APGAKEY)
|
||||
get_random_bytes(&keys->apga, sizeof(keys->apga));
|
||||
ptrauth_keys_install_user(keys);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u64 arg_to_enxx_mask(unsigned long arg)
|
||||
{
|
||||
u64 sctlr_enxx_mask = 0;
|
||||
|
||||
WARN_ON(arg & ~PR_PAC_ENABLED_KEYS_MASK);
|
||||
if (arg & PR_PAC_APIAKEY)
|
||||
sctlr_enxx_mask |= SCTLR_ELx_ENIA;
|
||||
if (arg & PR_PAC_APIBKEY)
|
||||
sctlr_enxx_mask |= SCTLR_ELx_ENIB;
|
||||
if (arg & PR_PAC_APDAKEY)
|
||||
sctlr_enxx_mask |= SCTLR_ELx_ENDA;
|
||||
if (arg & PR_PAC_APDBKEY)
|
||||
sctlr_enxx_mask |= SCTLR_ELx_ENDB;
|
||||
return sctlr_enxx_mask;
|
||||
}
|
||||
|
||||
int ptrauth_set_enabled_keys(struct task_struct *tsk, unsigned long keys,
|
||||
unsigned long enabled)
|
||||
{
|
||||
u64 sctlr;
|
||||
|
||||
if (!system_supports_address_auth())
|
||||
return -EINVAL;
|
||||
|
||||
if (is_compat_thread(task_thread_info(tsk)))
|
||||
return -EINVAL;
|
||||
|
||||
if ((keys & ~PR_PAC_ENABLED_KEYS_MASK) || (enabled & ~keys))
|
||||
return -EINVAL;
|
||||
|
||||
preempt_disable();
|
||||
sctlr = tsk->thread.sctlr_user;
|
||||
sctlr &= ~arg_to_enxx_mask(keys);
|
||||
sctlr |= arg_to_enxx_mask(enabled);
|
||||
tsk->thread.sctlr_user = sctlr;
|
||||
if (tsk == current)
|
||||
update_sctlr_el1(sctlr);
|
||||
preempt_enable();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ptrauth_get_enabled_keys(struct task_struct *tsk)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
if (!system_supports_address_auth())
|
||||
return -EINVAL;
|
||||
|
||||
if (is_compat_thread(task_thread_info(tsk)))
|
||||
return -EINVAL;
|
||||
|
||||
if (tsk->thread.sctlr_user & SCTLR_ELx_ENIA)
|
||||
retval |= PR_PAC_APIAKEY;
|
||||
if (tsk->thread.sctlr_user & SCTLR_ELx_ENIB)
|
||||
retval |= PR_PAC_APIBKEY;
|
||||
if (tsk->thread.sctlr_user & SCTLR_ELx_ENDA)
|
||||
retval |= PR_PAC_APDAKEY;
|
||||
if (tsk->thread.sctlr_user & SCTLR_ELx_ENDB)
|
||||
retval |= PR_PAC_APDBKEY;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -337,7 +337,6 @@ void flush_thread(void)
|
||||
tls_thread_flush();
|
||||
flush_ptrace_hw_breakpoint(current);
|
||||
flush_tagged_addr_state();
|
||||
flush_mte_state();
|
||||
}
|
||||
|
||||
void release_thread(struct task_struct *dead_task)
|
||||
@ -538,27 +537,24 @@ static void erratum_1418040_thread_switch(struct task_struct *prev,
|
||||
write_sysreg(val, cntkctl_el1);
|
||||
}
|
||||
|
||||
static void update_sctlr_el1(u64 sctlr)
|
||||
/*
|
||||
* __switch_to() checks current->thread.sctlr_user as an optimisation. Therefore
|
||||
* this function must be called with preemption disabled and the update to
|
||||
* sctlr_user must be made in the same preemption disabled block so that
|
||||
* __switch_to() does not see the variable update before the SCTLR_EL1 one.
|
||||
*/
|
||||
void update_sctlr_el1(u64 sctlr)
|
||||
{
|
||||
sysreg_clear_set(sctlr_el1, SCTLR_USER_MASK, sctlr);
|
||||
/*
|
||||
* EnIA must not be cleared while in the kernel as this is necessary for
|
||||
* in-kernel PAC. It will be cleared on kernel exit if needed.
|
||||
*/
|
||||
sysreg_clear_set(sctlr_el1, SCTLR_USER_MASK & ~SCTLR_ELx_ENIA, sctlr);
|
||||
|
||||
/* ISB required for the kernel uaccess routines when setting TCF0. */
|
||||
isb();
|
||||
}
|
||||
|
||||
void set_task_sctlr_el1(u64 sctlr)
|
||||
{
|
||||
/*
|
||||
* __switch_to() checks current->thread.sctlr as an
|
||||
* optimisation. Disable preemption so that it does not see
|
||||
* the variable update before the SCTLR_EL1 one.
|
||||
*/
|
||||
preempt_disable();
|
||||
current->thread.sctlr_user = sctlr;
|
||||
update_sctlr_el1(sctlr);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
* Thread switching.
|
||||
*/
|
||||
@ -575,6 +571,7 @@ __notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev,
|
||||
uao_thread_switch(next);
|
||||
ssbs_thread_switch(next);
|
||||
erratum_1418040_thread_switch(prev, next);
|
||||
ptrauth_thread_switch_user(next);
|
||||
/*
|
||||
* vendor hook is needed before the dsb(),
|
||||
* because MPAM is related to cache maintenance.
|
||||
@ -666,7 +663,8 @@ void arch_setup_new_exec(void)
|
||||
}
|
||||
|
||||
current->mm->context.flags = mmflags;
|
||||
ptrauth_thread_init_user(current);
|
||||
ptrauth_thread_init_user();
|
||||
mte_thread_init_user();
|
||||
|
||||
if (task_spec_ssb_noexec(current)) {
|
||||
arch_prctl_spec_ctrl_set(current, PR_SPEC_STORE_BYPASS,
|
||||
|
@ -908,6 +908,38 @@ static int pac_mask_get(struct task_struct *target,
|
||||
return membuf_write(&to, &uregs, sizeof(uregs));
|
||||
}
|
||||
|
||||
static int pac_enabled_keys_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
struct membuf to)
|
||||
{
|
||||
long enabled_keys = ptrauth_get_enabled_keys(target);
|
||||
|
||||
if (IS_ERR_VALUE(enabled_keys))
|
||||
return enabled_keys;
|
||||
|
||||
return membuf_write(&to, &enabled_keys, sizeof(enabled_keys));
|
||||
}
|
||||
|
||||
static int pac_enabled_keys_set(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int ret;
|
||||
long enabled_keys = ptrauth_get_enabled_keys(target);
|
||||
|
||||
if (IS_ERR_VALUE(enabled_keys))
|
||||
return enabled_keys;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &enabled_keys, 0,
|
||||
sizeof(long));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ptrauth_set_enabled_keys(target, PR_PAC_ENABLED_KEYS_MASK,
|
||||
enabled_keys);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CHECKPOINT_RESTORE
|
||||
static __uint128_t pac_key_to_user(const struct ptrauth_key *key)
|
||||
{
|
||||
@ -1073,6 +1105,7 @@ enum aarch64_regset {
|
||||
#endif
|
||||
#ifdef CONFIG_ARM64_PTR_AUTH
|
||||
REGSET_PAC_MASK,
|
||||
REGSET_PAC_ENABLED_KEYS,
|
||||
#ifdef CONFIG_CHECKPOINT_RESTORE
|
||||
REGSET_PACA_KEYS,
|
||||
REGSET_PACG_KEYS,
|
||||
@ -1159,6 +1192,14 @@ static const struct user_regset aarch64_regsets[] = {
|
||||
.regset_get = pac_mask_get,
|
||||
/* this cannot be set dynamically */
|
||||
},
|
||||
[REGSET_PAC_ENABLED_KEYS] = {
|
||||
.core_note_type = NT_ARM_PAC_ENABLED_KEYS,
|
||||
.n = 1,
|
||||
.size = sizeof(long),
|
||||
.align = sizeof(long),
|
||||
.regset_get = pac_enabled_keys_get,
|
||||
.set = pac_enabled_keys_set,
|
||||
},
|
||||
#ifdef CONFIG_CHECKPOINT_RESTORE
|
||||
[REGSET_PACA_KEYS] = {
|
||||
.core_note_type = NT_ARM_PACA_KEYS,
|
||||
|
@ -75,8 +75,9 @@ void notrace __cpu_suspend_exit(void)
|
||||
*/
|
||||
spectre_v4_enable_mitigation(NULL);
|
||||
|
||||
/* Restore additional MTE-specific configuration */
|
||||
/* Restore additional feature-specific configuration */
|
||||
mte_suspend_exit();
|
||||
ptrauth_suspend_exit();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -17,6 +17,7 @@ CONFIG_IKHEADERS=y
|
||||
CONFIG_UCLAMP_TASK=y
|
||||
CONFIG_UCLAMP_BUCKETS_COUNT=20
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_MEMCG=y
|
||||
CONFIG_BLK_CGROUP=y
|
||||
CONFIG_CGROUP_SCHED=y
|
||||
CONFIG_UCLAMP_TASK_GROUP=y
|
||||
@ -53,7 +54,7 @@ CONFIG_PARAVIRT=y
|
||||
CONFIG_NR_CPUS=32
|
||||
CONFIG_EFI=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="stack_depot_disable=on cgroup_disable=pressure"
|
||||
CONFIG_CMDLINE="stack_depot_disable=on cgroup_disable=pressure cgroup.memory=nokmem"
|
||||
CONFIG_PM_WAKELOCKS=y
|
||||
CONFIG_PM_WAKELOCKS_LIMIT=0
|
||||
# CONFIG_PM_WAKELOCKS_GC is not set
|
||||
@ -233,6 +234,7 @@ CONFIG_NET_ACT_GACT=y
|
||||
CONFIG_NET_ACT_MIRRED=y
|
||||
CONFIG_NET_ACT_SKBEDIT=y
|
||||
CONFIG_VSOCKETS=y
|
||||
CONFIG_CGROUP_NET_PRIO=y
|
||||
CONFIG_BPF_JIT=y
|
||||
CONFIG_CAN=y
|
||||
CONFIG_BT=y
|
||||
|
@ -4499,7 +4499,7 @@ static struct bfq_queue *bfq_select_queue(struct bfq_data *bfqd)
|
||||
bfqq = bfqq->bic->bfqq[0];
|
||||
else if (bfq_bfqq_has_waker(bfqq) &&
|
||||
bfq_bfqq_busy(bfqq->waker_bfqq) &&
|
||||
bfqq->next_rq &&
|
||||
bfqq->waker_bfqq->next_rq &&
|
||||
bfq_serv_to_charge(bfqq->waker_bfqq->next_rq,
|
||||
bfqq->waker_bfqq) <=
|
||||
bfq_bfqq_budget_left(bfqq->waker_bfqq)
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include <linux/bio.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/blk-mq.h>
|
||||
#include <linux/blk-pm.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pagemap.h>
|
||||
@ -441,8 +440,7 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)
|
||||
* responsible for ensuring that that counter is
|
||||
* globally visible before the queue is unfrozen.
|
||||
*/
|
||||
if ((pm && queue_rpm_status(q) != RPM_SUSPENDED) ||
|
||||
!blk_queue_pm_only(q)) {
|
||||
if (pm || !blk_queue_pm_only(q)) {
|
||||
success = true;
|
||||
} else {
|
||||
percpu_ref_put(&q->q_usage_counter);
|
||||
@ -467,7 +465,8 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)
|
||||
|
||||
wait_event(q->mq_freeze_wq,
|
||||
(!q->mq_freeze_depth &&
|
||||
blk_pm_resume_queue(pm, q)) ||
|
||||
(pm || (blk_pm_request_resume(q),
|
||||
!blk_queue_pm_only(q)))) ||
|
||||
blk_queue_dying(q));
|
||||
if (blk_queue_dying(q))
|
||||
return -ENODEV;
|
||||
|
@ -41,6 +41,8 @@
|
||||
#include "blk-mq-sched.h"
|
||||
#include "blk-rq-qos.h"
|
||||
|
||||
#include <trace/hooks/block.h>
|
||||
|
||||
static DEFINE_PER_CPU(struct list_head, blk_cpu_done);
|
||||
|
||||
static void blk_mq_poll_stats_start(struct request_queue *q);
|
||||
@ -341,6 +343,7 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data,
|
||||
}
|
||||
|
||||
data->hctx->queued++;
|
||||
trace_android_vh_blk_rq_ctx_init(rq, tags, data, alloc_time_ns);
|
||||
return rq;
|
||||
}
|
||||
|
||||
@ -2483,6 +2486,7 @@ int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
|
||||
*/
|
||||
rq_size = round_up(sizeof(struct request) + set->cmd_size,
|
||||
cache_line_size());
|
||||
trace_android_vh_blk_alloc_rqs(&rq_size, set, tags);
|
||||
left = rq_size * depth;
|
||||
|
||||
for (i = 0; i < depth; ) {
|
||||
|
@ -6,14 +6,11 @@
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static inline int blk_pm_resume_queue(const bool pm, struct request_queue *q)
|
||||
static inline void blk_pm_request_resume(struct request_queue *q)
|
||||
{
|
||||
if (!q->dev || !blk_queue_pm_only(q))
|
||||
return 1; /* Nothing to do */
|
||||
if (pm && q->rpm_status != RPM_SUSPENDED)
|
||||
return 1; /* Request allowed */
|
||||
pm_request_resume(q->dev);
|
||||
return 0;
|
||||
if (q->dev && (q->rpm_status == RPM_SUSPENDED ||
|
||||
q->rpm_status == RPM_SUSPENDING))
|
||||
pm_request_resume(q->dev);
|
||||
}
|
||||
|
||||
static inline void blk_pm_mark_last_busy(struct request *rq)
|
||||
@ -47,9 +44,8 @@ static inline void blk_pm_put_request(struct request *rq)
|
||||
--rq->q->nr_pending;
|
||||
}
|
||||
#else
|
||||
static inline int blk_pm_resume_queue(const bool pm, struct request_queue *q)
|
||||
static inline void blk_pm_request_resume(struct request_queue *q)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void blk_pm_mark_last_busy(struct request *rq)
|
||||
|
@ -1,5 +1,5 @@
|
||||
BRANCH=android12-5.10
|
||||
KMI_GENERATION=8
|
||||
KMI_GENERATION=9
|
||||
|
||||
LLVM=1
|
||||
DEPMOD=depmod
|
||||
|
@ -15,6 +15,7 @@ android/abi_gki_aarch64_db845c
|
||||
android/abi_gki_aarch64_qcom
|
||||
android/abi_gki_aarch64_virtual_device
|
||||
android/abi_gki_aarch64_hikey960
|
||||
android/abi_gki_aarch64_galaxy
|
||||
android/abi_gki_aarch64_generic
|
||||
android/abi_gki_aarch64_exynos
|
||||
android/abi_gki_aarch64_exynosauto
|
||||
@ -22,6 +23,7 @@ android/abi_gki_aarch64_mtk
|
||||
android/abi_gki_aarch64_xiaomi
|
||||
android/abi_gki_aarch64_fips140
|
||||
android/abi_gki_aarch64_vivo
|
||||
android/abi_gki_aarch64_oplus
|
||||
"
|
||||
|
||||
FILES="${FILES}
|
||||
|
@ -32,13 +32,35 @@ config CRYPTO_FIPS
|
||||
certification. You should say no unless you know what
|
||||
this is.
|
||||
|
||||
# CRYPTO_FIPS140 just enables the support in the kernel for loading fips140.ko.
|
||||
# The module still needs to be built and loaded if you need FIPS 140 compliance.
|
||||
config CRYPTO_FIPS140
|
||||
def_bool y
|
||||
depends on MODULES && ARM64 && ARM64_MODULE_PLTS
|
||||
|
||||
config CRYPTO_FIPS140_MOD
|
||||
bool "Enable FIPS140 integrity self-checked loadable module"
|
||||
bool "Enable FIPS 140 cryptographic module"
|
||||
depends on LTO_CLANG && CRYPTO_FIPS140
|
||||
help
|
||||
This option enables building a loadable module fips140.ko, which
|
||||
contains various crypto algorithms that are also built into vmlinux.
|
||||
At load time, this module overrides the built-in implementations of
|
||||
these algorithms with its implementations. It also runs self-tests on
|
||||
these algorithms and verifies the integrity of its code and data. If
|
||||
either of these steps fails, the kernel will panic.
|
||||
|
||||
This module is intended to be loaded at early boot time in order to
|
||||
meet FIPS 140 and NIAP FPT_TST_EXT.1 requirements. It shouldn't be
|
||||
used if you don't need to meet these requirements.
|
||||
|
||||
config CRYPTO_FIPS140_MOD_ERROR_INJECTION
|
||||
bool "Support injecting failures into the FIPS 140 self-tests"
|
||||
depends on CRYPTO_FIPS140_MOD
|
||||
help
|
||||
This option adds a module parameter "broken_alg" to the fips140 module
|
||||
which can be used to fail the self-tests for a particular algorithm,
|
||||
causing a kernel panic. This option is for FIPS lab testing only, and
|
||||
it shouldn't be enabled on production systems.
|
||||
|
||||
config CRYPTO_ALGAPI
|
||||
tristate
|
||||
|
@ -228,7 +228,7 @@ $(obj)/lib-crypto-%-fips.o: $(srctree)/lib/crypto/%.c FORCE
|
||||
$(obj)/crypto-fips.a: $(addprefix $(obj)/,$(crypto-fips-objs)) FORCE
|
||||
$(call if_changed,ar_and_symver)
|
||||
|
||||
fips140-objs := fips140-module.o crypto-fips.a
|
||||
fips140-objs := fips140-module.o fips140-selftests.o crypto-fips.a
|
||||
obj-m += fips140.o
|
||||
|
||||
CFLAGS_fips140-module.o += $(FIPS140_CFLAGS)
|
||||
|
65
crypto/fips140-generated-testvecs.h
Normal file
65
crypto/fips140-generated-testvecs.h
Normal file
@ -0,0 +1,65 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright 2021 Google LLC */
|
||||
|
||||
/*
|
||||
* This header was automatically generated by gen_fips140_testvecs.py.
|
||||
* Don't edit it directly.
|
||||
*/
|
||||
|
||||
static const u8 fips_message[32] __initconst =
|
||||
"This is a 32-byte test message.";
|
||||
|
||||
static const u8 fips_aes_key[16] __initconst = "128-bit AES key";
|
||||
|
||||
static const u8 fips_aes_iv[16] __initconst = "ABCDEFGHIJKL";
|
||||
|
||||
static const u8 fips_aes_cbc_ciphertext[32] __initconst =
|
||||
"\xc4\x6d\xad\xa4\x04\x52\x11\x5a\x7a\xb3\x7c\x68\x85\x8d\x90\xf0"
|
||||
"\x55\xc3\xd3\x35\xc1\x75\x31\x90\xdf\x90\x4b\x5a\x56\xfd\xa7\x89";
|
||||
|
||||
static const u8 fips_aes_ecb_ciphertext[32] __initconst =
|
||||
"\xc1\x9d\xe6\xb8\xb2\x90\xff\xfe\xf2\x77\x18\xb0\x55\xd3\xee\xa9"
|
||||
"\xe2\x6f\x4a\x32\x67\xfd\xb7\xa5\x2f\x4b\x6e\x1a\x86\x2b\x6e\x3a";
|
||||
|
||||
static const u8 fips_aes_ctr_ciphertext[32] __initconst =
|
||||
"\x92\xbe\x23\xa1\x80\x88\x5d\x31\x27\xb3\x9c\x40\x58\x57\x1d\xde"
|
||||
"\xc1\x8d\x5b\xe7\x42\x93\x09\xf8\xd4\xf7\x49\x42\xcf\x40\x62\x7e";
|
||||
|
||||
static const u8 fips_aes_gcm_assoc[22] __initconst = "associated data string";
|
||||
|
||||
static const u8 fips_aes_gcm_ciphertext[48] __initconst =
|
||||
"\x37\x88\x3e\x1d\x58\x50\xda\x10\x07\xeb\x52\xdf\xea\x0a\x54\xd4"
|
||||
"\x44\xbf\x88\x2a\xf3\x03\x03\x84\xaf\x8b\x96\xbd\xea\x65\x60\x6f"
|
||||
"\x82\xfa\x51\xf4\x28\xad\x0c\xf1\xce\x0f\x91\xdd\x1a\x4c\x77\x5f";
|
||||
|
||||
static const u8 fips_aes_xts_key[32] __initconst =
|
||||
"This is an AES-128-XTS key.";
|
||||
|
||||
static const u8 fips_aes_xts_ciphertext[32] __initconst =
|
||||
"\x5e\xb9\x98\xd6\x26\xb3\x55\xbf\x44\xab\x3e\xae\x73\xc0\x81\xc9"
|
||||
"\xf4\x29\x0e\x17\x1e\xc5\xc8\x90\x79\x99\xf1\x43\x3a\x23\x08\x5a";
|
||||
|
||||
static const u8 fips_hmac_key[16] __initconst = "128-bit HMAC key";
|
||||
|
||||
static const u8 fips_sha1_digest[20] __initconst =
|
||||
"\x1b\x78\xc7\x4b\xd5\xd4\x83\xb1\x58\xc5\x96\x83\x4f\x16\x8d\x15"
|
||||
"\xb4\xaa\x22\x8c";
|
||||
|
||||
static const u8 fips_sha256_digest[32] __initconst =
|
||||
"\x4e\x11\x83\x0c\x53\x80\x1e\x5f\x9b\x38\x33\x38\xe8\x74\x43\xb0"
|
||||
"\xc1\x3a\xbe\xbf\x75\xf0\x12\x0f\x21\x33\xf5\x16\x33\xf1\xb0\x81";
|
||||
|
||||
static const u8 fips_hmac_sha256_digest[32] __initconst =
|
||||
"\x63\x0e\xb5\x73\x79\xfc\xaf\x5f\x86\xe3\xaf\xf0\xc8\x36\xef\xd5"
|
||||
"\x35\x8d\x40\x25\x38\xb3\x65\x72\x98\xf3\x59\xd8\x1e\x54\x4c\xa1";
|
||||
|
||||
static const u8 fips_sha512_digest[64] __initconst =
|
||||
"\x32\xe0\x44\x23\xbd\xe3\xec\x28\xbf\xf1\x34\x11\xd5\xae\xbf\xd5"
|
||||
"\xc0\x8e\xb5\xa1\x04\xef\x2f\x07\x84\xf1\xd9\x83\x0f\x6c\x31\xab"
|
||||
"\xf7\xe7\x57\xfa\xf7\xae\xf0\x6f\xb2\x16\x08\x32\xcf\xc7\xef\x35"
|
||||
"\xb3\x3b\x51\xb9\xfd\xe7\xff\x5e\xb2\x8b\xc6\x79\xe6\x14\x04\xb4";
|
||||
|
||||
/*
|
||||
* This header was automatically generated by gen_fips140_testvecs.py.
|
||||
* Don't edit it directly.
|
||||
*/
|
@ -3,16 +3,17 @@
|
||||
* Copyright 2021 Google LLC
|
||||
* Author: Ard Biesheuvel <ardb@google.com>
|
||||
*
|
||||
* This file is the core of the fips140.ko, which carries a number of crypto
|
||||
* algorithms and chaining mode templates that are also built into vmlinux.
|
||||
* This modules performs a load time integrity check, as mandated by FIPS 140,
|
||||
* and replaces registered crypto algorithms that appear on the FIPS 140 list
|
||||
* with ones provided by this module. This meets the FIPS 140 requirements for
|
||||
* a cryptographic software module.
|
||||
* This file is the core of fips140.ko, which contains various crypto algorithms
|
||||
* that are also built into vmlinux. At load time, this module overrides the
|
||||
* built-in implementations of these algorithms with its implementations. It
|
||||
* also runs self-tests on these algorithms and verifies the integrity of its
|
||||
* code and data. If either of these steps fails, the kernel will panic.
|
||||
*
|
||||
* This module is intended to be loaded at early boot time in order to meet
|
||||
* FIPS 140 and NIAP FPT_TST_EXT.1 requirements. It shouldn't be used if you
|
||||
* don't need to meet these requirements.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "fips140: " fmt
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/module.h>
|
||||
#include <crypto/aead.h>
|
||||
@ -23,8 +24,18 @@
|
||||
#include <crypto/rng.h>
|
||||
#include <trace/hooks/fips140.h>
|
||||
|
||||
#include "fips140-module.h"
|
||||
#include "internal.h"
|
||||
|
||||
/*
|
||||
* This option allows deliberately failing the self-tests for a particular
|
||||
* algorithm. This is for FIPS lab testing only.
|
||||
*/
|
||||
#ifdef CONFIG_CRYPTO_FIPS140_MOD_ERROR_INJECTION
|
||||
char *fips140_broken_alg;
|
||||
module_param_named(broken_alg, fips140_broken_alg, charp, 0);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* FIPS 140-2 prefers the use of HMAC with a public key over a plain hash.
|
||||
*/
|
||||
@ -52,6 +63,12 @@ const u32 *__initcall_start = &__initcall_start_marker;
|
||||
const u8 *__text_start = &__fips140_text_start;
|
||||
const u8 *__rodata_start = &__fips140_rodata_start;
|
||||
|
||||
/*
|
||||
* The list of the crypto API algorithms (by cra_name) that will be unregistered
|
||||
* by this module, in preparation for the module registering its own
|
||||
* implementation(s) of them. When adding a new algorithm here, make sure to
|
||||
* consider whether it needs a self-test added to fips140_selftests[] as well.
|
||||
*/
|
||||
static const char * const fips140_algorithms[] __initconst = {
|
||||
"aes",
|
||||
|
||||
@ -566,13 +583,16 @@ fips140_init(void)
|
||||
*/
|
||||
synchronize_rcu_tasks();
|
||||
|
||||
/* insert self tests here */
|
||||
if (!fips140_run_selftests())
|
||||
goto panic;
|
||||
|
||||
/*
|
||||
* It may seem backward to perform the integrity check last, but this
|
||||
* is intentional: the check itself uses hmac(sha256) which is one of
|
||||
* the algorithms that are replaced with versions from this module, and
|
||||
* the integrity check must use the replacement version.
|
||||
* the integrity check must use the replacement version. Also, to be
|
||||
* ready for FIPS 140-3, the integrity check algorithm must have already
|
||||
* been self-tested.
|
||||
*/
|
||||
|
||||
if (!check_fips140_module_hmac()) {
|
||||
|
20
crypto/fips140-module.h
Normal file
20
crypto/fips140-module.h
Normal file
@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright 2021 Google LLC
|
||||
*/
|
||||
|
||||
#ifndef _CRYPTO_FIPS140_MODULE_H
|
||||
#define _CRYPTO_FIPS140_MODULE_H
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#undef pr_fmt
|
||||
#define pr_fmt(fmt) "fips140: " fmt
|
||||
|
||||
#ifdef CONFIG_CRYPTO_FIPS140_MOD_ERROR_INJECTION
|
||||
extern char *fips140_broken_alg;
|
||||
#endif
|
||||
|
||||
bool __init __must_check fips140_run_selftests(void);
|
||||
|
||||
#endif /* _CRYPTO_FIPS140_MODULE_H */
|
867
crypto/fips140-selftests.c
Normal file
867
crypto/fips140-selftests.c
Normal file
@ -0,0 +1,867 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2021 Google LLC
|
||||
*
|
||||
* Authors: Elena Petrova <lenaptr@google.com>,
|
||||
* Eric Biggers <ebiggers@google.com>
|
||||
*
|
||||
* Self-tests of fips140.ko cryptographic functionality. These are run at
|
||||
* module load time to fulfill FIPS 140 and NIAP FPT_TST_EXT.1 requirements.
|
||||
*
|
||||
* The actual requirements for these self-tests are somewhat vague, but
|
||||
* section 9 ("Self-Tests") of the FIPS 140-2 Implementation Guidance document
|
||||
* (https://csrc.nist.gov/csrc/media/projects/cryptographic-module-validation-program/documents/fips140-2/fips1402ig.pdf)
|
||||
* is somewhat helpful. Basically, all implementations of all FIPS approved
|
||||
* algorithms (including modes of operation) must be tested. However:
|
||||
*
|
||||
* - If an implementation won't be used, it doesn't have to be tested. So
|
||||
* when multiple implementations of the same algorithm are registered with
|
||||
* the crypto API, we only have to test the default (highest-priority) one.
|
||||
*
|
||||
* - There are provisions for skipping tests that are already sufficiently
|
||||
* covered by other tests. E.g., HMAC-SHA256 may cover SHA-256.
|
||||
*
|
||||
* - Only one test vector is required per algorithm, and it can be generated
|
||||
* by any known-good implementation or taken from any official document.
|
||||
*
|
||||
* - For ciphers, both encryption and decryption must be tested.
|
||||
*
|
||||
* - Only one key size per algorithm needs to be tested.
|
||||
*
|
||||
* See fips140_selftests[] for the list of tests we've selected. Currently, all
|
||||
* our test vectors except the DRBG ones were generated by the script
|
||||
* tools/crypto/gen_fips140_testvecs.py, using the known-good implementations in
|
||||
* the Python packages hashlib, pycryptodome, and cryptography. The DRBG test
|
||||
* vectors were manually extracted from
|
||||
* https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/drbg/drbgtestvectors.zip.
|
||||
*
|
||||
* Note that we don't reuse the upstream crypto API's self-tests
|
||||
* (crypto/testmgr.{c,h}), for several reasons:
|
||||
*
|
||||
* - To meet FIPS requirements, the self-tests must be located within the FIPS
|
||||
* module boundary (fips140.ko). But testmgr is integrated into the crypto
|
||||
* API framework and can't be extracted into the module.
|
||||
*
|
||||
* - testmgr is much more heavyweight than required for FIPS and NIAP; it
|
||||
* tests more algorithms and does more tests per algorithm, as it's meant to
|
||||
* do proper testing and not just meet certification requirements. We need
|
||||
* tests that can run with minimal overhead on every boot-up.
|
||||
*
|
||||
* - Despite being more heavyweight in general, testmgr doesn't test the
|
||||
* SHA-256 and AES library APIs, despite that being needed here.
|
||||
*/
|
||||
#include <crypto/aead.h>
|
||||
#include <crypto/aes.h>
|
||||
#include <crypto/drbg.h>
|
||||
#include <crypto/hash.h>
|
||||
#include <crypto/internal/cipher.h>
|
||||
#include <crypto/rng.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/skcipher.h>
|
||||
|
||||
#include "fips140-module.h"
|
||||
|
||||
/* Test vector for a block cipher algorithm */
|
||||
struct blockcipher_testvec {
|
||||
const u8 *key;
|
||||
size_t key_size;
|
||||
const u8 *plaintext;
|
||||
const u8 *ciphertext;
|
||||
size_t block_size;
|
||||
};
|
||||
|
||||
/* Test vector for an AEAD algorithm */
|
||||
struct aead_testvec {
|
||||
const u8 *key;
|
||||
size_t key_size;
|
||||
const u8 *iv;
|
||||
size_t iv_size;
|
||||
const u8 *assoc;
|
||||
size_t assoc_size;
|
||||
const u8 *plaintext;
|
||||
size_t plaintext_size;
|
||||
const u8 *ciphertext;
|
||||
size_t ciphertext_size;
|
||||
};
|
||||
|
||||
/* Test vector for a length-preserving encryption algorithm */
|
||||
struct skcipher_testvec {
|
||||
const u8 *key;
|
||||
size_t key_size;
|
||||
const u8 *iv;
|
||||
size_t iv_size;
|
||||
const u8 *plaintext;
|
||||
const u8 *ciphertext;
|
||||
size_t message_size;
|
||||
};
|
||||
|
||||
/* Test vector for a hash algorithm */
|
||||
struct hash_testvec {
|
||||
const u8 *key;
|
||||
size_t key_size;
|
||||
const u8 *message;
|
||||
size_t message_size;
|
||||
const u8 *digest;
|
||||
size_t digest_size;
|
||||
};
|
||||
|
||||
/* Test vector for a DRBG algorithm */
|
||||
struct drbg_testvec {
|
||||
const u8 *entropy;
|
||||
size_t entropy_size;
|
||||
const u8 *pers;
|
||||
size_t pers_size;
|
||||
const u8 *entpr_a;
|
||||
const u8 *entpr_b;
|
||||
size_t entpr_size;
|
||||
const u8 *add_a;
|
||||
const u8 *add_b;
|
||||
size_t add_size;
|
||||
const u8 *output;
|
||||
size_t out_size;
|
||||
};
|
||||
|
||||
/*
|
||||
* A struct which specifies an algorithm name (using crypto API syntax), a test
|
||||
* function for that algorithm, and a test vector used by that test function.
|
||||
*/
|
||||
struct fips_test {
|
||||
const char *alg;
|
||||
int __must_check (*func)(const struct fips_test *test);
|
||||
union {
|
||||
struct blockcipher_testvec blockcipher;
|
||||
struct aead_testvec aead;
|
||||
struct skcipher_testvec skcipher;
|
||||
struct hash_testvec hash;
|
||||
struct drbg_testvec drbg;
|
||||
};
|
||||
};
|
||||
|
||||
/* Maximum IV size (in bytes) among any algorithm tested here */
|
||||
#define MAX_IV_SIZE 16
|
||||
|
||||
static int __init __must_check
|
||||
fips_check_result(const struct fips_test *test, u8 *result,
|
||||
const u8 *expected_result, size_t result_size,
|
||||
const char *operation)
|
||||
{
|
||||
#ifdef CONFIG_CRYPTO_FIPS140_MOD_ERROR_INJECTION
|
||||
/* Inject a failure (via corrupting the result) if requested. */
|
||||
if (fips140_broken_alg && strcmp(test->alg, fips140_broken_alg) == 0)
|
||||
result[0] ^= 0xff;
|
||||
#endif
|
||||
if (memcmp(result, expected_result, result_size) != 0) {
|
||||
pr_err("wrong result from %s %s\n", test->alg, operation);
|
||||
return -EBADMSG;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* None of the algorithms should be ASYNC, as the FIPS module doesn't register
|
||||
* any ASYNC algorithms. (The ASYNC flag is only declared by hardware
|
||||
* algorithms, which would need their own FIPS certification.)
|
||||
*
|
||||
* Ideally we would verify alg->cra_module == THIS_MODULE here as well, but that
|
||||
* doesn't work because the files are compiled as built-in code.
|
||||
*/
|
||||
static int __init __must_check
|
||||
fips_validate_alg(const struct crypto_alg *alg)
|
||||
{
|
||||
if (alg->cra_flags & CRYPTO_ALG_ASYNC) {
|
||||
pr_err("unexpectedly got async implementation of %s (%s)\n",
|
||||
alg->cra_name, alg->cra_driver_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Test a block cipher using the crypto_cipher API. */
|
||||
static int __init __must_check
|
||||
fips_test_blockcipher(const struct fips_test *test)
|
||||
{
|
||||
const struct blockcipher_testvec *vec = &test->blockcipher;
|
||||
struct crypto_cipher *tfm;
|
||||
u8 block[MAX_CIPHER_BLOCKSIZE];
|
||||
int err;
|
||||
|
||||
if (WARN_ON(vec->block_size > MAX_CIPHER_BLOCKSIZE))
|
||||
return -EINVAL;
|
||||
|
||||
tfm = crypto_alloc_cipher(test->alg, 0, 0);
|
||||
if (IS_ERR(tfm)) {
|
||||
err = PTR_ERR(tfm);
|
||||
pr_err("failed to allocate %s tfm: %d\n", test->alg, err);
|
||||
return err;
|
||||
}
|
||||
err = fips_validate_alg(tfm->base.__crt_alg);
|
||||
if (err)
|
||||
goto out;
|
||||
if (crypto_cipher_blocksize(tfm) != vec->block_size) {
|
||||
pr_err("%s has wrong block size\n", test->alg);
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = crypto_cipher_setkey(tfm, vec->key, vec->key_size);
|
||||
if (err) {
|
||||
pr_err("failed to set %s key: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Encrypt the plaintext, then verify the resulting ciphertext. */
|
||||
memcpy(block, vec->plaintext, vec->block_size);
|
||||
crypto_cipher_encrypt_one(tfm, block, block);
|
||||
err = fips_check_result(test, block, vec->ciphertext, vec->block_size,
|
||||
"encryption");
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/* Decrypt the ciphertext, then verify the resulting plaintext. */
|
||||
crypto_cipher_decrypt_one(tfm, block, block);
|
||||
err = fips_check_result(test, block, vec->plaintext, vec->block_size,
|
||||
"decryption");
|
||||
out:
|
||||
crypto_free_cipher(tfm);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Test for plain AES (no mode of operation). We test this separately from the
|
||||
* AES modes because the implementation of AES which is used by the "aes"
|
||||
* crypto_cipher isn't necessarily the same as that used by the AES modes such
|
||||
* as "ecb(aes)". Similarly, the aes_{encrypt,decrypt}() library functions may
|
||||
* use a different implementation as well, so we test them separately too.
|
||||
*/
|
||||
static int __init __must_check
|
||||
fips_test_aes(const struct fips_test *test)
|
||||
{
|
||||
const struct blockcipher_testvec *vec = &test->blockcipher;
|
||||
struct crypto_aes_ctx ctx;
|
||||
u8 block[AES_BLOCK_SIZE];
|
||||
int err;
|
||||
|
||||
if (WARN_ON(vec->block_size != AES_BLOCK_SIZE))
|
||||
return -EINVAL;
|
||||
|
||||
err = fips_test_blockcipher(test);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = aes_expandkey(&ctx, vec->key, vec->key_size);
|
||||
if (err) {
|
||||
pr_err("aes_expandkey() failed: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
aes_encrypt(&ctx, block, vec->plaintext);
|
||||
err = fips_check_result(test, block, vec->ciphertext, AES_BLOCK_SIZE,
|
||||
"encryption (library API)");
|
||||
if (err)
|
||||
return err;
|
||||
aes_decrypt(&ctx, block, block);
|
||||
return fips_check_result(test, block, vec->plaintext, AES_BLOCK_SIZE,
|
||||
"decryption (library API)");
|
||||
}
|
||||
|
||||
/* Test a length-preserving symmetric cipher using the crypto_skcipher API. */
|
||||
static int __init __must_check
|
||||
fips_test_skcipher(const struct fips_test *test)
|
||||
{
|
||||
const struct skcipher_testvec *vec = &test->skcipher;
|
||||
struct crypto_skcipher *tfm;
|
||||
struct skcipher_request *req = NULL;
|
||||
u8 *message = NULL;
|
||||
struct scatterlist sg;
|
||||
u8 iv[MAX_IV_SIZE];
|
||||
int err;
|
||||
|
||||
if (WARN_ON(vec->iv_size > MAX_IV_SIZE))
|
||||
return -EINVAL;
|
||||
|
||||
tfm = crypto_alloc_skcipher(test->alg, 0, 0);
|
||||
if (IS_ERR(tfm)) {
|
||||
err = PTR_ERR(tfm);
|
||||
pr_err("failed to allocate %s tfm: %d\n", test->alg, err);
|
||||
return err;
|
||||
}
|
||||
err = fips_validate_alg(&crypto_skcipher_alg(tfm)->base);
|
||||
if (err)
|
||||
goto out;
|
||||
if (crypto_skcipher_ivsize(tfm) != vec->iv_size) {
|
||||
pr_err("%s has wrong IV size\n", test->alg);
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
req = skcipher_request_alloc(tfm, GFP_KERNEL);
|
||||
message = kmemdup(vec->plaintext, vec->message_size, GFP_KERNEL);
|
||||
if (!req || !message) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
sg_init_one(&sg, message, vec->message_size);
|
||||
|
||||
skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP,
|
||||
NULL, NULL);
|
||||
skcipher_request_set_crypt(req, &sg, &sg, vec->message_size, iv);
|
||||
|
||||
err = crypto_skcipher_setkey(tfm, vec->key, vec->key_size);
|
||||
if (err) {
|
||||
pr_err("failed to set %s key: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Encrypt the plaintext, then verify the resulting ciphertext. */
|
||||
memcpy(iv, vec->iv, vec->iv_size);
|
||||
err = crypto_skcipher_encrypt(req);
|
||||
if (err) {
|
||||
pr_err("%s encryption failed: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
err = fips_check_result(test, message, vec->ciphertext,
|
||||
vec->message_size, "encryption");
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/* Decrypt the ciphertext, then verify the resulting plaintext. */
|
||||
memcpy(iv, vec->iv, vec->iv_size);
|
||||
err = crypto_skcipher_decrypt(req);
|
||||
if (err) {
|
||||
pr_err("%s decryption failed: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
err = fips_check_result(test, message, vec->plaintext,
|
||||
vec->message_size, "decryption");
|
||||
out:
|
||||
kfree(message);
|
||||
skcipher_request_free(req);
|
||||
crypto_free_skcipher(tfm);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Test an AEAD using the crypto_aead API. */
|
||||
static int __init __must_check
|
||||
fips_test_aead(const struct fips_test *test)
|
||||
{
|
||||
const struct aead_testvec *vec = &test->aead;
|
||||
const int tag_size = vec->ciphertext_size - vec->plaintext_size;
|
||||
struct crypto_aead *tfm;
|
||||
struct aead_request *req = NULL;
|
||||
u8 *assoc = NULL;
|
||||
u8 *message = NULL;
|
||||
struct scatterlist sg[2];
|
||||
int sg_idx = 0;
|
||||
u8 iv[MAX_IV_SIZE];
|
||||
int err;
|
||||
|
||||
if (WARN_ON(vec->iv_size > MAX_IV_SIZE))
|
||||
return -EINVAL;
|
||||
if (WARN_ON(vec->ciphertext_size <= vec->plaintext_size))
|
||||
return -EINVAL;
|
||||
|
||||
tfm = crypto_alloc_aead(test->alg, 0, 0);
|
||||
if (IS_ERR(tfm)) {
|
||||
err = PTR_ERR(tfm);
|
||||
pr_err("failed to allocate %s tfm: %d\n", test->alg, err);
|
||||
return err;
|
||||
}
|
||||
err = fips_validate_alg(&crypto_aead_alg(tfm)->base);
|
||||
if (err)
|
||||
goto out;
|
||||
if (crypto_aead_ivsize(tfm) != vec->iv_size) {
|
||||
pr_err("%s has wrong IV size\n", test->alg);
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
req = aead_request_alloc(tfm, GFP_KERNEL);
|
||||
assoc = kmemdup(vec->assoc, vec->assoc_size, GFP_KERNEL);
|
||||
message = kzalloc(vec->ciphertext_size, GFP_KERNEL);
|
||||
if (!req || !assoc || !message) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
memcpy(message, vec->plaintext, vec->plaintext_size);
|
||||
|
||||
sg_init_table(sg, ARRAY_SIZE(sg));
|
||||
if (vec->assoc_size)
|
||||
sg_set_buf(&sg[sg_idx++], assoc, vec->assoc_size);
|
||||
sg_set_buf(&sg[sg_idx++], message, vec->ciphertext_size);
|
||||
|
||||
aead_request_set_ad(req, vec->assoc_size);
|
||||
aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
|
||||
|
||||
err = crypto_aead_setkey(tfm, vec->key, vec->key_size);
|
||||
if (err) {
|
||||
pr_err("failed to set %s key: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = crypto_aead_setauthsize(tfm, tag_size);
|
||||
if (err) {
|
||||
pr_err("failed to set %s authentication tag size: %d\n",
|
||||
test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encrypt the plaintext, then verify the resulting ciphertext (which
|
||||
* includes the authentication tag).
|
||||
*/
|
||||
memcpy(iv, vec->iv, vec->iv_size);
|
||||
aead_request_set_crypt(req, sg, sg, vec->plaintext_size, iv);
|
||||
err = crypto_aead_encrypt(req);
|
||||
if (err) {
|
||||
pr_err("%s encryption failed: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
err = fips_check_result(test, message, vec->ciphertext,
|
||||
vec->ciphertext_size, "encryption");
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Decrypt the ciphertext (which includes the authentication tag), then
|
||||
* verify the resulting plaintext.
|
||||
*/
|
||||
memcpy(iv, vec->iv, vec->iv_size);
|
||||
aead_request_set_crypt(req, sg, sg, vec->ciphertext_size, iv);
|
||||
err = crypto_aead_decrypt(req);
|
||||
if (err) {
|
||||
pr_err("%s decryption failed: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
err = fips_check_result(test, message, vec->plaintext,
|
||||
vec->plaintext_size, "decryption");
|
||||
out:
|
||||
kfree(message);
|
||||
kfree(assoc);
|
||||
aead_request_free(req);
|
||||
crypto_free_aead(tfm);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Test a hash algorithm using the crypto_shash API.
|
||||
*
|
||||
* Note that we don't need to test the crypto_ahash API too, since none of the
|
||||
* hash algorithms in the FIPS module have the ASYNC flag, and thus there will
|
||||
* be no hash algorithms that can be accessed only through crypto_ahash.
|
||||
*/
|
||||
static int __init __must_check
|
||||
fips_test_hash(const struct fips_test *test)
|
||||
{
|
||||
const struct hash_testvec *vec = &test->hash;
|
||||
struct crypto_shash *tfm;
|
||||
u8 digest[HASH_MAX_DIGESTSIZE];
|
||||
int err;
|
||||
|
||||
if (WARN_ON(vec->digest_size > HASH_MAX_DIGESTSIZE))
|
||||
return -EINVAL;
|
||||
|
||||
tfm = crypto_alloc_shash(test->alg, 0, 0);
|
||||
if (IS_ERR(tfm)) {
|
||||
err = PTR_ERR(tfm);
|
||||
pr_err("failed to allocate %s tfm: %d\n", test->alg, err);
|
||||
return err;
|
||||
}
|
||||
err = fips_validate_alg(&crypto_shash_alg(tfm)->base);
|
||||
if (err)
|
||||
goto out;
|
||||
if (crypto_shash_digestsize(tfm) != vec->digest_size) {
|
||||
pr_err("%s has wrong digest size\n", test->alg);
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (vec->key) {
|
||||
err = crypto_shash_setkey(tfm, vec->key, vec->key_size);
|
||||
if (err) {
|
||||
pr_err("failed to set %s key: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
err = crypto_shash_tfm_digest(tfm, vec->message, vec->message_size,
|
||||
digest);
|
||||
if (err) {
|
||||
pr_err("%s digest computation failed: %d\n", test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
err = fips_check_result(test, digest, vec->digest, vec->digest_size,
|
||||
"digest");
|
||||
out:
|
||||
crypto_free_shash(tfm);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Test the sha256() library function, as it may not be covered by the "sha256"
|
||||
* crypto_shash, and thus may not be covered by the "hmac(sha256)" test we do.
|
||||
*/
|
||||
static int __init __must_check
|
||||
fips_test_sha256_library(const struct fips_test *test)
|
||||
{
|
||||
const struct hash_testvec *vec = &test->hash;
|
||||
u8 digest[SHA256_DIGEST_SIZE];
|
||||
|
||||
if (WARN_ON(vec->digest_size != SHA256_DIGEST_SIZE))
|
||||
return -EINVAL;
|
||||
|
||||
sha256(vec->message, vec->message_size, digest);
|
||||
return fips_check_result(test, digest, vec->digest, vec->digest_size,
|
||||
"digest (library API)");
|
||||
}
|
||||
|
||||
/* Test a DRBG using the crypto_rng API. */
|
||||
static int __init __must_check
|
||||
fips_test_drbg(const struct fips_test *test)
|
||||
{
|
||||
const struct drbg_testvec *vec = &test->drbg;
|
||||
struct crypto_rng *rng;
|
||||
u8 *output = NULL;
|
||||
struct drbg_test_data test_data;
|
||||
struct drbg_string addtl, pers, testentropy;
|
||||
int err;
|
||||
|
||||
rng = crypto_alloc_rng(test->alg, 0, 0);
|
||||
if (IS_ERR(rng)) {
|
||||
err = PTR_ERR(rng);
|
||||
pr_err("failed to allocate %s tfm: %d\n", test->alg, err);
|
||||
return PTR_ERR(rng);
|
||||
}
|
||||
err = fips_validate_alg(&crypto_rng_alg(rng)->base);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
output = kzalloc(vec->out_size, GFP_KERNEL);
|
||||
if (!output) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the DRBG with the entropy and personalization string given
|
||||
* in the test vector.
|
||||
*/
|
||||
test_data.testentropy = &testentropy;
|
||||
drbg_string_fill(&testentropy, vec->entropy, vec->entropy_size);
|
||||
drbg_string_fill(&pers, vec->pers, vec->pers_size);
|
||||
err = crypto_drbg_reset_test(rng, &pers, &test_data);
|
||||
if (err) {
|
||||
pr_err("failed to reset %s\n", test->alg);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate some random bytes using the additional data string provided
|
||||
* in the test vector. Also use the additional entropy if provided
|
||||
* (relevant for the prediction-resistant DRBG variants only).
|
||||
*/
|
||||
drbg_string_fill(&addtl, vec->add_a, vec->add_size);
|
||||
if (vec->entpr_size) {
|
||||
drbg_string_fill(&testentropy, vec->entpr_a, vec->entpr_size);
|
||||
err = crypto_drbg_get_bytes_addtl_test(rng, output,
|
||||
vec->out_size, &addtl,
|
||||
&test_data);
|
||||
} else {
|
||||
err = crypto_drbg_get_bytes_addtl(rng, output, vec->out_size,
|
||||
&addtl);
|
||||
}
|
||||
if (err) {
|
||||
pr_err("failed to get bytes from %s (try 1): %d\n",
|
||||
test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the same again, using a second additional data string, and (when
|
||||
* applicable) a second additional entropy string.
|
||||
*/
|
||||
drbg_string_fill(&addtl, vec->add_b, vec->add_size);
|
||||
if (test->drbg.entpr_size) {
|
||||
drbg_string_fill(&testentropy, vec->entpr_b, vec->entpr_size);
|
||||
err = crypto_drbg_get_bytes_addtl_test(rng, output,
|
||||
vec->out_size, &addtl,
|
||||
&test_data);
|
||||
} else {
|
||||
err = crypto_drbg_get_bytes_addtl(rng, output, vec->out_size,
|
||||
&addtl);
|
||||
}
|
||||
if (err) {
|
||||
pr_err("failed to get bytes from %s (try 2): %d\n",
|
||||
test->alg, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check that the DRBG generated the expected output. */
|
||||
err = fips_check_result(test, output, vec->output, vec->out_size,
|
||||
"get_bytes");
|
||||
out:
|
||||
kfree(output);
|
||||
crypto_free_rng(rng);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Include the test vectors generated by the Python script. */
|
||||
#include "fips140-generated-testvecs.h"
|
||||
|
||||
/* List of all self-tests. Keep this in sync with fips140_algorithms[]. */
|
||||
static const struct fips_test fips140_selftests[] __initconst = {
|
||||
/*
|
||||
* Tests for AES and AES modes.
|
||||
*
|
||||
* The full list of AES algorithms we potentially need to test are AES
|
||||
* by itself, AES-CBC, AES-CTR, AES-ECB, AES-GCM, and AES-XTS. We can
|
||||
* follow the FIPS 140-2 Implementation Guidance (IG) document to try to
|
||||
* reduce this list, but we run into the issue that the architecture-
|
||||
* specific implementations of these algorithms in Linux often don't
|
||||
* share the "same" underlying AES implementation. E.g., the ARMv8 CE
|
||||
* optimized implementations issue ARMv8 CE instructions directly rather
|
||||
* than going through a separate AES implementation. In this case,
|
||||
* separate tests are needed according to section 9.2 of the IG.
|
||||
*/
|
||||
{
|
||||
.alg = "aes",
|
||||
.func = fips_test_aes,
|
||||
.blockcipher = {
|
||||
.key = fips_aes_key,
|
||||
.key_size = sizeof(fips_aes_key),
|
||||
.plaintext = fips_message,
|
||||
.ciphertext = fips_aes_ecb_ciphertext,
|
||||
.block_size = 16,
|
||||
}
|
||||
}, {
|
||||
.alg = "cbc(aes)",
|
||||
.func = fips_test_skcipher,
|
||||
.skcipher = {
|
||||
.key = fips_aes_key,
|
||||
.key_size = sizeof(fips_aes_key),
|
||||
.iv = fips_aes_iv,
|
||||
.iv_size = sizeof(fips_aes_iv),
|
||||
.plaintext = fips_message,
|
||||
.ciphertext = fips_aes_cbc_ciphertext,
|
||||
.message_size = sizeof(fips_message),
|
||||
}
|
||||
}, {
|
||||
.alg = "ctr(aes)",
|
||||
.func = fips_test_skcipher,
|
||||
.skcipher = {
|
||||
.key = fips_aes_key,
|
||||
.key_size = sizeof(fips_aes_key),
|
||||
.iv = fips_aes_iv,
|
||||
.iv_size = sizeof(fips_aes_iv),
|
||||
.plaintext = fips_message,
|
||||
.ciphertext = fips_aes_ctr_ciphertext,
|
||||
.message_size = sizeof(fips_message),
|
||||
}
|
||||
}, {
|
||||
.alg = "ecb(aes)",
|
||||
.func = fips_test_skcipher,
|
||||
.skcipher = {
|
||||
.key = fips_aes_key,
|
||||
.key_size = sizeof(fips_aes_key),
|
||||
.plaintext = fips_message,
|
||||
.ciphertext = fips_aes_ecb_ciphertext,
|
||||
.message_size = sizeof(fips_message)
|
||||
}
|
||||
}, {
|
||||
.alg = "gcm(aes)",
|
||||
.func = fips_test_aead,
|
||||
.aead = {
|
||||
.key = fips_aes_key,
|
||||
.key_size = sizeof(fips_aes_key),
|
||||
.iv = fips_aes_iv,
|
||||
/* The GCM implementation assumes an IV size of 12. */
|
||||
.iv_size = 12,
|
||||
.assoc = fips_aes_gcm_assoc,
|
||||
.assoc_size = sizeof(fips_aes_gcm_assoc),
|
||||
.plaintext = fips_message,
|
||||
.plaintext_size = sizeof(fips_message),
|
||||
.ciphertext = fips_aes_gcm_ciphertext,
|
||||
.ciphertext_size = sizeof(fips_aes_gcm_ciphertext),
|
||||
}
|
||||
}, {
|
||||
.alg = "xts(aes)",
|
||||
.func = fips_test_skcipher,
|
||||
.skcipher = {
|
||||
.key = fips_aes_xts_key,
|
||||
.key_size = sizeof(fips_aes_xts_key),
|
||||
.iv = fips_aes_iv,
|
||||
.iv_size = sizeof(fips_aes_iv),
|
||||
.plaintext = fips_message,
|
||||
.ciphertext = fips_aes_xts_ciphertext,
|
||||
.message_size = sizeof(fips_message),
|
||||
}
|
||||
/*
|
||||
* Tests for SHA-1, SHA-256, HMAC-SHA256, and SHA-512.
|
||||
*
|
||||
* The selection of these specific tests follows the guidance from
|
||||
* section 9 of the FIPS 140-2 Implementation Guidance (IG) document to
|
||||
* achieve a minimal list of tests, rather than testing all of
|
||||
* SHA-{1,224,256,384,512} and HMAC-SHA{1,224,256,384,512}. As per the
|
||||
* IG, testing SHA-224 is only required if SHA-256 isn't implemented,
|
||||
* and testing SHA-384 is only required if SHA-512 isn't implemented.
|
||||
* Also, HMAC only has to be tested with one underlying SHA, and the
|
||||
* HMAC test also fulfills the test for its underlying SHA. That would
|
||||
* result in a test list of e.g. SHA-1, HMAC-SHA256, and SHA-512.
|
||||
*
|
||||
* However we also need to take into account cases where implementations
|
||||
* aren't shared in the "natural" way assumed by the IG. Currently the
|
||||
* only known exception w.r.t. SHA-* and HMAC-* is the sha256() library
|
||||
* function which may not be covered by the test of the "hmac(sha256)"
|
||||
* crypto_shash. So, we test sha256() separately.
|
||||
*/
|
||||
}, {
|
||||
.alg = "sha1",
|
||||
.func = fips_test_hash,
|
||||
.hash = {
|
||||
.message = fips_message,
|
||||
.message_size = sizeof(fips_message),
|
||||
.digest = fips_sha1_digest,
|
||||
.digest_size = sizeof(fips_sha1_digest)
|
||||
}
|
||||
}, {
|
||||
.alg = "sha256",
|
||||
.func = fips_test_sha256_library,
|
||||
.hash = {
|
||||
.message = fips_message,
|
||||
.message_size = sizeof(fips_message),
|
||||
.digest = fips_sha256_digest,
|
||||
.digest_size = sizeof(fips_sha256_digest)
|
||||
}
|
||||
}, {
|
||||
.alg = "hmac(sha256)",
|
||||
.func = fips_test_hash,
|
||||
.hash = {
|
||||
.key = fips_hmac_key,
|
||||
.key_size = sizeof(fips_hmac_key),
|
||||
.message = fips_message,
|
||||
.message_size = sizeof(fips_message),
|
||||
.digest = fips_hmac_sha256_digest,
|
||||
.digest_size = sizeof(fips_hmac_sha256_digest)
|
||||
}
|
||||
}, {
|
||||
.alg = "sha512",
|
||||
.func = fips_test_hash,
|
||||
.hash = {
|
||||
.message = fips_message,
|
||||
.message_size = sizeof(fips_message),
|
||||
.digest = fips_sha512_digest,
|
||||
.digest_size = sizeof(fips_sha512_digest)
|
||||
}
|
||||
/*
|
||||
* Tests for DRBG algorithms.
|
||||
*
|
||||
* Only the default variant (the one that users get when they request
|
||||
* "stdrng") is required to be tested, as we don't consider the other
|
||||
* variants to be used / usable in the FIPS security policy. This is
|
||||
* similar to how e.g. we don't test both "xts(aes-generic)" and
|
||||
* "xts-aes-ce" but rather just "xts(aes)".
|
||||
*
|
||||
* Currently the default one is "drbg_nopr_hmac_sha256"; however, just
|
||||
* in case we also test the prediction-resistant enabled variant too.
|
||||
*/
|
||||
}, {
|
||||
.alg = "drbg_nopr_hmac_sha256",
|
||||
.func = fips_test_drbg,
|
||||
.drbg = {
|
||||
.entropy =
|
||||
"\xf9\x7a\x3c\xfd\x91\xfa\xa0\x46\xb9\xe6\x1b\x94"
|
||||
"\x93\xd4\x36\xc4\x93\x1f\x60\x4b\x22\xf1\x08\x15"
|
||||
"\x21\xb3\x41\x91\x51\xe8\xff\x06\x11\xf3\xa7\xd4"
|
||||
"\x35\x95\x35\x7d\x58\x12\x0b\xd1\xe2\xdd\x8a\xed",
|
||||
.entropy_size = 48,
|
||||
.output =
|
||||
"\xc6\x87\x1c\xff\x08\x24\xfe\x55\xea\x76\x89\xa5"
|
||||
"\x22\x29\x88\x67\x30\x45\x0e\x5d\x36\x2d\xa5\xbf"
|
||||
"\x59\x0d\xcf\x9a\xcd\x67\xfe\xd4\xcb\x32\x10\x7d"
|
||||
"\xf5\xd0\x39\x69\xa6\x6b\x1f\x64\x94\xfd\xf5\xd6"
|
||||
"\x3d\x5b\x4d\x0d\x34\xea\x73\x99\xa0\x7d\x01\x16"
|
||||
"\x12\x6d\x0d\x51\x8c\x7c\x55\xba\x46\xe1\x2f\x62"
|
||||
"\xef\xc8\xfe\x28\xa5\x1c\x9d\x42\x8e\x6d\x37\x1d"
|
||||
"\x73\x97\xab\x31\x9f\xc7\x3d\xed\x47\x22\xe5\xb4"
|
||||
"\xf3\x00\x04\x03\x2a\x61\x28\xdf\x5e\x74\x97\xec"
|
||||
"\xf8\x2c\xa7\xb0\xa5\x0e\x86\x7e\xf6\x72\x8a\x4f"
|
||||
"\x50\x9a\x8c\x85\x90\x87\x03\x9c",
|
||||
.out_size = 128,
|
||||
.add_a =
|
||||
"\x51\x72\x89\xaf\xe4\x44\xa0\xfe\x5e\xd1\xa4\x1d"
|
||||
"\xbb\xb5\xeb\x17\x15\x00\x79\xbd\xd3\x1e\x29\xcf"
|
||||
"\x2f\xf3\x00\x34\xd8\x26\x8e\x3b",
|
||||
.add_b =
|
||||
"\x88\x02\x8d\x29\xef\x80\xb4\xe6\xf0\xfe\x12\xf9"
|
||||
"\x1d\x74\x49\xfe\x75\x06\x26\x82\xe8\x9c\x57\x14"
|
||||
"\x40\xc0\xc9\xb5\x2c\x42\xa6\xe0",
|
||||
.add_size = 32,
|
||||
}
|
||||
}, {
|
||||
.alg = "drbg_pr_hmac_sha256",
|
||||
.func = fips_test_drbg,
|
||||
.drbg = {
|
||||
.entropy =
|
||||
"\xc7\xcc\xbc\x67\x7e\x21\x66\x1e\x27\x2b\x63\xdd"
|
||||
"\x3a\x78\xdc\xdf\x66\x6d\x3f\x24\xae\xcf\x37\x01"
|
||||
"\xa9\x0d\x89\x8a\xa7\xdc\x81\x58\xae\xb2\x10\x15"
|
||||
"\x7e\x18\x44\x6d\x13\xea\xdf\x37\x85\xfe\x81\xfb",
|
||||
.entropy_size = 48,
|
||||
.entpr_a =
|
||||
"\x7b\xa1\x91\x5b\x3c\x04\xc4\x1b\x1d\x19\x2f\x1a"
|
||||
"\x18\x81\x60\x3c\x6c\x62\x91\xb7\xe9\xf5\xcb\x96"
|
||||
"\xbb\x81\x6a\xcc\xb5\xae\x55\xb6",
|
||||
.entpr_b =
|
||||
"\x99\x2c\xc7\x78\x7e\x3b\x88\x12\xef\xbe\xd3\xd2"
|
||||
"\x7d\x2a\xa5\x86\xda\x8d\x58\x73\x4a\x0a\xb2\x2e"
|
||||
"\xbb\x4c\x7e\xe3\x9a\xb6\x81\xc1",
|
||||
.entpr_size = 32,
|
||||
.output =
|
||||
"\x95\x6f\x95\xfc\x3b\xb7\xfe\x3e\xd0\x4e\x1a\x14"
|
||||
"\x6c\x34\x7f\x7b\x1d\x0d\x63\x5e\x48\x9c\x69\xe6"
|
||||
"\x46\x07\xd2\x87\xf3\x86\x52\x3d\x98\x27\x5e\xd7"
|
||||
"\x54\xe7\x75\x50\x4f\xfb\x4d\xfd\xac\x2f\x4b\x77"
|
||||
"\xcf\x9e\x8e\xcc\x16\xa2\x24\xcd\x53\xde\x3e\xc5"
|
||||
"\x55\x5d\xd5\x26\x3f\x89\xdf\xca\x8b\x4e\x1e\xb6"
|
||||
"\x88\x78\x63\x5c\xa2\x63\x98\x4e\x6f\x25\x59\xb1"
|
||||
"\x5f\x2b\x23\xb0\x4b\xa5\x18\x5d\xc2\x15\x74\x40"
|
||||
"\x59\x4c\xb4\x1e\xcf\x9a\x36\xfd\x43\xe2\x03\xb8"
|
||||
"\x59\x91\x30\x89\x2a\xc8\x5a\x43\x23\x7c\x73\x72"
|
||||
"\xda\x3f\xad\x2b\xba\x00\x6b\xd1",
|
||||
.out_size = 128,
|
||||
.add_a =
|
||||
"\x18\xe8\x17\xff\xef\x39\xc7\x41\x5c\x73\x03\x03"
|
||||
"\xf6\x3d\xe8\x5f\xc8\xab\xe4\xab\x0f\xad\xe8\xd6"
|
||||
"\x86\x88\x55\x28\xc1\x69\xdd\x76",
|
||||
.add_b =
|
||||
"\xac\x07\xfc\xbe\x87\x0e\xd3\xea\x1f\x7e\xb8\xe7"
|
||||
"\x9d\xec\xe8\xe7\xbc\xf3\x18\x25\x77\x35\x4a\xaa"
|
||||
"\x00\x99\x2a\xdd\x0a\x00\x50\x82",
|
||||
.add_size = 32,
|
||||
.pers =
|
||||
"\xbc\x55\xab\x3c\xf6\x52\xb0\x11\x3d\x7b\x90\xb8"
|
||||
"\x24\xc9\x26\x4e\x5a\x1e\x77\x0d\x3d\x58\x4a\xda"
|
||||
"\xd1\x81\xe9\xf8\xeb\x30\x8f\x6f",
|
||||
.pers_size = 32,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
bool __init fips140_run_selftests(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
pr_info("running self-tests\n");
|
||||
for (i = 0; i < ARRAY_SIZE(fips140_selftests); i++) {
|
||||
const struct fips_test *test = &fips140_selftests[i];
|
||||
int err;
|
||||
|
||||
err = test->func(test);
|
||||
if (err) {
|
||||
pr_emerg("self-tests failed for algorithm %s: %d\n",
|
||||
test->alg, err);
|
||||
/* The caller is responsible for calling panic(). */
|
||||
return false;
|
||||
}
|
||||
}
|
||||
pr_info("all self-tests passed\n");
|
||||
return true;
|
||||
}
|
@ -738,7 +738,7 @@ static void binder_transaction_priority(struct task_struct *task,
|
||||
t->saved_priority.sched_policy = task->policy;
|
||||
t->saved_priority.prio = task->normal_prio;
|
||||
|
||||
trace_android_vh_binder_transaction_priority_skip(task, &skip);
|
||||
trace_android_vh_binder_priority_skip(task, &skip);
|
||||
if (skip)
|
||||
return;
|
||||
|
||||
|
@ -16,6 +16,8 @@
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/page_owner.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/security.h>
|
||||
|
||||
struct ads_entry {
|
||||
char *name;
|
||||
@ -59,6 +61,13 @@ static const struct ads_entry ads_entries[ADS_END] = {
|
||||
#ifdef CONFIG_SWAP
|
||||
ADS_ENTRY(ADS_NR_SWAP_PAGES, &nr_swap_pages),
|
||||
#endif
|
||||
#ifdef CONFIG_MMU
|
||||
ADS_ENTRY(ADS_MMAP_MIN_ADDR, &mmap_min_addr),
|
||||
#endif
|
||||
ADS_ENTRY(ADS_STACK_GUARD_GAP, &stack_guard_gap),
|
||||
#ifdef CONFIG_SYSCTL
|
||||
ADS_ENTRY(ADS_SYSCTL_LEGACY_VA_LAYOUT, &sysctl_legacy_va_layout),
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include <trace/hooks/iommu.h>
|
||||
#include <trace/hooks/thermal.h>
|
||||
#include <trace/hooks/ufshcd.h>
|
||||
#include <trace/hooks/block.h>
|
||||
#include <trace/hooks/cgroup.h>
|
||||
#include <trace/hooks/workqueue.h>
|
||||
#include <trace/hooks/sys.h>
|
||||
@ -68,6 +69,9 @@
|
||||
#include <trace/hooks/net.h>
|
||||
#include <trace/hooks/syscall_check.h>
|
||||
#include <trace/hooks/usb.h>
|
||||
#include <trace/hooks/ipv6.h>
|
||||
#include <trace/hooks/sound.h>
|
||||
#include <trace/hooks/snd_compr.h>
|
||||
|
||||
/*
|
||||
* Export tracepoints that act as a bare tracehook (ie: have no trace event
|
||||
@ -87,10 +91,14 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_prepare_prio_fork);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_finish_prio_fork);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_user_nice);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_setscheduler);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sk_alloc);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sk_free);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_nf_conn_alloc);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_nf_conn_free);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_arch_set_freq_scale);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_is_fpsimd_save);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_transaction_init);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_transaction_priority_skip);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_priority_skip);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_set_priority);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_restore_priority);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_wakeup_ilocked);
|
||||
@ -237,6 +245,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_insert);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_node_delete);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_node_replace);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_lookup);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_alloc_rqs);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_rq_ctx_init);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_commit_creds);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exit_creds);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_override_creds);
|
||||
@ -353,3 +363,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_file_open);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_bpf_syscall);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_suspend);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipv6_gen_linklocal_addr);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_snd_compr_use_pause_in_drain);
|
||||
|
@ -84,120 +84,6 @@ static struct kobj_type dma_buf_ktype = {
|
||||
.default_groups = dma_buf_stats_default_groups,
|
||||
};
|
||||
|
||||
#define to_dma_buf_attach_entry_from_kobj(x) container_of(x, struct dma_buf_attach_sysfs_entry, kobj)
|
||||
|
||||
struct dma_buf_attach_stats_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct dma_buf_attach_sysfs_entry *sysfs_entry,
|
||||
struct dma_buf_attach_stats_attribute *attr, char *buf);
|
||||
};
|
||||
#define to_dma_buf_attach_stats_attr(x) container_of(x, struct dma_buf_attach_stats_attribute, attr)
|
||||
|
||||
static ssize_t dma_buf_attach_stats_attribute_show(struct kobject *kobj,
|
||||
struct attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct dma_buf_attach_stats_attribute *attribute;
|
||||
struct dma_buf_attach_sysfs_entry *sysfs_entry;
|
||||
|
||||
attribute = to_dma_buf_attach_stats_attr(attr);
|
||||
sysfs_entry = to_dma_buf_attach_entry_from_kobj(kobj);
|
||||
|
||||
if (!attribute->show)
|
||||
return -EIO;
|
||||
|
||||
return attribute->show(sysfs_entry, attribute, buf);
|
||||
}
|
||||
|
||||
static const struct sysfs_ops dma_buf_attach_stats_sysfs_ops = {
|
||||
.show = dma_buf_attach_stats_attribute_show,
|
||||
};
|
||||
|
||||
static ssize_t map_counter_show(struct dma_buf_attach_sysfs_entry *sysfs_entry,
|
||||
struct dma_buf_attach_stats_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sysfs_emit(buf, "%u\n", sysfs_entry->map_counter);
|
||||
}
|
||||
|
||||
static struct dma_buf_attach_stats_attribute map_counter_attribute =
|
||||
__ATTR_RO(map_counter);
|
||||
|
||||
static struct attribute *dma_buf_attach_stats_default_attrs[] = {
|
||||
&map_counter_attribute.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(dma_buf_attach_stats_default);
|
||||
|
||||
static void dma_buf_attach_sysfs_release(struct kobject *kobj)
|
||||
{
|
||||
struct dma_buf_attach_sysfs_entry *sysfs_entry;
|
||||
|
||||
sysfs_entry = to_dma_buf_attach_entry_from_kobj(kobj);
|
||||
kfree(sysfs_entry);
|
||||
}
|
||||
|
||||
static struct kobj_type dma_buf_attach_ktype = {
|
||||
.sysfs_ops = &dma_buf_attach_stats_sysfs_ops,
|
||||
.release = dma_buf_attach_sysfs_release,
|
||||
.default_groups = dma_buf_attach_stats_default_groups,
|
||||
};
|
||||
|
||||
void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach)
|
||||
{
|
||||
struct dma_buf_attach_sysfs_entry *sysfs_entry;
|
||||
|
||||
sysfs_entry = attach->sysfs_entry;
|
||||
if (!sysfs_entry)
|
||||
return;
|
||||
|
||||
sysfs_delete_link(&sysfs_entry->kobj, &attach->dev->kobj, "device");
|
||||
|
||||
kobject_del(&sysfs_entry->kobj);
|
||||
kobject_put(&sysfs_entry->kobj);
|
||||
}
|
||||
|
||||
int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach,
|
||||
unsigned int uid)
|
||||
{
|
||||
struct dma_buf_attach_sysfs_entry *sysfs_entry;
|
||||
int ret;
|
||||
struct dma_buf *dmabuf;
|
||||
|
||||
if (!attach)
|
||||
return -EINVAL;
|
||||
|
||||
dmabuf = attach->dmabuf;
|
||||
|
||||
sysfs_entry = kzalloc(sizeof(struct dma_buf_attach_sysfs_entry),
|
||||
GFP_KERNEL);
|
||||
if (!sysfs_entry)
|
||||
return -ENOMEM;
|
||||
|
||||
sysfs_entry->kobj.kset = dmabuf->sysfs_entry->attach_stats_kset;
|
||||
|
||||
attach->sysfs_entry = sysfs_entry;
|
||||
|
||||
ret = kobject_init_and_add(&sysfs_entry->kobj, &dma_buf_attach_ktype,
|
||||
NULL, "%u", uid);
|
||||
if (ret)
|
||||
goto kobj_err;
|
||||
|
||||
ret = sysfs_create_link(&sysfs_entry->kobj, &attach->dev->kobj,
|
||||
"device");
|
||||
if (ret)
|
||||
goto link_err;
|
||||
|
||||
return 0;
|
||||
|
||||
link_err:
|
||||
kobject_del(&sysfs_entry->kobj);
|
||||
kobj_err:
|
||||
kobject_put(&sysfs_entry->kobj);
|
||||
attach->sysfs_entry = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
void dma_buf_stats_teardown(struct dma_buf *dmabuf)
|
||||
{
|
||||
struct dma_buf_sysfs_entry *sysfs_entry;
|
||||
@ -206,7 +92,6 @@ void dma_buf_stats_teardown(struct dma_buf *dmabuf)
|
||||
if (!sysfs_entry)
|
||||
return;
|
||||
|
||||
kset_unregister(sysfs_entry->attach_stats_kset);
|
||||
kobject_del(&sysfs_entry->kobj);
|
||||
kobject_put(&sysfs_entry->kobj);
|
||||
}
|
||||
@ -254,7 +139,6 @@ int dma_buf_stats_setup(struct dma_buf *dmabuf)
|
||||
{
|
||||
struct dma_buf_sysfs_entry *sysfs_entry;
|
||||
int ret;
|
||||
struct kset *attach_stats_kset;
|
||||
|
||||
if (!dmabuf || !dmabuf->file)
|
||||
return -EINVAL;
|
||||
@ -279,21 +163,8 @@ int dma_buf_stats_setup(struct dma_buf *dmabuf)
|
||||
if (ret)
|
||||
goto err_sysfs_dmabuf;
|
||||
|
||||
/* create the directory for attachment stats */
|
||||
attach_stats_kset = kset_create_and_add("attachments",
|
||||
&dmabuf_sysfs_no_uevent_ops,
|
||||
&sysfs_entry->kobj);
|
||||
if (!attach_stats_kset) {
|
||||
ret = -ENOMEM;
|
||||
goto err_sysfs_attach;
|
||||
}
|
||||
|
||||
sysfs_entry->attach_stats_kset = attach_stats_kset;
|
||||
|
||||
return 0;
|
||||
|
||||
err_sysfs_attach:
|
||||
kobject_del(&sysfs_entry->kobj);
|
||||
err_sysfs_dmabuf:
|
||||
kobject_put(&sysfs_entry->kobj);
|
||||
dmabuf->sysfs_entry = NULL;
|
||||
|
@ -14,23 +14,8 @@ int dma_buf_init_sysfs_statistics(void);
|
||||
void dma_buf_uninit_sysfs_statistics(void);
|
||||
|
||||
int dma_buf_stats_setup(struct dma_buf *dmabuf);
|
||||
int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach,
|
||||
unsigned int uid);
|
||||
static inline void dma_buf_update_attachment_map_count(struct dma_buf_attachment *attach,
|
||||
int delta)
|
||||
{
|
||||
struct dma_buf_attach_sysfs_entry *entry = attach->sysfs_entry;
|
||||
|
||||
entry->map_counter += delta;
|
||||
}
|
||||
void dma_buf_stats_teardown(struct dma_buf *dmabuf);
|
||||
void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach);
|
||||
static inline unsigned int dma_buf_update_attach_uid(struct dma_buf *dmabuf)
|
||||
{
|
||||
struct dma_buf_sysfs_entry *entry = dmabuf->sysfs_entry;
|
||||
|
||||
return entry->attachment_uid++;
|
||||
}
|
||||
#else
|
||||
|
||||
static inline int dma_buf_init_sysfs_statistics(void)
|
||||
@ -44,19 +29,7 @@ static inline int dma_buf_stats_setup(struct dma_buf *dmabuf)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach,
|
||||
unsigned int uid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dma_buf_stats_teardown(struct dma_buf *dmabuf) {}
|
||||
static inline void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach) {}
|
||||
static inline void dma_buf_update_attachment_map_count(struct dma_buf_attachment *attach,
|
||||
int delta) {}
|
||||
static inline unsigned int dma_buf_update_attach_uid(struct dma_buf *dmabuf)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif // _DMA_BUF_SYSFS_STATS_H
|
||||
|
@ -730,7 +730,6 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
|
||||
{
|
||||
struct dma_buf_attachment *attach;
|
||||
int ret;
|
||||
unsigned int attach_uid;
|
||||
|
||||
if (WARN_ON(!dmabuf || !dev))
|
||||
return ERR_PTR(-EINVAL);
|
||||
@ -756,13 +755,8 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
|
||||
}
|
||||
dma_resv_lock(dmabuf->resv, NULL);
|
||||
list_add(&attach->node, &dmabuf->attachments);
|
||||
attach_uid = dma_buf_update_attach_uid(dmabuf);
|
||||
dma_resv_unlock(dmabuf->resv);
|
||||
|
||||
ret = dma_buf_attach_stats_setup(attach, attach_uid);
|
||||
if (ret)
|
||||
goto err_sysfs;
|
||||
|
||||
/* When either the importer or the exporter can't handle dynamic
|
||||
* mappings we cache the mapping here to avoid issues with the
|
||||
* reservation object lock.
|
||||
@ -789,7 +783,6 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
|
||||
dma_resv_unlock(attach->dmabuf->resv);
|
||||
attach->sgt = sgt;
|
||||
attach->dir = DMA_BIDIRECTIONAL;
|
||||
dma_buf_update_attachment_map_count(attach, 1 /* delta */);
|
||||
}
|
||||
|
||||
return attach;
|
||||
@ -806,7 +799,6 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
|
||||
if (dma_buf_is_dynamic(attach->dmabuf))
|
||||
dma_resv_unlock(attach->dmabuf->resv);
|
||||
|
||||
err_sysfs:
|
||||
dma_buf_detach(dmabuf, attach);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
@ -845,7 +837,6 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
|
||||
dma_resv_lock(attach->dmabuf->resv, NULL);
|
||||
|
||||
dmabuf->ops->unmap_dma_buf(attach, attach->sgt, attach->dir);
|
||||
dma_buf_update_attachment_map_count(attach, -1 /* delta */);
|
||||
|
||||
if (dma_buf_is_dynamic(attach->dmabuf)) {
|
||||
dma_buf_unpin(attach);
|
||||
@ -859,7 +850,6 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
|
||||
if (dmabuf->ops->detach)
|
||||
dmabuf->ops->detach(dmabuf, attach);
|
||||
|
||||
dma_buf_attach_stats_teardown(attach);
|
||||
kfree(attach);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dma_buf_detach);
|
||||
@ -965,9 +955,6 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
|
||||
attach->dir = direction;
|
||||
}
|
||||
|
||||
if (!IS_ERR(sg_table))
|
||||
dma_buf_update_attachment_map_count(attach, 1 /* delta */);
|
||||
|
||||
return sg_table;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dma_buf_map_attachment);
|
||||
@ -1005,8 +992,6 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
|
||||
if (dma_buf_is_dynamic(attach->dmabuf) &&
|
||||
!IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY))
|
||||
dma_buf_unpin(attach);
|
||||
|
||||
dma_buf_update_attachment_map_count(attach, -1 /* delta */);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dma_buf_unmap_attachment);
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
@ -605,6 +606,8 @@ struct sdhci_host {
|
||||
|
||||
u64 data_timeout;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
|
||||
unsigned long private[] ____cacheline_aligned;
|
||||
};
|
||||
|
||||
@ -652,6 +655,8 @@ struct sdhci_ops {
|
||||
void (*request_done)(struct sdhci_host *host,
|
||||
struct mmc_request *mrq);
|
||||
void (*dump_vendor_regs)(struct sdhci_host *host);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
|
||||
|
@ -1817,6 +1817,7 @@ int of_add_property(struct device_node *np, struct property *prop)
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_add_property);
|
||||
|
||||
int __of_remove_property(struct device_node *np, struct property *prop)
|
||||
{
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/android_kabi.h>
|
||||
#include <uapi/scsi/scsi_bsg_ufs.h>
|
||||
|
||||
#define GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req))
|
||||
@ -594,6 +595,7 @@ struct ufs_dev_info {
|
||||
u8 b_presrv_uspc_en;
|
||||
/* UFS HPB related flag */
|
||||
bool hpb_enabled;
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include <scsi/scsi_tcq.h>
|
||||
#include <scsi/scsi_dbg.h>
|
||||
#include <scsi/scsi_eh.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#include "ufs.h"
|
||||
#include "ufs_quirks.h"
|
||||
@ -217,6 +218,8 @@ struct ufshcd_lrb {
|
||||
#endif
|
||||
|
||||
bool req_abort_skip;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -353,6 +356,11 @@ struct ufs_hba_variant_ops {
|
||||
const union ufs_crypto_cfg_entry *cfg, int slot);
|
||||
void (*event_notify)(struct ufs_hba *hba,
|
||||
enum ufs_event_type evt, void *data);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
/* clock gating state */
|
||||
@ -392,6 +400,8 @@ struct ufs_clk_gating {
|
||||
bool is_initialized;
|
||||
int active_reqs;
|
||||
struct workqueue_struct *clk_gating_workq;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct ufs_saved_pwr_info {
|
||||
@ -438,6 +448,8 @@ struct ufs_clk_scaling {
|
||||
bool is_initialized;
|
||||
bool is_busy_started;
|
||||
bool is_suspended;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
#define UFS_EVENT_HIST_LENGTH 8
|
||||
@ -916,6 +928,11 @@ struct ufs_hba {
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_root;
|
||||
#endif
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
/* Returns true if clocks can be gated. Otherwise false */
|
||||
|
@ -915,6 +915,15 @@ static const struct file_operations ashmem_fops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* is_ashmem_file - Check if struct file* is associated with ashmem
|
||||
*/
|
||||
int is_ashmem_file(struct file *file)
|
||||
{
|
||||
return file->f_op == &ashmem_fops;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(is_ashmem_file);
|
||||
|
||||
static struct miscdevice ashmem_misc = {
|
||||
.minor = MISC_DYNAMIC_MINOR,
|
||||
.name = "ashmem",
|
||||
|
@ -21,4 +21,6 @@
|
||||
#define COMPAT_ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned int)
|
||||
#endif
|
||||
|
||||
int is_ashmem_file(struct file *file);
|
||||
|
||||
#endif /* _LINUX_ASHMEM_H */
|
||||
|
@ -1267,6 +1267,7 @@ static void dwc3_get_properties(struct dwc3 *dwc)
|
||||
u8 rx_max_burst_prd;
|
||||
u8 tx_thr_num_pkt_prd;
|
||||
u8 tx_max_burst_prd;
|
||||
u8 tx_fifo_resize_max_num;
|
||||
const char *usb_psy_name;
|
||||
int ret;
|
||||
|
||||
@ -1282,6 +1283,13 @@ static void dwc3_get_properties(struct dwc3 *dwc)
|
||||
*/
|
||||
hird_threshold = 12;
|
||||
|
||||
/*
|
||||
* default to a TXFIFO size large enough to fit 6 max packets. This
|
||||
* allows for systems with larger bus latencies to have some headroom
|
||||
* for endpoints that have a large bMaxBurst value.
|
||||
*/
|
||||
tx_fifo_resize_max_num = 6;
|
||||
|
||||
dwc->maximum_speed = usb_get_maximum_speed(dev);
|
||||
dwc->max_ssp_rate = usb_get_maximum_ssp_rate(dev);
|
||||
dwc->dr_mode = usb_get_dr_mode(dev);
|
||||
@ -1325,6 +1333,11 @@ static void dwc3_get_properties(struct dwc3 *dwc)
|
||||
&tx_thr_num_pkt_prd);
|
||||
device_property_read_u8(dev, "snps,tx-max-burst-prd",
|
||||
&tx_max_burst_prd);
|
||||
dwc->do_fifo_resize = device_property_read_bool(dev,
|
||||
"tx-fifo-resize");
|
||||
if (dwc->do_fifo_resize)
|
||||
device_property_read_u8(dev, "tx-fifo-max-num",
|
||||
&tx_fifo_resize_max_num);
|
||||
|
||||
dwc->disable_scramble_quirk = device_property_read_bool(dev,
|
||||
"snps,disable_scramble_quirk");
|
||||
@ -1390,6 +1403,8 @@ static void dwc3_get_properties(struct dwc3 *dwc)
|
||||
dwc->tx_max_burst_prd = tx_max_burst_prd;
|
||||
|
||||
dwc->imod_interval = 0;
|
||||
|
||||
dwc->tx_fifo_resize_max_num = tx_fifo_resize_max_num;
|
||||
}
|
||||
|
||||
/* check whether the core supports IMOD */
|
||||
|
@ -1038,6 +1038,7 @@ struct dwc3_scratchpad_array {
|
||||
* @rx_max_burst_prd: max periodic ESS receive burst size
|
||||
* @tx_thr_num_pkt_prd: periodic ESS transmit packet count
|
||||
* @tx_max_burst_prd: max periodic ESS transmit burst size
|
||||
* @tx_fifo_resize_max_num: max number of fifos allocated during txfifo resize
|
||||
* @hsphy_interface: "utmi" or "ulpi"
|
||||
* @connected: true when we're connected to a host, false otherwise
|
||||
* @delayed_status: true when gadget driver asks for delayed status
|
||||
@ -1052,6 +1053,7 @@ struct dwc3_scratchpad_array {
|
||||
* 1 - utmi_l1_suspend_n
|
||||
* @is_fpga: true when we are using the FPGA board
|
||||
* @pending_events: true when we have pending IRQs to be handled
|
||||
* @do_fifo_resize: true when txfifo resizing is enabled for dwc3 endpoints
|
||||
* @pullups_connected: true when Run/Stop bit is set
|
||||
* @setup_packet_pending: true when there's a Setup Packet in FIFO. Workaround
|
||||
* @three_stage_setup: set if we perform a three phase setup
|
||||
@ -1094,6 +1096,11 @@ struct dwc3_scratchpad_array {
|
||||
* @dis_split_quirk: set to disable split boundary.
|
||||
* @imod_interval: set the interrupt moderation interval in 250ns
|
||||
* increments or 0 to disable.
|
||||
* @max_cfg_eps: current max number of IN eps used across all USB configs.
|
||||
* @last_fifo_depth: last fifo depth used to determine next fifo ram start
|
||||
* address.
|
||||
* @num_ep_resized: carries the current number endpoints which have had its tx
|
||||
* fifo resized.
|
||||
*/
|
||||
struct dwc3 {
|
||||
struct work_struct drd_work;
|
||||
@ -1249,6 +1256,7 @@ struct dwc3 {
|
||||
u8 rx_max_burst_prd;
|
||||
u8 tx_thr_num_pkt_prd;
|
||||
u8 tx_max_burst_prd;
|
||||
u8 tx_fifo_resize_max_num;
|
||||
|
||||
const char *hsphy_interface;
|
||||
|
||||
@ -1262,6 +1270,7 @@ struct dwc3 {
|
||||
unsigned is_utmi_l1_suspend:1;
|
||||
unsigned is_fpga:1;
|
||||
unsigned pending_events:1;
|
||||
unsigned do_fifo_resize:1;
|
||||
unsigned pullups_connected:1;
|
||||
unsigned setup_packet_pending:1;
|
||||
unsigned three_stage_setup:1;
|
||||
@ -1295,9 +1304,14 @@ struct dwc3 {
|
||||
unsigned dis_metastability_quirk:1;
|
||||
|
||||
unsigned dis_split_quirk:1;
|
||||
unsigned async_callbacks:1;
|
||||
|
||||
u16 imod_interval;
|
||||
|
||||
int max_cfg_eps;
|
||||
int last_fifo_depth;
|
||||
int num_ep_resized;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
@ -1534,6 +1548,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,
|
||||
int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned int cmd,
|
||||
u32 param);
|
||||
void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool interrupt);
|
||||
void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc);
|
||||
#else
|
||||
static inline int dwc3_gadget_init(struct dwc3 *dwc)
|
||||
{ return 0; }
|
||||
@ -1556,6 +1571,8 @@ static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc,
|
||||
static inline void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
|
||||
bool interrupt)
|
||||
{ }
|
||||
static inline void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc)
|
||||
{ }
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)
|
||||
|
@ -640,6 +640,7 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev)
|
||||
struct dwc3_qcom *qcom = platform_get_drvdata(pdev);
|
||||
struct device_node *np = pdev->dev.of_node, *dwc3_np;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct property *prop;
|
||||
int ret;
|
||||
|
||||
dwc3_np = of_get_child_by_name(np, "dwc3");
|
||||
@ -648,6 +649,20 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
prop = devm_kzalloc(dev, sizeof(*prop), GFP_KERNEL);
|
||||
if (!prop) {
|
||||
ret = -ENOMEM;
|
||||
dev_err(dev, "unable to allocate memory for property\n");
|
||||
goto node_put;
|
||||
}
|
||||
|
||||
prop->name = "tx-fifo-resize";
|
||||
ret = of_add_property(dwc3_np, prop);
|
||||
if (ret) {
|
||||
dev_err(dev, "unable to add property\n");
|
||||
goto node_put;
|
||||
}
|
||||
|
||||
ret = of_platform_populate(np, NULL, NULL, dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to register dwc3 core - %d\n", ret);
|
||||
|
@ -594,11 +594,13 @@ static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
|
||||
|
||||
static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
|
||||
{
|
||||
int ret;
|
||||
int ret = -EINVAL;
|
||||
|
||||
spin_unlock(&dwc->lock);
|
||||
ret = dwc->gadget_driver->setup(dwc->gadget, ctrl);
|
||||
spin_lock(&dwc->lock);
|
||||
if (dwc->async_callbacks) {
|
||||
spin_unlock(&dwc->lock);
|
||||
ret = dwc->gadget_driver->setup(dwc->gadget, ctrl);
|
||||
spin_lock(&dwc->lock);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -616,6 +618,8 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
|
||||
return -EINVAL;
|
||||
|
||||
case USB_STATE_ADDRESS:
|
||||
dwc3_gadget_clear_tx_fifos(dwc);
|
||||
|
||||
ret = dwc3_ep0_delegate_req(dwc, ctrl);
|
||||
/* if the cfg matches and the cfg is non zero */
|
||||
if (cfg && (!ret || (ret == USB_GADGET_DELAYED_STATUS))) {
|
||||
|
@ -629,6 +629,187 @@ static int dwc3_gadget_set_ep_config(struct dwc3_ep *dep, unsigned int action)
|
||||
return dwc3_send_gadget_ep_cmd(dep, DWC3_DEPCMD_SETEPCONFIG, ¶ms);
|
||||
}
|
||||
|
||||
/**
|
||||
* dwc3_gadget_calc_tx_fifo_size - calculates the txfifo size value
|
||||
* @dwc: pointer to the DWC3 context
|
||||
* @nfifos: number of fifos to calculate for
|
||||
*
|
||||
* Calculates the size value based on the equation below:
|
||||
*
|
||||
* DWC3 revision 280A and prior:
|
||||
* fifo_size = mult * (max_packet / mdwidth) + 1;
|
||||
*
|
||||
* DWC3 revision 290A and onwards:
|
||||
* fifo_size = mult * ((max_packet + mdwidth)/mdwidth + 1) + 1
|
||||
*
|
||||
* The max packet size is set to 1024, as the txfifo requirements mainly apply
|
||||
* to super speed USB use cases. However, it is safe to overestimate the fifo
|
||||
* allocations for other scenarios, i.e. high speed USB.
|
||||
*/
|
||||
static int dwc3_gadget_calc_tx_fifo_size(struct dwc3 *dwc, int mult)
|
||||
{
|
||||
int max_packet = 1024;
|
||||
int fifo_size;
|
||||
int mdwidth;
|
||||
|
||||
mdwidth = dwc3_mdwidth(dwc);
|
||||
|
||||
/* MDWIDTH is represented in bits, we need it in bytes */
|
||||
mdwidth >>= 3;
|
||||
|
||||
if (DWC3_VER_IS_PRIOR(DWC3, 290A))
|
||||
fifo_size = mult * (max_packet / mdwidth) + 1;
|
||||
else
|
||||
fifo_size = mult * ((max_packet + mdwidth) / mdwidth) + 1;
|
||||
return fifo_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* dwc3_gadget_clear_tx_fifo_size - Clears txfifo allocation
|
||||
* @dwc: pointer to the DWC3 context
|
||||
*
|
||||
* Iterates through all the endpoint registers and clears the previous txfifo
|
||||
* allocations.
|
||||
*/
|
||||
void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc)
|
||||
{
|
||||
struct dwc3_ep *dep;
|
||||
int fifo_depth;
|
||||
int size;
|
||||
int num;
|
||||
|
||||
if (!dwc->do_fifo_resize)
|
||||
return;
|
||||
|
||||
/* Read ep0IN related TXFIFO size */
|
||||
dep = dwc->eps[1];
|
||||
size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0));
|
||||
if (DWC3_IP_IS(DWC3))
|
||||
fifo_depth = DWC3_GTXFIFOSIZ_TXFDEP(size);
|
||||
else
|
||||
fifo_depth = DWC31_GTXFIFOSIZ_TXFDEP(size);
|
||||
|
||||
dwc->last_fifo_depth = fifo_depth;
|
||||
/* Clear existing TXFIFO for all IN eps except ep0 */
|
||||
for (num = 3; num < min_t(int, dwc->num_eps, DWC3_ENDPOINTS_NUM);
|
||||
num += 2) {
|
||||
dep = dwc->eps[num];
|
||||
/* Don't change TXFRAMNUM on usb31 version */
|
||||
size = DWC3_IP_IS(DWC3) ? 0 :
|
||||
dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1)) &
|
||||
DWC31_GTXFIFOSIZ_TXFRAMNUM;
|
||||
|
||||
dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1), size);
|
||||
}
|
||||
dwc->num_ep_resized = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* dwc3_gadget_resize_tx_fifos - reallocate fifo spaces for current use-case
|
||||
* @dwc: pointer to our context structure
|
||||
*
|
||||
* This function will a best effort FIFO allocation in order
|
||||
* to improve FIFO usage and throughput, while still allowing
|
||||
* us to enable as many endpoints as possible.
|
||||
*
|
||||
* Keep in mind that this operation will be highly dependent
|
||||
* on the configured size for RAM1 - which contains TxFifo -,
|
||||
* the amount of endpoints enabled on coreConsultant tool, and
|
||||
* the width of the Master Bus.
|
||||
*
|
||||
* In general, FIFO depths are represented with the following equation:
|
||||
*
|
||||
* fifo_size = mult * ((max_packet + mdwidth)/mdwidth + 1) + 1
|
||||
*
|
||||
* In conjunction with dwc3_gadget_check_config(), this resizing logic will
|
||||
* ensure that all endpoints will have enough internal memory for one max
|
||||
* packet per endpoint.
|
||||
*/
|
||||
static int dwc3_gadget_resize_tx_fifos(struct dwc3_ep *dep)
|
||||
{
|
||||
struct dwc3 *dwc = dep->dwc;
|
||||
int fifo_0_start;
|
||||
int ram1_depth;
|
||||
int fifo_size;
|
||||
int min_depth;
|
||||
int num_in_ep;
|
||||
int remaining;
|
||||
int num_fifos = 1;
|
||||
int fifo;
|
||||
int tmp;
|
||||
|
||||
if (!dwc->do_fifo_resize)
|
||||
return 0;
|
||||
|
||||
/* resize IN endpoints except ep0 */
|
||||
if (!usb_endpoint_dir_in(dep->endpoint.desc) || dep->number <= 1)
|
||||
return 0;
|
||||
|
||||
ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7);
|
||||
|
||||
if ((dep->endpoint.maxburst > 1 &&
|
||||
usb_endpoint_xfer_bulk(dep->endpoint.desc)) ||
|
||||
usb_endpoint_xfer_isoc(dep->endpoint.desc))
|
||||
num_fifos = 3;
|
||||
|
||||
if (dep->endpoint.maxburst > 6 &&
|
||||
usb_endpoint_xfer_bulk(dep->endpoint.desc) && DWC3_IP_IS(DWC31))
|
||||
num_fifos = dwc->tx_fifo_resize_max_num;
|
||||
|
||||
/* FIFO size for a single buffer */
|
||||
fifo = dwc3_gadget_calc_tx_fifo_size(dwc, 1);
|
||||
|
||||
/* Calculate the number of remaining EPs w/o any FIFO */
|
||||
num_in_ep = dwc->max_cfg_eps;
|
||||
num_in_ep -= dwc->num_ep_resized;
|
||||
|
||||
/* Reserve at least one FIFO for the number of IN EPs */
|
||||
min_depth = num_in_ep * (fifo + 1);
|
||||
remaining = ram1_depth - min_depth - dwc->last_fifo_depth;
|
||||
remaining = max_t(int, 0, remaining);
|
||||
/*
|
||||
* We've already reserved 1 FIFO per EP, so check what we can fit in
|
||||
* addition to it. If there is not enough remaining space, allocate
|
||||
* all the remaining space to the EP.
|
||||
*/
|
||||
fifo_size = (num_fifos - 1) * fifo;
|
||||
if (remaining < fifo_size)
|
||||
fifo_size = remaining;
|
||||
|
||||
fifo_size += fifo;
|
||||
/* Last increment according to the TX FIFO size equation */
|
||||
fifo_size++;
|
||||
|
||||
/* Check if TXFIFOs start at non-zero addr */
|
||||
tmp = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0));
|
||||
fifo_0_start = DWC3_GTXFIFOSIZ_TXFSTADDR(tmp);
|
||||
|
||||
fifo_size |= (fifo_0_start + (dwc->last_fifo_depth << 16));
|
||||
if (DWC3_IP_IS(DWC3))
|
||||
dwc->last_fifo_depth += DWC3_GTXFIFOSIZ_TXFDEP(fifo_size);
|
||||
else
|
||||
dwc->last_fifo_depth += DWC31_GTXFIFOSIZ_TXFDEP(fifo_size);
|
||||
|
||||
/* Check fifo size allocation doesn't exceed available RAM size. */
|
||||
if (dwc->last_fifo_depth >= ram1_depth) {
|
||||
dev_err(dwc->dev, "Fifosize(%d) > RAM size(%d) %s depth:%d\n",
|
||||
dwc->last_fifo_depth, ram1_depth,
|
||||
dep->endpoint.name, fifo_size);
|
||||
if (DWC3_IP_IS(DWC3))
|
||||
fifo_size = DWC3_GTXFIFOSIZ_TXFDEP(fifo_size);
|
||||
else
|
||||
fifo_size = DWC31_GTXFIFOSIZ_TXFDEP(fifo_size);
|
||||
|
||||
dwc->last_fifo_depth -= fifo_size;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1), fifo_size);
|
||||
dwc->num_ep_resized++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* __dwc3_gadget_ep_enable - initializes a hw endpoint
|
||||
* @dep: endpoint to be initialized
|
||||
@ -646,6 +827,10 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, unsigned int action)
|
||||
int ret;
|
||||
|
||||
if (!(dep->flags & DWC3_EP_ENABLED)) {
|
||||
ret = dwc3_gadget_resize_tx_fifos(dep);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = dwc3_gadget_start_config(dep);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -2510,6 +2695,7 @@ static int dwc3_gadget_stop(struct usb_gadget *g)
|
||||
|
||||
spin_lock_irqsave(&dwc->lock, flags);
|
||||
dwc->gadget_driver = NULL;
|
||||
dwc->max_cfg_eps = 0;
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
|
||||
free_irq(dwc->irq_gadget, dwc->ev_buf);
|
||||
@ -2597,6 +2783,61 @@ static int dwc3_gadget_vbus_draw(struct usb_gadget *g, unsigned int mA)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* dwc3_gadget_check_config - ensure dwc3 can support the USB configuration
|
||||
* @g: pointer to the USB gadget
|
||||
*
|
||||
* Used to record the maximum number of endpoints being used in a USB composite
|
||||
* device. (across all configurations) This is to be used in the calculation
|
||||
* of the TXFIFO sizes when resizing internal memory for individual endpoints.
|
||||
* It will help ensured that the resizing logic reserves enough space for at
|
||||
* least one max packet.
|
||||
*/
|
||||
static int dwc3_gadget_check_config(struct usb_gadget *g)
|
||||
{
|
||||
struct dwc3 *dwc = gadget_to_dwc(g);
|
||||
struct usb_ep *ep;
|
||||
int fifo_size = 0;
|
||||
int ram1_depth;
|
||||
int ep_num = 0;
|
||||
|
||||
if (!dwc->do_fifo_resize)
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(ep, &g->ep_list, ep_list) {
|
||||
/* Only interested in the IN endpoints */
|
||||
if (ep->claimed && (ep->address & USB_DIR_IN))
|
||||
ep_num++;
|
||||
}
|
||||
|
||||
if (ep_num <= dwc->max_cfg_eps)
|
||||
return 0;
|
||||
|
||||
/* Update the max number of eps in the composition */
|
||||
dwc->max_cfg_eps = ep_num;
|
||||
|
||||
fifo_size = dwc3_gadget_calc_tx_fifo_size(dwc, dwc->max_cfg_eps);
|
||||
/* Based on the equation, increment by one for every ep */
|
||||
fifo_size += dwc->max_cfg_eps;
|
||||
|
||||
/* Check if we can fit a single fifo per endpoint */
|
||||
ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7);
|
||||
if (fifo_size > ram1_depth)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dwc3_gadget_async_callbacks(struct usb_gadget *g, bool enable)
|
||||
{
|
||||
struct dwc3 *dwc = gadget_to_dwc(g);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&dwc->lock, flags);
|
||||
dwc->async_callbacks = enable;
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
}
|
||||
|
||||
static const struct usb_gadget_ops dwc3_gadget_ops = {
|
||||
.get_frame = dwc3_gadget_get_frame,
|
||||
.wakeup = dwc3_gadget_wakeup,
|
||||
@ -2608,6 +2849,8 @@ static const struct usb_gadget_ops dwc3_gadget_ops = {
|
||||
.udc_set_ssp_rate = dwc3_gadget_set_ssp_rate,
|
||||
.get_config_params = dwc3_gadget_config_params,
|
||||
.vbus_draw = dwc3_gadget_vbus_draw,
|
||||
.check_config = dwc3_gadget_check_config,
|
||||
.udc_async_callbacks = dwc3_gadget_async_callbacks,
|
||||
};
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
@ -3241,7 +3484,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
|
||||
|
||||
static void dwc3_disconnect_gadget(struct dwc3 *dwc)
|
||||
{
|
||||
if (dwc->gadget_driver && dwc->gadget_driver->disconnect) {
|
||||
if (dwc->async_callbacks && dwc->gadget_driver->disconnect) {
|
||||
spin_unlock(&dwc->lock);
|
||||
dwc->gadget_driver->disconnect(dwc->gadget);
|
||||
spin_lock(&dwc->lock);
|
||||
@ -3250,7 +3493,7 @@ static void dwc3_disconnect_gadget(struct dwc3 *dwc)
|
||||
|
||||
static void dwc3_suspend_gadget(struct dwc3 *dwc)
|
||||
{
|
||||
if (dwc->gadget_driver && dwc->gadget_driver->suspend) {
|
||||
if (dwc->async_callbacks && dwc->gadget_driver->suspend) {
|
||||
spin_unlock(&dwc->lock);
|
||||
dwc->gadget_driver->suspend(dwc->gadget);
|
||||
spin_lock(&dwc->lock);
|
||||
@ -3259,7 +3502,7 @@ static void dwc3_suspend_gadget(struct dwc3 *dwc)
|
||||
|
||||
static void dwc3_resume_gadget(struct dwc3 *dwc)
|
||||
{
|
||||
if (dwc->gadget_driver && dwc->gadget_driver->resume) {
|
||||
if (dwc->async_callbacks && dwc->gadget_driver->resume) {
|
||||
spin_unlock(&dwc->lock);
|
||||
dwc->gadget_driver->resume(dwc->gadget);
|
||||
spin_lock(&dwc->lock);
|
||||
@ -3271,7 +3514,7 @@ static void dwc3_reset_gadget(struct dwc3 *dwc)
|
||||
if (!dwc->gadget_driver)
|
||||
return;
|
||||
|
||||
if (dwc->gadget->speed != USB_SPEED_UNKNOWN) {
|
||||
if (dwc->async_callbacks && dwc->gadget->speed != USB_SPEED_UNKNOWN) {
|
||||
spin_unlock(&dwc->lock);
|
||||
usb_gadget_udc_reset(dwc->gadget, dwc->gadget_driver);
|
||||
spin_lock(&dwc->lock);
|
||||
@ -3601,7 +3844,7 @@ static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc)
|
||||
* implemented.
|
||||
*/
|
||||
|
||||
if (dwc->gadget_driver && dwc->gadget_driver->resume) {
|
||||
if (dwc->async_callbacks && dwc->gadget_driver->resume) {
|
||||
spin_unlock(&dwc->lock);
|
||||
dwc->gadget_driver->resume(dwc->gadget);
|
||||
spin_lock(&dwc->lock);
|
||||
|
@ -1436,6 +1436,10 @@ static int configfs_composite_bind(struct usb_gadget *gadget,
|
||||
goto err_purge_funcs;
|
||||
}
|
||||
}
|
||||
ret = usb_gadget_check_config(cdev->gadget);
|
||||
if (ret)
|
||||
goto err_purge_funcs;
|
||||
|
||||
usb_ep_autoconfig_reset(cdev->gadget);
|
||||
}
|
||||
if (cdev->use_os_string) {
|
||||
@ -1534,18 +1538,28 @@ static void configfs_composite_unbind(struct usb_gadget *gadget)
|
||||
static int android_setup(struct usb_gadget *gadget,
|
||||
const struct usb_ctrlrequest *c)
|
||||
{
|
||||
struct usb_composite_dev *cdev = get_gadget_data(gadget);
|
||||
struct usb_composite_dev *cdev;
|
||||
unsigned long flags;
|
||||
struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev);
|
||||
struct gadget_info *gi;
|
||||
int value = -EOPNOTSUPP;
|
||||
struct usb_function_instance *fi;
|
||||
|
||||
spin_lock_irqsave(&cdev->lock, flags);
|
||||
if (!android_device)
|
||||
return 0;
|
||||
|
||||
gi = dev_get_drvdata(android_device);
|
||||
spin_lock_irqsave(&gi->spinlock, flags);
|
||||
cdev = get_gadget_data(gadget);
|
||||
if (!cdev || gi->unbind) {
|
||||
spin_unlock_irqrestore(&gi->spinlock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
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);
|
||||
@ -1562,12 +1576,11 @@ static int android_setup(struct usb_gadget *gadget,
|
||||
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);
|
||||
spin_unlock_irqrestore(&gi->spinlock, flags);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
@ -1019,6 +1019,25 @@ int usb_gadget_ep_match_desc(struct usb_gadget *gadget,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_gadget_ep_match_desc);
|
||||
|
||||
/**
|
||||
* usb_gadget_check_config - checks if the UDC can support the binded
|
||||
* configuration
|
||||
* @gadget: controller to check the USB configuration
|
||||
*
|
||||
* Ensure that a UDC is able to support the requested resources by a
|
||||
* configuration, and that there are no resource limitations, such as
|
||||
* internal memory allocated to all requested endpoints.
|
||||
*
|
||||
* Returns zero on success, else a negative errno.
|
||||
*/
|
||||
int usb_gadget_check_config(struct usb_gadget *gadget)
|
||||
{
|
||||
if (gadget->ops->check_config)
|
||||
return gadget->ops->check_config(gadget);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_gadget_check_config);
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
static void usb_gadget_state_work(struct work_struct *work)
|
||||
@ -1163,6 +1182,53 @@ static inline void usb_gadget_udc_set_speed(struct usb_udc *udc,
|
||||
gadget->ops->udc_set_speed(gadget, s);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_gadget_enable_async_callbacks - tell usb device controller to enable asynchronous callbacks
|
||||
* @udc: The UDC which should enable async callbacks
|
||||
*
|
||||
* This routine is used when binding gadget drivers. It undoes the effect
|
||||
* of usb_gadget_disable_async_callbacks(); the UDC driver should enable IRQs
|
||||
* (if necessary) and resume issuing callbacks.
|
||||
*
|
||||
* This routine will always be called in process context.
|
||||
*/
|
||||
static inline void usb_gadget_enable_async_callbacks(struct usb_udc *udc)
|
||||
{
|
||||
struct usb_gadget *gadget = udc->gadget;
|
||||
|
||||
if (gadget->ops->udc_async_callbacks)
|
||||
gadget->ops->udc_async_callbacks(gadget, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_gadget_disable_async_callbacks - tell usb device controller to disable asynchronous callbacks
|
||||
* @udc: The UDC which should disable async callbacks
|
||||
*
|
||||
* This routine is used when unbinding gadget drivers. It prevents a race:
|
||||
* The UDC driver doesn't know when the gadget driver's ->unbind callback
|
||||
* runs, so unless it is told to disable asynchronous callbacks, it might
|
||||
* issue a callback (such as ->disconnect) after the unbind has completed.
|
||||
*
|
||||
* After this function runs, the UDC driver must suppress all ->suspend,
|
||||
* ->resume, ->disconnect, ->reset, and ->setup callbacks to the gadget driver
|
||||
* until async callbacks are again enabled. A simple-minded but effective
|
||||
* way to accomplish this is to tell the UDC hardware not to generate any
|
||||
* more IRQs.
|
||||
*
|
||||
* Request completion callbacks must still be issued. However, it's okay
|
||||
* to defer them until the request is cancelled, since the pull-up will be
|
||||
* turned off during the time period when async callbacks are disabled.
|
||||
*
|
||||
* This routine will always be called in process context.
|
||||
*/
|
||||
static inline void usb_gadget_disable_async_callbacks(struct usb_udc *udc)
|
||||
{
|
||||
struct usb_gadget *gadget = udc->gadget;
|
||||
|
||||
if (gadget->ops->udc_async_callbacks)
|
||||
gadget->ops->udc_async_callbacks(gadget, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_udc_release - release the usb_udc struct
|
||||
* @dev: the dev member within usb_udc
|
||||
@ -1377,6 +1443,7 @@ static void usb_gadget_remove_driver(struct usb_udc *udc)
|
||||
kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
|
||||
|
||||
usb_gadget_disconnect(udc->gadget);
|
||||
usb_gadget_disable_async_callbacks(udc);
|
||||
if (udc->gadget->irq)
|
||||
synchronize_irq(udc->gadget->irq);
|
||||
udc->driver->unbind(udc->gadget);
|
||||
@ -1458,6 +1525,7 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri
|
||||
driver->unbind(udc->gadget);
|
||||
goto err1;
|
||||
}
|
||||
usb_gadget_enable_async_callbacks(udc);
|
||||
usb_udc_connect_control(udc);
|
||||
|
||||
kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/usb/pd_vdo.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#include "bus.h"
|
||||
|
||||
@ -20,6 +21,7 @@ struct typec_plug {
|
||||
enum typec_plug_index index;
|
||||
struct ida mode_ids;
|
||||
int num_altmodes;
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct typec_cable {
|
||||
@ -28,6 +30,7 @@ struct typec_cable {
|
||||
struct usb_pd_identity *identity;
|
||||
unsigned int active:1;
|
||||
u16 pd_revision; /* 0300H = "3.0" */
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct typec_partner {
|
||||
@ -39,6 +42,7 @@ struct typec_partner {
|
||||
int num_altmodes;
|
||||
u16 pd_revision; /* 0300H = "3.0" */
|
||||
enum usb_pd_svdm_ver svdm_version;
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct typec_port {
|
||||
@ -60,6 +64,7 @@ struct typec_port {
|
||||
|
||||
const struct typec_capability *cap;
|
||||
const struct typec_operations *ops;
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
#define to_typec_port(_dev_) container_of(_dev_, struct typec_port, dev)
|
||||
|
@ -1307,11 +1307,12 @@ static int virtio_mem_mb_unplug_sb_online(struct virtio_mem *vm,
|
||||
const unsigned long nr_pages = PFN_DOWN(vm->subblock_size) * count;
|
||||
unsigned long start_pfn;
|
||||
int rc;
|
||||
struct acr_info dummy;
|
||||
|
||||
start_pfn = PFN_DOWN(virtio_mem_mb_id_to_phys(mb_id) +
|
||||
sb_id * vm->subblock_size);
|
||||
rc = alloc_contig_range(start_pfn, start_pfn + nr_pages,
|
||||
MIGRATE_MOVABLE, GFP_KERNEL);
|
||||
MIGRATE_MOVABLE, GFP_KERNEL, &dummy);
|
||||
if (rc == -ENOMEM)
|
||||
/* whoops, out of memory */
|
||||
return rc;
|
||||
|
@ -3905,6 +3905,7 @@ include/trace/events/writeback.h
|
||||
include/trace/events/xdp.h
|
||||
include/trace/hooks/avc.h
|
||||
include/trace/hooks/binder.h
|
||||
include/trace/hooks/block.h
|
||||
include/trace/hooks/bug.h
|
||||
include/trace/hooks/cgroup.h
|
||||
include/trace/hooks/cpufreq.h
|
||||
@ -3927,6 +3928,7 @@ include/trace/hooks/gpiolib.h
|
||||
include/trace/hooks/hung_task.h
|
||||
include/trace/hooks/i2c.h
|
||||
include/trace/hooks/iommu.h
|
||||
include/trace/hooks/ipv6.h
|
||||
include/trace/hooks/logbuf.h
|
||||
include/trace/hooks/memory.h
|
||||
include/trace/hooks/mmc_core.h
|
||||
@ -3946,7 +3948,9 @@ include/trace/hooks/scmi.h
|
||||
include/trace/hooks/selinux.h
|
||||
include/trace/hooks/shmem_fs.h
|
||||
include/trace/hooks/signal.h
|
||||
include/trace/hooks/snd_compr.h
|
||||
include/trace/hooks/softlockup.h
|
||||
include/trace/hooks/sound.h
|
||||
include/trace/hooks/syscall_check.h
|
||||
include/trace/hooks/sys.h
|
||||
include/trace/hooks/sysrqcrash.h
|
||||
@ -5012,6 +5016,7 @@ mm/list_lru.c
|
||||
mm/maccess.c
|
||||
mm/madvise.c
|
||||
mm/memblock.c
|
||||
mm/memcontrol.c
|
||||
mm/memfd.c
|
||||
mm/memory.c
|
||||
mm/memory_hotplug.c
|
||||
@ -5029,6 +5034,7 @@ mm/mremap.c
|
||||
mm/msync.c
|
||||
mm/oom_kill.c
|
||||
mm/page_alloc.c
|
||||
mm/page_counter.c
|
||||
mm/page_ext.c
|
||||
mm/page_io.c
|
||||
mm/page_isolation.c
|
||||
@ -5056,6 +5062,7 @@ mm/slub.c
|
||||
mm/sparse.c
|
||||
mm/sparse-vmemmap.c
|
||||
mm/swap.c
|
||||
mm/swap_cgroup.c
|
||||
mm/swapfile.c
|
||||
mm/swap_slots.c
|
||||
mm/swap_state.c
|
||||
@ -5065,6 +5072,7 @@ mm/userfaultfd.c
|
||||
mm/util.c
|
||||
mm/vmacache.c
|
||||
mm/vmalloc.c
|
||||
mm/vmpressure.c
|
||||
mm/vmscan.c
|
||||
mm/vmstat.c
|
||||
mm/workingset.c
|
||||
@ -5167,6 +5175,7 @@ net/core/link_watch.c
|
||||
net/core/neighbour.c
|
||||
net/core/netevent.c
|
||||
net/core/net_namespace.c
|
||||
net/core/netprio_cgroup.c
|
||||
net/core/net-procfs.c
|
||||
net/core/net-sysfs.c
|
||||
net/core/net-sysfs.h
|
||||
|
@ -3876,6 +3876,8 @@ int f2fs_migrate_page(struct address_space *mapping,
|
||||
get_page(newpage);
|
||||
}
|
||||
|
||||
/* guarantee to start from no stale private field */
|
||||
set_page_private(newpage, 0);
|
||||
if (PagePrivate(page)) {
|
||||
set_page_private(newpage, page_private(page));
|
||||
SetPagePrivate(newpage);
|
||||
|
@ -450,6 +450,15 @@ static int stat_show(struct seq_file *s, void *v)
|
||||
si->data_segs, si->bg_data_segs);
|
||||
seq_printf(s, " - node segments : %d (%d)\n",
|
||||
si->node_segs, si->bg_node_segs);
|
||||
seq_printf(s, " - Reclaimed segs : Normal (%d), Idle CB (%d), "
|
||||
"Idle Greedy (%d), Idle AT (%d), "
|
||||
"Urgent High (%d), Urgent Low (%d)\n",
|
||||
si->sbi->gc_reclaimed_segs[GC_NORMAL],
|
||||
si->sbi->gc_reclaimed_segs[GC_IDLE_CB],
|
||||
si->sbi->gc_reclaimed_segs[GC_IDLE_GREEDY],
|
||||
si->sbi->gc_reclaimed_segs[GC_IDLE_AT],
|
||||
si->sbi->gc_reclaimed_segs[GC_URGENT_HIGH],
|
||||
si->sbi->gc_reclaimed_segs[GC_URGENT_LOW]);
|
||||
seq_printf(s, "Try to move %d blocks (BG: %d)\n", si->tot_blks,
|
||||
si->bg_data_blks + si->bg_node_blks);
|
||||
seq_printf(s, " - data blocks : %d (%d)\n", si->data_blks,
|
||||
|
@ -1251,6 +1251,7 @@ enum {
|
||||
GC_IDLE_AT,
|
||||
GC_URGENT_HIGH,
|
||||
GC_URGENT_LOW,
|
||||
MAX_GC_MODE,
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -1329,7 +1330,8 @@ enum {
|
||||
#define PAGE_PRIVATE_GET_FUNC(name, flagname) \
|
||||
static inline bool page_private_##name(struct page *page) \
|
||||
{ \
|
||||
return test_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)) && \
|
||||
return PagePrivate(page) && \
|
||||
test_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)) && \
|
||||
test_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
|
||||
}
|
||||
|
||||
@ -1339,6 +1341,7 @@ static inline void set_page_private_##name(struct page *page) \
|
||||
if (!PagePrivate(page)) { \
|
||||
get_page(page); \
|
||||
SetPagePrivate(page); \
|
||||
set_page_private(page, 0); \
|
||||
} \
|
||||
set_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)); \
|
||||
set_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
|
||||
@ -1390,6 +1393,7 @@ static inline void set_page_private_data(struct page *page, unsigned long data)
|
||||
if (!PagePrivate(page)) {
|
||||
get_page(page);
|
||||
SetPagePrivate(page);
|
||||
set_page_private(page, 0);
|
||||
}
|
||||
set_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page));
|
||||
page_private(page) |= data << PAGE_PRIVATE_MAX;
|
||||
@ -1728,6 +1732,10 @@ struct f2fs_sb_info {
|
||||
struct kmem_cache *inline_xattr_slab; /* inline xattr entry */
|
||||
unsigned int inline_xattr_slab_size; /* default inline xattr slab size */
|
||||
|
||||
/* For reclaimed segs statistics per each GC mode */
|
||||
unsigned int gc_segment_mode; /* GC state for reclaimed segments */
|
||||
unsigned int gc_reclaimed_segs[MAX_GC_MODE]; /* Reclaimed segs for each mode */
|
||||
|
||||
#ifdef CONFIG_F2FS_FS_COMPRESSION
|
||||
struct kmem_cache *page_array_slab; /* page array entry */
|
||||
unsigned int page_array_slab_size; /* default page array slab size */
|
||||
|
@ -1646,6 +1646,7 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,
|
||||
force_migrate);
|
||||
|
||||
stat_inc_seg_count(sbi, type, gc_type);
|
||||
sbi->gc_reclaimed_segs[sbi->gc_mode]++;
|
||||
migrated++;
|
||||
|
||||
freed:
|
||||
|
@ -307,6 +307,14 @@ static ssize_t f2fs_sbi_show(struct f2fs_attr *a,
|
||||
return sysfs_emit(buf, "%u\n", sbi->compr_new_inode);
|
||||
#endif
|
||||
|
||||
if (!strcmp(a->attr.name, "gc_segment_mode"))
|
||||
return sysfs_emit(buf, "%u\n", sbi->gc_segment_mode);
|
||||
|
||||
if (!strcmp(a->attr.name, "gc_reclaimed_segments")) {
|
||||
return sysfs_emit(buf, "%u\n",
|
||||
sbi->gc_reclaimed_segs[sbi->gc_segment_mode]);
|
||||
}
|
||||
|
||||
ui = (unsigned int *)(ptr + a->offset);
|
||||
|
||||
return sprintf(buf, "%u\n", *ui);
|
||||
@ -515,6 +523,21 @@ static ssize_t __sbi_store(struct f2fs_attr *a,
|
||||
return count;
|
||||
}
|
||||
|
||||
if (!strcmp(a->attr.name, "gc_segment_mode")) {
|
||||
if (t < MAX_GC_MODE)
|
||||
sbi->gc_segment_mode = t;
|
||||
else
|
||||
return -EINVAL;
|
||||
return count;
|
||||
}
|
||||
|
||||
if (!strcmp(a->attr.name, "gc_reclaimed_segments")) {
|
||||
if (t != 0)
|
||||
return -EINVAL;
|
||||
sbi->gc_reclaimed_segs[sbi->gc_segment_mode] = 0;
|
||||
return count;
|
||||
}
|
||||
|
||||
*ui = (unsigned int)t;
|
||||
|
||||
return count;
|
||||
@ -740,6 +763,9 @@ F2FS_RW_ATTR(ATGC_INFO, atgc_management, atgc_candidate_count, max_candidate_cou
|
||||
F2FS_RW_ATTR(ATGC_INFO, atgc_management, atgc_age_weight, age_weight);
|
||||
F2FS_RW_ATTR(ATGC_INFO, atgc_management, atgc_age_threshold, age_threshold);
|
||||
|
||||
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_segment_mode, gc_segment_mode);
|
||||
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_reclaimed_segments, gc_reclaimed_segs);
|
||||
|
||||
#define ATTR_LIST(name) (&f2fs_attr_##name.attr)
|
||||
static struct attribute *f2fs_attrs[] = {
|
||||
ATTR_LIST(gc_urgent_sleep_time),
|
||||
@ -812,6 +838,8 @@ static struct attribute *f2fs_attrs[] = {
|
||||
ATTR_LIST(atgc_candidate_count),
|
||||
ATTR_LIST(atgc_age_weight),
|
||||
ATTR_LIST(atgc_age_threshold),
|
||||
ATTR_LIST(gc_segment_mode),
|
||||
ATTR_LIST(gc_reclaimed_segments),
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(f2fs);
|
||||
|
@ -635,20 +635,28 @@ static int ramoops_parse_dt(struct platform_device *pdev,
|
||||
struct device_node *of_node = pdev->dev.of_node;
|
||||
struct device_node *parent_node;
|
||||
struct reserved_mem *rmem;
|
||||
struct resource *res;
|
||||
u32 value;
|
||||
int ret;
|
||||
|
||||
dev_dbg(&pdev->dev, "using Device Tree\n");
|
||||
|
||||
rmem = of_reserved_mem_lookup(of_node);
|
||||
if (!rmem) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to locate DT /reserved-memory resource\n");
|
||||
return -EINVAL;
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
rmem = of_reserved_mem_lookup(of_node);
|
||||
if (rmem) {
|
||||
pdata->mem_size = rmem->size;
|
||||
pdata->mem_address = rmem->base;
|
||||
} else {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to locate DT /reserved-memory resource\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
pdata->mem_size = resource_size(res);
|
||||
pdata->mem_address = res->start;
|
||||
}
|
||||
|
||||
pdata->mem_size = rmem->size;
|
||||
pdata->mem_address = rmem->base;
|
||||
/*
|
||||
* Setting "unbuffered" is deprecated and will be ignored if
|
||||
* "mem_type" is also specified.
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/resource.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#define AMBA_NR_IRQS 9
|
||||
#define AMBA_CID 0xb105f00d
|
||||
@ -71,6 +72,8 @@ struct amba_device {
|
||||
struct amba_cs_uci_id uci;
|
||||
unsigned int irq[AMBA_NR_IRQS];
|
||||
char *driver_override;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct amba_driver {
|
||||
@ -79,6 +82,8 @@ struct amba_driver {
|
||||
void (*remove)(struct amba_device *);
|
||||
void (*shutdown)(struct amba_device *);
|
||||
const struct amba_id *id_table;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -29,6 +29,13 @@ enum android_debug_symbol {
|
||||
#endif
|
||||
#ifdef CONFIG_SWAP
|
||||
ADS_NR_SWAP_PAGES,
|
||||
#endif
|
||||
#ifdef CONFIG_MMU
|
||||
ADS_MMAP_MIN_ADDR,
|
||||
#endif
|
||||
ADS_STACK_GUARD_GAP,
|
||||
#ifdef CONFIG_SYSCTL
|
||||
ADS_SYSCTL_LEGACY_VA_LAYOUT,
|
||||
#endif
|
||||
ADS_END
|
||||
};
|
||||
@ -43,6 +50,9 @@ enum android_debug_per_cpu_symbol {
|
||||
void *android_debug_symbol(enum android_debug_symbol symbol);
|
||||
void *android_debug_per_cpu_symbol(enum android_debug_per_cpu_symbol symbol);
|
||||
|
||||
void android_debug_for_each_module(int (*fn)(const char *mod_name, void *mod_addr, void *data),
|
||||
void *data);
|
||||
|
||||
#else /* !CONFIG_ANDROID_DEBUG_SYMBOLS */
|
||||
|
||||
static inline void *android_debug_symbol(enum android_debug_symbol symbol)
|
||||
@ -53,6 +63,9 @@ static inline void *android_debug_per_cpu_symbol(enum android_debug_per_cpu_symb
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void android_debug_for_each_module(int (*fn)(const char *mod_name, void *mod_addr,
|
||||
void *data), void *data) {}
|
||||
#endif /* CONFIG_ANDROID_DEBUG_SYMBOLS */
|
||||
|
||||
#endif /* _ANDROID_DEBUG_SYMBOLS_H */
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
struct page;
|
||||
struct device;
|
||||
@ -160,6 +161,9 @@ struct bdi_writeback {
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
#endif
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
struct backing_dev_info {
|
||||
@ -198,6 +202,9 @@ struct backing_dev_info {
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debug_dir;
|
||||
#endif
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/ioprio.h>
|
||||
/* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */
|
||||
#include <linux/blk_types.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#define BIO_DEBUG
|
||||
|
||||
@ -325,6 +326,10 @@ struct bio_integrity_payload {
|
||||
struct work_struct bip_work; /* I/O completion */
|
||||
|
||||
struct bio_vec *bip_vec;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
|
||||
struct bio_vec bip_inline_vecs[];/* embedded bvec array */
|
||||
};
|
||||
|
||||
@ -698,6 +703,11 @@ struct bio_set {
|
||||
struct bio_list rescue_list;
|
||||
struct work_struct rescue_work;
|
||||
struct workqueue_struct *rescue_workqueue;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
struct biovec_slab {
|
||||
|
@ -48,6 +48,11 @@ struct block_device {
|
||||
/* Mutex for freeze */
|
||||
struct mutex bd_fsfreeze_mutex;
|
||||
struct super_block *bd_fsfreeze_sb;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
} __randomize_layout;
|
||||
|
||||
/*
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/blkzoned.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/android_kabi.h>
|
||||
#include <linux/android_vendor.h>
|
||||
|
||||
struct module;
|
||||
struct scsi_ioctl_command;
|
||||
@ -242,6 +244,8 @@ struct request {
|
||||
*/
|
||||
rq_end_io_fn *end_io;
|
||||
void *end_io_data;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
static inline bool blk_op_is_scsi(unsigned int op)
|
||||
@ -346,6 +350,8 @@ struct queue_limits {
|
||||
unsigned char discard_misaligned;
|
||||
unsigned char raid_partial_stripes_expensive;
|
||||
enum blk_zoned_model zoned;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
typedef int (*report_zones_cb)(struct blk_zone *zone, unsigned int idx,
|
||||
@ -589,6 +595,10 @@ struct request_queue {
|
||||
#define BLK_MAX_WRITE_HINTS 5
|
||||
u64 write_hints[BLK_MAX_WRITE_HINTS];
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
ANDROID_OEM_DATA(1);
|
||||
};
|
||||
|
||||
@ -694,18 +704,6 @@ static inline bool queue_is_mq(struct request_queue *q)
|
||||
return q->mq_ops;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static inline enum rpm_status queue_rpm_status(struct request_queue *q)
|
||||
{
|
||||
return q->rpm_status;
|
||||
}
|
||||
#else
|
||||
static inline enum rpm_status queue_rpm_status(struct request_queue *q)
|
||||
{
|
||||
return RPM_ACTIVE;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline enum blk_zoned_model
|
||||
blk_queue_zoned_model(struct request_queue *q)
|
||||
{
|
||||
@ -1870,6 +1868,10 @@ struct block_device_operations {
|
||||
char *(*devnode)(struct gendisk *disk, umode_t *mode);
|
||||
struct module *owner;
|
||||
const struct pr_ops *pr_ops;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_OEM_DATA(1);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/percpu-refcount.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
struct bpf_verifier_env;
|
||||
struct bpf_verifier_log;
|
||||
@ -132,6 +133,9 @@ struct bpf_map_ops {
|
||||
|
||||
/* bpf_iter info used to open a seq_file */
|
||||
const struct bpf_iter_seq_info *iter_seq_info;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
struct bpf_map_memory {
|
||||
@ -218,6 +222,8 @@ struct bpf_map_dev_ops {
|
||||
int (*map_update_elem)(struct bpf_offloaded_map *map,
|
||||
void *key, void *value, u64 flags);
|
||||
int (*map_delete_elem)(struct bpf_offloaded_map *map, void *key);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct bpf_offloaded_map {
|
||||
@ -459,6 +465,7 @@ struct bpf_verifier_ops {
|
||||
const struct btf_type *t, int off, int size,
|
||||
enum bpf_access_type atype,
|
||||
u32 *next_btf_id);
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct bpf_prog_offload_ops {
|
||||
@ -474,6 +481,7 @@ struct bpf_prog_offload_ops {
|
||||
int (*prepare)(struct bpf_prog *prog);
|
||||
int (*translate)(struct bpf_prog *prog);
|
||||
void (*destroy)(struct bpf_prog *prog);
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct bpf_prog_offload {
|
||||
@ -851,6 +859,7 @@ struct bpf_prog_aux {
|
||||
struct work_struct work;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct bpf_array_aux {
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <linux/bpf.h> /* for enum bpf_reg_type */
|
||||
#include <linux/filter.h> /* for MAX_BPF_STACK */
|
||||
#include <linux/tnum.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
/* Maximum variable offset umax_value permitted when resolving memory accesses.
|
||||
* In practice this is far bigger than any realistic pointer offset; this limit
|
||||
@ -370,6 +371,8 @@ struct bpf_subprog_info {
|
||||
bool has_tail_call;
|
||||
bool tail_call_reachable;
|
||||
bool has_ld_abs;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
/* single container for all structs
|
||||
@ -425,6 +428,9 @@ struct bpf_verifier_env {
|
||||
u32 peak_states;
|
||||
/* longest register parentage chain walked for liveness marking */
|
||||
u32 longest_mark_read_walk;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
__printf(2, 0) void bpf_verifier_vlog(struct bpf_verifier_log *log,
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/user_namespace.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#include <linux/cgroup-defs.h>
|
||||
|
||||
@ -66,6 +67,8 @@ struct css_task_iter {
|
||||
struct css_set *cur_dcset;
|
||||
struct task_struct *cur_task;
|
||||
struct list_head iters_node; /* css_set->task_iters */
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
extern struct cgroup_root cgrp_dfl_root;
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/exportfs.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/android_vendor.h>
|
||||
|
||||
#define CLEANCACHE_NO_POOL -1
|
||||
#define CLEANCACHE_NO_BACKEND -2
|
||||
@ -36,6 +37,7 @@ struct cleancache_ops {
|
||||
void (*invalidate_page)(int, struct cleancache_filekey, pgoff_t);
|
||||
void (*invalidate_inode)(int, struct cleancache_filekey);
|
||||
void (*invalidate_fs)(int);
|
||||
ANDROID_OEM_DATA(1);
|
||||
};
|
||||
|
||||
extern int cleancache_register_ops(const struct cleancache_ops *ops);
|
||||
|
@ -22,6 +22,15 @@
|
||||
|
||||
struct cma;
|
||||
|
||||
struct cma_alloc_info {
|
||||
unsigned long nr_migrated;
|
||||
unsigned long nr_reclaimed;
|
||||
unsigned long nr_mapped;
|
||||
unsigned int nr_isolate_fail;
|
||||
unsigned int nr_migrate_fail;
|
||||
unsigned int nr_test_fail;
|
||||
};
|
||||
|
||||
extern unsigned long totalcma_pages;
|
||||
extern phys_addr_t cma_get_base(const struct cma *cma);
|
||||
extern unsigned long cma_get_size(const struct cma *cma);
|
||||
|
@ -195,6 +195,10 @@ enum cpuhp_state {
|
||||
CPUHP_AP_X86_KVM_CLK_ONLINE,
|
||||
CPUHP_AP_DTPM_CPU_ONLINE,
|
||||
CPUHP_AP_ACTIVE,
|
||||
CPUHP_ANDROID_RESERVED_1,
|
||||
CPUHP_ANDROID_RESERVED_2,
|
||||
CPUHP_ANDROID_RESERVED_3,
|
||||
CPUHP_ANDROID_RESERVED_4,
|
||||
CPUHP_ONLINE,
|
||||
};
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#define CPUIDLE_STATE_MAX 10
|
||||
#define CPUIDLE_NAME_LEN 16
|
||||
@ -110,6 +111,8 @@ struct cpuidle_device {
|
||||
cpumask_t coupled_cpus;
|
||||
struct cpuidle_coupled *coupled;
|
||||
#endif
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices);
|
||||
@ -135,6 +138,8 @@ struct cpuidle_driver {
|
||||
|
||||
/* preferred governor to switch at register time */
|
||||
const char *governor;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CPU_IDLE
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/lockref.h>
|
||||
#include <linux/stringhash.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
struct path;
|
||||
struct vfsmount;
|
||||
@ -118,6 +119,9 @@ struct dentry {
|
||||
struct hlist_bl_node d_in_lookup_hash; /* only for in-lookup ones */
|
||||
struct rcu_head d_rcu;
|
||||
} d_u;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
} __randomize_layout;
|
||||
|
||||
/*
|
||||
@ -148,6 +152,10 @@ struct dentry_operations {
|
||||
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 *);
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
} ____cacheline_aligned;
|
||||
|
||||
/*
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/dm-ioctl.h>
|
||||
#include <linux/math64.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
struct dm_dev;
|
||||
struct dm_target;
|
||||
@ -198,6 +199,9 @@ struct target_type {
|
||||
dm_dax_copy_iter_fn dax_copy_to_iter;
|
||||
dm_dax_zero_page_range_fn dax_zero_page_range;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
|
||||
/* For internal device-mapper use. */
|
||||
struct list_head list;
|
||||
};
|
||||
@ -349,6 +353,9 @@ struct dm_target {
|
||||
* Set if we need to limit the number of in-flight bios when swapping.
|
||||
*/
|
||||
bool limit_swap_bios:1;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
void *dm_per_bio_data(struct bio *bio, size_t data_size);
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <linux/device/bus.h>
|
||||
#include <linux/device/class.h>
|
||||
#include <linux/device/driver.h>
|
||||
#include <linux/android_kabi.h>
|
||||
#include <asm/device.h>
|
||||
|
||||
struct device;
|
||||
@ -553,6 +554,14 @@ struct device {
|
||||
#ifdef CONFIG_DMA_OPS_BYPASS
|
||||
bool dma_ops_bypass : 1;
|
||||
#endif
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
ANDROID_KABI_RESERVE(5);
|
||||
ANDROID_KABI_RESERVE(6);
|
||||
ANDROID_KABI_RESERVE(7);
|
||||
ANDROID_KABI_RESERVE(8);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -112,6 +112,11 @@ struct bus_type {
|
||||
struct lock_class_key lock_key;
|
||||
|
||||
bool need_parent_lock;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
extern int __must_check bus_register(struct bus_type *bus);
|
||||
|
@ -76,7 +76,11 @@ struct class {
|
||||
const struct dev_pm_ops *pm;
|
||||
|
||||
struct subsys_private *p;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
struct class_dev_iter {
|
||||
|
@ -118,6 +118,11 @@ struct device_driver {
|
||||
void (*coredump) (struct device *dev);
|
||||
|
||||
struct driver_private *p;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/dma-fence.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
struct device;
|
||||
struct dma_buf;
|
||||
@ -353,6 +354,9 @@ struct dma_buf_ops {
|
||||
* will be populated with the buffer's flags.
|
||||
*/
|
||||
int (*get_flags)(struct dma_buf *dmabuf, unsigned long *flags);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -379,8 +383,6 @@ struct dma_buf_ops {
|
||||
* @cb_excl: for userspace poll support
|
||||
* @cb_shared: for userspace poll support
|
||||
* @sysfs_entry: for exposing information about this buffer in sysfs.
|
||||
* The attachment_uid member of @sysfs_entry is protected by dma_resv lock
|
||||
* and is incremented on each attach.
|
||||
*
|
||||
* This represents a shared buffer, created by calling dma_buf_export(). The
|
||||
* userspace representation is a normal file descriptor, which can be created by
|
||||
@ -421,10 +423,11 @@ struct dma_buf {
|
||||
struct dma_buf_sysfs_entry {
|
||||
struct kobject kobj;
|
||||
struct dma_buf *dmabuf;
|
||||
unsigned int attachment_uid;
|
||||
struct kset *attach_stats_kset;
|
||||
} *sysfs_entry;
|
||||
#endif
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -476,7 +479,6 @@ struct dma_buf_attach_ops {
|
||||
* @importer_priv: importer specific attachment data.
|
||||
* @dma_map_attrs: DMA attributes to be used when the exporter maps the buffer
|
||||
* through dma_buf_map_attachment.
|
||||
* @sysfs_entry: For exposing information about this attachment in sysfs.
|
||||
*
|
||||
* This structure holds the attachment information between the dma_buf buffer
|
||||
* and its user device(s). The list contains one attachment struct per device
|
||||
@ -498,13 +500,9 @@ struct dma_buf_attachment {
|
||||
void *importer_priv;
|
||||
void *priv;
|
||||
unsigned long dma_map_attrs;
|
||||
#ifdef CONFIG_DMABUF_SYSFS_STATS
|
||||
/* for sysfs stats */
|
||||
struct dma_buf_attach_sysfs_entry {
|
||||
struct kobject kobj;
|
||||
unsigned int map_counter;
|
||||
} *sysfs_entry;
|
||||
#endif
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -528,6 +526,9 @@ struct dma_buf_export_info {
|
||||
int flags;
|
||||
struct dma_resv *resv;
|
||||
void *priv;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/android_kabi.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/**
|
||||
@ -941,6 +942,11 @@ struct dma_device {
|
||||
void (*dbg_summary_show)(struct seq_file *s, struct dma_device *dev);
|
||||
struct dentry *dbg_dev_root;
|
||||
#endif
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
static inline int dmaengine_slave_config(struct dma_chan *chan,
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/hashtable.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#ifdef CONFIG_BLOCK
|
||||
|
||||
@ -50,6 +51,11 @@ struct elevator_mq_ops {
|
||||
struct request *(*next_request)(struct request_queue *, struct request *);
|
||||
void (*init_icq)(struct io_cq *);
|
||||
void (*exit_icq)(struct io_cq *);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
#define ELV_NAME_MAX (16)
|
||||
@ -86,6 +92,9 @@ struct elevator_type
|
||||
/* managed by elevator core */
|
||||
char icq_cache_name[ELV_NAME_MAX + 6]; /* elvname + "_io_cq" */
|
||||
struct list_head list;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
#define ELV_HASH_BITS 6
|
||||
|
@ -39,9 +39,11 @@
|
||||
#include <linux/fs_types.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
#include <uapi/linux/fs.h>
|
||||
#include <linux/android_vendor.h>
|
||||
|
||||
struct backing_dev_info;
|
||||
struct bdi_writeback;
|
||||
@ -413,6 +415,11 @@ struct address_space_operations {
|
||||
int (*swap_activate)(struct swap_info_struct *sis, struct file *file,
|
||||
sector_t *span);
|
||||
void (*swap_deactivate)(struct file *file);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
extern const struct address_space_operations empty_aops;
|
||||
@ -468,6 +475,11 @@ struct address_space {
|
||||
spinlock_t private_lock;
|
||||
struct list_head private_list;
|
||||
void *private_data;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
} __attribute__((aligned(sizeof(long)))) __randomize_layout;
|
||||
/*
|
||||
* On most architectures that alignment is already the case; but
|
||||
@ -718,6 +730,9 @@ struct inode {
|
||||
#endif
|
||||
|
||||
void *i_private; /* fs or device private pointer */
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
} __randomize_layout;
|
||||
|
||||
struct timespec64 timestamp_truncate(struct timespec64 t, struct inode *inode);
|
||||
@ -952,6 +967,10 @@ struct file {
|
||||
struct address_space *f_mapping;
|
||||
errseq_t f_wb_err;
|
||||
errseq_t f_sb_err; /* for syncfs */
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_OEM_DATA(1);
|
||||
} __randomize_layout
|
||||
__attribute__((aligned(4))); /* lest something weird decides that 2 is OK */
|
||||
|
||||
@ -1011,6 +1030,9 @@ struct file_lock;
|
||||
struct file_lock_operations {
|
||||
void (*fl_copy_lock)(struct file_lock *, struct file_lock *);
|
||||
void (*fl_release_private)(struct file_lock *);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
struct lock_manager_operations {
|
||||
@ -1022,6 +1044,9 @@ struct lock_manager_operations {
|
||||
int (*lm_change)(struct file_lock *, int, struct list_head *);
|
||||
void (*lm_setup)(struct file_lock *, void **);
|
||||
bool (*lm_breaker_owns_lease)(struct file_lock *);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
struct lock_manager {
|
||||
@ -1095,6 +1120,10 @@ struct file_lock {
|
||||
unsigned int debug_id;
|
||||
} afs;
|
||||
} fl_u;
|
||||
|
||||
struct list_head android_reserved1; /* not a macro as we might just need it as-is */
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
} __randomize_layout;
|
||||
|
||||
struct file_lock_context {
|
||||
@ -1547,6 +1576,11 @@ struct super_block {
|
||||
|
||||
spinlock_t s_inode_wblist_lock;
|
||||
struct list_head s_inodes_wb; /* writeback inodes */
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
} __randomize_layout;
|
||||
|
||||
/* Helper functions so that in most cases filesystems will
|
||||
@ -1859,6 +1893,11 @@ struct file_operations {
|
||||
struct file *file_out, loff_t pos_out,
|
||||
loff_t len, unsigned int remap_flags);
|
||||
int (*fadvise)(struct file *, loff_t, loff_t, int);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
} __randomize_layout;
|
||||
|
||||
struct inode_operations {
|
||||
@ -1889,6 +1928,11 @@ struct inode_operations {
|
||||
umode_t create_mode);
|
||||
int (*tmpfile) (struct inode *, struct dentry *, umode_t);
|
||||
int (*set_acl)(struct inode *, struct posix_acl *, int);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
} ____cacheline_aligned;
|
||||
|
||||
static inline ssize_t call_read_iter(struct file *file, struct kiocb *kio,
|
||||
@ -1965,6 +2009,11 @@ struct super_operations {
|
||||
struct shrink_control *);
|
||||
long (*free_cached_objects)(struct super_block *,
|
||||
struct shrink_control *);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
/*
|
||||
@ -2252,6 +2301,11 @@ struct file_system_type {
|
||||
struct lock_class_key i_lock_key;
|
||||
struct lock_class_key i_mutex_key;
|
||||
struct lock_class_key i_mutex_dir_key;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
#define MODULE_ALIAS_FS(NAME) MODULE_ALIAS("fs-" NAME)
|
||||
|
@ -70,6 +70,13 @@ struct fscrypt_operations {
|
||||
int (*get_num_devices)(struct super_block *sb);
|
||||
void (*get_devices)(struct super_block *sb,
|
||||
struct request_queue **devs);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
|
||||
ANDROID_OEM_DATA_ARRAY(1, 4);
|
||||
};
|
||||
|
||||
static inline struct fscrypt_info *fscrypt_get_info(const struct inode *inode)
|
||||
|
@ -642,9 +642,24 @@ static inline bool pm_suspended_storage(void)
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
#ifdef CONFIG_CONTIG_ALLOC
|
||||
extern unsigned long pfn_max_align_up(unsigned long pfn);
|
||||
|
||||
#define ACR_ERR_ISOLATE (1 << 0)
|
||||
#define ACR_ERR_MIGRATE (1 << 1)
|
||||
#define ACR_ERR_TEST (1 << 2)
|
||||
|
||||
struct acr_info {
|
||||
unsigned long nr_mapped;
|
||||
unsigned long nr_migrated;
|
||||
unsigned long nr_reclaimed;
|
||||
unsigned int err;
|
||||
unsigned long failed_pfn;
|
||||
};
|
||||
|
||||
/* The below functions must be run on a range from a single zone. */
|
||||
extern int alloc_contig_range(unsigned long start, unsigned long end,
|
||||
unsigned migratetype, gfp_t gfp_mask);
|
||||
unsigned migratetype, gfp_t gfp_mask,
|
||||
struct acr_info *info);
|
||||
extern struct page *alloc_contig_pages(unsigned long nr_pages, gfp_t gfp_mask,
|
||||
int nid, nodemask_t *nodemask);
|
||||
#endif
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
struct gpio_desc;
|
||||
struct of_phandle_args;
|
||||
@ -266,6 +267,9 @@ struct gpio_irq_chip {
|
||||
* Store old irq_chip irq_mask callback
|
||||
*/
|
||||
void (*irq_mask)(struct irq_data *data);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -469,6 +473,9 @@ struct gpio_chip {
|
||||
int (*of_xlate)(struct gpio_chip *gc,
|
||||
const struct of_phandle_args *gpiospec, u32 *flags);
|
||||
#endif /* CONFIG_OF_GPIO */
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
};
|
||||
|
||||
extern const char *gpiochip_is_requested(struct gpio_chip *gc,
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include <linux/time.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/android_kabi.h>
|
||||
#include <uapi/linux/input.h>
|
||||
/* Implementation details, userspace should not care about these */
|
||||
#define ABS_MT_FIRST ABS_MT_TOUCH_MAJOR
|
||||
@ -201,6 +202,11 @@ struct input_dev {
|
||||
bool devres_managed;
|
||||
|
||||
ktime_t timestamp[INPUT_CLK_MAX];
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
#define to_input_dev(d) container_of(d, struct input_dev, dev)
|
||||
|
||||
@ -320,6 +326,8 @@ struct input_handler {
|
||||
|
||||
struct list_head h_list;
|
||||
struct list_head node;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -346,6 +354,8 @@ struct input_handle {
|
||||
|
||||
struct list_head d_node;
|
||||
struct list_head h_node;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct input_dev __must_check *input_allocate_device(void);
|
||||
@ -550,6 +560,9 @@ struct ff_device {
|
||||
|
||||
int max_effects;
|
||||
struct ff_effect *effects;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
|
||||
struct file *effect_owners[];
|
||||
};
|
||||
|
||||
|
@ -89,6 +89,8 @@ struct iomap {
|
||||
void *inline_data;
|
||||
void *private; /* filesystem private */
|
||||
const struct iomap_page_ops *page_ops;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
static inline sector_t
|
||||
|
@ -113,7 +113,7 @@ struct static_key {
|
||||
#endif /* CONFIG_JUMP_LABEL */
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#ifdef CONFIG_JUMP_LABEL
|
||||
#if defined(CONFIG_JUMP_LABEL) && !defined(BUILD_FIPS140_KO)
|
||||
#include <asm/jump_label.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
@ -188,7 +188,28 @@ enum jump_label_type {
|
||||
|
||||
struct module;
|
||||
|
||||
#ifdef CONFIG_JUMP_LABEL
|
||||
#ifdef BUILD_FIPS140_KO
|
||||
|
||||
static inline int static_key_count(struct static_key *key)
|
||||
{
|
||||
return atomic_read(&key->enabled);
|
||||
}
|
||||
|
||||
static __always_inline bool static_key_false(struct static_key *key)
|
||||
{
|
||||
if (unlikely(static_key_count(key) > 0))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static __always_inline bool static_key_true(struct static_key *key)
|
||||
{
|
||||
if (likely(static_key_count(key) > 0))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
#elif defined(CONFIG_JUMP_LABEL)
|
||||
|
||||
#define JUMP_TYPE_FALSE 0UL
|
||||
#define JUMP_TYPE_TRUE 1UL
|
||||
@ -393,7 +414,7 @@ extern bool ____wrong_branch_error(void);
|
||||
static_key_count((struct static_key *)x) > 0; \
|
||||
})
|
||||
|
||||
#ifdef CONFIG_JUMP_LABEL
|
||||
#if defined(CONFIG_JUMP_LABEL) && !defined(BUILD_FIPS140_KO)
|
||||
|
||||
/*
|
||||
* Combine the right initial value (type) with the right branch order
|
||||
|
@ -157,6 +157,8 @@ struct kernfs_node {
|
||||
unsigned short flags;
|
||||
umode_t mode;
|
||||
struct kernfs_iattrs *iattr;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
/*
|
||||
@ -198,6 +200,8 @@ struct kernfs_root {
|
||||
struct list_head supers;
|
||||
|
||||
wait_queue_head_t deactivate_waitq;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct kernfs_open_file {
|
||||
@ -218,6 +222,8 @@ struct kernfs_open_file {
|
||||
bool mmapped:1;
|
||||
bool released:1;
|
||||
const struct vm_operations_struct *vm_ops;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
struct kernfs_ops {
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
#include <linux/key.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/android_kabi.h>
|
||||
|
||||
#ifdef CONFIG_KEYS
|
||||
|
||||
@ -155,6 +156,9 @@ struct key_type {
|
||||
int (*asym_verify_signature)(struct kernel_pkey_params *params,
|
||||
const void *in, const void *in2);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
|
||||
/* internal fields */
|
||||
struct list_head link; /* link in types list */
|
||||
struct lock_class_key lock_class; /* key->sem lock class */
|
||||
|
@ -331,6 +331,7 @@ struct mem_cgroup {
|
||||
struct deferred_split deferred_split_queue;
|
||||
#endif
|
||||
|
||||
ANDROID_OEM_DATA(1);
|
||||
struct mem_cgroup_per_node *nodeinfo[0];
|
||||
/* WARNING: nodeinfo must be the last member here */
|
||||
};
|
||||
@ -441,10 +442,31 @@ static inline bool mem_cgroup_below_min(struct mem_cgroup *memcg)
|
||||
page_counter_read(&memcg->memory);
|
||||
}
|
||||
|
||||
int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask);
|
||||
int __mem_cgroup_charge(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask);
|
||||
static inline int mem_cgroup_charge(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask)
|
||||
{
|
||||
if (mem_cgroup_disabled())
|
||||
return 0;
|
||||
return __mem_cgroup_charge(page, mm, gfp_mask);
|
||||
}
|
||||
|
||||
void mem_cgroup_uncharge(struct page *page);
|
||||
void mem_cgroup_uncharge_list(struct list_head *page_list);
|
||||
void __mem_cgroup_uncharge(struct page *page);
|
||||
static inline void mem_cgroup_uncharge(struct page *page)
|
||||
{
|
||||
if (mem_cgroup_disabled())
|
||||
return;
|
||||
__mem_cgroup_uncharge(page);
|
||||
}
|
||||
|
||||
void __mem_cgroup_uncharge_list(struct list_head *page_list);
|
||||
static inline void mem_cgroup_uncharge_list(struct list_head *page_list)
|
||||
{
|
||||
if (mem_cgroup_disabled())
|
||||
return;
|
||||
__mem_cgroup_uncharge_list(page_list);
|
||||
}
|
||||
|
||||
void mem_cgroup_migrate(struct page *oldpage, struct page *newpage);
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user