Merge remote branch 'android12-5.10' of https://android.googlesource.com/kernel/common
* android12-5.10: (966 commits) ANDROID: Support disabling symbol trimming ANDROID: Incremental fs: Fix pseudo-file attributes ANDROID: sched: Fix missing RQCF_UPDATED in migrate_tasks FROMLIST: mm, thp: Relax the VM_DENYWRITE constraint on file-backed THPs ANDROID: GKI: Update the generic symbol list ANDROID: ABI: Add symbols for crypto ANDROID: ABI: Update the ABI XML Revert "ANDROID: GKI: Change UCLAMP_BUCKETS_COUNT to 20" ANDROID: vendor_hooks: Add hook for binder UPSTREAM: crypto: arm/blake2s - fix for big endian UPSTREAM: crypto: arm/blake2b - drop unnecessary return statement FROMGIT: kasan, arm64: tests supports for HW_TAGS async mode FROMGIT: arm64: mte: Report async tag faults before suspend FROMGIT: arm64: mte: Enable async tag check fault FROMGIT: arm64: mte: Conditionally compile mte_enable_kernel_*() ANDROID: ABI: Update the ABI xml ANDROID: ABI: Update the generic symbol list ANDROID: selinux: add vendor hook in selinux FROMGIT: arm64: mte: Enable TCO in functions that can read beyond buffer limits ANDROID: sched: Add vendor hooks for update_load_avg ... Change-Id: I74731b47c1f6cd67cea9622113833b3f8c994544
This commit is contained in:
64
Documentation/ABI/testing/sysfs-fs-incfs
Normal file
64
Documentation/ABI/testing/sysfs-fs-incfs
Normal file
@@ -0,0 +1,64 @@
|
||||
What: /sys/fs/incremental-fs/features/corefs
|
||||
Date: 2019
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Reads 'supported'. Always present.
|
||||
|
||||
What: /sys/fs/incremental-fs/features/v2
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Reads 'supported'. Present if all v2 features of incfs are
|
||||
supported.
|
||||
|
||||
What: /sys/fs/incremental-fs/features/zstd
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Reads 'supported'. Present if zstd compression is supported
|
||||
for data blocks.
|
||||
|
||||
What: /sys/fs/incremental-fs/instances/[name]
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Folder created when incfs is mounted with the sysfs_name=[name]
|
||||
option. If this option is used, the following values are created
|
||||
in this folder.
|
||||
|
||||
What: /sys/fs/incremental-fs/instances/[name]/reads_delayed_min
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Returns a count of the number of reads that were delayed as a
|
||||
result of the per UID read timeouts min time setting.
|
||||
|
||||
What: /sys/fs/incremental-fs/instances/[name]/reads_delayed_min_us
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Returns total delay time for all files since first mount as a
|
||||
result of the per UID read timeouts min time setting.
|
||||
|
||||
What: /sys/fs/incremental-fs/instances/[name]/reads_delayed_pending
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Returns a count of the number of reads that were delayed as a
|
||||
result of waiting for a pending read.
|
||||
|
||||
What: /sys/fs/incremental-fs/instances/[name]/reads_delayed_pending_us
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Returns total delay time for all files since first mount as a
|
||||
result of waiting for a pending read.
|
||||
|
||||
What: /sys/fs/incremental-fs/instances/[name]/reads_failed_hash_verification
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Returns number of reads that failed because of hash verification
|
||||
failures.
|
||||
|
||||
What: /sys/fs/incremental-fs/instances/[name]/reads_failed_other
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Returns number of reads that failed for reasons other than
|
||||
timing out or hash failures.
|
||||
|
||||
What: /sys/fs/incremental-fs/instances/[name]/reads_failed_timed_out
|
||||
Date: April 2021
|
||||
Contact: Paul Lawrence <paullawrence@google.com>
|
||||
Description: Returns number of reads that timed out.
|
||||
@@ -289,6 +289,12 @@
|
||||
do not want to use tracing_snapshot_alloc() as it needs
|
||||
to be done where GFP_KERNEL allocations are allowed.
|
||||
|
||||
allow_file_spec_access
|
||||
Allow speculative faults on file backed pages.
|
||||
Speculative faults are enabled only for those vm_ops
|
||||
that implement and return true for allow_speculation
|
||||
callback.
|
||||
|
||||
allow_mismatched_32bit_el0 [ARM64]
|
||||
Allow execve() of 32-bit applications and setting of the
|
||||
PER_LINUX32 personality on systems where only a strict
|
||||
|
||||
@@ -63,36 +63,36 @@ the generic ioctl available.
|
||||
|
||||
The ``uffdio_api.features`` bitmask returned by the ``UFFDIO_API`` ioctl
|
||||
defines what memory types are supported by the ``userfaultfd`` and what
|
||||
events, except page fault notifications, may be generated.
|
||||
events, except page fault notifications, may be generated:
|
||||
|
||||
If the kernel supports registering ``userfaultfd`` ranges on hugetlbfs
|
||||
virtual memory areas, ``UFFD_FEATURE_MISSING_HUGETLBFS`` will be set in
|
||||
``uffdio_api.features``. Similarly, ``UFFD_FEATURE_MISSING_SHMEM`` will be
|
||||
set if the kernel supports registering ``userfaultfd`` ranges on shared
|
||||
memory (covering all shmem APIs, i.e. tmpfs, ``IPCSHM``, ``/dev/zero``,
|
||||
``MAP_SHARED``, ``memfd_create``, etc).
|
||||
- The ``UFFD_FEATURE_EVENT_*`` flags indicate that various other events
|
||||
other than page faults are supported. These events are described in more
|
||||
detail below in the `Non-cooperative userfaultfd`_ section.
|
||||
|
||||
The userland application that wants to use ``userfaultfd`` with hugetlbfs
|
||||
or shared memory need to set the corresponding flag in
|
||||
``uffdio_api.features`` to enable those features.
|
||||
- ``UFFD_FEATURE_MISSING_HUGETLBFS`` and ``UFFD_FEATURE_MISSING_SHMEM``
|
||||
indicate that the kernel supports ``UFFDIO_REGISTER_MODE_MISSING``
|
||||
registrations for hugetlbfs and shared memory (covering all shmem APIs,
|
||||
i.e. tmpfs, ``IPCSHM``, ``/dev/zero``, ``MAP_SHARED``, ``memfd_create``,
|
||||
etc) virtual memory areas, respectively.
|
||||
|
||||
If the userland desires to receive notifications for events other than
|
||||
page faults, it has to verify that ``uffdio_api.features`` has appropriate
|
||||
``UFFD_FEATURE_EVENT_*`` bits set. These events are described in more
|
||||
detail below in `Non-cooperative userfaultfd`_ section.
|
||||
- ``UFFD_FEATURE_MINOR_HUGETLBFS`` indicates that the kernel supports
|
||||
``UFFDIO_REGISTER_MODE_MINOR`` registration for hugetlbfs virtual memory
|
||||
areas.
|
||||
|
||||
Once the ``userfaultfd`` has been enabled the ``UFFDIO_REGISTER`` ioctl should
|
||||
be invoked (if present in the returned ``uffdio_api.ioctls`` bitmask) to
|
||||
register a memory range in the ``userfaultfd`` by setting the
|
||||
The userland application should set the feature flags it intends to use
|
||||
when invoking the ``UFFDIO_API`` ioctl, to request that those features be
|
||||
enabled if supported.
|
||||
|
||||
Once the ``userfaultfd`` API has been enabled the ``UFFDIO_REGISTER``
|
||||
ioctl should be invoked (if present in the returned ``uffdio_api.ioctls``
|
||||
bitmask) to register a memory range in the ``userfaultfd`` by setting the
|
||||
uffdio_register structure accordingly. The ``uffdio_register.mode``
|
||||
bitmask will specify to the kernel which kind of faults to track for
|
||||
the range (``UFFDIO_REGISTER_MODE_MISSING`` would track missing
|
||||
pages). The ``UFFDIO_REGISTER`` ioctl will return the
|
||||
the range. The ``UFFDIO_REGISTER`` ioctl will return the
|
||||
``uffdio_register.ioctls`` bitmask of ioctls that are suitable to resolve
|
||||
userfaults on the range registered. Not all ioctls will necessarily be
|
||||
supported for all memory types depending on the underlying virtual
|
||||
memory backend (anonymous memory vs tmpfs vs real filebacked
|
||||
mappings).
|
||||
supported for all memory types (e.g. anonymous memory vs. shmem vs.
|
||||
hugetlbfs), or all types of intercepted faults.
|
||||
|
||||
Userland can use the ``uffdio_register.ioctls`` to manage the virtual
|
||||
address space in the background (to add or potentially also remove
|
||||
@@ -100,21 +100,46 @@ memory from the ``userfaultfd`` registered range). This means a userfault
|
||||
could be triggering just before userland maps in the background the
|
||||
user-faulted page.
|
||||
|
||||
The primary ioctl to resolve userfaults is ``UFFDIO_COPY``. That
|
||||
atomically copies a page into the userfault registered range and wakes
|
||||
up the blocked userfaults
|
||||
(unless ``uffdio_copy.mode & UFFDIO_COPY_MODE_DONTWAKE`` is set).
|
||||
Other ioctl works similarly to ``UFFDIO_COPY``. They're atomic as in
|
||||
guaranteeing that nothing can see an half copied page since it'll
|
||||
keep userfaulting until the copy has finished.
|
||||
Resolving Userfaults
|
||||
--------------------
|
||||
|
||||
There are three basic ways to resolve userfaults:
|
||||
|
||||
- ``UFFDIO_COPY`` atomically copies some existing page contents from
|
||||
userspace.
|
||||
|
||||
- ``UFFDIO_ZEROPAGE`` atomically zeros the new page.
|
||||
|
||||
- ``UFFDIO_CONTINUE`` maps an existing, previously-populated page.
|
||||
|
||||
These operations are atomic in the sense that they guarantee nothing can
|
||||
see a half-populated page, since readers will keep userfaulting until the
|
||||
operation has finished.
|
||||
|
||||
By default, these wake up userfaults blocked on the range in question.
|
||||
They support a ``UFFDIO_*_MODE_DONTWAKE`` ``mode`` flag, which indicates
|
||||
that waking will be done separately at some later time.
|
||||
|
||||
Which ioctl to choose depends on the kind of page fault, and what we'd
|
||||
like to do to resolve it:
|
||||
|
||||
- For ``UFFDIO_REGISTER_MODE_MISSING`` faults, the fault needs to be
|
||||
resolved by either providing a new page (``UFFDIO_COPY``), or mapping
|
||||
the zero page (``UFFDIO_ZEROPAGE``). By default, the kernel would map
|
||||
the zero page for a missing fault. With userfaultfd, userspace can
|
||||
decide what content to provide before the faulting thread continues.
|
||||
|
||||
- For ``UFFDIO_REGISTER_MODE_MINOR`` faults, there is an existing page (in
|
||||
the page cache). Userspace has the option of modifying the page's
|
||||
contents before resolving the fault. Once the contents are correct
|
||||
(modified or not), userspace asks the kernel to map the page and let the
|
||||
faulting thread continue with ``UFFDIO_CONTINUE``.
|
||||
|
||||
Notes:
|
||||
|
||||
- If you requested ``UFFDIO_REGISTER_MODE_MISSING`` when registering then
|
||||
you must provide some kind of page in your thread after reading from
|
||||
the uffd. You must provide either ``UFFDIO_COPY`` or ``UFFDIO_ZEROPAGE``.
|
||||
The normal behavior of the OS automatically providing a zero page on
|
||||
an annonymous mmaping is not in place.
|
||||
- You can tell which kind of fault occurred by examining
|
||||
``pagefault.flags`` within the ``uffd_msg``, checking for the
|
||||
``UFFD_PAGEFAULT_FLAG_*`` flags.
|
||||
|
||||
- None of the page-delivering ioctls default to the range that you
|
||||
registered with. You must fill in all fields for the appropriate
|
||||
@@ -122,9 +147,9 @@ Notes:
|
||||
|
||||
- You get the address of the access that triggered the missing page
|
||||
event out of a struct uffd_msg that you read in the thread from the
|
||||
uffd. You can supply as many pages as you want with ``UFFDIO_COPY`` or
|
||||
``UFFDIO_ZEROPAGE``. Keep in mind that unless you used DONTWAKE then
|
||||
the first of any of those IOCTLs wakes up the faulting thread.
|
||||
uffd. You can supply as many pages as you want with these IOCTLs.
|
||||
Keep in mind that unless you used DONTWAKE then the first of any of
|
||||
those IOCTLs wakes up the faulting thread.
|
||||
|
||||
- Be sure to test for all errors including
|
||||
(``pollfd[0].revents & POLLERR``). This can happen, e.g. when ranges
|
||||
|
||||
@@ -3,7 +3,7 @@ Ramoops oops/panic logger
|
||||
|
||||
Sergiu Iordache <sergiu@chromium.org>
|
||||
|
||||
Updated: 17 November 2011
|
||||
Updated: 10 Feb 2021
|
||||
|
||||
Introduction
|
||||
------------
|
||||
@@ -30,6 +30,8 @@ mapping to pgprot_writecombine. Setting ``mem_type=1`` attempts to use
|
||||
depends on atomic operations. At least on ARM, pgprot_noncached causes the
|
||||
memory to be mapped strongly ordered, and atomic operations on strongly ordered
|
||||
memory are implementation defined, and won't work on many ARMs such as omaps.
|
||||
Setting ``mem_type=2`` attempts to treat the memory region as normal memory,
|
||||
which enables full cache on it. This can improve the performance.
|
||||
|
||||
The memory area is divided into ``record_size`` chunks (also rounded down to
|
||||
power of two) and each kmesg dump writes a ``record_size`` chunk of
|
||||
|
||||
@@ -161,6 +161,15 @@ particular KASAN features.
|
||||
|
||||
- ``kasan=off`` or ``=on`` controls whether KASAN is enabled (default: ``on``).
|
||||
|
||||
- ``kasan.mode=sync`` or ``=async`` controls whether KASAN is configured in
|
||||
synchronous or asynchronous mode of execution (default: ``sync``).
|
||||
Synchronous mode: a bad access is detected immediately when a tag
|
||||
check fault occurs.
|
||||
Asynchronous mode: a bad access detection is delayed. When a tag check
|
||||
fault occurs, the information is stored in hardware (in the TFSR_EL1
|
||||
register for arm64). The kernel periodically checks the hardware and
|
||||
only reports tag faults during these checks.
|
||||
|
||||
- ``kasan.stacktrace=off`` or ``=on`` disables or enables alloc and free stack
|
||||
traces collection (default: ``on``).
|
||||
|
||||
|
||||
@@ -178,6 +178,16 @@ properties:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [1, 2, 3]
|
||||
|
||||
slow-charger-loop:
|
||||
description: Allows PMIC charger loops which are slow(i.e. cannot meet the 15ms deadline) to
|
||||
still comply to pSnkStby i.e Maximum power that can be consumed by sink while in Sink Standby
|
||||
state as defined in 7.4.2 Sink Electrical Parameters of USB Power Delivery Specification
|
||||
Revision 3.0, Version 1.2. When the property is set, the port requests pSnkStby(2.5W -
|
||||
5V@500mA) upon entering SNK_DISCOVERY(instead of 3A or the 1.5A, Rp current advertised, during
|
||||
SNK_DISCOVERY) and the actual currrent limit after reception of PS_Ready for PD link or during
|
||||
SNK_READY for non-pd link.
|
||||
type: boolean
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ properties:
|
||||
description:
|
||||
Reference to an nvmem node for the MAC address
|
||||
|
||||
nvmem-cells-names:
|
||||
nvmem-cell-names:
|
||||
const: mac-address
|
||||
|
||||
phy-connection-type:
|
||||
|
||||
@@ -42,8 +42,14 @@ Optional properties:
|
||||
- pmsg-size: size in bytes of log buffer reserved for userspace messages
|
||||
(defaults to 0: disabled)
|
||||
|
||||
- unbuffered: if present, use unbuffered mappings to map the reserved region
|
||||
(defaults to buffered mappings)
|
||||
- mem-type: if present, sets the type of mapping is to be used to map the
|
||||
reserved region. mem-type: 0 = write-combined (default), 1 = unbuffered,
|
||||
2 = cached.
|
||||
|
||||
- unbuffered: deprecated, use mem_type instead. if present, and mem_type is
|
||||
not specified, it is equivalent to mem_type = 1 and uses unbuffered mappings
|
||||
to map the reserved region (defaults to buffered mappings mem_type = 0). If
|
||||
both are specified -- "mem_type" overrides "unbuffered".
|
||||
|
||||
- max-reason: if present, sets maximum type of kmsg dump reasons to store
|
||||
(defaults to 2: log Oopses and Panics). This can be set to INT_MAX to
|
||||
|
||||
2
Documentation/filesystems/OWNERS
Normal file
2
Documentation/filesystems/OWNERS
Normal file
@@ -0,0 +1,2 @@
|
||||
# include OWNERS from the authoritative android-mainline branch
|
||||
include kernel/common:android-mainline:/Documentation/filesystems/OWNERS
|
||||
82
Documentation/filesystems/incfs.rst
Normal file
82
Documentation/filesystems/incfs.rst
Normal file
@@ -0,0 +1,82 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=================================================
|
||||
incfs: A stacked incremental filesystem for Linux
|
||||
=================================================
|
||||
|
||||
/sys/fs interface
|
||||
=================
|
||||
|
||||
Please update Documentation/ABI/testing/sys-fs-incfs if you update this
|
||||
section.
|
||||
|
||||
incfs creates the following files in /sys/fs.
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
/sys/fs/incremental-fs/features/corefs
|
||||
Reads 'supported'. Always present.
|
||||
|
||||
/sys/fs/incremental-fs/features/v2
|
||||
Reads 'supported'. Present if all v2 features of incfs are supported. These
|
||||
are:
|
||||
fs-verity support
|
||||
inotify support
|
||||
ioclts:
|
||||
INCFS_IOC_SET_READ_TIMEOUTS
|
||||
INCFS_IOC_GET_READ_TIMEOUTS
|
||||
INCFS_IOC_GET_BLOCK_COUNT
|
||||
INCFS_IOC_CREATE_MAPPED_FILE
|
||||
.incomplete folder
|
||||
.blocks_written pseudo file
|
||||
report_uid mount option
|
||||
|
||||
/sys/fs/incremental-fs/features/zstd
|
||||
Reads 'supported'. Present if zstd compression is supported for data blocks.
|
||||
|
||||
Optional per mount
|
||||
------------------
|
||||
|
||||
For each incfs mount, the mount option sysfs_name=[name] creates a /sys/fs
|
||||
node called:
|
||||
|
||||
/sys/fs/incremental-fs/instances/[name]
|
||||
|
||||
This will contain the following files:
|
||||
|
||||
/sys/fs/incremental-fs/instances/[name]/reads_delayed_min
|
||||
Returns a count of the number of reads that were delayed as a result of the
|
||||
per UID read timeouts min time setting.
|
||||
|
||||
/sys/fs/incremental-fs/instances/[name]/reads_delayed_min_us
|
||||
Returns total delay time for all files since first mount as a result of the
|
||||
per UID read timeouts min time setting.
|
||||
|
||||
/sys/fs/incremental-fs/instances/[name]/reads_delayed_pending
|
||||
Returns a count of the number of reads that were delayed as a result of
|
||||
waiting for a pending read.
|
||||
|
||||
/sys/fs/incremental-fs/instances/[name]/reads_delayed_pending_us
|
||||
Returns total delay time for all files since first mount as a result of
|
||||
waiting for a pending read.
|
||||
|
||||
/sys/fs/incremental-fs/instances/[name]/reads_failed_hash_verification
|
||||
Returns number of reads that failed because of hash verification failures.
|
||||
|
||||
/sys/fs/incremental-fs/instances/[name]/reads_failed_other
|
||||
Returns number of reads that failed for reasons other than timing out or
|
||||
hash failures.
|
||||
|
||||
/sys/fs/incremental-fs/instances/[name]/reads_failed_timed_out
|
||||
Returns number of reads that timed out.
|
||||
|
||||
For reads_delayed_*** settings, note that a file can count for both
|
||||
reads_delayed_min and reads_delayed_pending if incfs first waits for a pending
|
||||
read then has to wait further for the min time. In that case, the time spent
|
||||
waiting is split between reads_delayed_pending_us, which is increased by the
|
||||
time spent waiting for the pending read, and reads_delayed_min_us, which is
|
||||
increased by the remainder of the time spent waiting.
|
||||
|
||||
Reads that timed out are not added to the reads_delayed_pending or the
|
||||
reads_delayed_pending_us counters.
|
||||
@@ -76,6 +76,9 @@ it::
|
||||
All files located in the tracefs file system will be located in that
|
||||
debugfs file system directory as well.
|
||||
|
||||
In order to not automount tracefs in the debugfs filesystem, enable the
|
||||
defconfig option CONFIG_TRACEFS_DISABLE_AUTOMOUNT.
|
||||
|
||||
.. attention::
|
||||
|
||||
Any selected ftrace option will also create the tracefs file system.
|
||||
|
||||
@@ -50,6 +50,7 @@ applicable to all devices.
|
||||
ext-ctrls-fm-tx
|
||||
ext-ctrls-fm-rx
|
||||
ext-ctrls-detect
|
||||
ext-ctrls-colorimetry
|
||||
fourcc
|
||||
format
|
||||
planar-apis
|
||||
|
||||
@@ -674,11 +674,64 @@ enum v4l2_mpeg_video_frame_skip_mode -
|
||||
is currently displayed (decoded). This value is reset to 0 whenever
|
||||
the decoder is started.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_DEC_CONCEAL_COLOR (integer64)``
|
||||
This control sets the conceal color in YUV color space. It describes
|
||||
the client preference of the error conceal color in case of an error
|
||||
where the reference frame is missing. The decoder should fill the
|
||||
reference buffer with the preferred color and use it for future
|
||||
decoding. The control is using 16 bits per channel.
|
||||
Applicable to decoders.
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
|
||||
* -
|
||||
- 8bit format
|
||||
- 10bit format
|
||||
- 12bit format
|
||||
* - Y luminance
|
||||
- Bit 0:7
|
||||
- Bit 0:9
|
||||
- Bit 0:11
|
||||
* - Cb chrominance
|
||||
- Bit 16:23
|
||||
- Bit 16:25
|
||||
- Bit 16:27
|
||||
* - Cr chrominance
|
||||
- Bit 32:39
|
||||
- Bit 32:41
|
||||
- Bit 32:43
|
||||
* - Must be zero
|
||||
- Bit 48:63
|
||||
- Bit 48:63
|
||||
- Bit 48:63
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE (boolean)``
|
||||
If enabled the decoder expects to receive a single slice per buffer,
|
||||
otherwise the decoder expects a single frame in per buffer.
|
||||
Applicable to the decoder, all codecs.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE (boolean)``
|
||||
If the display delay is enabled then the decoder is forced to return
|
||||
a CAPTURE buffer (decoded frame) after processing a certain number
|
||||
of OUTPUT buffers. The delay can be set through
|
||||
``V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY``. This
|
||||
feature can be used for example for generating thumbnails of videos.
|
||||
Applicable to the decoder.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY (integer)``
|
||||
Display delay value for decoder. The decoder is forced to
|
||||
return a decoded frame after the set 'display delay' number of
|
||||
frames. If this number is low it may result in frames returned out
|
||||
of display order, in addition the hardware may still be using the
|
||||
returned buffer as a reference picture for subsequent frames.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_AU_DELIMITER (boolean)``
|
||||
If enabled then, AUD (Access Unit Delimiter) NALUs will be generated.
|
||||
That could be useful to find the start of a frame without having to
|
||||
fully parse each NALU. Applicable to the H264 and HEVC encoders.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE (boolean)``
|
||||
Enable writing sample aspect ratio in the Video Usability
|
||||
Information. Applicable to the H264 encoder.
|
||||
@@ -2788,6 +2841,11 @@ MFC 5.1 Control IDs
|
||||
feature can be used for example for generating thumbnails of videos.
|
||||
Applicable to the H264 decoder.
|
||||
|
||||
.. note::
|
||||
|
||||
This control is deprecated. Use the standard
|
||||
``V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE`` control instead.
|
||||
|
||||
``V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY (integer)``
|
||||
Display delay value for H264 decoder. The decoder is forced to
|
||||
return a decoded frame after the set 'display delay' number of
|
||||
@@ -2795,6 +2853,11 @@ MFC 5.1 Control IDs
|
||||
of display order, in addition the hardware may still be using the
|
||||
returned buffer as a reference picture for subsequent frames.
|
||||
|
||||
.. note::
|
||||
|
||||
This control is deprecated. Use the standard
|
||||
``V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY`` control instead.
|
||||
|
||||
``V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P (integer)``
|
||||
The number of reference pictures used for encoding a P picture.
|
||||
Applicable to the H264 encoder.
|
||||
@@ -4459,3 +4522,21 @@ enum v4l2_mpeg_video_hevc_size_of_length_field -
|
||||
so this has to come from client.
|
||||
This is applicable to H264 and valid Range is from 0 to 63.
|
||||
Source Rec. ITU-T H.264 (06/2019); G.7.4.1.1, G.8.8.1.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_LTR_COUNT (integer)``
|
||||
Specifies the maximum number of Long Term Reference (LTR) frames at any
|
||||
given time that the encoder can keep.
|
||||
This is applicable to the H264 and HEVC encoders.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX (integer)``
|
||||
After setting this control the frame that will be queued next
|
||||
will be marked as a Long Term Reference (LTR) frame
|
||||
and given this LTR index which ranges from 0 to LTR_COUNT-1.
|
||||
This is applicable to the H264 and HEVC encoders.
|
||||
Source Rec. ITU-T H.264 (06/2019); Table 7.9
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES (bitmask)``
|
||||
Specifies the Long Term Reference (LTR) frame(s) to be used for
|
||||
encoding the next frame queued after setting this control.
|
||||
This provides a bitmask which consists of bits [0, LTR_COUNT-1].
|
||||
This is applicable to the H264 and HEVC encoders.
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
|
||||
|
||||
.. _colorimetry-controls:
|
||||
|
||||
*****************************
|
||||
Colorimetry Control Reference
|
||||
*****************************
|
||||
|
||||
The Colorimetry class includes controls for High Dynamic Range
|
||||
imaging for representing colors in digital images and video. The
|
||||
controls should be used for video and image encoding and decoding
|
||||
as well as in HDMI receivers and transmitters.
|
||||
|
||||
Colorimetry Control IDs
|
||||
-----------------------
|
||||
|
||||
.. _colorimetry-control-id:
|
||||
|
||||
``V4L2_CID_COLORIMETRY_CLASS (class)``
|
||||
The Colorimetry class descriptor. Calling
|
||||
:ref:`VIDIOC_QUERYCTRL` for this control will
|
||||
return a description of this control class.
|
||||
@@ -358,6 +358,10 @@ still cause this situation.
|
||||
- 0xa20000
|
||||
- The class containing RF tuner controls. These controls are
|
||||
described in :ref:`rf-tuner-controls`.
|
||||
* - ``V4L2_CTRL_CLASS_COLORIMETRY``
|
||||
- 0xa50000
|
||||
- The class containing colorimetry controls. These controls are
|
||||
described in :ref:`colorimetry-controls`.
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
@@ -4815,8 +4815,10 @@ If an MSR access is not permitted through the filtering, it generates a
|
||||
allows user space to deflect and potentially handle various MSR accesses
|
||||
into user space.
|
||||
|
||||
If a vCPU is in running state while this ioctl is invoked, the vCPU may
|
||||
experience inconsistent filtering behavior on MSR accesses.
|
||||
Note, invoking this ioctl with a vCPU is running is inherently racy. However,
|
||||
KVM does guarantee that vCPUs will see either the previous filter or the new
|
||||
filter, e.g. MSRs with identical settings in both the old and new filter will
|
||||
have deterministic behavior.
|
||||
|
||||
|
||||
5. The kvm_run structure
|
||||
|
||||
48
Makefile
48
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 26
|
||||
SUBLEVEL = 32
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
@@ -225,6 +225,20 @@ export KBUILD_CHECKSRC KBUILD_EXTMOD
|
||||
|
||||
extmod-prefix = $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)
|
||||
|
||||
# ANDROID: set up mixed-build support. mixed-build allows device kernel modules
|
||||
# to be compiled against a GKI kernel. This approach still uses the headers and
|
||||
# Kbuild from device kernel, so care must be taken to ensure that those headers match.
|
||||
ifdef KBUILD_MIXED_TREE
|
||||
# Need vmlinux.symvers for modpost and System.map for depmod, check whether they exist in KBUILD_MIXED_TREE
|
||||
required_mixed_files=vmlinux.symvers System.map
|
||||
$(if $(filter-out $(words $(required_mixed_files)), \
|
||||
$(words $(wildcard $(add-prefix $(KBUILD_MIXED_TREE)/,$(required_mixed_files))))),,\
|
||||
$(error KBUILD_MIXED_TREE=$(KBUILD_MIXED_TREE) doesn't contain $(required_mixed_files)))
|
||||
endif
|
||||
|
||||
mixed-build-prefix = $(if $(KBUILD_MIXED_TREE),$(KBUILD_MIXED_TREE)/)
|
||||
export KBUILD_MIXED_TREE
|
||||
|
||||
ifeq ($(abs_srctree),$(abs_objtree))
|
||||
# building in the source tree
|
||||
srctree := .
|
||||
@@ -265,7 +279,8 @@ no-dot-config-targets := $(clean-targets) \
|
||||
$(version_h) headers headers_% archheaders archscripts \
|
||||
%asm-generic kernelversion %src-pkg dt_binding_check \
|
||||
outputmakefile
|
||||
no-sync-config-targets := $(no-dot-config-targets) %install kernelrelease
|
||||
no-sync-config-targets := $(no-dot-config-targets) %install kernelrelease \
|
||||
image_name
|
||||
single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
|
||||
|
||||
config-build :=
|
||||
@@ -662,11 +677,13 @@ drivers-y += net/ virt/
|
||||
libs-y := lib/
|
||||
endif # KBUILD_EXTMOD
|
||||
|
||||
ifndef KBUILD_MIXED_TREE
|
||||
# The all: target is the default when no target is given on the
|
||||
# command line.
|
||||
# This allow a user to issue only 'make' to build a kernel including modules
|
||||
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
||||
all: vmlinux
|
||||
endif
|
||||
|
||||
CFLAGS_GCOV := -fprofile-arcs -ftest-coverage \
|
||||
$(call cc-option,-fno-tree-loop-im) \
|
||||
@@ -1136,6 +1153,17 @@ ifdef CONFIG_STACK_VALIDATION
|
||||
endif
|
||||
endif
|
||||
|
||||
PHONY += resolve_btfids_clean
|
||||
|
||||
resolve_btfids_O = $(abspath $(objtree))/tools/bpf/resolve_btfids
|
||||
|
||||
# tools/bpf/resolve_btfids directory might not exist
|
||||
# in output directory, skip its clean in that case
|
||||
resolve_btfids_clean:
|
||||
ifneq ($(wildcard $(resolve_btfids_O)),)
|
||||
$(Q)$(MAKE) -sC $(srctree)/tools/bpf/resolve_btfids O=$(resolve_btfids_O) clean
|
||||
endif
|
||||
|
||||
ifdef CONFIG_BPF
|
||||
ifdef CONFIG_DEBUG_INFO_BTF
|
||||
ifeq ($(has_libelf),1)
|
||||
@@ -1251,8 +1279,10 @@ cmd_link-vmlinux = \
|
||||
$(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \
|
||||
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
|
||||
|
||||
ifndef KBUILD_MIXED_TREE
|
||||
vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE
|
||||
+$(call if_changed,link-vmlinux)
|
||||
endif
|
||||
|
||||
targets := vmlinux
|
||||
|
||||
@@ -1468,7 +1498,9 @@ endif
|
||||
# using awk while concatenating to the final file.
|
||||
|
||||
PHONY += modules
|
||||
modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_check modules_prepare
|
||||
# if KBUILD_BUILTIN && !KBUILD_MIXED_TREE, depend on vmlinux
|
||||
modules: $(if $(KBUILD_BUILTIN), $(if $(KBUILD_MIXED_TREE),,vmlinux))
|
||||
modules: modules_check modules_prepare
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||
|
||||
PHONY += modules_check
|
||||
@@ -1502,8 +1534,8 @@ _modinst_:
|
||||
ln -s $(CURDIR) $(MODLIB)/build ; \
|
||||
fi
|
||||
@sed 's:^:kernel/:' modules.order > $(MODLIB)/modules.order
|
||||
@cp -f modules.builtin $(MODLIB)/
|
||||
@cp -f $(objtree)/modules.builtin.modinfo $(MODLIB)/
|
||||
@cp -f $(mixed-build-prefix)modules.builtin $(MODLIB)/
|
||||
@cp -f $(or $(mixed-build-prefix),$(objtree)/)modules.builtin.modinfo $(MODLIB)/
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
||||
|
||||
# This depmod is only for convenience to give the initial
|
||||
@@ -1571,7 +1603,7 @@ vmlinuxclean:
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/link-vmlinux.sh clean
|
||||
$(Q)$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) clean)
|
||||
|
||||
clean: archclean vmlinuxclean
|
||||
clean: archclean vmlinuxclean resolve_btfids_clean
|
||||
|
||||
# mrproper - Delete all generated files, including .config
|
||||
#
|
||||
@@ -1882,7 +1914,7 @@ descend: $(build-dirs)
|
||||
$(build-dirs): prepare
|
||||
$(Q)$(MAKE) $(build)=$@ \
|
||||
single-build=$(if $(filter-out $@/, $(filter $@/%, $(KBUILD_SINGLE_TARGETS))),1) \
|
||||
need-builtin=1 need-modorder=1
|
||||
$(if $(KBUILD_MIXED_TREE),,need-builtin=1) need-modorder=1
|
||||
|
||||
clean-dirs := $(addprefix _clean_, $(clean-dirs))
|
||||
PHONY += $(clean-dirs) clean
|
||||
@@ -2016,7 +2048,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files))
|
||||
# Run depmod only if we have System.map and depmod is executable
|
||||
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
|
||||
cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \
|
||||
$(KERNELRELEASE)
|
||||
$(KERNELRELEASE) $(mixed-build-prefix)
|
||||
|
||||
# read saved command lines for existing targets
|
||||
existing-targets := $(wildcard $(sort $(targets)))
|
||||
|
||||
2
OWNERS
Normal file
2
OWNERS
Normal file
@@ -0,0 +1,2 @@
|
||||
# include OWNERS from the authoritative android-mainline branch
|
||||
include kernel/common:android-mainline:/OWNERS
|
||||
@@ -1,7 +1,6 @@
|
||||
# If we ever add another OWNERS above this directory, it's likely to be
|
||||
# more permissive, so don't inherit from it
|
||||
set noparent
|
||||
gki-abi-approvers@google.com
|
||||
adelva@google.com
|
||||
maennich@google.com
|
||||
saravanak@google.com
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
9
android/abi_gki_aarch64_core
Normal file
9
android/abi_gki_aarch64_core
Normal file
@@ -0,0 +1,9 @@
|
||||
[abi_symbol_list]
|
||||
# commonly used symbols
|
||||
ieee802154_alloc_hw
|
||||
ieee802154_free_hw
|
||||
ieee802154_register_hw
|
||||
ieee802154_rx_irqsafe
|
||||
ieee802154_unregister_hw
|
||||
ieee802154_wake_queue
|
||||
ieee802154_xmit_complete
|
||||
@@ -21,6 +21,7 @@
|
||||
cdev_device_add
|
||||
cdev_device_del
|
||||
cdev_init
|
||||
__cfi_slowpath
|
||||
__check_object_size
|
||||
clk_bulk_disable
|
||||
clk_bulk_enable
|
||||
@@ -183,7 +184,6 @@
|
||||
flush_workqueue
|
||||
free_io_pgtable_ops
|
||||
free_irq
|
||||
__free_pages
|
||||
generic_handle_irq
|
||||
generic_mii_ioctl
|
||||
get_device
|
||||
@@ -224,7 +224,6 @@
|
||||
icc_nodes_remove
|
||||
icc_provider_add
|
||||
icc_provider_del
|
||||
icc_put
|
||||
icc_set_bw
|
||||
icc_sync_state
|
||||
ida_alloc_range
|
||||
@@ -241,6 +240,7 @@
|
||||
init_timer_key
|
||||
init_wait_entry
|
||||
__init_waitqueue_head
|
||||
iomem_resource
|
||||
iommu_attach_device
|
||||
iommu_detach_device
|
||||
iommu_domain_alloc
|
||||
@@ -276,6 +276,7 @@
|
||||
irq_to_desc
|
||||
is_vmalloc_addr
|
||||
jiffies
|
||||
kasan_flag_enabled
|
||||
kasprintf
|
||||
kernel_connect
|
||||
kernel_getsockname
|
||||
@@ -293,7 +294,6 @@
|
||||
kstrdup_const
|
||||
kstrtoint
|
||||
kstrtouint
|
||||
kthread_create_on_node
|
||||
ktime_get
|
||||
ktime_get_mono_fast_ns
|
||||
ktime_get_real_ts64
|
||||
@@ -348,13 +348,11 @@
|
||||
of_device_is_compatible
|
||||
of_device_uevent_modalias
|
||||
of_dma_configure_id
|
||||
of_find_device_by_node
|
||||
of_find_property
|
||||
of_fwnode_ops
|
||||
of_genpd_add_provider_onecell
|
||||
of_genpd_del_provider
|
||||
of_get_child_by_name
|
||||
of_get_compatible_child
|
||||
of_get_named_gpio_flags
|
||||
of_get_next_available_child
|
||||
of_get_next_child
|
||||
@@ -455,7 +453,6 @@
|
||||
regcache_sync
|
||||
register_reboot_notifier
|
||||
__register_rpmsg_driver
|
||||
register_shrinker
|
||||
regmap_bulk_read
|
||||
regmap_bulk_write
|
||||
__regmap_init
|
||||
@@ -473,10 +470,12 @@
|
||||
regulator_set_load
|
||||
regulator_set_voltage
|
||||
release_firmware
|
||||
__release_region
|
||||
remap_pfn_range
|
||||
request_firmware
|
||||
request_firmware_direct
|
||||
request_firmware_into_buf
|
||||
__request_region
|
||||
request_threaded_irq
|
||||
reset_control_assert
|
||||
reset_control_deassert
|
||||
@@ -576,6 +575,9 @@
|
||||
trace_event_raw_init
|
||||
trace_event_reg
|
||||
trace_handle_return
|
||||
__traceiter_rwmmio_post_read
|
||||
__traceiter_rwmmio_read
|
||||
__traceiter_rwmmio_write
|
||||
__tracepoint_rwmmio_post_read
|
||||
__tracepoint_rwmmio_read
|
||||
__tracepoint_rwmmio_write
|
||||
@@ -629,7 +631,6 @@
|
||||
vunmap
|
||||
wait_for_completion_timeout
|
||||
__wake_up
|
||||
wake_up_process
|
||||
__warn_printk
|
||||
watchdog_init_timeout
|
||||
|
||||
@@ -694,11 +695,15 @@
|
||||
# required by ath10k_core.ko
|
||||
bcmp
|
||||
cancel_delayed_work
|
||||
__cfg80211_alloc_event_skb
|
||||
__cfg80211_alloc_reply_skb
|
||||
cfg80211_calculate_bitrate
|
||||
cfg80211_find_elem_match
|
||||
cfg80211_find_vendor_elem
|
||||
cfg80211_get_bss
|
||||
cfg80211_put_bss
|
||||
__cfg80211_send_event_skb
|
||||
cfg80211_vendor_cmd_reply
|
||||
cpu_latency_qos_add_request
|
||||
cpu_latency_qos_remove_request
|
||||
device_get_mac_address
|
||||
@@ -757,6 +762,8 @@
|
||||
__kfifo_alloc
|
||||
__kfifo_free
|
||||
__local_bh_enable_ip
|
||||
__nla_parse
|
||||
nla_put
|
||||
param_ops_ulong
|
||||
regulatory_hint
|
||||
skb_copy
|
||||
@@ -840,15 +847,10 @@
|
||||
of_clk_get_parent_name
|
||||
|
||||
# required by cqhci.ko
|
||||
devm_blk_ksm_init
|
||||
dmam_free_coherent
|
||||
mmc_cqe_request_done
|
||||
|
||||
# required by deferred-free-helper.ko
|
||||
freezing_slow_path
|
||||
__refrigerator
|
||||
sched_set_normal
|
||||
system_freezing_cnt
|
||||
|
||||
# required by extcon-usb-gpio.ko
|
||||
devm_extcon_dev_allocate
|
||||
devm_extcon_dev_register
|
||||
@@ -1185,12 +1187,14 @@
|
||||
hdmi_infoframe_pack
|
||||
hrtimer_init
|
||||
hrtimer_start_range_ns
|
||||
icc_put
|
||||
invalidate_mapping_pages
|
||||
iommu_map_sg
|
||||
iommu_set_fault_handler
|
||||
irq_domain_xlate_onecell
|
||||
kstrdup_quotable_cmdline
|
||||
kstrtouint_from_user
|
||||
kthread_create_on_node
|
||||
kthread_create_worker
|
||||
kthread_destroy_worker
|
||||
kthread_queue_work
|
||||
@@ -1213,7 +1217,9 @@
|
||||
of_device_is_available
|
||||
of_drm_find_bridge
|
||||
of_drm_find_panel
|
||||
of_find_device_by_node
|
||||
of_find_matching_node_and_match
|
||||
of_get_compatible_child
|
||||
of_graph_get_endpoint_by_regs
|
||||
of_graph_get_next_endpoint
|
||||
of_graph_get_remote_port_parent
|
||||
@@ -1229,6 +1235,7 @@
|
||||
_raw_read_unlock
|
||||
_raw_write_lock
|
||||
_raw_write_unlock
|
||||
register_shrinker
|
||||
register_vmap_purge_notifier
|
||||
regulator_get
|
||||
regulator_put
|
||||
@@ -1253,13 +1260,11 @@
|
||||
vm_get_page_prot
|
||||
vscnprintf
|
||||
vsnprintf
|
||||
wake_up_process
|
||||
ww_mutex_lock_interruptible
|
||||
ww_mutex_unlock
|
||||
|
||||
# required by msm_serial.ko
|
||||
iomem_resource
|
||||
__release_region
|
||||
__request_region
|
||||
tty_termios_baud_rate
|
||||
tty_termios_encode_baud_rate
|
||||
|
||||
@@ -1318,11 +1323,6 @@
|
||||
usb_put_hcd
|
||||
usb_remove_hcd
|
||||
|
||||
# required by page_pool.ko
|
||||
__alloc_pages_nodemask
|
||||
contig_page_data
|
||||
mod_node_page_state
|
||||
|
||||
# required by pdr_interface.ko
|
||||
strnlen
|
||||
|
||||
@@ -1403,9 +1403,7 @@
|
||||
of_get_cpu_node
|
||||
|
||||
# required by qcom-geni-se.ko
|
||||
console_drivers
|
||||
icc_set_tag
|
||||
of_get_next_parent
|
||||
|
||||
# required by qcom-pdc.ko
|
||||
irq_chip_get_parent_state
|
||||
@@ -1677,10 +1675,17 @@
|
||||
spmi_controller_remove
|
||||
|
||||
# required by system_heap.ko
|
||||
deferred_free
|
||||
dmabuf_page_pool_alloc
|
||||
dmabuf_page_pool_create
|
||||
dmabuf_page_pool_destroy
|
||||
dmabuf_page_pool_free
|
||||
dma_heap_add
|
||||
dma_heap_get_dev
|
||||
dma_heap_get_name
|
||||
dma_sync_sg_for_cpu
|
||||
dma_sync_sg_for_device
|
||||
__free_pages
|
||||
preempt_schedule
|
||||
__sg_page_iter_next
|
||||
|
||||
|
||||
1663
android/abi_gki_aarch64_exynos
Normal file
1663
android/abi_gki_aarch64_exynos
Normal file
File diff suppressed because it is too large
Load Diff
2124
android/abi_gki_aarch64_generic
Normal file
2124
android/abi_gki_aarch64_generic
Normal file
File diff suppressed because it is too large
Load Diff
@@ -25,6 +25,8 @@
|
||||
blk_mq_quiesce_queue
|
||||
blk_mq_requeue_request
|
||||
blk_mq_start_request
|
||||
blk_mq_tagset_busy_iter
|
||||
blk_mq_tagset_wait_completed_request
|
||||
blk_mq_unquiesce_queue
|
||||
blk_put_queue
|
||||
blk_queue_flag_clear
|
||||
@@ -44,6 +46,7 @@
|
||||
cdev_device_add
|
||||
cdev_device_del
|
||||
cdev_init
|
||||
__cfi_slowpath
|
||||
__check_object_size
|
||||
__class_create
|
||||
class_destroy
|
||||
@@ -193,7 +196,6 @@
|
||||
kstrtouint
|
||||
kstrtoul_from_user
|
||||
kstrtoull
|
||||
kthread_create_on_node
|
||||
ktime_get
|
||||
ktime_get_mono_fast_ns
|
||||
ktime_get_with_offset
|
||||
@@ -308,7 +310,6 @@
|
||||
__rcu_read_unlock
|
||||
rdev_get_drvdata
|
||||
refcount_warn_saturate
|
||||
register_shrinker
|
||||
regmap_read
|
||||
regmap_update_bits_base
|
||||
regmap_write
|
||||
@@ -376,6 +377,9 @@
|
||||
trace_event_raw_init
|
||||
trace_event_reg
|
||||
trace_handle_return
|
||||
__traceiter_rwmmio_post_read
|
||||
__traceiter_rwmmio_read
|
||||
__traceiter_rwmmio_write
|
||||
__tracepoint_rwmmio_post_read
|
||||
__tracepoint_rwmmio_read
|
||||
__tracepoint_rwmmio_write
|
||||
@@ -398,7 +402,6 @@
|
||||
wait_for_completion
|
||||
wait_for_completion_timeout
|
||||
__wake_up
|
||||
wake_up_process
|
||||
__warn_printk
|
||||
xa_destroy
|
||||
xa_erase
|
||||
@@ -507,12 +510,6 @@
|
||||
get_cpu_device
|
||||
policy_has_boost_freq
|
||||
|
||||
# required by deferred-free-helper.ko
|
||||
freezing_slow_path
|
||||
__refrigerator
|
||||
sched_set_normal
|
||||
system_freezing_cnt
|
||||
|
||||
# required by dw_mmc.ko
|
||||
debugfs_create_u32
|
||||
debugfs_create_x64
|
||||
@@ -809,6 +806,7 @@
|
||||
kimage_voffset
|
||||
kstrdup
|
||||
kstrtobool_from_user
|
||||
kthread_create_on_node
|
||||
kthread_should_stop
|
||||
kthread_stop
|
||||
ktime_add_safe
|
||||
@@ -830,6 +828,7 @@
|
||||
rb_next
|
||||
rb_prev
|
||||
rb_replace_node
|
||||
register_shrinker
|
||||
regulator_get_optional
|
||||
regulator_put
|
||||
__release_region
|
||||
@@ -857,6 +856,7 @@
|
||||
vmf_insert_pfn
|
||||
vm_mmap
|
||||
vzalloc
|
||||
wake_up_process
|
||||
|
||||
# required by mmc_block.ko
|
||||
blk_get_request
|
||||
@@ -882,6 +882,8 @@
|
||||
mmc_cqe_post_req
|
||||
mmc_cqe_recovery
|
||||
mmc_cqe_start_req
|
||||
mmc_crypto_prepare_req
|
||||
mmc_crypto_setup_queue
|
||||
mmc_detect_card_removed
|
||||
mmc_erase
|
||||
mmc_erase_group_aligned
|
||||
@@ -978,8 +980,6 @@
|
||||
blk_mq_complete_request_remote
|
||||
blk_mq_map_queues
|
||||
blk_mq_pci_map_queues
|
||||
blk_mq_tagset_busy_iter
|
||||
blk_mq_tagset_wait_completed_request
|
||||
blk_mq_tag_to_rq
|
||||
blk_mq_update_nr_hw_queues
|
||||
device_release_driver
|
||||
@@ -1113,10 +1113,6 @@
|
||||
usb_put_hcd
|
||||
usb_remove_hcd
|
||||
|
||||
# required by page_pool.ko
|
||||
contig_page_data
|
||||
mod_node_page_state
|
||||
|
||||
# required by phy-hi3660-usb3.ko
|
||||
__devm_of_phy_provider_register
|
||||
devm_phy_create
|
||||
@@ -1212,6 +1208,11 @@
|
||||
__unregister_chrdev
|
||||
|
||||
# required by system_heap.ko
|
||||
deferred_free
|
||||
dmabuf_page_pool_alloc
|
||||
dmabuf_page_pool_create
|
||||
dmabuf_page_pool_destroy
|
||||
dmabuf_page_pool_free
|
||||
dma_heap_get_dev
|
||||
__sg_page_iter_next
|
||||
__sg_page_iter_start
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
amba_driver_unregister
|
||||
android_debug_per_cpu_symbol
|
||||
android_debug_symbol
|
||||
android_rvh_probe_register
|
||||
anon_inode_getfile
|
||||
__arch_clear_user
|
||||
__arch_copy_from_user
|
||||
@@ -57,6 +58,7 @@
|
||||
bitmap_allocate_region
|
||||
__bitmap_clear
|
||||
bitmap_find_next_zero_area_off
|
||||
__bitmap_or
|
||||
bitmap_parselist
|
||||
bitmap_parselist_user
|
||||
bitmap_print_to_pagebuf
|
||||
@@ -83,10 +85,10 @@
|
||||
blocking_notifier_call_chain
|
||||
blocking_notifier_chain_register
|
||||
blocking_notifier_chain_unregister
|
||||
bpf_trace_run1
|
||||
bpf_trace_run10
|
||||
bpf_trace_run11
|
||||
bpf_trace_run12
|
||||
bpf_trace_run1
|
||||
bpf_trace_run2
|
||||
bpf_trace_run3
|
||||
bpf_trace_run4
|
||||
@@ -289,28 +291,43 @@
|
||||
crypto_aead_encrypt
|
||||
crypto_aead_setauthsize
|
||||
crypto_aead_setkey
|
||||
crypto_ahash_digest
|
||||
crypto_ahash_setkey
|
||||
crypto_alloc_aead
|
||||
crypto_alloc_ahash
|
||||
crypto_alloc_base
|
||||
crypto_alloc_shash
|
||||
crypto_alloc_skcipher
|
||||
crypto_alloc_sync_skcipher
|
||||
crypto_cipher_encrypt_one
|
||||
crypto_cipher_setkey
|
||||
crypto_comp_compress
|
||||
crypto_comp_decompress
|
||||
crypto_dequeue_request
|
||||
crypto_destroy_tfm
|
||||
crypto_enqueue_request
|
||||
crypto_has_alg
|
||||
crypto_init_queue
|
||||
crypto_register_aead
|
||||
crypto_register_ahash
|
||||
crypto_register_alg
|
||||
crypto_register_algs
|
||||
crypto_register_rngs
|
||||
crypto_register_scomp
|
||||
crypto_register_skcipher
|
||||
crypto_shash_final
|
||||
crypto_shash_setkey
|
||||
crypto_shash_update
|
||||
crypto_skcipher_decrypt
|
||||
crypto_skcipher_encrypt
|
||||
crypto_skcipher_setkey
|
||||
crypto_unregister_aead
|
||||
crypto_unregister_ahash
|
||||
crypto_unregister_alg
|
||||
crypto_unregister_algs
|
||||
crypto_unregister_rngs
|
||||
crypto_unregister_scomp
|
||||
crypto_unregister_skcipher
|
||||
css_next_child
|
||||
csum_ipv6_magic
|
||||
csum_partial
|
||||
@@ -343,6 +360,7 @@
|
||||
debugfs_remove
|
||||
dec_zone_page_state
|
||||
default_llseek
|
||||
deferred_free
|
||||
delayed_work_timer_fn
|
||||
del_gendisk
|
||||
del_timer
|
||||
@@ -365,6 +383,7 @@
|
||||
devfreq_suspend_device
|
||||
dev_fwnode
|
||||
__dev_get_by_index
|
||||
dev_get_by_index
|
||||
dev_get_by_name
|
||||
dev_get_regmap
|
||||
device_add
|
||||
@@ -509,6 +528,7 @@
|
||||
dev_pm_opp_unregister_notifier
|
||||
dev_pm_qos_add_notifier
|
||||
dev_pm_qos_add_request
|
||||
dev_pm_qos_read_value
|
||||
dev_pm_qos_remove_notifier
|
||||
dev_pm_qos_remove_request
|
||||
dev_pm_qos_update_request
|
||||
@@ -548,6 +568,7 @@
|
||||
dma_buf_unmap_attachment
|
||||
dma_buf_vmap
|
||||
dma_buf_vunmap
|
||||
dma_contiguous_default_area
|
||||
dma_fence_add_callback
|
||||
dma_fence_array_create
|
||||
dma_fence_array_ops
|
||||
@@ -928,13 +949,18 @@
|
||||
getboottime64
|
||||
get_cpu_device
|
||||
get_device
|
||||
get_each_dmabuf
|
||||
get_each_object_track
|
||||
__get_free_pages
|
||||
get_governor_parent_kobj
|
||||
get_option
|
||||
get_page_owner_handle
|
||||
get_pfnblock_flags_mask
|
||||
get_pid_task
|
||||
get_random_bytes
|
||||
get_random_u32
|
||||
get_sg_io_hdr
|
||||
get_slabinfo
|
||||
get_state_synchronize_rcu
|
||||
__get_task_comm
|
||||
get_task_mm
|
||||
@@ -1049,8 +1075,10 @@
|
||||
import_iovec
|
||||
in4_pton
|
||||
in6_pton
|
||||
inc_node_page_state
|
||||
inc_zone_page_state
|
||||
in_egroup_p
|
||||
inet_proto_csum_replace4
|
||||
init_dummy_netdev
|
||||
init_iova_domain
|
||||
init_net
|
||||
@@ -1083,6 +1111,10 @@
|
||||
input_unregister_device
|
||||
input_unregister_handle
|
||||
input_unregister_handler
|
||||
interval_tree_insert
|
||||
interval_tree_iter_first
|
||||
interval_tree_iter_next
|
||||
interval_tree_remove
|
||||
int_sqrt
|
||||
invalidate_mapping_pages
|
||||
iomem_resource
|
||||
@@ -1179,6 +1211,8 @@
|
||||
irq_work_queue_on
|
||||
irq_work_sync
|
||||
is_dma_buf_file
|
||||
isolate_and_split_free_page
|
||||
isolate_anon_lru_page
|
||||
is_vmalloc_addr
|
||||
jiffies
|
||||
jiffies_to_msecs
|
||||
@@ -1305,6 +1339,7 @@
|
||||
__log_post_read_mmio
|
||||
__log_read_mmio
|
||||
__log_write_mmio
|
||||
lookup_page_ext
|
||||
lzo1x_1_compress
|
||||
lzo1x_decompress_safe
|
||||
lzorle1x_1_compress
|
||||
@@ -1344,11 +1379,12 @@
|
||||
mempool_free
|
||||
mempool_free_slab
|
||||
memremap
|
||||
memset
|
||||
memset64
|
||||
memset
|
||||
__memset_io
|
||||
memstart_addr
|
||||
memunmap
|
||||
migrate_pages
|
||||
migrate_swap
|
||||
mipi_dsi_create_packet
|
||||
mipi_dsi_dcs_set_display_brightness
|
||||
@@ -1370,6 +1406,7 @@
|
||||
__module_get
|
||||
module_layout
|
||||
module_put
|
||||
__mod_zone_page_state
|
||||
__msecs_to_jiffies
|
||||
msleep
|
||||
msleep_interruptible
|
||||
@@ -1411,10 +1448,10 @@
|
||||
nla_find
|
||||
nla_memcpy
|
||||
__nla_parse
|
||||
nla_put
|
||||
nla_put_64bit
|
||||
nla_reserve
|
||||
nla_put
|
||||
nla_reserve_64bit
|
||||
nla_reserve
|
||||
__nla_validate
|
||||
__nlmsg_put
|
||||
no_llseek
|
||||
@@ -1570,8 +1607,8 @@
|
||||
pci_bus_type
|
||||
pci_clear_master
|
||||
pci_d3cold_disable
|
||||
pci_dev_present
|
||||
pci_device_group
|
||||
pci_dev_present
|
||||
pci_disable_device
|
||||
pci_disable_msi
|
||||
pcie_capability_read_word
|
||||
@@ -1605,6 +1642,7 @@
|
||||
pci_walk_bus
|
||||
pci_write_config_dword
|
||||
pci_write_config_word
|
||||
pcpu_nr_pages
|
||||
PDE_DATA
|
||||
__percpu_down_read
|
||||
percpu_down_write
|
||||
@@ -1734,6 +1772,7 @@
|
||||
pskb_expand_head
|
||||
__pskb_pull_tail
|
||||
___pskb_trim
|
||||
putback_movable_pages
|
||||
put_device
|
||||
put_disk
|
||||
put_iova_domain
|
||||
@@ -1823,7 +1862,6 @@
|
||||
refcount_dec_and_lock
|
||||
refcount_dec_not_one
|
||||
refcount_warn_saturate
|
||||
__refrigerator
|
||||
regcache_cache_only
|
||||
regcache_mark_dirty
|
||||
regcache_sync
|
||||
@@ -1970,6 +2008,8 @@
|
||||
rtnl_unlock
|
||||
rtnl_unregister
|
||||
runqueues
|
||||
scatterwalk_ffwd
|
||||
scatterwalk_map_and_copy
|
||||
sched_clock
|
||||
sched_feat_keys
|
||||
sched_feat_names
|
||||
@@ -1986,6 +2026,10 @@
|
||||
schedule_timeout
|
||||
schedule_timeout_interruptible
|
||||
schedule_timeout_uninterruptible
|
||||
scmi_driver_register
|
||||
scmi_driver_unregister
|
||||
scmi_protocol_register
|
||||
scmi_protocol_unregister
|
||||
scnprintf
|
||||
scsi_autopm_get_device
|
||||
scsi_autopm_put_device
|
||||
@@ -2037,6 +2081,8 @@
|
||||
set_user_nice
|
||||
sg_alloc_table
|
||||
sg_alloc_table_from_pages
|
||||
sg_copy_from_buffer
|
||||
sg_copy_to_buffer
|
||||
sg_free_table
|
||||
sg_init_one
|
||||
sg_init_table
|
||||
@@ -2054,6 +2100,7 @@
|
||||
show_rcu_gp_kthreads
|
||||
show_regs
|
||||
sigprocmask
|
||||
si_mem_available
|
||||
si_meminfo
|
||||
simple_attr_open
|
||||
simple_attr_read
|
||||
@@ -2077,6 +2124,7 @@
|
||||
skb_copy_expand
|
||||
skb_dequeue
|
||||
skb_dequeue_tail
|
||||
skb_ensure_writable
|
||||
skb_free_datagram
|
||||
__skb_get_hash
|
||||
__skb_gso_segment
|
||||
@@ -2172,6 +2220,7 @@
|
||||
sock_queue_rcv_skb
|
||||
sock_register
|
||||
sock_release
|
||||
sock_setsockopt
|
||||
sock_unregister
|
||||
softnet_data
|
||||
sort
|
||||
@@ -2208,6 +2257,7 @@
|
||||
sscanf
|
||||
__stack_chk_fail
|
||||
__stack_chk_guard
|
||||
stack_depot_fetch
|
||||
stack_trace_print
|
||||
stack_trace_save
|
||||
static_key_disable
|
||||
@@ -2249,6 +2299,8 @@
|
||||
synchronize_rcu_tasks_trace
|
||||
synchronize_srcu
|
||||
synchronize_srcu_expedited
|
||||
synth_event_create
|
||||
synth_event_delete
|
||||
syscon_node_to_regmap
|
||||
syscon_regmap_lookup_by_phandle
|
||||
sysctl_sched_features
|
||||
@@ -2298,7 +2350,9 @@
|
||||
thermal_cooling_device_unregister
|
||||
thermal_of_cooling_device_register
|
||||
thermal_pressure
|
||||
thermal_zone_device_enable
|
||||
thermal_zone_device_register
|
||||
thermal_zone_device_unregister
|
||||
thermal_zone_device_update
|
||||
thermal_zone_get_slope
|
||||
thermal_zone_get_temp
|
||||
@@ -2311,6 +2365,9 @@
|
||||
topology_set_thermal_pressure
|
||||
_totalram_pages
|
||||
total_swapcache_pages
|
||||
trace_array_get_by_name
|
||||
trace_array_put
|
||||
trace_array_set_clr_event
|
||||
__trace_bprintk
|
||||
__trace_bputs
|
||||
trace_clock_local
|
||||
@@ -2319,13 +2376,99 @@
|
||||
trace_event_ignore_this_pid
|
||||
trace_event_raw_init
|
||||
trace_event_reg
|
||||
trace_get_event_file
|
||||
trace_handle_return
|
||||
__traceiter_android_rvh_account_irq
|
||||
__traceiter_android_rvh_build_perf_domains
|
||||
__traceiter_android_rvh_can_migrate_task
|
||||
__traceiter_android_rvh_check_preempt_wakeup
|
||||
__traceiter_android_rvh_cpu_cgroup_attach
|
||||
__traceiter_android_rvh_cpu_cgroup_online
|
||||
__traceiter_android_rvh_cpufreq_transition
|
||||
__traceiter_android_rvh_dequeue_task
|
||||
__traceiter_android_rvh_enqueue_task
|
||||
__traceiter_android_rvh_find_busiest_queue
|
||||
__traceiter_android_rvh_find_lowest_rq
|
||||
__traceiter_android_rvh_flush_task
|
||||
__traceiter_android_rvh_irqs_disable
|
||||
__traceiter_android_rvh_irqs_enable
|
||||
__traceiter_android_rvh_migrate_queued_task
|
||||
__traceiter_android_rvh_new_task_stats
|
||||
__traceiter_android_rvh_pick_next_entity
|
||||
__traceiter_android_rvh_place_entity
|
||||
__traceiter_android_rvh_preempt_disable
|
||||
__traceiter_android_rvh_preempt_enable
|
||||
__traceiter_android_rvh_replace_next_task_fair
|
||||
__traceiter_android_rvh_resume_cpus
|
||||
__traceiter_android_rvh_sched_balance_rt
|
||||
__traceiter_android_rvh_sched_cpu_dying
|
||||
__traceiter_android_rvh_sched_cpu_starting
|
||||
__traceiter_android_rvh_sched_exec
|
||||
__traceiter_android_rvh_sched_fork
|
||||
__traceiter_android_rvh_sched_fork_init
|
||||
__traceiter_android_rvh_sched_newidle_balance
|
||||
__traceiter_android_rvh_sched_nohz_balancer_kick
|
||||
__traceiter_android_rvh_sched_setaffinity
|
||||
__traceiter_android_rvh_schedule
|
||||
__traceiter_android_rvh_schedule_bug
|
||||
__traceiter_android_rvh_select_task_rq_fair
|
||||
__traceiter_android_rvh_select_task_rq_rt
|
||||
__traceiter_android_rvh_set_gfp_zone_flags
|
||||
__traceiter_android_rvh_set_readahead_gfp_mask
|
||||
__traceiter_android_rvh_set_skip_swapcache_flags
|
||||
__traceiter_android_rvh_set_task_cpu
|
||||
__traceiter_android_rvh_tick_entry
|
||||
__traceiter_android_rvh_try_to_wake_up
|
||||
__traceiter_android_rvh_try_to_wake_up_success
|
||||
__traceiter_android_rvh_ttwu_cond
|
||||
__traceiter_android_rvh_update_cpu_capacity
|
||||
__traceiter_android_rvh_update_cpus_allowed
|
||||
__traceiter_android_rvh_update_misfit_status
|
||||
__traceiter_android_rvh_wake_up_new_task
|
||||
__traceiter_android_vh_allow_domain_state
|
||||
__traceiter_android_vh_binder_restore_priority
|
||||
__traceiter_android_vh_binder_set_priority
|
||||
__traceiter_android_vh_binder_transaction_init
|
||||
__traceiter_android_vh_binder_wakeup_ilocked
|
||||
__traceiter_android_vh_cpu_idle_enter
|
||||
__traceiter_android_vh_cpu_idle_exit
|
||||
__traceiter_android_vh_dump_throttled_rt_tasks
|
||||
__traceiter_android_vh_freq_table_limits
|
||||
__traceiter_android_vh_ftrace_dump_buffer
|
||||
__traceiter_android_vh_ftrace_format_check
|
||||
__traceiter_android_vh_ftrace_oops_enter
|
||||
__traceiter_android_vh_ftrace_oops_exit
|
||||
__traceiter_android_vh_ftrace_size_check
|
||||
__traceiter_android_vh_gpio_block_read
|
||||
__traceiter_android_vh_iommu_setup_dma_ops
|
||||
__traceiter_android_vh_ipi_stop
|
||||
__traceiter_android_vh_jiffies_update
|
||||
__traceiter_android_vh_logbuf
|
||||
__traceiter_android_vh_printk_hotplug
|
||||
__traceiter_android_vh_scheduler_tick
|
||||
__traceiter_android_vh_show_max_freq
|
||||
__traceiter_android_vh_show_resume_epoch_val
|
||||
__traceiter_android_vh_show_suspend_epoch_val
|
||||
__traceiter_android_vh_timer_calc_index
|
||||
__traceiter_binder_transaction_received
|
||||
__traceiter_cpu_frequency
|
||||
__traceiter_cpu_frequency_limits
|
||||
__traceiter_cpu_idle
|
||||
__traceiter_gpu_mem_total
|
||||
__traceiter_ipi_entry
|
||||
__traceiter_ipi_raise
|
||||
__traceiter_irq_handler_entry
|
||||
__traceiter_rwmmio_post_read
|
||||
__traceiter_rwmmio_read
|
||||
__traceiter_rwmmio_write
|
||||
__traceiter_sched_switch
|
||||
__traceiter_suspend_resume
|
||||
__tracepoint_android_rvh_account_irq
|
||||
__tracepoint_android_rvh_build_perf_domains
|
||||
__tracepoint_android_rvh_can_migrate_task
|
||||
__tracepoint_android_rvh_check_preempt_wakeup
|
||||
__tracepoint_android_rvh_cpu_cgroup_attach
|
||||
__tracepoint_android_rvh_cpu_cgroup_online
|
||||
__tracepoint_android_rvh_cpufreq_transition
|
||||
__tracepoint_android_rvh_dequeue_task
|
||||
__tracepoint_android_rvh_enqueue_task
|
||||
@@ -2340,6 +2483,7 @@
|
||||
__tracepoint_android_rvh_place_entity
|
||||
__tracepoint_android_rvh_preempt_disable
|
||||
__tracepoint_android_rvh_preempt_enable
|
||||
__tracepoint_android_rvh_replace_next_task_fair
|
||||
__tracepoint_android_rvh_resume_cpus
|
||||
__tracepoint_android_rvh_sched_balance_rt
|
||||
__tracepoint_android_rvh_sched_cpu_dying
|
||||
@@ -2349,6 +2493,7 @@
|
||||
__tracepoint_android_rvh_sched_fork_init
|
||||
__tracepoint_android_rvh_sched_newidle_balance
|
||||
__tracepoint_android_rvh_sched_nohz_balancer_kick
|
||||
__tracepoint_android_rvh_sched_setaffinity
|
||||
__tracepoint_android_rvh_schedule
|
||||
__tracepoint_android_rvh_schedule_bug
|
||||
__tracepoint_android_rvh_select_task_rq_fair
|
||||
@@ -2366,6 +2511,9 @@
|
||||
__tracepoint_android_rvh_update_misfit_status
|
||||
__tracepoint_android_rvh_wake_up_new_task
|
||||
__tracepoint_android_vh_allow_domain_state
|
||||
__tracepoint_android_vh_binder_restore_priority
|
||||
__tracepoint_android_vh_binder_set_priority
|
||||
__tracepoint_android_vh_binder_transaction_init
|
||||
__tracepoint_android_vh_binder_wakeup_ilocked
|
||||
__tracepoint_android_vh_cpu_idle_enter
|
||||
__tracepoint_android_vh_cpu_idle_exit
|
||||
@@ -2376,10 +2524,14 @@
|
||||
__tracepoint_android_vh_ftrace_oops_enter
|
||||
__tracepoint_android_vh_ftrace_oops_exit
|
||||
__tracepoint_android_vh_ftrace_size_check
|
||||
__tracepoint_android_vh_gpio_block_read
|
||||
__tracepoint_android_vh_iommu_setup_dma_ops
|
||||
__tracepoint_android_vh_ipi_stop
|
||||
__tracepoint_android_vh_jiffies_update
|
||||
__tracepoint_android_vh_logbuf
|
||||
__tracepoint_android_vh_printk_hotplug
|
||||
__tracepoint_android_vh_psi_event
|
||||
__tracepoint_android_vh_psi_group
|
||||
__tracepoint_android_vh_scheduler_tick
|
||||
__tracepoint_android_vh_show_max_freq
|
||||
__tracepoint_android_vh_show_resume_epoch_val
|
||||
@@ -2389,6 +2541,7 @@
|
||||
__tracepoint_cpu_frequency
|
||||
__tracepoint_cpu_frequency_limits
|
||||
__tracepoint_cpu_idle
|
||||
__tracepoint_gpu_mem_total
|
||||
__tracepoint_ipi_entry
|
||||
__tracepoint_ipi_raise
|
||||
__tracepoint_irq_handler_entry
|
||||
@@ -2657,6 +2810,7 @@
|
||||
vm_insert_page
|
||||
vm_iomap_memory
|
||||
vm_map_pages
|
||||
vm_memory_committed
|
||||
vm_mmap
|
||||
vm_munmap
|
||||
vm_node_stat
|
||||
|
||||
2571
android/abi_gki_aarch64_unisoc
Normal file
2571
android/abi_gki_aarch64_unisoc
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
||||
[abi_symbol_list]
|
||||
# commonly used symbols
|
||||
alloc_anon_inode
|
||||
__alloc_disk_node
|
||||
alloc_etherdev_mqs
|
||||
__alloc_pages_nodemask
|
||||
@@ -39,6 +40,7 @@
|
||||
__check_object_size
|
||||
__class_create
|
||||
class_destroy
|
||||
__ClearPageMovable
|
||||
clk_disable
|
||||
clk_enable
|
||||
clk_get_rate
|
||||
@@ -116,7 +118,6 @@
|
||||
free_netdev
|
||||
__free_pages
|
||||
free_pages
|
||||
freezing_slow_path
|
||||
fs_bio_set
|
||||
get_device
|
||||
__get_free_pages
|
||||
@@ -130,6 +131,7 @@
|
||||
idr_alloc
|
||||
idr_destroy
|
||||
idr_remove
|
||||
init_pseudo
|
||||
__init_rwsem
|
||||
__init_swait_queue_head
|
||||
init_timer_key
|
||||
@@ -145,11 +147,15 @@
|
||||
input_unregister_device
|
||||
__ioremap
|
||||
iounmap
|
||||
iput
|
||||
jiffies
|
||||
jiffies_to_msecs
|
||||
kasan_flag_enabled
|
||||
kern_mount
|
||||
kern_unmount
|
||||
kfree
|
||||
kfree_skb
|
||||
kill_anon_super
|
||||
kimage_voffset
|
||||
__kmalloc
|
||||
kmalloc_caches
|
||||
@@ -170,7 +176,6 @@
|
||||
kstrtoint
|
||||
kstrtouint
|
||||
kstrtoull
|
||||
kthread_create_on_node
|
||||
ktime_get
|
||||
ktime_get_mono_fast_ns
|
||||
ktime_get_raw_ts64
|
||||
@@ -204,6 +209,7 @@
|
||||
__mutex_init
|
||||
mutex_lock
|
||||
mutex_lock_interruptible
|
||||
mutex_trylock
|
||||
mutex_unlock
|
||||
netdev_err
|
||||
netdev_info
|
||||
@@ -286,7 +292,6 @@
|
||||
__rcu_read_lock
|
||||
__rcu_read_unlock
|
||||
refcount_warn_saturate
|
||||
__refrigerator
|
||||
register_blkdev
|
||||
register_netdev
|
||||
register_netdevice
|
||||
@@ -321,6 +326,7 @@
|
||||
__serio_register_port
|
||||
serio_unregister_driver
|
||||
set_disk_ro
|
||||
__SetPageMovable
|
||||
sg_alloc_table
|
||||
sg_free_table
|
||||
sg_init_one
|
||||
@@ -378,7 +384,6 @@
|
||||
__sysfs_match_string
|
||||
sysfs_remove_group
|
||||
sysfs_remove_link
|
||||
system_freezing_cnt
|
||||
system_wq
|
||||
trace_event_buffer_commit
|
||||
trace_event_buffer_reserve
|
||||
@@ -386,6 +391,9 @@
|
||||
trace_event_raw_init
|
||||
trace_event_reg
|
||||
trace_handle_return
|
||||
__traceiter_rwmmio_post_read
|
||||
__traceiter_rwmmio_read
|
||||
__traceiter_rwmmio_write
|
||||
__tracepoint_rwmmio_post_read
|
||||
__tracepoint_rwmmio_read
|
||||
__tracepoint_rwmmio_write
|
||||
@@ -398,6 +406,7 @@
|
||||
unregister_netdev
|
||||
unregister_netdevice_notifier
|
||||
unregister_netdevice_queue
|
||||
unregister_shrinker
|
||||
unregister_virtio_device
|
||||
unregister_virtio_driver
|
||||
up_read
|
||||
@@ -429,7 +438,6 @@
|
||||
vring_transport_features
|
||||
wait_for_completion
|
||||
__wake_up
|
||||
wake_up_process
|
||||
__warn_printk
|
||||
|
||||
# required by ambakmi.ko
|
||||
@@ -482,9 +490,6 @@
|
||||
of_clk_hw_simple_get
|
||||
of_property_read_string
|
||||
|
||||
# required by deferred-free-helper.ko
|
||||
sched_set_normal
|
||||
|
||||
# required by dummy-cpufreq.ko
|
||||
cpufreq_generic_attr
|
||||
cpufreq_register_driver
|
||||
@@ -675,6 +680,7 @@
|
||||
kobject_del
|
||||
kobject_get
|
||||
kstrtoll
|
||||
kthread_create_on_node
|
||||
kthread_parkme
|
||||
kthread_should_park
|
||||
kthread_should_stop
|
||||
@@ -687,7 +693,6 @@
|
||||
mempool_init
|
||||
mempool_kfree
|
||||
mempool_kmalloc
|
||||
mutex_trylock
|
||||
part_end_io_acct
|
||||
part_start_io_acct
|
||||
percpu_ref_exit
|
||||
@@ -710,6 +715,7 @@
|
||||
unregister_reboot_notifier
|
||||
unregister_sysctl_table
|
||||
vfs_fsync
|
||||
wake_up_process
|
||||
|
||||
# required by nd_virtio.ko
|
||||
bio_chain
|
||||
@@ -732,9 +738,6 @@
|
||||
netdev_pick_tx
|
||||
pci_bus_type
|
||||
|
||||
# required by page_pool.ko
|
||||
mod_node_page_state
|
||||
|
||||
# required by psmouse.ko
|
||||
bus_register_notifier
|
||||
bus_unregister_notifier
|
||||
@@ -876,6 +879,11 @@
|
||||
snd_pcm_hw_constraint_msbits
|
||||
|
||||
# required by system_heap.ko
|
||||
deferred_free
|
||||
dmabuf_page_pool_alloc
|
||||
dmabuf_page_pool_create
|
||||
dmabuf_page_pool_destroy
|
||||
dmabuf_page_pool_free
|
||||
dma_heap_add
|
||||
dma_heap_get_dev
|
||||
dma_heap_get_name
|
||||
@@ -1084,6 +1092,24 @@
|
||||
# required by virtio-rng.ko
|
||||
wait_for_completion_killable
|
||||
|
||||
# required by virtio_balloon.ko
|
||||
adjust_managed_page_count
|
||||
all_vm_events
|
||||
balloon_aops
|
||||
balloon_page_alloc
|
||||
balloon_page_dequeue
|
||||
balloon_page_enqueue
|
||||
init_on_free
|
||||
page_reporting_register
|
||||
page_reporting_unregister
|
||||
register_oom_notifier
|
||||
si_mem_available
|
||||
si_meminfo
|
||||
system_freezable_wq
|
||||
unregister_oom_notifier
|
||||
vm_event_states
|
||||
vm_node_stat
|
||||
|
||||
# required by virtio_blk.ko
|
||||
blk_execute_rq
|
||||
blk_get_request
|
||||
@@ -1116,6 +1142,7 @@
|
||||
cdev_del
|
||||
device_destroy
|
||||
fasync_helper
|
||||
freezing_slow_path
|
||||
hvc_alloc
|
||||
hvc_instantiate
|
||||
hvc_kick
|
||||
@@ -1125,10 +1152,12 @@
|
||||
kill_fasync
|
||||
pipe_lock
|
||||
pipe_unlock
|
||||
__refrigerator
|
||||
__register_chrdev
|
||||
single_open
|
||||
single_release
|
||||
__splice_from_pipe
|
||||
system_freezing_cnt
|
||||
__unregister_chrdev
|
||||
|
||||
# required by virtio_mmio.ko
|
||||
@@ -1282,20 +1311,11 @@
|
||||
vzalloc
|
||||
|
||||
# required by zsmalloc.ko
|
||||
alloc_anon_inode
|
||||
__ClearPageMovable
|
||||
dec_zone_page_state
|
||||
inc_zone_page_state
|
||||
init_pseudo
|
||||
iput
|
||||
kern_mount
|
||||
kern_unmount
|
||||
kill_anon_super
|
||||
__lock_page
|
||||
page_mapping
|
||||
_raw_read_lock
|
||||
_raw_read_unlock
|
||||
_raw_write_lock
|
||||
_raw_write_unlock
|
||||
__SetPageMovable
|
||||
unregister_shrinker
|
||||
|
||||
@@ -96,7 +96,7 @@ stash_usr_regs(struct rt_sigframe __user *sf, struct pt_regs *regs,
|
||||
sizeof(sf->uc.uc_mcontext.regs.scratch));
|
||||
err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(sigset_t));
|
||||
|
||||
return err;
|
||||
return err ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf)
|
||||
@@ -110,7 +110,7 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf)
|
||||
&(sf->uc.uc_mcontext.regs.scratch),
|
||||
sizeof(sf->uc.uc_mcontext.regs.scratch));
|
||||
if (err)
|
||||
return err;
|
||||
return -EFAULT;
|
||||
|
||||
set_current_blocked(&set);
|
||||
regs->bta = uregs.scratch.bta;
|
||||
|
||||
2
arch/arm/OWNERS
Normal file
2
arch/arm/OWNERS
Normal file
@@ -0,0 +1,2 @@
|
||||
# include OWNERS from the authoritative android-mainline branch
|
||||
include kernel/common:android-mainline:/arch/arm/OWNERS
|
||||
@@ -40,6 +40,9 @@
|
||||
ethernet1 = &cpsw_emac1;
|
||||
spi0 = &spi0;
|
||||
spi1 = &spi1;
|
||||
mmc0 = &mmc1;
|
||||
mmc1 = &mmc2;
|
||||
mmc2 = &mmc3;
|
||||
};
|
||||
|
||||
cpus {
|
||||
|
||||
@@ -236,6 +236,7 @@
|
||||
status = "okay";
|
||||
compatible = "ethernet-phy-id0141.0DD1", "ethernet-phy-ieee802.3-c22";
|
||||
reg = <1>;
|
||||
marvell,reg-init = <3 18 0 0x4985>;
|
||||
|
||||
/* irq is connected to &pcawan pin 7 */
|
||||
};
|
||||
|
||||
@@ -334,14 +334,6 @@
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
atmel,mux-mask = <
|
||||
/* A B C */
|
||||
0xFFFFFE7F 0xC0E0397F 0xEF00019D /* pioA */
|
||||
0x03FFFFFF 0x02FC7E68 0x00780000 /* pioB */
|
||||
0xffffffff 0xF83FFFFF 0xB800F3FC /* pioC */
|
||||
0x003FFFFF 0x003F8000 0x00000000 /* pioD */
|
||||
>;
|
||||
|
||||
adc {
|
||||
pinctrl_adc_default: adc_default {
|
||||
atmel,pins = <AT91_PIOB 15 AT91_PERIPH_A AT91_PINCTRL_NONE>;
|
||||
|
||||
@@ -84,8 +84,8 @@
|
||||
pinctrl-0 = <&pinctrl_macb0_default>;
|
||||
phy-mode = "rmii";
|
||||
|
||||
ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
ethernet-phy@7 {
|
||||
reg = <0x7>;
|
||||
interrupt-parent = <&pioA>;
|
||||
interrupts = <PIN_PD31 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
@@ -432,6 +432,7 @@
|
||||
pinctrl-0 = <&pinctrl_usdhc2>;
|
||||
cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
|
||||
wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
|
||||
vmmc-supply = <&vdd_sd1_reg>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -441,5 +442,6 @@
|
||||
&pinctrl_usdhc3_cdwp>;
|
||||
cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
|
||||
wp-gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
|
||||
vmmc-supply = <&vdd_sd0_reg>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -14,5 +14,6 @@
|
||||
};
|
||||
|
||||
&gpmi {
|
||||
fsl,use-minimum-ecc;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -22,6 +22,11 @@
|
||||
i2c1 = &i2c2;
|
||||
i2c2 = &i2c3;
|
||||
i2c3 = &i2c4;
|
||||
mmc0 = &mmc1;
|
||||
mmc1 = &mmc2;
|
||||
mmc2 = &mmc3;
|
||||
mmc3 = &mmc4;
|
||||
mmc4 = &mmc5;
|
||||
serial0 = &uart1;
|
||||
serial1 = &uart2;
|
||||
serial2 = &uart3;
|
||||
|
||||
@@ -770,14 +770,6 @@
|
||||
ti,max-div = <2>;
|
||||
};
|
||||
|
||||
sha2md5_fck: sha2md5_fck@15c8 {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,gate-clock";
|
||||
clocks = <&l3_div_ck>;
|
||||
ti,bit-shift = <1>;
|
||||
reg = <0x15c8>;
|
||||
};
|
||||
|
||||
usb_phy_cm_clk32k: usb_phy_cm_clk32k@640 {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,gate-clock";
|
||||
|
||||
@@ -25,6 +25,11 @@
|
||||
i2c2 = &i2c3;
|
||||
i2c3 = &i2c4;
|
||||
i2c4 = &i2c5;
|
||||
mmc0 = &mmc1;
|
||||
mmc1 = &mmc2;
|
||||
mmc2 = &mmc3;
|
||||
mmc3 = &mmc4;
|
||||
mmc4 = &mmc5;
|
||||
serial0 = &uart1;
|
||||
serial1 = &uart2;
|
||||
serial2 = &uart3;
|
||||
|
||||
@@ -606,6 +606,15 @@
|
||||
compatible = "microchip,sam9x60-pinctrl", "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl", "simple-bus";
|
||||
ranges = <0xfffff400 0xfffff400 0x800>;
|
||||
|
||||
/* mux-mask corresponding to sam9x60 SoC in TFBGA228L package */
|
||||
atmel,mux-mask = <
|
||||
/* A B C */
|
||||
0xffffffff 0xffe03fff 0xef00019d /* pioA */
|
||||
0x03ffffff 0x02fc7e7f 0x00780000 /* pioB */
|
||||
0xffffffff 0xffffffff 0xf83fffff /* pioC */
|
||||
0x003fffff 0x003f8000 0x00000000 /* pioD */
|
||||
>;
|
||||
|
||||
pioA: gpio@fffff400 {
|
||||
compatible = "microchip,sam9x60-gpio", "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
|
||||
reg = <0xfffff400 0x200>;
|
||||
|
||||
@@ -85,8 +85,8 @@ static int __init blake2b_neon_mod_init(void)
|
||||
|
||||
static void __exit blake2b_neon_mod_exit(void)
|
||||
{
|
||||
return crypto_unregister_shashes(blake2b_neon_algs,
|
||||
ARRAY_SIZE(blake2b_neon_algs));
|
||||
crypto_unregister_shashes(blake2b_neon_algs,
|
||||
ARRAY_SIZE(blake2b_neon_algs));
|
||||
}
|
||||
|
||||
module_init(blake2b_neon_mod_init);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
// Registers used to hold message words temporarily. There aren't
|
||||
// enough ARM registers to hold the whole message block, so we have to
|
||||
@@ -38,6 +39,23 @@
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro _le32_bswap a, tmp
|
||||
#ifdef __ARMEB__
|
||||
rev_l \a, \tmp
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro _le32_bswap_8x a, b, c, d, e, f, g, h, tmp
|
||||
_le32_bswap \a, \tmp
|
||||
_le32_bswap \b, \tmp
|
||||
_le32_bswap \c, \tmp
|
||||
_le32_bswap \d, \tmp
|
||||
_le32_bswap \e, \tmp
|
||||
_le32_bswap \f, \tmp
|
||||
_le32_bswap \g, \tmp
|
||||
_le32_bswap \h, \tmp
|
||||
.endm
|
||||
|
||||
// Execute a quarter-round of BLAKE2s by mixing two columns or two diagonals.
|
||||
// (a0, b0, c0, d0) and (a1, b1, c1, d1) give the registers containing the two
|
||||
// columns/diagonals. s0-s1 are the word offsets to the message words the first
|
||||
@@ -180,8 +198,10 @@ ENTRY(blake2s_compress_arch)
|
||||
tst r1, #3
|
||||
bne .Lcopy_block_misaligned
|
||||
ldmia r1!, {r2-r9}
|
||||
_le32_bswap_8x r2, r3, r4, r5, r6, r7, r8, r9, r14
|
||||
stmia r12!, {r2-r9}
|
||||
ldmia r1!, {r2-r9}
|
||||
_le32_bswap_8x r2, r3, r4, r5, r6, r7, r8, r9, r14
|
||||
stmia r12, {r2-r9}
|
||||
.Lcopy_block_done:
|
||||
str r1, [sp, #68] // Update message pointer
|
||||
@@ -268,6 +288,7 @@ ENTRY(blake2s_compress_arch)
|
||||
1:
|
||||
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
ldr r3, [r1], #4
|
||||
_le32_bswap r3, r4
|
||||
#else
|
||||
ldrb r3, [r1, #0]
|
||||
ldrb r4, [r1, #1]
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
/* cats host-specific stuff */
|
||||
static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 };
|
||||
static int irqmap_cats[] = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 };
|
||||
|
||||
static u8 cats_no_swizzle(struct pci_dev *dev, u8 *pin)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init cats_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
static int cats_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
if (dev->irq >= 255)
|
||||
return -1; /* not a valid interrupt. */
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
static int irqmap_ebsa285[] __initdata = { IRQ_IN3, IRQ_IN1, IRQ_IN0, IRQ_PCI };
|
||||
static int irqmap_ebsa285[] = { IRQ_IN3, IRQ_IN1, IRQ_IN0, IRQ_PCI };
|
||||
|
||||
static int __init ebsa285_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
static int ebsa285_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
if (dev->vendor == PCI_VENDOR_ID_CONTAQ &&
|
||||
dev->device == PCI_DEVICE_ID_CONTAQ_82C693)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* We now use the slot ID instead of the device identifiers to select
|
||||
* which interrupt is routed where.
|
||||
*/
|
||||
static int __init netwinder_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
static int netwinder_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
switch (slot) {
|
||||
case 0: /* host bridge */
|
||||
|
||||
@@ -14,13 +14,12 @@
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
static int irqmap_personal_server[] __initdata = {
|
||||
static int irqmap_personal_server[] = {
|
||||
IRQ_IN0, IRQ_IN1, IRQ_IN2, IRQ_IN3, 0, 0, 0,
|
||||
IRQ_DOORBELLHOST, IRQ_DMA1, IRQ_DMA2, IRQ_PCI
|
||||
};
|
||||
|
||||
static int __init personal_server_map_irq(const struct pci_dev *dev, u8 slot,
|
||||
u8 pin)
|
||||
static int personal_server_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
unsigned char line;
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ static void __init keystone_init(void)
|
||||
static long long __init keystone_pv_fixup(void)
|
||||
{
|
||||
long long offset;
|
||||
phys_addr_t mem_start, mem_end;
|
||||
u64 mem_start, mem_end;
|
||||
|
||||
mem_start = memblock_start_of_DRAM();
|
||||
mem_end = memblock_end_of_DRAM();
|
||||
@@ -78,7 +78,7 @@ static long long __init keystone_pv_fixup(void)
|
||||
if (mem_start < KEYSTONE_HIGH_PHYS_START ||
|
||||
mem_end > KEYSTONE_HIGH_PHYS_END) {
|
||||
pr_crit("Invalid address space for memory (%08llx-%08llx)\n",
|
||||
(u64)mem_start, (u64)mem_end);
|
||||
mem_start, mem_end);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include "ams-delta-fiq.h"
|
||||
#include "board-ams-delta.h"
|
||||
|
||||
@@ -33,7 +33,7 @@ static void __init __maybe_unused omap_generic_init(void)
|
||||
}
|
||||
|
||||
/* Clocks are needed early, see drivers/clocksource for the rest */
|
||||
void __init __maybe_unused omap_init_time_of(void)
|
||||
static void __init __maybe_unused omap_init_time_of(void)
|
||||
{
|
||||
omap_clk_init();
|
||||
timer_probe();
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/arm-smccc.h>
|
||||
#include <linux/cpu_pm.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
@@ -20,6 +21,7 @@
|
||||
|
||||
#include "common.h"
|
||||
#include "omap-secure.h"
|
||||
#include "soc.h"
|
||||
|
||||
static phys_addr_t omap_secure_memblock_base;
|
||||
|
||||
@@ -213,3 +215,40 @@ void __init omap_secure_init(void)
|
||||
{
|
||||
omap_optee_init_check();
|
||||
}
|
||||
|
||||
/*
|
||||
* Dummy dispatcher call after core OSWR and MPU off. Updates the ROM return
|
||||
* address after MMU has been re-enabled after CPU1 has been woken up again.
|
||||
* Otherwise the ROM code will attempt to use the earlier physical return
|
||||
* address that got set with MMU off when waking up CPU1. Only used on secure
|
||||
* devices.
|
||||
*/
|
||||
static int cpu_notifier(struct notifier_block *nb, unsigned long cmd, void *v)
|
||||
{
|
||||
switch (cmd) {
|
||||
case CPU_CLUSTER_PM_EXIT:
|
||||
omap_secure_dispatcher(OMAP4_PPA_SERVICE_0,
|
||||
FLAG_START_CRITICAL,
|
||||
0, 0, 0, 0, 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block secure_notifier_block = {
|
||||
.notifier_call = cpu_notifier,
|
||||
};
|
||||
|
||||
static int __init secure_pm_init(void)
|
||||
{
|
||||
if (omap_type() == OMAP2_DEVICE_TYPE_GP || !soc_is_omap44xx())
|
||||
return 0;
|
||||
|
||||
cpu_pm_register_notifier(&secure_notifier_block);
|
||||
|
||||
return 0;
|
||||
}
|
||||
omap_arch_initcall(secure_pm_init);
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
#define OMAP5_DRA7_MON_SET_ACR_INDEX 0x107
|
||||
|
||||
/* Secure PPA(Primary Protected Application) APIs */
|
||||
#define OMAP4_PPA_SERVICE_0 0x21
|
||||
#define OMAP4_PPA_L2_POR_INDEX 0x23
|
||||
#define OMAP4_PPA_CPU_ACTRL_SMP_INDEX 0x25
|
||||
|
||||
|
||||
@@ -246,10 +246,10 @@ int __init omap4_cpcap_init(void)
|
||||
omap_voltage_register_pmic(voltdm, &omap443x_max8952_mpu);
|
||||
|
||||
if (of_machine_is_compatible("motorola,droid-bionic")) {
|
||||
voltdm = voltdm_lookup("mpu");
|
||||
voltdm = voltdm_lookup("core");
|
||||
omap_voltage_register_pmic(voltdm, &omap_cpcap_core);
|
||||
|
||||
voltdm = voltdm_lookup("mpu");
|
||||
voltdm = voltdm_lookup("iva");
|
||||
omap_voltage_register_pmic(voltdm, &omap_cpcap_iva);
|
||||
} else {
|
||||
voltdm = voltdm_lookup("core");
|
||||
|
||||
@@ -88,34 +88,26 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data,
|
||||
|
||||
extern struct omap_sr_data omap_sr_pdata[];
|
||||
|
||||
static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
|
||||
static int __init sr_init_by_name(const char *name, const char *voltdm)
|
||||
{
|
||||
struct omap_sr_data *sr_data = NULL;
|
||||
struct omap_volt_data *volt_data;
|
||||
struct omap_smartreflex_dev_attr *sr_dev_attr;
|
||||
static int i;
|
||||
|
||||
if (!strncmp(oh->name, "smartreflex_mpu_iva", 20) ||
|
||||
!strncmp(oh->name, "smartreflex_mpu", 16))
|
||||
if (!strncmp(name, "smartreflex_mpu_iva", 20) ||
|
||||
!strncmp(name, "smartreflex_mpu", 16))
|
||||
sr_data = &omap_sr_pdata[OMAP_SR_MPU];
|
||||
else if (!strncmp(oh->name, "smartreflex_core", 17))
|
||||
else if (!strncmp(name, "smartreflex_core", 17))
|
||||
sr_data = &omap_sr_pdata[OMAP_SR_CORE];
|
||||
else if (!strncmp(oh->name, "smartreflex_iva", 16))
|
||||
else if (!strncmp(name, "smartreflex_iva", 16))
|
||||
sr_data = &omap_sr_pdata[OMAP_SR_IVA];
|
||||
|
||||
if (!sr_data) {
|
||||
pr_err("%s: Unknown instance %s\n", __func__, oh->name);
|
||||
pr_err("%s: Unknown instance %s\n", __func__, name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
sr_dev_attr = (struct omap_smartreflex_dev_attr *)oh->dev_attr;
|
||||
if (!sr_dev_attr || !sr_dev_attr->sensor_voltdm_name) {
|
||||
pr_err("%s: No voltage domain specified for %s. Cannot initialize\n",
|
||||
__func__, oh->name);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
sr_data->name = oh->name;
|
||||
sr_data->name = name;
|
||||
if (cpu_is_omap343x())
|
||||
sr_data->ip_type = 1;
|
||||
else
|
||||
@@ -136,10 +128,10 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
|
||||
}
|
||||
}
|
||||
|
||||
sr_data->voltdm = voltdm_lookup(sr_dev_attr->sensor_voltdm_name);
|
||||
sr_data->voltdm = voltdm_lookup(voltdm);
|
||||
if (!sr_data->voltdm) {
|
||||
pr_err("%s: Unable to get voltage domain pointer for VDD %s\n",
|
||||
__func__, sr_dev_attr->sensor_voltdm_name);
|
||||
__func__, voltdm);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -160,6 +152,20 @@ exit:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
|
||||
{
|
||||
struct omap_smartreflex_dev_attr *sr_dev_attr;
|
||||
|
||||
sr_dev_attr = (struct omap_smartreflex_dev_attr *)oh->dev_attr;
|
||||
if (!sr_dev_attr || !sr_dev_attr->sensor_voltdm_name) {
|
||||
pr_err("%s: No voltage domain specified for %s. Cannot initialize\n",
|
||||
__func__, oh->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return sr_init_by_name(oh->name, sr_dev_attr->sensor_voltdm_name);
|
||||
}
|
||||
|
||||
/*
|
||||
* API to be called from board files to enable smartreflex
|
||||
* autocompensation at init.
|
||||
@@ -169,7 +175,42 @@ void __init omap_enable_smartreflex_on_init(void)
|
||||
sr_enable_on_init = true;
|
||||
}
|
||||
|
||||
static const char * const omap4_sr_instances[] = {
|
||||
"mpu",
|
||||
"iva",
|
||||
"core",
|
||||
};
|
||||
|
||||
static const char * const dra7_sr_instances[] = {
|
||||
"mpu",
|
||||
"core",
|
||||
};
|
||||
|
||||
int __init omap_devinit_smartreflex(void)
|
||||
{
|
||||
const char * const *sr_inst = NULL;
|
||||
int i, nr_sr = 0;
|
||||
|
||||
if (soc_is_omap44xx()) {
|
||||
sr_inst = omap4_sr_instances;
|
||||
nr_sr = ARRAY_SIZE(omap4_sr_instances);
|
||||
|
||||
} else if (soc_is_dra7xx()) {
|
||||
sr_inst = dra7_sr_instances;
|
||||
nr_sr = ARRAY_SIZE(dra7_sr_instances);
|
||||
}
|
||||
|
||||
if (nr_sr) {
|
||||
const char *name, *voltdm;
|
||||
|
||||
for (i = 0; i < nr_sr; i++) {
|
||||
name = kasprintf(GFP_KERNEL, "smartreflex_%s", sr_inst[i]);
|
||||
voltdm = sr_inst[i];
|
||||
sr_init_by_name(name, voltdm);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return omap_hwmod_for_each_by_class("smartreflex", sr_dev_init, NULL);
|
||||
}
|
||||
|
||||
@@ -235,6 +235,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
|
||||
phys_addr_t mem_end;
|
||||
phys_addr_t reg_start, reg_end;
|
||||
unsigned int mem_max_regions;
|
||||
bool first = true;
|
||||
int num;
|
||||
u64 i;
|
||||
|
||||
@@ -263,7 +264,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
|
||||
#endif
|
||||
|
||||
for_each_mem_range(i, ®_start, ®_end) {
|
||||
if (i == 0) {
|
||||
if (first) {
|
||||
phys_addr_t phys_offset = PHYS_OFFSET;
|
||||
|
||||
/*
|
||||
@@ -275,6 +276,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
|
||||
mem_start = reg_start;
|
||||
mem_end = reg_end;
|
||||
specified_mem_size = mem_end - mem_start;
|
||||
first = false;
|
||||
} else {
|
||||
/*
|
||||
* memblock auto merges contiguous blocks, remove
|
||||
|
||||
@@ -95,10 +95,11 @@ void __init pmsav8_adjust_lowmem_bounds(void)
|
||||
{
|
||||
phys_addr_t mem_end;
|
||||
phys_addr_t reg_start, reg_end;
|
||||
bool first = true;
|
||||
u64 i;
|
||||
|
||||
for_each_mem_range(i, ®_start, ®_end) {
|
||||
if (i == 0) {
|
||||
if (first) {
|
||||
phys_addr_t phys_offset = PHYS_OFFSET;
|
||||
|
||||
/*
|
||||
@@ -107,6 +108,7 @@ void __init pmsav8_adjust_lowmem_bounds(void)
|
||||
if (reg_start != phys_offset)
|
||||
panic("First memory bank must be contiguous from PHYS_OFFSET");
|
||||
mem_end = reg_end;
|
||||
first = false;
|
||||
} else {
|
||||
/*
|
||||
* memblock auto merges contiguous blocks, remove
|
||||
|
||||
@@ -204,7 +204,7 @@ unsigned long uprobe_get_swbp_addr(struct pt_regs *regs)
|
||||
static struct undef_hook uprobes_arm_break_hook = {
|
||||
.instr_mask = 0x0fffffff,
|
||||
.instr_val = (UPROBE_SWBP_ARM_INSN & 0x0fffffff),
|
||||
.cpsr_mask = MODE_MASK,
|
||||
.cpsr_mask = (PSR_T_BIT | MODE_MASK),
|
||||
.cpsr_val = USR_MODE,
|
||||
.fn = uprobe_trap_handler,
|
||||
};
|
||||
@@ -212,7 +212,7 @@ static struct undef_hook uprobes_arm_break_hook = {
|
||||
static struct undef_hook uprobes_arm_ss_hook = {
|
||||
.instr_mask = 0x0fffffff,
|
||||
.instr_val = (UPROBE_SS_ARM_INSN & 0x0fffffff),
|
||||
.cpsr_mask = MODE_MASK,
|
||||
.cpsr_mask = (PSR_T_BIT | MODE_MASK),
|
||||
.cpsr_val = USR_MODE,
|
||||
.fn = uprobe_trap_handler,
|
||||
};
|
||||
|
||||
@@ -209,6 +209,7 @@ config ARM64
|
||||
select SYSCTL_EXCEPTION_TRACE
|
||||
select THREAD_INFO_IN_TASK
|
||||
select ARCH_SUPPORTS_SPECULATIVE_PAGE_FAULT
|
||||
select HAVE_ARCH_USERFAULTFD_MINOR if USERFAULTFD
|
||||
help
|
||||
ARM 64-bit (AArch64) Linux support.
|
||||
|
||||
@@ -1401,10 +1402,13 @@ config ARM64_PAN
|
||||
config AS_HAS_LDAPR
|
||||
def_bool $(as-instr,.arch_extension rcpc)
|
||||
|
||||
config AS_HAS_LSE_ATOMICS
|
||||
def_bool $(as-instr,.arch_extension lse)
|
||||
|
||||
config ARM64_LSE_ATOMICS
|
||||
bool
|
||||
default ARM64_USE_LSE_ATOMICS
|
||||
depends on $(as-instr,.arch_extension lse)
|
||||
depends on AS_HAS_LSE_ATOMICS
|
||||
|
||||
config ARM64_USE_LSE_ATOMICS
|
||||
bool "Atomic instructions"
|
||||
@@ -1686,6 +1690,7 @@ config ARM64_MTE
|
||||
depends on AS_HAS_ARMV8_5
|
||||
# Required for tag checking in the uaccess routines
|
||||
depends on ARM64_PAN
|
||||
depends on AS_HAS_LSE_ATOMICS
|
||||
select ARCH_USES_HIGH_VMA_FLAGS
|
||||
help
|
||||
Memory Tagging (part of the ARMv8.5 Extensions) provides
|
||||
|
||||
2
arch/arm64/OWNERS
Normal file
2
arch/arm64/OWNERS
Normal file
@@ -0,0 +1,2 @@
|
||||
# include OWNERS from the authoritative android-mainline branch
|
||||
include kernel/common:android-mainline:/arch/arm64/OWNERS
|
||||
@@ -8,3 +8,7 @@
|
||||
compatible = "pine64,pine64-lts", "allwinner,sun50i-r18",
|
||||
"allwinner,sun50i-a64";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 push-push switch */
|
||||
};
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
vmmc-supply = <®_dcdc1>;
|
||||
disable-wp;
|
||||
bus-width = <4>;
|
||||
cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
|
||||
cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 push-pull switch */
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -289,10 +289,6 @@
|
||||
vcc-pm-supply = <®_aldo1>;
|
||||
};
|
||||
|
||||
&rtc {
|
||||
clocks = <&ext_osc32k>;
|
||||
};
|
||||
|
||||
&spdif {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -192,6 +192,7 @@
|
||||
ranges = <0x0 0x00 0x1700000 0x100000>;
|
||||
reg = <0x00 0x1700000 0x0 0x100000>;
|
||||
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
|
||||
dma-coherent;
|
||||
|
||||
sec_jr0: jr@10000 {
|
||||
compatible = "fsl,sec-v5.4-job-ring",
|
||||
|
||||
@@ -322,6 +322,7 @@
|
||||
ranges = <0x0 0x00 0x1700000 0x100000>;
|
||||
reg = <0x00 0x1700000 0x0 0x100000>;
|
||||
interrupts = <0 75 0x4>;
|
||||
dma-coherent;
|
||||
|
||||
sec_jr0: jr@10000 {
|
||||
compatible = "fsl,sec-v5.4-job-ring",
|
||||
|
||||
@@ -325,6 +325,7 @@
|
||||
ranges = <0x0 0x00 0x1700000 0x100000>;
|
||||
reg = <0x00 0x1700000 0x0 0x100000>;
|
||||
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
|
||||
dma-coherent;
|
||||
|
||||
sec_jr0: jr@10000 {
|
||||
compatible = "fsl,sec-v5.4-job-ring",
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
#define MX8MM_IOMUXC_SD1_CMD_USDHC1_CMD 0x0A4 0x30C 0x000 0x0 0x0
|
||||
#define MX8MM_IOMUXC_SD1_CMD_GPIO2_IO1 0x0A4 0x30C 0x000 0x5 0x0
|
||||
#define MX8MM_IOMUXC_SD1_DATA0_USDHC1_DATA0 0x0A8 0x310 0x000 0x0 0x0
|
||||
#define MX8MM_IOMUXC_SD1_DATA0_GPIO2_IO2 0x0A8 0x31 0x000 0x5 0x0
|
||||
#define MX8MM_IOMUXC_SD1_DATA0_GPIO2_IO2 0x0A8 0x310 0x000 0x5 0x0
|
||||
#define MX8MM_IOMUXC_SD1_DATA1_USDHC1_DATA1 0x0AC 0x314 0x000 0x0 0x0
|
||||
#define MX8MM_IOMUXC_SD1_DATA1_GPIO2_IO3 0x0AC 0x314 0x000 0x5 0x0
|
||||
#define MX8MM_IOMUXC_SD1_DATA2_USDHC1_DATA2 0x0B0 0x318 0x000 0x0 0x0
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
#define MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0x0A4 0x30C 0x000 0x0 0x0
|
||||
#define MX8MQ_IOMUXC_SD1_CMD_GPIO2_IO1 0x0A4 0x30C 0x000 0x5 0x0
|
||||
#define MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0x0A8 0x310 0x000 0x0 0x0
|
||||
#define MX8MQ_IOMUXC_SD1_DATA0_GPIO2_IO2 0x0A8 0x31 0x000 0x5 0x0
|
||||
#define MX8MQ_IOMUXC_SD1_DATA0_GPIO2_IO2 0x0A8 0x310 0x000 0x5 0x0
|
||||
#define MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0x0AC 0x314 0x000 0x0 0x0
|
||||
#define MX8MQ_IOMUXC_SD1_DATA1_GPIO2_IO3 0x0AC 0x314 0x000 0x5 0x0
|
||||
#define MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0x0B0 0x318 0x000 0x0 0x0
|
||||
|
||||
@@ -65,6 +65,8 @@ CONFIG_PM_WAKELOCKS_LIMIT=0
|
||||
# CONFIG_PM_WAKELOCKS_GC is not set
|
||||
CONFIG_ENERGY_MODEL=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_IDLE_GOV_TEO=y
|
||||
CONFIG_ARM_CPUIDLE=y
|
||||
CONFIG_ARM_PSCI_CPUIDLE=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
@@ -289,7 +291,6 @@ CONFIG_DM_DEFAULT_KEY=y
|
||||
CONFIG_DM_SNAPSHOT=y
|
||||
CONFIG_DM_UEVENT=y
|
||||
CONFIG_DM_VERITY=y
|
||||
CONFIG_DM_VERITY_AVB=y
|
||||
CONFIG_DM_VERITY_FEC=y
|
||||
CONFIG_DM_BOW=y
|
||||
CONFIG_NETDEVICES=y
|
||||
@@ -485,6 +486,8 @@ CONFIG_RTC_DRV_PL030=y
|
||||
CONFIG_RTC_DRV_PL031=y
|
||||
CONFIG_DMABUF_HEAPS=y
|
||||
CONFIG_DMABUF_SYSFS_STATS=y
|
||||
CONFIG_DMABUF_HEAPS_DEFERRED_FREE=y
|
||||
CONFIG_DMABUF_HEAPS_PAGE_POOL=y
|
||||
CONFIG_UIO=y
|
||||
CONFIG_VHOST_VSOCK=y
|
||||
CONFIG_STAGING=y
|
||||
@@ -639,7 +642,8 @@ CONFIG_DEBUG_MEMORY_INIT=y
|
||||
CONFIG_KASAN=y
|
||||
CONFIG_KASAN_HW_TAGS=y
|
||||
CONFIG_KFENCE=y
|
||||
CONFIG_KFENCE_SAMPLE_INTERVAL=500
|
||||
CONFIG_KFENCE_SAMPLE_INTERVAL=0
|
||||
CONFIG_KFENCE_NUM_OBJECTS=63
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_PANIC_TIMEOUT=-1
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
@@ -648,6 +652,8 @@ CONFIG_SCHEDSTATS=y
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
CONFIG_BUG_ON_DATA_CORRUPTION=y
|
||||
CONFIG_TRACE_MMIO_ACCESS=y
|
||||
CONFIG_TRACEFS_DISABLE_AUTOMOUNT=y
|
||||
CONFIG_HIST_TRIGGERS=y
|
||||
CONFIG_KUNIT=y
|
||||
CONFIG_KUNIT_DEBUGFS=y
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
|
||||
@@ -218,7 +218,6 @@ CONFIG_BLK_DEV_DM=y
|
||||
CONFIG_DM_CRYPT=y
|
||||
CONFIG_DM_UEVENT=y
|
||||
CONFIG_DM_VERITY=y
|
||||
CONFIG_DM_VERITY_AVB=y
|
||||
CONFIG_DM_VERITY_FEC=y
|
||||
CONFIG_DM_BOW=y
|
||||
CONFIG_NETDEVICES=y
|
||||
|
||||
@@ -97,9 +97,9 @@
|
||||
.popsection
|
||||
.subsection 1
|
||||
663: \insn2
|
||||
664: .previous
|
||||
.org . - (664b-663b) + (662b-661b)
|
||||
664: .org . - (664b-663b) + (662b-661b)
|
||||
.org . - (662b-661b) + (664b-663b)
|
||||
.previous
|
||||
.endif
|
||||
.endm
|
||||
|
||||
@@ -169,11 +169,11 @@
|
||||
*/
|
||||
.macro alternative_endif
|
||||
664:
|
||||
.org . - (664b-663b) + (662b-661b)
|
||||
.org . - (662b-661b) + (664b-663b)
|
||||
.if .Lasm_alt_mode==0
|
||||
.previous
|
||||
.endif
|
||||
.org . - (664b-663b) + (662b-661b)
|
||||
.org . - (662b-661b) + (664b-663b)
|
||||
.endm
|
||||
|
||||
/*
|
||||
|
||||
@@ -59,62 +59,32 @@ alternative_else_nop_endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Generate the assembly for UAO alternatives with exception table entries.
|
||||
* Generate the assembly for LDTR/STTR with exception table entries.
|
||||
* This is complicated as there is no post-increment or pair versions of the
|
||||
* unprivileged instructions, and USER() only works for single instructions.
|
||||
*/
|
||||
#ifdef CONFIG_ARM64_UAO
|
||||
.macro uao_ldp l, reg1, reg2, addr, post_inc
|
||||
alternative_if_not ARM64_HAS_UAO
|
||||
8888: ldp \reg1, \reg2, [\addr], \post_inc;
|
||||
8889: nop;
|
||||
nop;
|
||||
alternative_else
|
||||
ldtr \reg1, [\addr];
|
||||
ldtr \reg2, [\addr, #8];
|
||||
add \addr, \addr, \post_inc;
|
||||
alternative_endif
|
||||
8888: ldtr \reg1, [\addr];
|
||||
8889: ldtr \reg2, [\addr, #8];
|
||||
add \addr, \addr, \post_inc;
|
||||
|
||||
_asm_extable 8888b,\l;
|
||||
_asm_extable 8889b,\l;
|
||||
.endm
|
||||
|
||||
.macro uao_stp l, reg1, reg2, addr, post_inc
|
||||
alternative_if_not ARM64_HAS_UAO
|
||||
8888: stp \reg1, \reg2, [\addr], \post_inc;
|
||||
8889: nop;
|
||||
nop;
|
||||
alternative_else
|
||||
sttr \reg1, [\addr];
|
||||
sttr \reg2, [\addr, #8];
|
||||
add \addr, \addr, \post_inc;
|
||||
alternative_endif
|
||||
8888: sttr \reg1, [\addr];
|
||||
8889: sttr \reg2, [\addr, #8];
|
||||
add \addr, \addr, \post_inc;
|
||||
|
||||
_asm_extable 8888b,\l;
|
||||
_asm_extable 8889b,\l;
|
||||
.endm
|
||||
|
||||
.macro uao_user_alternative l, inst, alt_inst, reg, addr, post_inc
|
||||
alternative_if_not ARM64_HAS_UAO
|
||||
8888: \inst \reg, [\addr], \post_inc;
|
||||
nop;
|
||||
alternative_else
|
||||
\alt_inst \reg, [\addr];
|
||||
add \addr, \addr, \post_inc;
|
||||
alternative_endif
|
||||
8888: \alt_inst \reg, [\addr];
|
||||
add \addr, \addr, \post_inc;
|
||||
|
||||
_asm_extable 8888b,\l;
|
||||
.endm
|
||||
#else
|
||||
.macro uao_ldp l, reg1, reg2, addr, post_inc
|
||||
USER(\l, ldp \reg1, \reg2, [\addr], \post_inc)
|
||||
.endm
|
||||
.macro uao_stp l, reg1, reg2, addr, post_inc
|
||||
USER(\l, stp \reg1, \reg2, [\addr], \post_inc)
|
||||
.endm
|
||||
.macro uao_user_alternative l, inst, alt_inst, reg, addr, post_inc
|
||||
USER(\l, \inst \reg, [\addr], \post_inc)
|
||||
.endm
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <asm-generic/export.h>
|
||||
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/asm-bug.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/debug-monitors.h>
|
||||
@@ -270,12 +271,24 @@ alternative_endif
|
||||
* provide the system wide safe value from arm64_ftr_reg_ctrel0.sys_val
|
||||
*/
|
||||
.macro read_ctr, reg
|
||||
#ifndef __KVM_NVHE_HYPERVISOR__
|
||||
alternative_if_not ARM64_MISMATCHED_CACHE_TYPE
|
||||
mrs \reg, ctr_el0 // read CTR
|
||||
nop
|
||||
alternative_else
|
||||
ldr_l \reg, arm64_ftr_reg_ctrel0 + ARM64_FTR_SYSVAL
|
||||
alternative_endif
|
||||
#else
|
||||
alternative_if_not ARM64_KVM_PROTECTED_MODE
|
||||
ASM_BUG()
|
||||
alternative_else_nop_endif
|
||||
alternative_cb kvm_compute_final_ctr_el0
|
||||
movz \reg, #0
|
||||
movk \reg, #0, lsl #16
|
||||
movk \reg, #0, lsl #32
|
||||
movk \reg, #0, lsl #48
|
||||
alternative_cb_end
|
||||
#endif
|
||||
.endm
|
||||
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
#define ARM64_HAS_LDAPR 59
|
||||
#define ARM64_KVM_PROTECTED_MODE 60
|
||||
|
||||
#define ARM64_NCAPS 61
|
||||
/* kabi: reserve 62 - 76 for future cpu capabilities */
|
||||
#define ARM64_NCAPS 76
|
||||
|
||||
#endif /* __ASM_CPUCAPS_H */
|
||||
|
||||
@@ -607,7 +607,6 @@ void check_local_cpu_capabilities(void);
|
||||
|
||||
u64 read_sanitised_ftr_reg(u32 id);
|
||||
u64 __read_sysreg_by_encoding(u32 sys_id);
|
||||
int copy_ftr_reg(u32 id, struct arm64_ftr_reg *dst);
|
||||
|
||||
static inline bool cpu_supports_mixed_endian_el0(void)
|
||||
{
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
do { \
|
||||
unsigned int loops = FUTEX_MAX_LOOPS; \
|
||||
\
|
||||
uaccess_enable(); \
|
||||
uaccess_enable_privileged(); \
|
||||
asm volatile( \
|
||||
" prfm pstl1strm, %2\n" \
|
||||
"1: ldxr %w1, %2\n" \
|
||||
@@ -39,7 +39,7 @@ do { \
|
||||
"+r" (loops) \
|
||||
: "r" (oparg), "Ir" (-EFAULT), "Ir" (-EAGAIN) \
|
||||
: "memory"); \
|
||||
uaccess_disable(); \
|
||||
uaccess_disable_privileged(); \
|
||||
} while (0)
|
||||
|
||||
static inline int
|
||||
@@ -95,7 +95,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *_uaddr,
|
||||
return -EFAULT;
|
||||
|
||||
uaddr = __uaccess_mask_ptr(_uaddr);
|
||||
uaccess_enable();
|
||||
uaccess_enable_privileged();
|
||||
asm volatile("// futex_atomic_cmpxchg_inatomic\n"
|
||||
" prfm pstl1strm, %2\n"
|
||||
"1: ldxr %w1, %2\n"
|
||||
@@ -118,7 +118,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *_uaddr,
|
||||
: "+r" (ret), "=&r" (val), "+Q" (*uaddr), "=&r" (tmp), "+r" (loops)
|
||||
: "r" (oldval), "r" (newval), "Ir" (-EFAULT), "Ir" (-EAGAIN)
|
||||
: "memory");
|
||||
uaccess_disable();
|
||||
uaccess_disable_privileged();
|
||||
|
||||
if (!ret)
|
||||
*uval = val;
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2020 - Google LLC
|
||||
* Author: Quentin Perret <qperret@google.com>
|
||||
*/
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
#ifndef KVM_HYP_CPU_FTR_REG
|
||||
#if defined(__KVM_NVHE_HYPERVISOR__)
|
||||
#define KVM_HYP_CPU_FTR_REG(name) extern struct arm64_ftr_reg name
|
||||
#else
|
||||
#define KVM_HYP_CPU_FTR_REG(name) extern struct arm64_ftr_reg kvm_nvhe_sym(name)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
KVM_HYP_CPU_FTR_REG(arm64_ftr_reg_ctrel0);
|
||||
KVM_HYP_CPU_FTR_REG(arm64_ftr_reg_id_aa64mmfr0_el1);
|
||||
KVM_HYP_CPU_FTR_REG(arm64_ftr_reg_id_aa64mmfr1_el1);
|
||||
@@ -743,13 +743,9 @@ void kvm_clr_pmu_events(u32 clr);
|
||||
|
||||
void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu);
|
||||
void kvm_vcpu_pmu_restore_host(struct kvm_vcpu *vcpu);
|
||||
|
||||
void setup_kvm_el2_caps(void);
|
||||
#else
|
||||
static inline void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr) {}
|
||||
static inline void kvm_clr_pmu_events(u32 clr) {}
|
||||
|
||||
static inline void setup_kvm_el2_caps(void) {}
|
||||
#endif
|
||||
|
||||
void kvm_vcpu_load_sysregs_vhe(struct kvm_vcpu *vcpu);
|
||||
|
||||
@@ -116,4 +116,7 @@ int __pkvm_init(phys_addr_t phys, unsigned long size, unsigned long nr_cpus,
|
||||
void __noreturn __host_enter(struct kvm_cpu_context *host_ctxt);
|
||||
#endif
|
||||
|
||||
extern u64 kvm_nvhe_sym(id_aa64mmfr0_el1_sys_val);
|
||||
extern u64 kvm_nvhe_sym(id_aa64mmfr1_el1_sys_val);
|
||||
|
||||
#endif /* __ARM64_KVM_HYP_H__ */
|
||||
|
||||
@@ -60,9 +60,11 @@ struct kvm_pgtable_mm_ops {
|
||||
* enum kvm_pgtable_stage2_flags - Stage-2 page-table flags.
|
||||
* @KVM_PGTABLE_S2_NOFWB: Don't enforce Normal-WB even if the CPUs have
|
||||
* ARM64_HAS_STAGE2_FWB.
|
||||
* @KVM_PGTABLE_S2_IDMAP: Only use identity mappings.
|
||||
*/
|
||||
enum kvm_pgtable_stage2_flags {
|
||||
KVM_PGTABLE_S2_NOFWB = BIT(0),
|
||||
KVM_PGTABLE_S2_IDMAP = BIT(1),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -206,7 +208,7 @@ int kvm_pgtable_hyp_map(struct kvm_pgtable *pgt, u64 addr, u64 size, u64 phys,
|
||||
u64 kvm_get_vtcr(u64 mmfr0, u64 mmfr1, u32 phys_shift);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_init() - Initialise a guest stage-2 page-table.
|
||||
* kvm_pgtable_stage2_init_flags() - Initialise a guest stage-2 page-table.
|
||||
* @pgt: Uninitialised page-table structure to initialise.
|
||||
* @arch: Arch-specific KVM structure representing the guest virtual
|
||||
* machine.
|
||||
@@ -224,7 +226,7 @@ int kvm_pgtable_stage2_init_flags(struct kvm_pgtable *pgt, struct kvm_arch *arch
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_destroy() - Destroy an unused guest stage-2 page-table.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
*
|
||||
* The page-table is assumed to be unreachable by any hardware walkers prior
|
||||
* to freeing and therefore no TLB invalidation is performed.
|
||||
@@ -233,7 +235,7 @@ void kvm_pgtable_stage2_destroy(struct kvm_pgtable *pgt);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_map() - Install a mapping in a guest stage-2 page-table.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Intermediate physical address at which to place the mapping.
|
||||
* @size: Size of the mapping.
|
||||
* @phys: Physical address of the memory to map.
|
||||
@@ -264,10 +266,9 @@ int kvm_pgtable_stage2_map(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
||||
void *mc);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_set_owner() - Annotate invalid mappings with metadata
|
||||
* encoding the ownership of a page in the
|
||||
* IPA space.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* kvm_pgtable_stage2_set_owner() - Unmap and annotate pages in the IPA space to
|
||||
* track ownership.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Base intermediate physical address to annotate.
|
||||
* @size: Size of the annotated range.
|
||||
* @mc: Cache of pre-allocated and zeroed memory from which to allocate
|
||||
@@ -286,7 +287,7 @@ int kvm_pgtable_stage2_set_owner(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_unmap() - Remove a mapping from a guest stage-2 page-table.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Intermediate physical address from which to remove the mapping.
|
||||
* @size: Size of the mapping.
|
||||
*
|
||||
@@ -306,7 +307,7 @@ int kvm_pgtable_stage2_unmap(struct kvm_pgtable *pgt, u64 addr, u64 size);
|
||||
/**
|
||||
* kvm_pgtable_stage2_wrprotect() - Write-protect guest stage-2 address range
|
||||
* without TLB invalidation.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Intermediate physical address from which to write-protect,
|
||||
* @size: Size of the range.
|
||||
*
|
||||
@@ -323,7 +324,7 @@ int kvm_pgtable_stage2_wrprotect(struct kvm_pgtable *pgt, u64 addr, u64 size);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_mkyoung() - Set the access flag in a page-table entry.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Intermediate physical address to identify the page-table entry.
|
||||
*
|
||||
* The offset of @addr within a page is ignored.
|
||||
@@ -337,7 +338,7 @@ kvm_pte_t kvm_pgtable_stage2_mkyoung(struct kvm_pgtable *pgt, u64 addr);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_mkold() - Clear the access flag in a page-table entry.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Intermediate physical address to identify the page-table entry.
|
||||
*
|
||||
* The offset of @addr within a page is ignored.
|
||||
@@ -356,7 +357,7 @@ kvm_pte_t kvm_pgtable_stage2_mkold(struct kvm_pgtable *pgt, u64 addr);
|
||||
/**
|
||||
* kvm_pgtable_stage2_relax_perms() - Relax the permissions enforced by a
|
||||
* page-table entry.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Intermediate physical address to identify the page-table entry.
|
||||
* @prot: Additional permissions to grant for the mapping.
|
||||
*
|
||||
@@ -375,7 +376,7 @@ int kvm_pgtable_stage2_relax_perms(struct kvm_pgtable *pgt, u64 addr,
|
||||
/**
|
||||
* kvm_pgtable_stage2_is_young() - Test whether a page-table entry has the
|
||||
* access flag set.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Intermediate physical address to identify the page-table entry.
|
||||
*
|
||||
* The offset of @addr within a page is ignored.
|
||||
@@ -388,7 +389,7 @@ bool kvm_pgtable_stage2_is_young(struct kvm_pgtable *pgt, u64 addr);
|
||||
* kvm_pgtable_stage2_flush_range() - Clean and invalidate data cache to Point
|
||||
* of Coherency for guest stage-2 address
|
||||
* range.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Intermediate physical address from which to flush.
|
||||
* @size: Size of the range.
|
||||
*
|
||||
@@ -427,7 +428,7 @@ int kvm_pgtable_walk(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
||||
* kvm_pgtable_stage2_find_range() - Find a range of Intermediate Physical
|
||||
* Addresses with compatible permission
|
||||
* attributes.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||
* @addr: Address that must be covered by the range.
|
||||
* @prot: Protection attributes that the range must be compatible with.
|
||||
* @range: Range structure used to limit the search space at call time and
|
||||
|
||||
@@ -232,8 +232,10 @@ static inline const void *__tag_set(const void *addr, u8 tag)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
#define arch_enable_tagging() mte_enable_kernel()
|
||||
#define arch_enable_tagging_sync() mte_enable_kernel_sync()
|
||||
#define arch_enable_tagging_async() mte_enable_kernel_async()
|
||||
#define arch_set_tagging_report_once(state) mte_set_report_once(state)
|
||||
#define arch_force_async_tag_fault() mte_check_tfsr_exit()
|
||||
#define arch_init_tags(max_tag) mte_init_tags(max_tag)
|
||||
#define arch_get_random_tag() mte_get_random_tag()
|
||||
#define arch_get_mem_tag(addr) mte_get_mem_tag(addr)
|
||||
|
||||
@@ -87,7 +87,8 @@ static inline void mte_set_mem_tag_range(void *addr, size_t size,
|
||||
}
|
||||
}
|
||||
|
||||
void mte_enable_kernel(void);
|
||||
void mte_enable_kernel_sync(void);
|
||||
void mte_enable_kernel_async(void);
|
||||
void mte_init_tags(u64 max_tag);
|
||||
|
||||
void mte_set_report_once(bool state);
|
||||
@@ -115,7 +116,11 @@ static inline void mte_set_mem_tag_range(void *addr, size_t size,
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mte_enable_kernel(void)
|
||||
static inline void mte_enable_kernel_sync(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mte_enable_kernel_async(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ 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_switch(struct task_struct *next);
|
||||
void mte_suspend_enter(void);
|
||||
void mte_suspend_exit(void);
|
||||
long set_mte_ctrl(struct task_struct *task, unsigned long arg);
|
||||
long get_mte_ctrl(struct task_struct *task);
|
||||
@@ -66,6 +67,9 @@ static inline void flush_mte_state(void)
|
||||
static inline void mte_thread_switch(struct task_struct *next)
|
||||
{
|
||||
}
|
||||
static inline void mte_suspend_enter(void)
|
||||
{
|
||||
}
|
||||
static inline void mte_suspend_exit(void)
|
||||
{
|
||||
}
|
||||
@@ -90,5 +94,49 @@ static inline void mte_assign_mem_tag_range(void *addr, size_t size)
|
||||
|
||||
#endif /* CONFIG_ARM64_MTE */
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
/* Whether the MTE asynchronous mode is enabled. */
|
||||
DECLARE_STATIC_KEY_FALSE(mte_async_mode);
|
||||
|
||||
static inline bool system_uses_mte_async_mode(void)
|
||||
{
|
||||
return static_branch_unlikely(&mte_async_mode);
|
||||
}
|
||||
|
||||
void mte_check_tfsr_el1(void);
|
||||
|
||||
static inline void mte_check_tfsr_entry(void)
|
||||
{
|
||||
mte_check_tfsr_el1();
|
||||
}
|
||||
|
||||
static inline void mte_check_tfsr_exit(void)
|
||||
{
|
||||
/*
|
||||
* The asynchronous faults are sync'ed automatically with
|
||||
* TFSR_EL1 on kernel entry but for exit an explicit dsb()
|
||||
* is required.
|
||||
*/
|
||||
dsb(nsh);
|
||||
isb();
|
||||
|
||||
mte_check_tfsr_el1();
|
||||
}
|
||||
#else
|
||||
static inline bool system_uses_mte_async_mode(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline void mte_check_tfsr_el1(void)
|
||||
{
|
||||
}
|
||||
static inline void mte_check_tfsr_entry(void)
|
||||
{
|
||||
}
|
||||
static inline void mte_check_tfsr_exit(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_KASAN_HW_TAGS */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASM_MTE_H */
|
||||
|
||||
@@ -20,10 +20,13 @@
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/mte.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/extable.h>
|
||||
|
||||
#define HAVE_GET_KERNEL_NOFAULT
|
||||
|
||||
#define get_fs() (current_thread_info()->addr_limit)
|
||||
|
||||
static inline void set_fs(mm_segment_t fs)
|
||||
@@ -217,18 +220,45 @@ do { \
|
||||
* The Tag check override (TCO) bit disables temporarily the tag checking
|
||||
* preventing the issue.
|
||||
*/
|
||||
static inline void uaccess_disable(void)
|
||||
static inline void __uaccess_disable_tco(void)
|
||||
{
|
||||
asm volatile(ALTERNATIVE("nop", SET_PSTATE_TCO(0),
|
||||
ARM64_MTE, CONFIG_KASAN_HW_TAGS));
|
||||
}
|
||||
|
||||
static inline void __uaccess_enable_tco(void)
|
||||
{
|
||||
asm volatile(ALTERNATIVE("nop", SET_PSTATE_TCO(1),
|
||||
ARM64_MTE, CONFIG_KASAN_HW_TAGS));
|
||||
}
|
||||
|
||||
/*
|
||||
* These functions disable tag checking only if in MTE async mode
|
||||
* since the sync mode generates exceptions synchronously and the
|
||||
* nofault or load_unaligned_zeropad can handle them.
|
||||
*/
|
||||
static inline void __uaccess_disable_tco_async(void)
|
||||
{
|
||||
if (system_uses_mte_async_mode())
|
||||
__uaccess_disable_tco();
|
||||
}
|
||||
|
||||
static inline void __uaccess_enable_tco_async(void)
|
||||
{
|
||||
if (system_uses_mte_async_mode())
|
||||
__uaccess_enable_tco();
|
||||
}
|
||||
|
||||
static inline void uaccess_disable_privileged(void)
|
||||
{
|
||||
__uaccess_disable_tco();
|
||||
|
||||
__uaccess_disable(ARM64_HAS_PAN);
|
||||
}
|
||||
|
||||
static inline void uaccess_enable(void)
|
||||
static inline void uaccess_enable_privileged(void)
|
||||
{
|
||||
asm volatile(ALTERNATIVE("nop", SET_PSTATE_TCO(1),
|
||||
ARM64_MTE, CONFIG_KASAN_HW_TAGS));
|
||||
__uaccess_enable_tco();
|
||||
|
||||
__uaccess_enable(ARM64_HAS_PAN);
|
||||
}
|
||||
@@ -276,10 +306,9 @@ static inline void __user *__uaccess_mask_ptr(const void __user *ptr)
|
||||
* The "__xxx_error" versions set the third argument to -EFAULT if an error
|
||||
* occurs, and leave it unchanged on success.
|
||||
*/
|
||||
#define __get_user_asm(instr, alt_instr, reg, x, addr, err, feature) \
|
||||
#define __get_mem_asm(load, reg, x, addr, err) \
|
||||
asm volatile( \
|
||||
"1:"ALTERNATIVE(instr " " reg "1, [%2]\n", \
|
||||
alt_instr " " reg "1, [%2]\n", feature) \
|
||||
"1: " load " " reg "1, [%2]\n" \
|
||||
"2:\n" \
|
||||
" .section .fixup, \"ax\"\n" \
|
||||
" .align 2\n" \
|
||||
@@ -291,35 +320,36 @@ static inline void __user *__uaccess_mask_ptr(const void __user *ptr)
|
||||
: "+r" (err), "=&r" (x) \
|
||||
: "r" (addr), "i" (-EFAULT))
|
||||
|
||||
#define __raw_get_user(x, ptr, err) \
|
||||
#define __raw_get_mem(ldr, x, ptr, err) \
|
||||
do { \
|
||||
unsigned long __gu_val; \
|
||||
__chk_user_ptr(ptr); \
|
||||
uaccess_enable_not_uao(); \
|
||||
switch (sizeof(*(ptr))) { \
|
||||
case 1: \
|
||||
__get_user_asm("ldrb", "ldtrb", "%w", __gu_val, (ptr), \
|
||||
(err), ARM64_HAS_UAO); \
|
||||
__get_mem_asm(ldr "b", "%w", __gu_val, (ptr), (err)); \
|
||||
break; \
|
||||
case 2: \
|
||||
__get_user_asm("ldrh", "ldtrh", "%w", __gu_val, (ptr), \
|
||||
(err), ARM64_HAS_UAO); \
|
||||
__get_mem_asm(ldr "h", "%w", __gu_val, (ptr), (err)); \
|
||||
break; \
|
||||
case 4: \
|
||||
__get_user_asm("ldr", "ldtr", "%w", __gu_val, (ptr), \
|
||||
(err), ARM64_HAS_UAO); \
|
||||
__get_mem_asm(ldr, "%w", __gu_val, (ptr), (err)); \
|
||||
break; \
|
||||
case 8: \
|
||||
__get_user_asm("ldr", "ldtr", "%x", __gu_val, (ptr), \
|
||||
(err), ARM64_HAS_UAO); \
|
||||
__get_mem_asm(ldr, "%x", __gu_val, (ptr), (err)); \
|
||||
break; \
|
||||
default: \
|
||||
BUILD_BUG(); \
|
||||
} \
|
||||
uaccess_disable_not_uao(); \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
} while (0)
|
||||
|
||||
#define __raw_get_user(x, ptr, err) \
|
||||
do { \
|
||||
__chk_user_ptr(ptr); \
|
||||
uaccess_enable_not_uao(); \
|
||||
__raw_get_mem("ldtr", x, ptr, err); \
|
||||
uaccess_disable_not_uao(); \
|
||||
} while (0)
|
||||
|
||||
#define __get_user_error(x, ptr, err) \
|
||||
do { \
|
||||
__typeof__(*(ptr)) __user *__p = (ptr); \
|
||||
@@ -341,10 +371,21 @@ do { \
|
||||
|
||||
#define get_user __get_user
|
||||
|
||||
#define __put_user_asm(instr, alt_instr, reg, x, addr, err, feature) \
|
||||
#define __get_kernel_nofault(dst, src, type, err_label) \
|
||||
do { \
|
||||
int __gkn_err = 0; \
|
||||
\
|
||||
__uaccess_enable_tco_async(); \
|
||||
__raw_get_mem("ldr", *((type *)(dst)), \
|
||||
(__force type *)(src), __gkn_err); \
|
||||
__uaccess_disable_tco_async(); \
|
||||
if (unlikely(__gkn_err)) \
|
||||
goto err_label; \
|
||||
} while (0)
|
||||
|
||||
#define __put_mem_asm(store, reg, x, addr, err) \
|
||||
asm volatile( \
|
||||
"1:"ALTERNATIVE(instr " " reg "1, [%2]\n", \
|
||||
alt_instr " " reg "1, [%2]\n", feature) \
|
||||
"1: " store " " reg "1, [%2]\n" \
|
||||
"2:\n" \
|
||||
" .section .fixup,\"ax\"\n" \
|
||||
" .align 2\n" \
|
||||
@@ -355,31 +396,32 @@ do { \
|
||||
: "+r" (err) \
|
||||
: "r" (x), "r" (addr), "i" (-EFAULT))
|
||||
|
||||
#define __raw_put_user(x, ptr, err) \
|
||||
#define __raw_put_mem(str, x, ptr, err) \
|
||||
do { \
|
||||
__typeof__(*(ptr)) __pu_val = (x); \
|
||||
__chk_user_ptr(ptr); \
|
||||
uaccess_enable_not_uao(); \
|
||||
switch (sizeof(*(ptr))) { \
|
||||
case 1: \
|
||||
__put_user_asm("strb", "sttrb", "%w", __pu_val, (ptr), \
|
||||
(err), ARM64_HAS_UAO); \
|
||||
__put_mem_asm(str "b", "%w", __pu_val, (ptr), (err)); \
|
||||
break; \
|
||||
case 2: \
|
||||
__put_user_asm("strh", "sttrh", "%w", __pu_val, (ptr), \
|
||||
(err), ARM64_HAS_UAO); \
|
||||
__put_mem_asm(str "h", "%w", __pu_val, (ptr), (err)); \
|
||||
break; \
|
||||
case 4: \
|
||||
__put_user_asm("str", "sttr", "%w", __pu_val, (ptr), \
|
||||
(err), ARM64_HAS_UAO); \
|
||||
__put_mem_asm(str, "%w", __pu_val, (ptr), (err)); \
|
||||
break; \
|
||||
case 8: \
|
||||
__put_user_asm("str", "sttr", "%x", __pu_val, (ptr), \
|
||||
(err), ARM64_HAS_UAO); \
|
||||
__put_mem_asm(str, "%x", __pu_val, (ptr), (err)); \
|
||||
break; \
|
||||
default: \
|
||||
BUILD_BUG(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define __raw_put_user(x, ptr, err) \
|
||||
do { \
|
||||
__chk_user_ptr(ptr); \
|
||||
uaccess_enable_not_uao(); \
|
||||
__raw_put_mem("sttr", x, ptr, err); \
|
||||
uaccess_disable_not_uao(); \
|
||||
} while (0)
|
||||
|
||||
@@ -404,6 +446,18 @@ do { \
|
||||
|
||||
#define put_user __put_user
|
||||
|
||||
#define __put_kernel_nofault(dst, src, type, err_label) \
|
||||
do { \
|
||||
int __pkn_err = 0; \
|
||||
\
|
||||
__uaccess_enable_tco_async(); \
|
||||
__raw_put_mem("str", *((type *)(src)), \
|
||||
(__force type *)(dst), __pkn_err); \
|
||||
__uaccess_disable_tco_async(); \
|
||||
if (unlikely(__pkn_err)) \
|
||||
goto err_label; \
|
||||
} while(0)
|
||||
|
||||
extern unsigned long __must_check __arch_copy_from_user(void *to, const void __user *from, unsigned long n);
|
||||
#define raw_copy_from_user(to, from, n) \
|
||||
({ \
|
||||
|
||||
@@ -53,7 +53,9 @@ static inline unsigned long find_zero(unsigned long mask)
|
||||
*/
|
||||
static inline unsigned long load_unaligned_zeropad(const void *addr)
|
||||
{
|
||||
unsigned long ret, offset;
|
||||
unsigned long ret, tmp;
|
||||
|
||||
__uaccess_enable_tco_async();
|
||||
|
||||
/* Load word from unaligned pointer addr */
|
||||
asm(
|
||||
@@ -61,9 +63,9 @@ static inline unsigned long load_unaligned_zeropad(const void *addr)
|
||||
"2:\n"
|
||||
" .pushsection .fixup,\"ax\"\n"
|
||||
" .align 2\n"
|
||||
"3: and %1, %2, #0x7\n"
|
||||
" bic %2, %2, #0x7\n"
|
||||
" ldr %0, [%2]\n"
|
||||
"3: bic %1, %2, #0x7\n"
|
||||
" ldr %0, [%1]\n"
|
||||
" and %1, %2, #0x7\n"
|
||||
" lsl %1, %1, #0x3\n"
|
||||
#ifndef __AARCH64EB__
|
||||
" lsr %0, %0, %1\n"
|
||||
@@ -73,9 +75,11 @@ static inline unsigned long load_unaligned_zeropad(const void *addr)
|
||||
" b 2b\n"
|
||||
" .popsection\n"
|
||||
_ASM_EXTABLE(1b, 3b)
|
||||
: "=&r" (ret), "=&r" (offset)
|
||||
: "=&r" (ret), "=&r" (tmp)
|
||||
: "r" (addr), "Q" (*(unsigned long *)addr));
|
||||
|
||||
__uaccess_disable_tco_async();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -277,7 +277,7 @@ static void __init register_insn_emulation_sysctl(void)
|
||||
|
||||
#define __user_swpX_asm(data, addr, res, temp, temp2, B) \
|
||||
do { \
|
||||
uaccess_enable(); \
|
||||
uaccess_enable_privileged(); \
|
||||
__asm__ __volatile__( \
|
||||
" mov %w3, %w7\n" \
|
||||
"0: ldxr"B" %w2, [%4]\n" \
|
||||
@@ -302,7 +302,7 @@ do { \
|
||||
"i" (-EFAULT), \
|
||||
"i" (__SWP_LL_SC_LOOPS) \
|
||||
: "memory"); \
|
||||
uaccess_disable(); \
|
||||
uaccess_disable_privileged(); \
|
||||
} while (0)
|
||||
|
||||
#define __user_swp_asm(data, addr, res, temp, temp2) \
|
||||
|
||||
@@ -1199,18 +1199,6 @@ u64 read_sanitised_ftr_reg(u32 id)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(read_sanitised_ftr_reg);
|
||||
|
||||
int copy_ftr_reg(u32 id, struct arm64_ftr_reg *dst)
|
||||
{
|
||||
struct arm64_ftr_reg *regp = get_arm64_ftr_reg(id);
|
||||
|
||||
if (!regp)
|
||||
return -EINVAL;
|
||||
|
||||
*dst = *regp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define read_sysreg_case(r) \
|
||||
case r: val = read_sysreg_s(r); break;
|
||||
|
||||
@@ -1354,6 +1342,7 @@ const struct cpumask *system_32bit_el0_cpumask(void)
|
||||
|
||||
return cpu_possible_mask;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(system_32bit_el0_cpumask);
|
||||
|
||||
static int __init parse_32bit_el0_param(char *str)
|
||||
{
|
||||
@@ -2942,7 +2931,6 @@ void __init setup_cpu_features(void)
|
||||
|
||||
setup_system_capabilities();
|
||||
setup_elf_hwcaps(arm64_elf_hwcaps);
|
||||
setup_kvm_el2_caps();
|
||||
|
||||
if (system_supports_32bit_el0())
|
||||
setup_elf_hwcaps(compat_elf_hwcaps);
|
||||
|
||||
@@ -64,5 +64,7 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
|
||||
ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos)
|
||||
{
|
||||
memcpy(buf, phys_to_virt((phys_addr_t)*ppos), count);
|
||||
*ppos += count;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@ static void noinstr enter_from_kernel_mode(struct pt_regs *regs)
|
||||
lockdep_hardirqs_off(CALLER_ADDR0);
|
||||
rcu_irq_enter_check_tick();
|
||||
trace_hardirqs_off_finish();
|
||||
|
||||
mte_check_tfsr_entry();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -47,6 +49,8 @@ static void noinstr exit_to_kernel_mode(struct pt_regs *regs)
|
||||
{
|
||||
lockdep_assert_irqs_disabled();
|
||||
|
||||
mte_check_tfsr_exit();
|
||||
|
||||
if (interrupts_enabled(regs)) {
|
||||
if (regs->exit_rcu) {
|
||||
trace_hardirqs_on_prepare();
|
||||
@@ -243,6 +247,8 @@ asmlinkage void noinstr enter_from_user_mode(void)
|
||||
|
||||
asmlinkage void noinstr exit_to_user_mode(void)
|
||||
{
|
||||
mte_check_tfsr_exit();
|
||||
|
||||
trace_hardirqs_on_prepare();
|
||||
lockdep_hardirqs_on_prepare(CALLER_ADDR0);
|
||||
user_enter_irqoff();
|
||||
|
||||
@@ -148,16 +148,18 @@ alternative_cb_end
|
||||
.endm
|
||||
|
||||
/* Check for MTE asynchronous tag check faults */
|
||||
.macro check_mte_async_tcf, flgs, tmp
|
||||
.macro check_mte_async_tcf, tmp, ti_flags
|
||||
#ifdef CONFIG_ARM64_MTE
|
||||
.arch_extension lse
|
||||
alternative_if_not ARM64_MTE
|
||||
b 1f
|
||||
alternative_else_nop_endif
|
||||
mrs_s \tmp, SYS_TFSRE0_EL1
|
||||
tbz \tmp, #SYS_TFSR_EL1_TF0_SHIFT, 1f
|
||||
/* Asynchronous TCF occurred for TTBR0 access, set the TI flag */
|
||||
orr \flgs, \flgs, #_TIF_MTE_ASYNC_FAULT
|
||||
str \flgs, [tsk, #TSK_TI_FLAGS]
|
||||
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
|
||||
@@ -244,7 +246,7 @@ alternative_else_nop_endif
|
||||
disable_step_tsk x19, x20
|
||||
|
||||
/* Check for asynchronous tag check faults in user space */
|
||||
check_mte_async_tcf x19, x22
|
||||
check_mte_async_tcf x22, x23
|
||||
apply_ssbd 1, x22, x23
|
||||
|
||||
ptrauth_keys_install_kernel tsk, x20, x22, x23
|
||||
|
||||
@@ -65,6 +65,7 @@ __efistub__ctype = _ctype;
|
||||
KVM_NVHE_ALIAS(kvm_patch_vector_branch);
|
||||
KVM_NVHE_ALIAS(kvm_update_va_mask);
|
||||
KVM_NVHE_ALIAS(kvm_get_kimage_voffset);
|
||||
KVM_NVHE_ALIAS(kvm_compute_final_ctr_el0);
|
||||
|
||||
/* Global kernel state accessed by nVHE hyp code. */
|
||||
KVM_NVHE_ALIAS(kvm_vgic_global_state);
|
||||
|
||||
@@ -26,6 +26,12 @@ u64 gcr_kernel_excl __ro_after_init;
|
||||
|
||||
static bool report_fault_once = true;
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
/* Whether the MTE asynchronous mode is enabled. */
|
||||
DEFINE_STATIC_KEY_FALSE(mte_async_mode);
|
||||
EXPORT_SYMBOL_GPL(mte_async_mode);
|
||||
#endif
|
||||
|
||||
static void mte_sync_page_tags(struct page *page, pte_t *ptep, bool check_swap)
|
||||
{
|
||||
pte_t old_pte = READ_ONCE(*ptep);
|
||||
@@ -107,13 +113,45 @@ void mte_init_tags(u64 max_tag)
|
||||
write_sysreg_s(SYS_GCR_EL1_RRND | gcr_kernel_excl, SYS_GCR_EL1);
|
||||
}
|
||||
|
||||
void mte_enable_kernel(void)
|
||||
static inline void __mte_enable_kernel(const char *mode, unsigned long tcf)
|
||||
{
|
||||
/* Enable MTE Sync Mode for EL1. */
|
||||
sysreg_clear_set(sctlr_el1, SCTLR_ELx_TCF_MASK, SCTLR_ELx_TCF_SYNC);
|
||||
sysreg_clear_set(sctlr_el1, SCTLR_ELx_TCF_MASK, tcf);
|
||||
isb();
|
||||
|
||||
pr_info_once("MTE: enabled in %s mode at EL1\n", mode);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
void mte_enable_kernel_sync(void)
|
||||
{
|
||||
/*
|
||||
* Make sure we enter this function when no PE has set
|
||||
* async mode previously.
|
||||
*/
|
||||
WARN_ONCE(system_uses_mte_async_mode(),
|
||||
"MTE async mode enabled system wide!");
|
||||
|
||||
__mte_enable_kernel("synchronous", SCTLR_ELx_TCF_SYNC);
|
||||
}
|
||||
|
||||
void mte_enable_kernel_async(void)
|
||||
{
|
||||
__mte_enable_kernel("asynchronous", SCTLR_ELx_TCF_ASYNC);
|
||||
|
||||
/*
|
||||
* MTE async mode is set system wide by the first PE that
|
||||
* executes this function.
|
||||
*
|
||||
* Note: If in future KASAN acquires a runtime switching
|
||||
* mode in between sync and async, this strategy needs
|
||||
* to be reviewed.
|
||||
*/
|
||||
if (!system_uses_mte_async_mode())
|
||||
static_branch_enable(&mte_async_mode);
|
||||
}
|
||||
#endif
|
||||
|
||||
void mte_set_report_once(bool state)
|
||||
{
|
||||
WRITE_ONCE(report_fault_once, state);
|
||||
@@ -124,6 +162,29 @@ bool mte_report_once(void)
|
||||
return READ_ONCE(report_fault_once);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
void mte_check_tfsr_el1(void)
|
||||
{
|
||||
u64 tfsr_el1;
|
||||
|
||||
if (!system_supports_mte())
|
||||
return;
|
||||
|
||||
tfsr_el1 = read_sysreg_s(SYS_TFSR_EL1);
|
||||
|
||||
if (unlikely(tfsr_el1 & SYS_TFSR_EL1_TF1)) {
|
||||
/*
|
||||
* Note: isb() is not required after this direct write
|
||||
* because there is no indirect read subsequent to it
|
||||
* (per ARM DDI 0487F.c table D13-1).
|
||||
*/
|
||||
write_sysreg_s(0, SYS_TFSR_EL1);
|
||||
|
||||
kasan_report_async();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void update_sctlr_el1_tcf0(u64 tcf0)
|
||||
{
|
||||
/* ISB required for the kernel uaccess routines */
|
||||
@@ -189,6 +250,35 @@ void mte_thread_switch(struct task_struct *next)
|
||||
/* avoid expensive SCTLR_EL1 accesses if no change */
|
||||
if (current->thread.sctlr_tcf0 != next->thread.sctlr_tcf0)
|
||||
update_sctlr_el1_tcf0(next->thread.sctlr_tcf0);
|
||||
else
|
||||
isb();
|
||||
|
||||
/*
|
||||
* Check if an async tag exception occurred at EL1.
|
||||
*
|
||||
* Note: On the context switch path we rely on the dsb() present
|
||||
* in __switch_to() to guarantee that the indirect writes to TFSR_EL1
|
||||
* are synchronized before this point.
|
||||
* isb() above is required for the same reason.
|
||||
*
|
||||
*/
|
||||
mte_check_tfsr_el1();
|
||||
}
|
||||
|
||||
void mte_suspend_enter(void)
|
||||
{
|
||||
if (!system_supports_mte())
|
||||
return;
|
||||
|
||||
/*
|
||||
* The barriers are required to guarantee that the indirect writes
|
||||
* to TFSR_EL1 are synchronized before we report the state.
|
||||
*/
|
||||
dsb(nsh);
|
||||
isb();
|
||||
|
||||
/* Report SYS_TFSR_EL1 before suspend entry */
|
||||
mte_check_tfsr_el1();
|
||||
}
|
||||
|
||||
void mte_suspend_exit(void)
|
||||
|
||||
@@ -200,8 +200,9 @@ void show_stack(struct task_struct *tsk, unsigned long *sp, const char *loglvl)
|
||||
|
||||
#ifdef CONFIG_STACKTRACE
|
||||
|
||||
void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
|
||||
struct task_struct *task, struct pt_regs *regs)
|
||||
noinline void arch_stack_walk(stack_trace_consume_fn consume_entry,
|
||||
void *cookie, struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
struct stackframe frame;
|
||||
|
||||
@@ -209,8 +210,8 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
|
||||
start_backtrace(&frame, regs->regs[29], regs->pc);
|
||||
else if (task == current)
|
||||
start_backtrace(&frame,
|
||||
(unsigned long)__builtin_frame_address(0),
|
||||
(unsigned long)arch_stack_walk);
|
||||
(unsigned long)__builtin_frame_address(1),
|
||||
(unsigned long)__builtin_return_address(0));
|
||||
else
|
||||
start_backtrace(&frame, thread_saved_fp(task),
|
||||
thread_saved_pc(task));
|
||||
|
||||
@@ -92,6 +92,9 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
|
||||
unsigned long flags;
|
||||
struct sleep_stack_data state;
|
||||
|
||||
/* Report any MTE async fault before going to suspend */
|
||||
mte_suspend_enter();
|
||||
|
||||
/*
|
||||
* From this point debug exceptions are disabled to prevent
|
||||
* updates to mdscr register (saved and restored along with
|
||||
|
||||
@@ -1739,6 +1739,9 @@ static int kvm_hyp_init_protection(u32 hyp_va_bits)
|
||||
void *addr = phys_to_virt(hyp_mem_base);
|
||||
int ret;
|
||||
|
||||
kvm_nvhe_sym(id_aa64mmfr0_el1_sys_val) = read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1);
|
||||
kvm_nvhe_sym(id_aa64mmfr1_el1_sys_val) = read_sanitised_ftr_reg(SYS_ID_AA64MMFR1_EL1);
|
||||
|
||||
ret = create_hyp_mappings(addr, addr + hyp_mem_size, PAGE_HYP);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -162,7 +162,9 @@ static inline bool __translate_far_to_hpfar(u64 far, u64 *hpfar)
|
||||
|
||||
static inline bool __get_fault_info(u64 esr, struct kvm_vcpu_fault_info *fault)
|
||||
{
|
||||
fault->far_el2 = read_sysreg_el2(SYS_FAR);
|
||||
u64 hpfar, far;
|
||||
|
||||
far = read_sysreg_el2(SYS_FAR);
|
||||
|
||||
/*
|
||||
* The HPFAR can be invalid if the stage 2 fault did not
|
||||
@@ -178,12 +180,14 @@ static inline bool __get_fault_info(u64 esr, struct kvm_vcpu_fault_info *fault)
|
||||
if (!(esr & ESR_ELx_S1PTW) &&
|
||||
(cpus_have_final_cap(ARM64_WORKAROUND_834220) ||
|
||||
(esr & ESR_ELx_FSC_TYPE) == FSC_PERM)) {
|
||||
if (!__translate_far_to_hpfar(fault->far_el2, &fault->hpfar_el2))
|
||||
if (!__translate_far_to_hpfar(far, &hpfar))
|
||||
return false;
|
||||
} else {
|
||||
fault->hpfar_el2 = read_sysreg(hpfar_el2);
|
||||
hpfar = read_sysreg(hpfar_el2);
|
||||
}
|
||||
|
||||
fault->far_el2 = far;
|
||||
fault->hpfar_el2 = hpfar;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -247,7 +247,6 @@ void handle_trap(struct kvm_cpu_context *host_ctxt)
|
||||
sve_cond_update_zcr_vq(ZCR_ELx_LEN_MASK, SYS_ZCR_EL2);
|
||||
break;
|
||||
case ESR_ELx_EC_IABT_LOW:
|
||||
fallthrough;
|
||||
case ESR_ELx_EC_DABT_LOW:
|
||||
handle_host_mem_abort(host_ctxt);
|
||||
break;
|
||||
|
||||
@@ -38,10 +38,3 @@ unsigned long __hyp_per_cpu_offset(unsigned int cpu)
|
||||
elf_base = (unsigned long)&__per_cpu_start;
|
||||
return this_cpu_base - elf_base;
|
||||
}
|
||||
|
||||
/*
|
||||
* Define the CPU feature registers variables that will hold the copies of
|
||||
* the host's sanitized values.
|
||||
*/
|
||||
#define KVM_HYP_CPU_FTR_REG(name) struct arm64_ftr_reg name
|
||||
#include <asm/kvm_cpufeature.h>
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/kvm_host.h>
|
||||
#include <asm/kvm_cpufeature.h>
|
||||
#include <asm/kvm_emulate.h>
|
||||
#include <asm/kvm_hyp.h>
|
||||
#include <asm/kvm_mmu.h>
|
||||
@@ -19,12 +18,20 @@
|
||||
#include <nvhe/mem_protect.h>
|
||||
#include <nvhe/mm.h>
|
||||
|
||||
#define KVM_HOST_S2_FLAGS (KVM_PGTABLE_S2_NOFWB | KVM_PGTABLE_S2_IDMAP)
|
||||
|
||||
extern unsigned long hyp_nr_cpus;
|
||||
struct host_kvm host_kvm;
|
||||
|
||||
struct hyp_pool host_s2_mem;
|
||||
struct hyp_pool host_s2_dev;
|
||||
|
||||
/*
|
||||
* Copies of the host's CPU features registers holding sanitized values.
|
||||
*/
|
||||
u64 id_aa64mmfr0_el1_sys_val;
|
||||
u64 id_aa64mmfr1_el1_sys_val;
|
||||
|
||||
static const u8 pkvm_hyp_id = 1;
|
||||
|
||||
static void *host_s2_zalloc_pages_exact(size_t size)
|
||||
@@ -70,16 +77,13 @@ static int prepare_s2_pools(void *mem_pgt_pool, void *dev_pgt_pool)
|
||||
static void prepare_host_vtcr(void)
|
||||
{
|
||||
u32 parange, phys_shift;
|
||||
u64 mmfr0, mmfr1;
|
||||
|
||||
mmfr0 = arm64_ftr_reg_id_aa64mmfr0_el1.sys_val;
|
||||
mmfr1 = arm64_ftr_reg_id_aa64mmfr1_el1.sys_val;
|
||||
|
||||
/* The host stage 2 is id-mapped, so use parange for T0SZ */
|
||||
parange = kvm_get_parange(mmfr0);
|
||||
parange = kvm_get_parange(id_aa64mmfr0_el1_sys_val);
|
||||
phys_shift = id_aa64mmfr0_parange_to_phys_shift(parange);
|
||||
|
||||
host_kvm.arch.vtcr = kvm_get_vtcr(mmfr0, mmfr1, phys_shift);
|
||||
host_kvm.arch.vtcr = kvm_get_vtcr(id_aa64mmfr0_el1_sys_val,
|
||||
id_aa64mmfr1_el1_sys_val, phys_shift);
|
||||
}
|
||||
|
||||
int kvm_host_prepare_stage2(void *mem_pgt_pool, void *dev_pgt_pool)
|
||||
@@ -95,7 +99,7 @@ int kvm_host_prepare_stage2(void *mem_pgt_pool, void *dev_pgt_pool)
|
||||
return ret;
|
||||
|
||||
ret = kvm_pgtable_stage2_init_flags(&host_kvm.pgt, &host_kvm.arch,
|
||||
&host_kvm.mm_ops, KVM_PGTABLE_S2_NOFWB);
|
||||
&host_kvm.mm_ops, KVM_HOST_S2_FLAGS);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -516,17 +516,15 @@ static bool stage2_has_fwb(struct kvm_pgtable *pgt)
|
||||
return !(pgt->flags & KVM_PGTABLE_S2_NOFWB);
|
||||
}
|
||||
|
||||
static int stage2_set_prot_attr(enum kvm_pgtable_prot prot, kvm_pte_t *ptep,
|
||||
struct kvm_pgtable *pgt)
|
||||
#define KVM_S2_MEMATTR(pgt, attr) PAGE_S2_MEMATTR(attr, stage2_has_fwb(pgt))
|
||||
|
||||
static int stage2_set_prot_attr(struct kvm_pgtable *pgt, enum kvm_pgtable_prot prot,
|
||||
kvm_pte_t *ptep)
|
||||
{
|
||||
bool device = prot & KVM_PGTABLE_PROT_DEVICE;
|
||||
kvm_pte_t attr = device ? KVM_S2_MEMATTR(pgt, DEVICE_nGnRE) :
|
||||
KVM_S2_MEMATTR(pgt, NORMAL);
|
||||
u32 sh = KVM_PTE_LEAF_ATTR_LO_S2_SH_IS;
|
||||
kvm_pte_t attr;
|
||||
|
||||
if (device)
|
||||
attr = PAGE_S2_MEMATTR(DEVICE_nGnRE, stage2_has_fwb(pgt));
|
||||
else
|
||||
attr = PAGE_S2_MEMATTR(NORMAL, stage2_has_fwb(pgt));
|
||||
|
||||
if (!(prot & KVM_PGTABLE_PROT_X))
|
||||
attr |= KVM_PTE_LEAF_ATTR_HI_S2_XN;
|
||||
@@ -762,7 +760,10 @@ int kvm_pgtable_stage2_map(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
||||
.arg = &map_data,
|
||||
};
|
||||
|
||||
ret = stage2_set_prot_attr(prot, &map_data.attr, pgt);
|
||||
if (WARN_ON((pgt->flags & KVM_PGTABLE_S2_IDMAP) && (addr != phys)))
|
||||
return -EINVAL;
|
||||
|
||||
ret = stage2_set_prot_attr(pgt, prot, &map_data.attr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -794,19 +795,13 @@ int kvm_pgtable_stage2_set_owner(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
||||
return -EINVAL;
|
||||
|
||||
ret = kvm_pgtable_walk(pgt, addr, size, &walker);
|
||||
dsb(ishst);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void stage2_flush_dcache(void *addr, u64 size)
|
||||
{
|
||||
__flush_dcache_area(addr, size);
|
||||
}
|
||||
|
||||
static bool stage2_pte_cacheable(kvm_pte_t pte, struct kvm_pgtable *pgt)
|
||||
static bool stage2_pte_cacheable(struct kvm_pgtable *pgt, kvm_pte_t pte)
|
||||
{
|
||||
u64 memattr = pte & KVM_PTE_LEAF_ATTR_LO_S2_MEMATTR;
|
||||
return memattr == PAGE_S2_MEMATTR(NORMAL, stage2_has_fwb(pgt));
|
||||
return memattr == KVM_S2_MEMATTR(pgt, NORMAL);
|
||||
}
|
||||
|
||||
static int stage2_unmap_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,
|
||||
@@ -832,7 +827,7 @@ static int stage2_unmap_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,
|
||||
|
||||
if (mm_ops->page_count(childp) != 1)
|
||||
return 0;
|
||||
} else if (stage2_pte_cacheable(pte, pgt)) {
|
||||
} else if (stage2_pte_cacheable(pgt, pte)) {
|
||||
need_flush = !stage2_has_fwb(pgt);
|
||||
}
|
||||
|
||||
@@ -844,7 +839,7 @@ static int stage2_unmap_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,
|
||||
stage2_put_pte(ptep, mmu, addr, level, mm_ops);
|
||||
|
||||
if (need_flush) {
|
||||
stage2_flush_dcache(kvm_pte_follow(pte, mm_ops),
|
||||
__flush_dcache_area(kvm_pte_follow(pte, mm_ops),
|
||||
kvm_granule_size(level));
|
||||
}
|
||||
|
||||
@@ -994,10 +989,10 @@ static int stage2_flush_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,
|
||||
struct kvm_pgtable_mm_ops *mm_ops = pgt->mm_ops;
|
||||
kvm_pte_t pte = *ptep;
|
||||
|
||||
if (!kvm_pte_valid(pte) || !stage2_pte_cacheable(pte, pgt))
|
||||
if (!kvm_pte_valid(pte) || !stage2_pte_cacheable(pgt, pte))
|
||||
return 0;
|
||||
|
||||
stage2_flush_dcache(kvm_pte_follow(pte, mm_ops), kvm_granule_size(level));
|
||||
__flush_dcache_area(kvm_pte_follow(pte, mm_ops), kvm_granule_size(level));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1030,11 +1025,11 @@ int kvm_pgtable_stage2_init_flags(struct kvm_pgtable *pgt, struct kvm_arch *arch
|
||||
if (!pgt->pgd)
|
||||
return -ENOMEM;
|
||||
|
||||
pgt->flags = flags;
|
||||
pgt->ia_bits = ia_bits;
|
||||
pgt->start_level = start_level;
|
||||
pgt->mm_ops = mm_ops;
|
||||
pgt->mmu = &arch->mmu;
|
||||
pgt->flags = flags;
|
||||
|
||||
/* Ensure zeroed PGD pages are visible to the hardware walker */
|
||||
dsb(ishst);
|
||||
@@ -1115,7 +1110,7 @@ int kvm_pgtable_stage2_find_range(struct kvm_pgtable *pgt, u64 addr,
|
||||
u32 level;
|
||||
int ret;
|
||||
|
||||
ret = stage2_set_prot_attr(prot, &attr, pgt);
|
||||
ret = stage2_set_prot_attr(pgt, prot, &attr);
|
||||
if (ret)
|
||||
return ret;
|
||||
attr &= KVM_PTE_LEAF_S2_COMPAT_MASK;
|
||||
|
||||
@@ -429,6 +429,13 @@ u64 __vgic_v3_get_gic_config(void)
|
||||
if (has_vhe())
|
||||
flags = local_daif_save();
|
||||
|
||||
/*
|
||||
* Table 11-2 "Permitted ICC_SRE_ELx.SRE settings" indicates
|
||||
* that to be able to set ICC_SRE_EL1.SRE to 0, all the
|
||||
* interrupt overrides must be set. You've got to love this.
|
||||
*/
|
||||
sysreg_clear_set(hcr_el2, 0, HCR_AMO | HCR_FMO | HCR_IMO);
|
||||
isb();
|
||||
write_gicreg(0, ICC_SRE_EL1);
|
||||
isb();
|
||||
|
||||
@@ -436,6 +443,8 @@ u64 __vgic_v3_get_gic_config(void)
|
||||
|
||||
write_gicreg(sre, ICC_SRE_EL1);
|
||||
isb();
|
||||
sysreg_clear_set(hcr_el2, HCR_AMO | HCR_FMO | HCR_IMO, 0);
|
||||
isb();
|
||||
|
||||
if (has_vhe())
|
||||
local_daif_restore(flags);
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <asm/debug-monitors.h>
|
||||
#include <asm/esr.h>
|
||||
#include <asm/kvm_arm.h>
|
||||
#include <asm/kvm_cpufeature.h>
|
||||
#include <asm/kvm_emulate.h>
|
||||
#include <asm/kvm_hyp.h>
|
||||
#include <asm/kvm_mmu.h>
|
||||
@@ -2776,24 +2775,3 @@ void kvm_sys_reg_table_init(void)
|
||||
/* Clear all higher bits. */
|
||||
cache_levels &= (1 << (i*3))-1;
|
||||
}
|
||||
|
||||
#define CPU_FTR_REG_HYP_COPY(id, name) \
|
||||
{ .sys_id = id, .dst = (struct arm64_ftr_reg *)&kvm_nvhe_sym(name) }
|
||||
struct __ftr_reg_copy_entry {
|
||||
u32 sys_id;
|
||||
struct arm64_ftr_reg *dst;
|
||||
} hyp_ftr_regs[] __initdata = {
|
||||
CPU_FTR_REG_HYP_COPY(SYS_CTR_EL0, arm64_ftr_reg_ctrel0),
|
||||
CPU_FTR_REG_HYP_COPY(SYS_ID_AA64MMFR0_EL1, arm64_ftr_reg_id_aa64mmfr0_el1),
|
||||
CPU_FTR_REG_HYP_COPY(SYS_ID_AA64MMFR1_EL1, arm64_ftr_reg_id_aa64mmfr1_el1),
|
||||
};
|
||||
|
||||
void __init setup_kvm_el2_caps(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(hyp_ftr_regs); i++) {
|
||||
WARN(copy_ftr_reg(hyp_ftr_regs[i].sys_id, hyp_ftr_regs[i].dst),
|
||||
"%u feature register not found\n", hyp_ftr_regs[i].sys_id);
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user