Merge remote-tracking branch 'tip/sched/arm64' into for-next/core
* tip/sched/arm64: (785 commits) Documentation: arm64: describe asymmetric 32-bit support arm64: Remove logic to kill 32-bit tasks on 64-bit-only cores arm64: Hook up cmdline parameter to allow mismatched 32-bit EL0 arm64: Advertise CPUs capable of running 32-bit applications in sysfs arm64: Prevent offlining first CPU with 32-bit EL0 on mismatched system arm64: exec: Adjust affinity for compat tasks with mismatched 32-bit EL0 arm64: Implement task_cpu_possible_mask() sched: Introduce dl_task_check_affinity() to check proposed affinity sched: Allow task CPU affinity to be restricted on asymmetric systems sched: Split the guts of sched_setaffinity() into a helper function sched: Introduce task_struct::user_cpus_ptr to track requested affinity sched: Reject CPU affinity changes based on task_cpu_possible_mask() cpuset: Cleanup cpuset_cpus_allowed_fallback() use in select_fallback_rq() cpuset: Honour task_cpu_possible_mask() in guarantee_online_cpus() cpuset: Don't use the cpu_possible_mask as a last resort for cgroup v1 sched: Introduce task_cpu_possible_mask() to limit fallback rq selection sched: Cgroup SCHED_IDLE support sched/topology: Skip updating masks for non-online nodes Linux 5.14-rc6 lib: use PFN_PHYS() in devmem_is_allowed() ...
This commit is contained in:
@@ -494,6 +494,15 @@ Description: AArch64 CPU registers
|
|||||||
'identification' directory exposes the CPU ID registers for
|
'identification' directory exposes the CPU ID registers for
|
||||||
identifying model and revision of the CPU.
|
identifying model and revision of the CPU.
|
||||||
|
|
||||||
|
What: /sys/devices/system/cpu/aarch32_el0
|
||||||
|
Date: May 2021
|
||||||
|
Contact: Linux ARM Kernel Mailing list <linux-arm-kernel@lists.infradead.org>
|
||||||
|
Description: Identifies the subset of CPUs in the system that can execute
|
||||||
|
AArch32 (32-bit ARM) applications. If present, the same format as
|
||||||
|
/sys/devices/system/cpu/{offline,online,possible,present} is used.
|
||||||
|
If absent, then all or none of the CPUs can execute AArch32
|
||||||
|
applications and execve() will behave accordingly.
|
||||||
|
|
||||||
What: /sys/devices/system/cpu/cpu#/cpu_capacity
|
What: /sys/devices/system/cpu/cpu#/cpu_capacity
|
||||||
Date: December 2016
|
Date: December 2016
|
||||||
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
||||||
|
|||||||
@@ -287,6 +287,17 @@
|
|||||||
do not want to use tracing_snapshot_alloc() as it needs
|
do not want to use tracing_snapshot_alloc() as it needs
|
||||||
to be done where GFP_KERNEL allocations are allowed.
|
to be done where GFP_KERNEL allocations are allowed.
|
||||||
|
|
||||||
|
allow_mismatched_32bit_el0 [ARM64]
|
||||||
|
Allow execve() of 32-bit applications and setting of the
|
||||||
|
PER_LINUX32 personality on systems where only a strict
|
||||||
|
subset of the CPUs support 32-bit EL0. When this
|
||||||
|
parameter is present, the set of CPUs supporting 32-bit
|
||||||
|
EL0 is indicated by /sys/devices/system/cpu/aarch32_el0
|
||||||
|
and hot-unplug operations may be restricted.
|
||||||
|
|
||||||
|
See Documentation/arm64/asymmetric-32bit.rst for more
|
||||||
|
information.
|
||||||
|
|
||||||
amd_iommu= [HW,X86-64]
|
amd_iommu= [HW,X86-64]
|
||||||
Pass parameters to the AMD IOMMU driver in the system.
|
Pass parameters to the AMD IOMMU driver in the system.
|
||||||
Possible values are:
|
Possible values are:
|
||||||
|
|||||||
155
Documentation/arm64/asymmetric-32bit.rst
Normal file
155
Documentation/arm64/asymmetric-32bit.rst
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
======================
|
||||||
|
Asymmetric 32-bit SoCs
|
||||||
|
======================
|
||||||
|
|
||||||
|
Author: Will Deacon <will@kernel.org>
|
||||||
|
|
||||||
|
This document describes the impact of asymmetric 32-bit SoCs on the
|
||||||
|
execution of 32-bit (``AArch32``) applications.
|
||||||
|
|
||||||
|
Date: 2021-05-17
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
|
Some Armv9 SoCs suffer from a big.LITTLE misfeature where only a subset
|
||||||
|
of the CPUs are capable of executing 32-bit user applications. On such
|
||||||
|
a system, Linux by default treats the asymmetry as a "mismatch" and
|
||||||
|
disables support for both the ``PER_LINUX32`` personality and
|
||||||
|
``execve(2)`` of 32-bit ELF binaries, with the latter returning
|
||||||
|
``-ENOEXEC``. If the mismatch is detected during late onlining of a
|
||||||
|
64-bit-only CPU, then the onlining operation fails and the new CPU is
|
||||||
|
unavailable for scheduling.
|
||||||
|
|
||||||
|
Surprisingly, these SoCs have been produced with the intention of
|
||||||
|
running legacy 32-bit binaries. Unsurprisingly, that doesn't work very
|
||||||
|
well with the default behaviour of Linux.
|
||||||
|
|
||||||
|
It seems inevitable that future SoCs will drop 32-bit support
|
||||||
|
altogether, so if you're stuck in the unenviable position of needing to
|
||||||
|
run 32-bit code on one of these transitionary platforms then you would
|
||||||
|
be wise to consider alternatives such as recompilation, emulation or
|
||||||
|
retirement. If neither of those options are practical, then read on.
|
||||||
|
|
||||||
|
Enabling kernel support
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Since the kernel support is not completely transparent to userspace,
|
||||||
|
allowing 32-bit tasks to run on an asymmetric 32-bit system requires an
|
||||||
|
explicit "opt-in" and can be enabled by passing the
|
||||||
|
``allow_mismatched_32bit_el0`` parameter on the kernel command-line.
|
||||||
|
|
||||||
|
For the remainder of this document we will refer to an *asymmetric
|
||||||
|
system* to mean an asymmetric 32-bit SoC running Linux with this kernel
|
||||||
|
command-line option enabled.
|
||||||
|
|
||||||
|
Userspace impact
|
||||||
|
================
|
||||||
|
|
||||||
|
32-bit tasks running on an asymmetric system behave in mostly the same
|
||||||
|
way as on a homogeneous system, with a few key differences relating to
|
||||||
|
CPU affinity.
|
||||||
|
|
||||||
|
sysfs
|
||||||
|
-----
|
||||||
|
|
||||||
|
The subset of CPUs capable of running 32-bit tasks is described in
|
||||||
|
``/sys/devices/system/cpu/aarch32_el0`` and is documented further in
|
||||||
|
``Documentation/ABI/testing/sysfs-devices-system-cpu``.
|
||||||
|
|
||||||
|
**Note:** CPUs are advertised by this file as they are detected and so
|
||||||
|
late-onlining of 32-bit-capable CPUs can result in the file contents
|
||||||
|
being modified by the kernel at runtime. Once advertised, CPUs are never
|
||||||
|
removed from the file.
|
||||||
|
|
||||||
|
``execve(2)``
|
||||||
|
-------------
|
||||||
|
|
||||||
|
On a homogeneous system, the CPU affinity of a task is preserved across
|
||||||
|
``execve(2)``. This is not always possible on an asymmetric system,
|
||||||
|
specifically when the new program being executed is 32-bit yet the
|
||||||
|
affinity mask contains 64-bit-only CPUs. In this situation, the kernel
|
||||||
|
determines the new affinity mask as follows:
|
||||||
|
|
||||||
|
1. If the 32-bit-capable subset of the affinity mask is not empty,
|
||||||
|
then the affinity is restricted to that subset and the old affinity
|
||||||
|
mask is saved. This saved mask is inherited over ``fork(2)`` and
|
||||||
|
preserved across ``execve(2)`` of 32-bit programs.
|
||||||
|
|
||||||
|
**Note:** This step does not apply to ``SCHED_DEADLINE`` tasks.
|
||||||
|
See `SCHED_DEADLINE`_.
|
||||||
|
|
||||||
|
2. Otherwise, the cpuset hierarchy of the task is walked until an
|
||||||
|
ancestor is found containing at least one 32-bit-capable CPU. The
|
||||||
|
affinity of the task is then changed to match the 32-bit-capable
|
||||||
|
subset of the cpuset determined by the walk.
|
||||||
|
|
||||||
|
3. On failure (i.e. out of memory), the affinity is changed to the set
|
||||||
|
of all 32-bit-capable CPUs of which the kernel is aware.
|
||||||
|
|
||||||
|
A subsequent ``execve(2)`` of a 64-bit program by the 32-bit task will
|
||||||
|
invalidate the affinity mask saved in (1) and attempt to restore the CPU
|
||||||
|
affinity of the task using the saved mask if it was previously valid.
|
||||||
|
This restoration may fail due to intervening changes to the deadline
|
||||||
|
policy or cpuset hierarchy, in which case the ``execve(2)`` continues
|
||||||
|
with the affinity unchanged.
|
||||||
|
|
||||||
|
Calls to ``sched_setaffinity(2)`` for a 32-bit task will consider only
|
||||||
|
the 32-bit-capable CPUs of the requested affinity mask. On success, the
|
||||||
|
affinity for the task is updated and any saved mask from a prior
|
||||||
|
``execve(2)`` is invalidated.
|
||||||
|
|
||||||
|
``SCHED_DEADLINE``
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Explicit admission of a 32-bit deadline task to the default root domain
|
||||||
|
(e.g. by calling ``sched_setattr(2)``) is rejected on an asymmetric
|
||||||
|
32-bit system unless admission control is disabled by writing -1 to
|
||||||
|
``/proc/sys/kernel/sched_rt_runtime_us``.
|
||||||
|
|
||||||
|
``execve(2)`` of a 32-bit program from a 64-bit deadline task will
|
||||||
|
return ``-ENOEXEC`` if the root domain for the task contains any
|
||||||
|
64-bit-only CPUs and admission control is enabled. Concurrent offlining
|
||||||
|
of 32-bit-capable CPUs may still necessitate the procedure described in
|
||||||
|
`execve(2)`_, in which case step (1) is skipped and a warning is
|
||||||
|
emitted on the console.
|
||||||
|
|
||||||
|
**Note:** It is recommended that a set of 32-bit-capable CPUs are placed
|
||||||
|
into a separate root domain if ``SCHED_DEADLINE`` is to be used with
|
||||||
|
32-bit tasks on an asymmetric system. Failure to do so is likely to
|
||||||
|
result in missed deadlines.
|
||||||
|
|
||||||
|
Cpusets
|
||||||
|
-------
|
||||||
|
|
||||||
|
The affinity of a 32-bit task on an asymmetric system may include CPUs
|
||||||
|
that are not explicitly allowed by the cpuset to which it is attached.
|
||||||
|
This can occur as a result of the following two situations:
|
||||||
|
|
||||||
|
- A 64-bit task attached to a cpuset which allows only 64-bit CPUs
|
||||||
|
executes a 32-bit program.
|
||||||
|
|
||||||
|
- All of the 32-bit-capable CPUs allowed by a cpuset containing a
|
||||||
|
32-bit task are offlined.
|
||||||
|
|
||||||
|
In both of these cases, the new affinity is calculated according to step
|
||||||
|
(2) of the process described in `execve(2)`_ and the cpuset hierarchy is
|
||||||
|
unchanged irrespective of the cgroup version.
|
||||||
|
|
||||||
|
CPU hotplug
|
||||||
|
-----------
|
||||||
|
|
||||||
|
On an asymmetric system, the first detected 32-bit-capable CPU is
|
||||||
|
prevented from being offlined by userspace and any such attempt will
|
||||||
|
return ``-EPERM``. Note that suspend is still permitted even if the
|
||||||
|
primary CPU (i.e. CPU 0) is 64-bit-only.
|
||||||
|
|
||||||
|
KVM
|
||||||
|
---
|
||||||
|
|
||||||
|
Although KVM will not advertise 32-bit EL0 support to any vCPUs on an
|
||||||
|
asymmetric system, a broken guest at EL1 could still attempt to execute
|
||||||
|
32-bit code at EL0. In this case, an exit from a vCPU thread in 32-bit
|
||||||
|
mode will return to host userspace with an ``exit_reason`` of
|
||||||
|
``KVM_EXIT_FAIL_ENTRY`` and will remain non-runnable until successfully
|
||||||
|
re-initialised by a subsequent ``KVM_ARM_VCPU_INIT`` operation.
|
||||||
@@ -10,6 +10,7 @@ ARM64 Architecture
|
|||||||
acpi_object_usage
|
acpi_object_usage
|
||||||
amu
|
amu
|
||||||
arm-acpi
|
arm-acpi
|
||||||
|
asymmetric-32bit
|
||||||
booting
|
booting
|
||||||
cpu-feature-registers
|
cpu-feature-registers
|
||||||
elf_hwcaps
|
elf_hwcaps
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ This bump in ABI version is at most once per kernel development cycle.
|
|||||||
|
|
||||||
For example, if current state of ``libbpf.map`` is:
|
For example, if current state of ``libbpf.map`` is:
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: none
|
||||||
|
|
||||||
LIBBPF_0.0.1 {
|
LIBBPF_0.0.1 {
|
||||||
global:
|
global:
|
||||||
@@ -121,7 +121,7 @@ For example, if current state of ``libbpf.map`` is:
|
|||||||
, and a new symbol ``bpf_func_c`` is being introduced, then
|
, and a new symbol ``bpf_func_c`` is being introduced, then
|
||||||
``libbpf.map`` should be changed like this:
|
``libbpf.map`` should be changed like this:
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: none
|
||||||
|
|
||||||
LIBBPF_0.0.1 {
|
LIBBPF_0.0.1 {
|
||||||
global:
|
global:
|
||||||
|
|||||||
@@ -152,47 +152,6 @@ allOf:
|
|||||||
maxItems: 1
|
maxItems: 1
|
||||||
st,drdy-int-pin: false
|
st,drdy-int-pin: false
|
||||||
|
|
||||||
- if:
|
|
||||||
properties:
|
|
||||||
compatible:
|
|
||||||
enum:
|
|
||||||
# Two intertial interrupts i.e. accelerometer/gyro interrupts
|
|
||||||
- st,h3lis331dl-accel
|
|
||||||
- st,l3g4200d-gyro
|
|
||||||
- st,l3g4is-gyro
|
|
||||||
- st,l3gd20-gyro
|
|
||||||
- st,l3gd20h-gyro
|
|
||||||
- st,lis2de12
|
|
||||||
- st,lis2dw12
|
|
||||||
- st,lis2hh12
|
|
||||||
- st,lis2dh12-accel
|
|
||||||
- st,lis331dl-accel
|
|
||||||
- st,lis331dlh-accel
|
|
||||||
- st,lis3de
|
|
||||||
- st,lis3dh-accel
|
|
||||||
- st,lis3dhh
|
|
||||||
- st,lis3mdl-magn
|
|
||||||
- st,lng2dm-accel
|
|
||||||
- st,lps331ap-press
|
|
||||||
- st,lsm303agr-accel
|
|
||||||
- st,lsm303dlh-accel
|
|
||||||
- st,lsm303dlhc-accel
|
|
||||||
- st,lsm303dlm-accel
|
|
||||||
- st,lsm330-accel
|
|
||||||
- st,lsm330-gyro
|
|
||||||
- st,lsm330d-accel
|
|
||||||
- st,lsm330d-gyro
|
|
||||||
- st,lsm330dl-accel
|
|
||||||
- st,lsm330dl-gyro
|
|
||||||
- st,lsm330dlc-accel
|
|
||||||
- st,lsm330dlc-gyro
|
|
||||||
- st,lsm9ds0-gyro
|
|
||||||
- st,lsm9ds1-magn
|
|
||||||
then:
|
|
||||||
properties:
|
|
||||||
interrupts:
|
|
||||||
maxItems: 2
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
|
|||||||
@@ -18,114 +18,5 @@ real, with all the uAPI bits is:
|
|||||||
* Route shmem backend over to TTM SYSTEM for discrete
|
* Route shmem backend over to TTM SYSTEM for discrete
|
||||||
* TTM purgeable object support
|
* TTM purgeable object support
|
||||||
* Move i915 buddy allocator over to TTM
|
* Move i915 buddy allocator over to TTM
|
||||||
* MMAP ioctl mode(see `I915 MMAP`_)
|
|
||||||
* SET/GET ioctl caching(see `I915 SET/GET CACHING`_)
|
|
||||||
* Send RFC(with mesa-dev on cc) for final sign off on the uAPI
|
* Send RFC(with mesa-dev on cc) for final sign off on the uAPI
|
||||||
* Add pciid for DG1 and turn on uAPI for real
|
* Add pciid for DG1 and turn on uAPI for real
|
||||||
|
|
||||||
New object placement and region query uAPI
|
|
||||||
==========================================
|
|
||||||
Starting from DG1 we need to give userspace the ability to allocate buffers from
|
|
||||||
device local-memory. Currently the driver supports gem_create, which can place
|
|
||||||
buffers in system memory via shmem, and the usual assortment of other
|
|
||||||
interfaces, like dumb buffers and userptr.
|
|
||||||
|
|
||||||
To support this new capability, while also providing a uAPI which will work
|
|
||||||
beyond just DG1, we propose to offer three new bits of uAPI:
|
|
||||||
|
|
||||||
DRM_I915_QUERY_MEMORY_REGIONS
|
|
||||||
-----------------------------
|
|
||||||
New query ID which allows userspace to discover the list of supported memory
|
|
||||||
regions(like system-memory and local-memory) for a given device. We identify
|
|
||||||
each region with a class and instance pair, which should be unique. The class
|
|
||||||
here would be DEVICE or SYSTEM, and the instance would be zero, on platforms
|
|
||||||
like DG1.
|
|
||||||
|
|
||||||
Side note: The class/instance design is borrowed from our existing engine uAPI,
|
|
||||||
where we describe every physical engine in terms of its class, and the
|
|
||||||
particular instance, since we can have more than one per class.
|
|
||||||
|
|
||||||
In the future we also want to expose more information which can further
|
|
||||||
describe the capabilities of a region.
|
|
||||||
|
|
||||||
.. kernel-doc:: include/uapi/drm/i915_drm.h
|
|
||||||
:functions: drm_i915_gem_memory_class drm_i915_gem_memory_class_instance drm_i915_memory_region_info drm_i915_query_memory_regions
|
|
||||||
|
|
||||||
GEM_CREATE_EXT
|
|
||||||
--------------
|
|
||||||
New ioctl which is basically just gem_create but now allows userspace to provide
|
|
||||||
a chain of possible extensions. Note that if we don't provide any extensions and
|
|
||||||
set flags=0 then we get the exact same behaviour as gem_create.
|
|
||||||
|
|
||||||
Side note: We also need to support PXP[1] in the near future, which is also
|
|
||||||
applicable to integrated platforms, and adds its own gem_create_ext extension,
|
|
||||||
which basically lets userspace mark a buffer as "protected".
|
|
||||||
|
|
||||||
.. kernel-doc:: include/uapi/drm/i915_drm.h
|
|
||||||
:functions: drm_i915_gem_create_ext
|
|
||||||
|
|
||||||
I915_GEM_CREATE_EXT_MEMORY_REGIONS
|
|
||||||
----------------------------------
|
|
||||||
Implemented as an extension for gem_create_ext, we would now allow userspace to
|
|
||||||
optionally provide an immutable list of preferred placements at creation time,
|
|
||||||
in priority order, for a given buffer object. For the placements we expect
|
|
||||||
them each to use the class/instance encoding, as per the output of the regions
|
|
||||||
query. Having the list in priority order will be useful in the future when
|
|
||||||
placing an object, say during eviction.
|
|
||||||
|
|
||||||
.. kernel-doc:: include/uapi/drm/i915_drm.h
|
|
||||||
:functions: drm_i915_gem_create_ext_memory_regions
|
|
||||||
|
|
||||||
One fair criticism here is that this seems a little over-engineered[2]. If we
|
|
||||||
just consider DG1 then yes, a simple gem_create.flags or something is totally
|
|
||||||
all that's needed to tell the kernel to allocate the buffer in local-memory or
|
|
||||||
whatever. However looking to the future we need uAPI which can also support
|
|
||||||
upcoming Xe HP multi-tile architecture in a sane way, where there can be
|
|
||||||
multiple local-memory instances for a given device, and so using both class and
|
|
||||||
instance in our uAPI to describe regions is desirable, although specifically
|
|
||||||
for DG1 it's uninteresting, since we only have a single local-memory instance.
|
|
||||||
|
|
||||||
Existing uAPI issues
|
|
||||||
====================
|
|
||||||
Some potential issues we still need to resolve.
|
|
||||||
|
|
||||||
I915 MMAP
|
|
||||||
---------
|
|
||||||
In i915 there are multiple ways to MMAP GEM object, including mapping the same
|
|
||||||
object using different mapping types(WC vs WB), i.e multiple active mmaps per
|
|
||||||
object. TTM expects one MMAP at most for the lifetime of the object. If it
|
|
||||||
turns out that we have to backpedal here, there might be some potential
|
|
||||||
userspace fallout.
|
|
||||||
|
|
||||||
I915 SET/GET CACHING
|
|
||||||
--------------------
|
|
||||||
In i915 we have set/get_caching ioctl. TTM doesn't let us to change this, but
|
|
||||||
DG1 doesn't support non-snooped pcie transactions, so we can just always
|
|
||||||
allocate as WB for smem-only buffers. If/when our hw gains support for
|
|
||||||
non-snooped pcie transactions then we must fix this mode at allocation time as
|
|
||||||
a new GEM extension.
|
|
||||||
|
|
||||||
This is related to the mmap problem, because in general (meaning, when we're
|
|
||||||
not running on intel cpus) the cpu mmap must not, ever, be inconsistent with
|
|
||||||
allocation mode.
|
|
||||||
|
|
||||||
Possible idea is to let the kernel picks the mmap mode for userspace from the
|
|
||||||
following table:
|
|
||||||
|
|
||||||
smem-only: WB. Userspace does not need to call clflush.
|
|
||||||
|
|
||||||
smem+lmem: We only ever allow a single mode, so simply allocate this as uncached
|
|
||||||
memory, and always give userspace a WC mapping. GPU still does snooped access
|
|
||||||
here(assuming we can't turn it off like on DG1), which is a bit inefficient.
|
|
||||||
|
|
||||||
lmem only: always WC
|
|
||||||
|
|
||||||
This means on discrete you only get a single mmap mode, all others must be
|
|
||||||
rejected. That's probably going to be a new default mode or something like
|
|
||||||
that.
|
|
||||||
|
|
||||||
Links
|
|
||||||
=====
|
|
||||||
[1] https://patchwork.freedesktop.org/series/86798/
|
|
||||||
|
|
||||||
[2] https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5599#note_553791
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ Introduction
|
|||||||
busses/index
|
busses/index
|
||||||
i2c-topology
|
i2c-topology
|
||||||
muxes/i2c-mux-gpio
|
muxes/i2c-mux-gpio
|
||||||
|
i2c-sysfs
|
||||||
|
|
||||||
Writing device drivers
|
Writing device drivers
|
||||||
======================
|
======================
|
||||||
|
|||||||
@@ -228,6 +228,23 @@ before posting to the mailing list. The patchwork build bot instance
|
|||||||
gets overloaded very easily and netdev@vger really doesn't need more
|
gets overloaded very easily and netdev@vger really doesn't need more
|
||||||
traffic if we can help it.
|
traffic if we can help it.
|
||||||
|
|
||||||
|
netdevsim is great, can I extend it for my out-of-tree tests?
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
No, `netdevsim` is a test vehicle solely for upstream tests.
|
||||||
|
(Please add your tests under tools/testing/selftests/.)
|
||||||
|
|
||||||
|
We also give no guarantees that `netdevsim` won't change in the future
|
||||||
|
in a way which would break what would normally be considered uAPI.
|
||||||
|
|
||||||
|
Is netdevsim considered a "user" of an API?
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
Linux kernel has a long standing rule that no API should be added unless
|
||||||
|
it has a real, in-tree user. Mock-ups and tests based on `netdevsim` are
|
||||||
|
strongly encouraged when adding new APIs, but `netdevsim` in itself
|
||||||
|
is **not** considered a use case/user.
|
||||||
|
|
||||||
Any other tips to help ensure my net/net-next patch gets OK'd?
|
Any other tips to help ensure my net/net-next patch gets OK'd?
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
Attention to detail. Re-read your own work as if you were the
|
Attention to detail. Re-read your own work as if you were the
|
||||||
|
|||||||
@@ -191,19 +191,9 @@ nf_flowtable_tcp_timeout - INTEGER (seconds)
|
|||||||
TCP connections may be offloaded from nf conntrack to nf flow table.
|
TCP connections may be offloaded from nf conntrack to nf flow table.
|
||||||
Once aged, the connection is returned to nf conntrack with tcp pickup timeout.
|
Once aged, the connection is returned to nf conntrack with tcp pickup timeout.
|
||||||
|
|
||||||
nf_flowtable_tcp_pickup - INTEGER (seconds)
|
|
||||||
default 120
|
|
||||||
|
|
||||||
TCP connection timeout after being aged from nf flow table offload.
|
|
||||||
|
|
||||||
nf_flowtable_udp_timeout - INTEGER (seconds)
|
nf_flowtable_udp_timeout - INTEGER (seconds)
|
||||||
default 30
|
default 30
|
||||||
|
|
||||||
Control offload timeout for udp connections.
|
Control offload timeout for udp connections.
|
||||||
UDP connections may be offloaded from nf conntrack to nf flow table.
|
UDP connections may be offloaded from nf conntrack to nf flow table.
|
||||||
Once aged, the connection is returned to nf conntrack with udp pickup timeout.
|
Once aged, the connection is returned to nf conntrack with udp pickup timeout.
|
||||||
|
|
||||||
nf_flowtable_udp_pickup - INTEGER (seconds)
|
|
||||||
default 30
|
|
||||||
|
|
||||||
UDP connection timeout after being aged from nf flow table offload.
|
|
||||||
|
|||||||
@@ -73,7 +73,9 @@ IF_OPER_LOWERLAYERDOWN (3):
|
|||||||
state (f.e. VLAN).
|
state (f.e. VLAN).
|
||||||
|
|
||||||
IF_OPER_TESTING (4):
|
IF_OPER_TESTING (4):
|
||||||
Unused in current kernel.
|
Interface is in testing mode, for example executing driver self-tests
|
||||||
|
or media (cable) test. It can't be used for normal traffic until tests
|
||||||
|
complete.
|
||||||
|
|
||||||
IF_OPER_DORMANT (5):
|
IF_OPER_DORMANT (5):
|
||||||
Interface is L1 up, but waiting for an external event, f.e. for a
|
Interface is L1 up, but waiting for an external event, f.e. for a
|
||||||
@@ -111,7 +113,7 @@ it as lower layer.
|
|||||||
|
|
||||||
Note that for certain kind of soft-devices, which are not managing any
|
Note that for certain kind of soft-devices, which are not managing any
|
||||||
real hardware, it is possible to set this bit from userspace. One
|
real hardware, it is possible to set this bit from userspace. One
|
||||||
should use TVL IFLA_CARRIER to do so.
|
should use TLV IFLA_CARRIER to do so.
|
||||||
|
|
||||||
netif_carrier_ok() can be used to query that bit.
|
netif_carrier_ok() can be used to query that bit.
|
||||||
|
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ Userspace can also add file descriptors to the notifying process via
|
|||||||
``ioctl(SECCOMP_IOCTL_NOTIF_ADDFD)``. The ``id`` member of
|
``ioctl(SECCOMP_IOCTL_NOTIF_ADDFD)``. The ``id`` member of
|
||||||
``struct seccomp_notif_addfd`` should be the same ``id`` as in
|
``struct seccomp_notif_addfd`` should be the same ``id`` as in
|
||||||
``struct seccomp_notif``. The ``newfd_flags`` flag may be used to set flags
|
``struct seccomp_notif``. The ``newfd_flags`` flag may be used to set flags
|
||||||
like O_EXEC on the file descriptor in the notifying process. If the supervisor
|
like O_CLOEXEC on the file descriptor in the notifying process. If the supervisor
|
||||||
wants to inject the file descriptor with a specific number, the
|
wants to inject the file descriptor with a specific number, the
|
||||||
``SECCOMP_ADDFD_FLAG_SETFD`` flag can be used, and set the ``newfd`` member to
|
``SECCOMP_ADDFD_FLAG_SETFD`` flag can be used, and set the ``newfd`` member to
|
||||||
the specific number to use. If that file descriptor is already open in the
|
the specific number to use. If that file descriptor is already open in the
|
||||||
|
|||||||
@@ -855,7 +855,7 @@ in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to
|
|||||||
use PPIs designated for specific cpus. The irq field is interpreted
|
use PPIs designated for specific cpus. The irq field is interpreted
|
||||||
like this::
|
like this::
|
||||||
|
|
||||||
bits: | 31 ... 28 | 27 ... 24 | 23 ... 16 | 15 ... 0 |
|
bits: | 31 ... 28 | 27 ... 24 | 23 ... 16 | 15 ... 0 |
|
||||||
field: | vcpu2_index | irq_type | vcpu_index | irq_id |
|
field: | vcpu2_index | irq_type | vcpu_index | irq_id |
|
||||||
|
|
||||||
The irq_type field has the following values:
|
The irq_type field has the following values:
|
||||||
@@ -2149,10 +2149,10 @@ prior to calling the KVM_RUN ioctl.
|
|||||||
Errors:
|
Errors:
|
||||||
|
|
||||||
====== ============================================================
|
====== ============================================================
|
||||||
ENOENT no such register
|
ENOENT no such register
|
||||||
EINVAL invalid register ID, or no such register or used with VMs in
|
EINVAL invalid register ID, or no such register or used with VMs in
|
||||||
protected virtualization mode on s390
|
protected virtualization mode on s390
|
||||||
EPERM (arm64) register access not allowed before vcpu finalization
|
EPERM (arm64) register access not allowed before vcpu finalization
|
||||||
====== ============================================================
|
====== ============================================================
|
||||||
|
|
||||||
(These error codes are indicative only: do not rely on a specific error
|
(These error codes are indicative only: do not rely on a specific error
|
||||||
@@ -2590,10 +2590,10 @@ following id bit patterns::
|
|||||||
Errors include:
|
Errors include:
|
||||||
|
|
||||||
======== ============================================================
|
======== ============================================================
|
||||||
ENOENT no such register
|
ENOENT no such register
|
||||||
EINVAL invalid register ID, or no such register or used with VMs in
|
EINVAL invalid register ID, or no such register or used with VMs in
|
||||||
protected virtualization mode on s390
|
protected virtualization mode on s390
|
||||||
EPERM (arm64) register access not allowed before vcpu finalization
|
EPERM (arm64) register access not allowed before vcpu finalization
|
||||||
======== ============================================================
|
======== ============================================================
|
||||||
|
|
||||||
(These error codes are indicative only: do not rely on a specific error
|
(These error codes are indicative only: do not rely on a specific error
|
||||||
@@ -3112,13 +3112,13 @@ current state. "addr" is ignored.
|
|||||||
Errors:
|
Errors:
|
||||||
|
|
||||||
====== =================================================================
|
====== =================================================================
|
||||||
EINVAL the target is unknown, or the combination of features is invalid.
|
EINVAL the target is unknown, or the combination of features is invalid.
|
||||||
ENOENT a features bit specified is unknown.
|
ENOENT a features bit specified is unknown.
|
||||||
====== =================================================================
|
====== =================================================================
|
||||||
|
|
||||||
This tells KVM what type of CPU to present to the guest, and what
|
This tells KVM what type of CPU to present to the guest, and what
|
||||||
optional features it should have. This will cause a reset of the cpu
|
optional features it should have. This will cause a reset of the cpu
|
||||||
registers to their initial values. If this is not called, KVM_RUN will
|
registers to their initial values. If this is not called, KVM_RUN will
|
||||||
return ENOEXEC for that vcpu.
|
return ENOEXEC for that vcpu.
|
||||||
|
|
||||||
The initial values are defined as:
|
The initial values are defined as:
|
||||||
@@ -3239,8 +3239,8 @@ VCPU matching underlying host.
|
|||||||
Errors:
|
Errors:
|
||||||
|
|
||||||
===== ==============================================================
|
===== ==============================================================
|
||||||
E2BIG the reg index list is too big to fit in the array specified by
|
E2BIG the reg index list is too big to fit in the array specified by
|
||||||
the user (the number required will be written into n).
|
the user (the number required will be written into n).
|
||||||
===== ==============================================================
|
===== ==============================================================
|
||||||
|
|
||||||
::
|
::
|
||||||
@@ -3288,7 +3288,7 @@ specific device.
|
|||||||
ARM/arm64 divides the id field into two parts, a device id and an
|
ARM/arm64 divides the id field into two parts, a device id and an
|
||||||
address type id specific to the individual device::
|
address type id specific to the individual device::
|
||||||
|
|
||||||
bits: | 63 ... 32 | 31 ... 16 | 15 ... 0 |
|
bits: | 63 ... 32 | 31 ... 16 | 15 ... 0 |
|
||||||
field: | 0x00000000 | device id | addr type id |
|
field: | 0x00000000 | device id | addr type id |
|
||||||
|
|
||||||
ARM/arm64 currently only require this when using the in-kernel GIC
|
ARM/arm64 currently only require this when using the in-kernel GIC
|
||||||
@@ -7049,7 +7049,7 @@ In combination with KVM_CAP_X86_USER_SPACE_MSR, this allows user space to
|
|||||||
trap and emulate MSRs that are outside of the scope of KVM as well as
|
trap and emulate MSRs that are outside of the scope of KVM as well as
|
||||||
limit the attack surface on KVM's MSR emulation code.
|
limit the attack surface on KVM's MSR emulation code.
|
||||||
|
|
||||||
8.28 KVM_CAP_ENFORCE_PV_CPUID
|
8.28 KVM_CAP_ENFORCE_PV_FEATURE_CPUID
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
Architectures: x86
|
Architectures: x86
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ On x86:
|
|||||||
|
|
||||||
- vcpu->mutex is taken outside kvm->arch.hyperv.hv_lock
|
- vcpu->mutex is taken outside kvm->arch.hyperv.hv_lock
|
||||||
|
|
||||||
- kvm->arch.mmu_lock is an rwlock. kvm->arch.tdp_mmu_pages_lock is
|
- kvm->arch.mmu_lock is an rwlock. kvm->arch.tdp_mmu_pages_lock and
|
||||||
taken inside kvm->arch.mmu_lock, and cannot be taken without already
|
kvm->arch.mmu_unsync_pages_lock are taken inside kvm->arch.mmu_lock, and
|
||||||
holding kvm->arch.mmu_lock (typically with ``read_lock``, otherwise
|
cannot be taken without already holding kvm->arch.mmu_lock (typically with
|
||||||
there's no need to take kvm->arch.tdp_mmu_pages_lock at all).
|
``read_lock`` for the TDP MMU, thus the need for additional spinlocks).
|
||||||
|
|
||||||
Everything else is a leaf: no other lock is taken inside the critical
|
Everything else is a leaf: no other lock is taken inside the critical
|
||||||
sections.
|
sections.
|
||||||
|
|||||||
21
MAINTAINERS
21
MAINTAINERS
@@ -7858,9 +7858,9 @@ S: Maintained
|
|||||||
F: drivers/input/touchscreen/goodix.c
|
F: drivers/input/touchscreen/goodix.c
|
||||||
|
|
||||||
GOOGLE ETHERNET DRIVERS
|
GOOGLE ETHERNET DRIVERS
|
||||||
M: Catherine Sullivan <csully@google.com>
|
M: Jeroen de Borst <jeroendb@google.com>
|
||||||
R: Sagi Shahar <sagis@google.com>
|
R: Catherine Sullivan <csully@google.com>
|
||||||
R: Jon Olson <jonolson@google.com>
|
R: David Awogbemila <awogbemila@google.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/networking/device_drivers/ethernet/google/gve.rst
|
F: Documentation/networking/device_drivers/ethernet/google/gve.rst
|
||||||
@@ -11327,6 +11327,12 @@ W: https://linuxtv.org
|
|||||||
T: git git://linuxtv.org/media_tree.git
|
T: git git://linuxtv.org/media_tree.git
|
||||||
F: drivers/media/radio/radio-maxiradio*
|
F: drivers/media/radio/radio-maxiradio*
|
||||||
|
|
||||||
|
MCBA MICROCHIP CAN BUS ANALYZER TOOL DRIVER
|
||||||
|
R: Yasushi SHOJI <yashi@spacecubics.com>
|
||||||
|
L: linux-can@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/net/can/usb/mcba_usb.c
|
||||||
|
|
||||||
MCAN MMIO DEVICE DRIVER
|
MCAN MMIO DEVICE DRIVER
|
||||||
M: Chandrasekar Ramakrishnan <rcsekar@samsung.com>
|
M: Chandrasekar Ramakrishnan <rcsekar@samsung.com>
|
||||||
L: linux-can@vger.kernel.org
|
L: linux-can@vger.kernel.org
|
||||||
@@ -15468,6 +15474,8 @@ M: Pan, Xinhui <Xinhui.Pan@amd.com>
|
|||||||
L: amd-gfx@lists.freedesktop.org
|
L: amd-gfx@lists.freedesktop.org
|
||||||
S: Supported
|
S: Supported
|
||||||
T: git https://gitlab.freedesktop.org/agd5f/linux.git
|
T: git https://gitlab.freedesktop.org/agd5f/linux.git
|
||||||
|
B: https://gitlab.freedesktop.org/drm/amd/-/issues
|
||||||
|
C: irc://irc.oftc.net/radeon
|
||||||
F: drivers/gpu/drm/amd/
|
F: drivers/gpu/drm/amd/
|
||||||
F: drivers/gpu/drm/radeon/
|
F: drivers/gpu/drm/radeon/
|
||||||
F: include/uapi/drm/amdgpu_drm.h
|
F: include/uapi/drm/amdgpu_drm.h
|
||||||
@@ -15795,7 +15803,7 @@ F: Documentation/devicetree/bindings/i2c/renesas,iic-emev2.yaml
|
|||||||
F: drivers/i2c/busses/i2c-emev2.c
|
F: drivers/i2c/busses/i2c-emev2.c
|
||||||
|
|
||||||
RENESAS ETHERNET DRIVERS
|
RENESAS ETHERNET DRIVERS
|
||||||
R: Sergei Shtylyov <sergei.shtylyov@gmail.com>
|
R: Sergey Shtylyov <s.shtylyov@omp.ru>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: linux-renesas-soc@vger.kernel.org
|
L: linux-renesas-soc@vger.kernel.org
|
||||||
F: Documentation/devicetree/bindings/net/renesas,*.yaml
|
F: Documentation/devicetree/bindings/net/renesas,*.yaml
|
||||||
@@ -17807,7 +17815,7 @@ F: include/linux/sync_file.h
|
|||||||
F: include/uapi/linux/sync_file.h
|
F: include/uapi/linux/sync_file.h
|
||||||
|
|
||||||
SYNOPSYS ARC ARCHITECTURE
|
SYNOPSYS ARC ARCHITECTURE
|
||||||
M: Vineet Gupta <vgupta@synopsys.com>
|
M: Vineet Gupta <vgupta@kernel.org>
|
||||||
L: linux-snps-arc@lists.infradead.org
|
L: linux-snps-arc@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git
|
||||||
@@ -20009,7 +20017,8 @@ F: Documentation/devicetree/bindings/extcon/wlf,arizona.yaml
|
|||||||
F: Documentation/devicetree/bindings/mfd/wlf,arizona.yaml
|
F: Documentation/devicetree/bindings/mfd/wlf,arizona.yaml
|
||||||
F: Documentation/devicetree/bindings/mfd/wm831x.txt
|
F: Documentation/devicetree/bindings/mfd/wm831x.txt
|
||||||
F: Documentation/devicetree/bindings/regulator/wlf,arizona.yaml
|
F: Documentation/devicetree/bindings/regulator/wlf,arizona.yaml
|
||||||
F: Documentation/devicetree/bindings/sound/wlf,arizona.yaml
|
F: Documentation/devicetree/bindings/sound/wlf,*.yaml
|
||||||
|
F: Documentation/devicetree/bindings/sound/wm*
|
||||||
F: Documentation/hwmon/wm83??.rst
|
F: Documentation/hwmon/wm83??.rst
|
||||||
F: arch/arm/mach-s3c/mach-crag6410*
|
F: arch/arm/mach-s3c/mach-crag6410*
|
||||||
F: drivers/clk/clk-wm83*.c
|
F: drivers/clk/clk-wm83*.c
|
||||||
|
|||||||
13
Makefile
13
Makefile
@@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 14
|
PATCHLEVEL = 14
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc6
|
||||||
NAME = Opossums on Parade
|
NAME = Opossums on Parade
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@@ -546,7 +546,6 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
|
|||||||
PHONY += scripts_basic
|
PHONY += scripts_basic
|
||||||
scripts_basic:
|
scripts_basic:
|
||||||
$(Q)$(MAKE) $(build)=scripts/basic
|
$(Q)$(MAKE) $(build)=scripts/basic
|
||||||
$(Q)rm -f .tmp_quiet_recordmcount
|
|
||||||
|
|
||||||
PHONY += outputmakefile
|
PHONY += outputmakefile
|
||||||
ifdef building_out_of_srctree
|
ifdef building_out_of_srctree
|
||||||
@@ -1317,6 +1316,16 @@ PHONY += scripts_unifdef
|
|||||||
scripts_unifdef: scripts_basic
|
scripts_unifdef: scripts_basic
|
||||||
$(Q)$(MAKE) $(build)=scripts scripts/unifdef
|
$(Q)$(MAKE) $(build)=scripts scripts/unifdef
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Install
|
||||||
|
|
||||||
|
# Many distributions have the custom install script, /sbin/installkernel.
|
||||||
|
# If DKMS is installed, 'make install' will eventually recuses back
|
||||||
|
# to the this Makefile to build and install external modules.
|
||||||
|
# Cancel sub_make_done so that options such as M=, V=, etc. are parsed.
|
||||||
|
|
||||||
|
install: sub_make_done :=
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Tools
|
# Tools
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ config ALPHA
|
|||||||
select PCI_SYSCALL if PCI
|
select PCI_SYSCALL if PCI
|
||||||
select HAVE_AOUT
|
select HAVE_AOUT
|
||||||
select HAVE_ASM_MODVERSIONS
|
select HAVE_ASM_MODVERSIONS
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_PCSPKR_PLATFORM
|
select HAVE_PCSPKR_PLATFORM
|
||||||
select HAVE_PERF_EVENTS
|
select HAVE_PERF_EVENTS
|
||||||
select NEED_DMA_MAP_STATE
|
select NEED_DMA_MAP_STATE
|
||||||
@@ -532,7 +531,7 @@ config SMP
|
|||||||
will run faster if you say N here.
|
will run faster if you say N here.
|
||||||
|
|
||||||
See also the SMP-HOWTO available at
|
See also the SMP-HOWTO available at
|
||||||
<http://www.tldp.org/docs.html#howto>.
|
<https://www.tldp.org/docs.html#howto>.
|
||||||
|
|
||||||
If you don't know what to do here, say N.
|
If you don't know what to do here, say N.
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#include "ksize.h"
|
#include "ksize.h"
|
||||||
|
|
||||||
extern unsigned long switch_to_osf_pal(unsigned long nr,
|
extern unsigned long switch_to_osf_pal(unsigned long nr,
|
||||||
struct pcb_struct * pcb_va, struct pcb_struct * pcb_pa,
|
struct pcb_struct *pcb_va, struct pcb_struct *pcb_pa,
|
||||||
unsigned long *vptb);
|
unsigned long *vptb);
|
||||||
|
|
||||||
extern void move_stack(unsigned long new_stack);
|
extern void move_stack(unsigned long new_stack);
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ extern char _end;
|
|||||||
START_ADDR KSEG address of the entry point of kernel code.
|
START_ADDR KSEG address of the entry point of kernel code.
|
||||||
|
|
||||||
ZERO_PGE KSEG address of page full of zeroes, but
|
ZERO_PGE KSEG address of page full of zeroes, but
|
||||||
upon entry to kerne cvan be expected
|
upon entry to kernel, it can be expected
|
||||||
to hold the parameter list and possible
|
to hold the parameter list and possible
|
||||||
INTRD information.
|
INTRD information.
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ extern long srm_printk(const char *, ...)
|
|||||||
__attribute__ ((format (printf, 1, 2)));
|
__attribute__ ((format (printf, 1, 2)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* gzip delarations
|
* gzip declarations
|
||||||
*/
|
*/
|
||||||
#define OF(args) args
|
#define OF(args) args
|
||||||
#define STATIC static
|
#define STATIC static
|
||||||
|
|||||||
@@ -70,3 +70,4 @@ CONFIG_DEBUG_INFO=y
|
|||||||
CONFIG_ALPHA_LEGACY_START_ADDRESS=y
|
CONFIG_ALPHA_LEGACY_START_ADDRESS=y
|
||||||
CONFIG_MATHEMU=y
|
CONFIG_MATHEMU=y
|
||||||
CONFIG_CRYPTO_HMAC=y
|
CONFIG_CRYPTO_HMAC=y
|
||||||
|
CONFIG_DEVTMPFS=y
|
||||||
|
|||||||
@@ -4,15 +4,4 @@
|
|||||||
|
|
||||||
#include <uapi/asm/compiler.h>
|
#include <uapi/asm/compiler.h>
|
||||||
|
|
||||||
/* Some idiots over in <linux/compiler.h> thought inline should imply
|
|
||||||
always_inline. This breaks stuff. We'll include this file whenever
|
|
||||||
we run into such problems. */
|
|
||||||
|
|
||||||
#include <linux/compiler.h>
|
|
||||||
#undef inline
|
|
||||||
#undef __inline__
|
|
||||||
#undef __inline
|
|
||||||
#undef __always_inline
|
|
||||||
#define __always_inline inline __attribute__((always_inline))
|
|
||||||
|
|
||||||
#endif /* __ALPHA_COMPILER_H */
|
#endif /* __ALPHA_COMPILER_H */
|
||||||
|
|||||||
@@ -9,4 +9,10 @@ static inline int syscall_get_arch(struct task_struct *task)
|
|||||||
return AUDIT_ARCH_ALPHA;
|
return AUDIT_ARCH_ALPHA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline long syscall_get_return_value(struct task_struct *task,
|
||||||
|
struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return regs->r0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _ASM_ALPHA_SYSCALL_H */
|
#endif /* _ASM_ALPHA_SYSCALL_H */
|
||||||
|
|||||||
@@ -834,7 +834,7 @@ SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer,
|
|||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
state = ¤t_thread_info()->ieee_state;
|
state = ¤t_thread_info()->ieee_state;
|
||||||
|
|
||||||
/* Update softare trap enable bits. */
|
/* Update software trap enable bits. */
|
||||||
*state = (*state & ~IEEE_SW_MASK) | (swcr & IEEE_SW_MASK);
|
*state = (*state & ~IEEE_SW_MASK) | (swcr & IEEE_SW_MASK);
|
||||||
|
|
||||||
/* Update the real fpcr. */
|
/* Update the real fpcr. */
|
||||||
@@ -854,7 +854,7 @@ SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer,
|
|||||||
state = ¤t_thread_info()->ieee_state;
|
state = ¤t_thread_info()->ieee_state;
|
||||||
exc &= IEEE_STATUS_MASK;
|
exc &= IEEE_STATUS_MASK;
|
||||||
|
|
||||||
/* Update softare trap enable bits. */
|
/* Update software trap enable bits. */
|
||||||
swcr = (*state & IEEE_SW_MASK) | exc;
|
swcr = (*state & IEEE_SW_MASK) | exc;
|
||||||
*state |= exc;
|
*state |= exc;
|
||||||
|
|
||||||
|
|||||||
@@ -574,7 +574,7 @@ static void alpha_pmu_start(struct perf_event *event, int flags)
|
|||||||
* Check that CPU performance counters are supported.
|
* Check that CPU performance counters are supported.
|
||||||
* - currently support EV67 and later CPUs.
|
* - currently support EV67 and later CPUs.
|
||||||
* - actually some later revisions of the EV6 have the same PMC model as the
|
* - actually some later revisions of the EV6 have the same PMC model as the
|
||||||
* EV67 but we don't do suffiently deep CPU detection to detect them.
|
* EV67 but we don't do sufficiently deep CPU detection to detect them.
|
||||||
* Bad luck to the very few people who might have one, I guess.
|
* Bad luck to the very few people who might have one, I guess.
|
||||||
*/
|
*/
|
||||||
static int supported_cpu(void)
|
static int supported_cpu(void)
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|||||||
childstack->r26 = (unsigned long) ret_from_kernel_thread;
|
childstack->r26 = (unsigned long) ret_from_kernel_thread;
|
||||||
childstack->r9 = usp; /* function */
|
childstack->r9 = usp; /* function */
|
||||||
childstack->r10 = kthread_arg;
|
childstack->r10 = kthread_arg;
|
||||||
childregs->hae = alpha_mv.hae_cache,
|
childregs->hae = alpha_mv.hae_cache;
|
||||||
childti->pcb.usp = 0;
|
childti->pcb.usp = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -319,18 +319,19 @@ setup_memory(void *kernel_end)
|
|||||||
i, cluster->usage, cluster->start_pfn,
|
i, cluster->usage, cluster->start_pfn,
|
||||||
cluster->start_pfn + cluster->numpages);
|
cluster->start_pfn + cluster->numpages);
|
||||||
|
|
||||||
/* Bit 0 is console/PALcode reserved. Bit 1 is
|
|
||||||
non-volatile memory -- we might want to mark
|
|
||||||
this for later. */
|
|
||||||
if (cluster->usage & 3)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
end = cluster->start_pfn + cluster->numpages;
|
end = cluster->start_pfn + cluster->numpages;
|
||||||
if (end > max_low_pfn)
|
if (end > max_low_pfn)
|
||||||
max_low_pfn = end;
|
max_low_pfn = end;
|
||||||
|
|
||||||
memblock_add(PFN_PHYS(cluster->start_pfn),
|
memblock_add(PFN_PHYS(cluster->start_pfn),
|
||||||
cluster->numpages << PAGE_SHIFT);
|
cluster->numpages << PAGE_SHIFT);
|
||||||
|
|
||||||
|
/* Bit 0 is console/PALcode reserved. Bit 1 is
|
||||||
|
non-volatile memory -- we might want to mark
|
||||||
|
this for later. */
|
||||||
|
if (cluster->usage & 3)
|
||||||
|
memblock_reserve(PFN_PHYS(cluster->start_pfn),
|
||||||
|
cluster->numpages << PAGE_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -582,7 +582,7 @@ void
|
|||||||
smp_send_stop(void)
|
smp_send_stop(void)
|
||||||
{
|
{
|
||||||
cpumask_t to_whom;
|
cpumask_t to_whom;
|
||||||
cpumask_copy(&to_whom, cpu_possible_mask);
|
cpumask_copy(&to_whom, cpu_online_mask);
|
||||||
cpumask_clear_cpu(smp_processor_id(), &to_whom);
|
cpumask_clear_cpu(smp_processor_id(), &to_whom);
|
||||||
#ifdef DEBUG_IPI_MSG
|
#ifdef DEBUG_IPI_MSG
|
||||||
if (hard_smp_processor_id() != boot_cpu_id)
|
if (hard_smp_processor_id() != boot_cpu_id)
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ nautilus_init_pci(void)
|
|||||||
|
|
||||||
/* Use default IO. */
|
/* Use default IO. */
|
||||||
pci_add_resource(&bridge->windows, &ioport_resource);
|
pci_add_resource(&bridge->windows, &ioport_resource);
|
||||||
/* Irongate PCI memory aperture, calculate requred size before
|
/* Irongate PCI memory aperture, calculate required size before
|
||||||
setting it up. */
|
setting it up. */
|
||||||
pci_add_resource(&bridge->windows, &irongate_mem);
|
pci_add_resource(&bridge->windows, &irongate_mem);
|
||||||
|
|
||||||
|
|||||||
@@ -730,7 +730,7 @@ do_entUnaUser(void __user * va, unsigned long opcode,
|
|||||||
long error;
|
long error;
|
||||||
|
|
||||||
/* Check the UAC bits to decide what the user wants us to do
|
/* Check the UAC bits to decide what the user wants us to do
|
||||||
with the unaliged access. */
|
with the unaligned access. */
|
||||||
|
|
||||||
if (!(current_thread_info()->status & TS_UAC_NOPRINT)) {
|
if (!(current_thread_info()->status & TS_UAC_NOPRINT)) {
|
||||||
if (__ratelimit(&ratelimit)) {
|
if (__ratelimit(&ratelimit)) {
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ static long (*save_emul) (unsigned long pc);
|
|||||||
long do_alpha_fp_emul_imprecise(struct pt_regs *, unsigned long);
|
long do_alpha_fp_emul_imprecise(struct pt_regs *, unsigned long);
|
||||||
long do_alpha_fp_emul(unsigned long);
|
long do_alpha_fp_emul(unsigned long);
|
||||||
|
|
||||||
int init_module(void)
|
static int alpha_fp_emul_init_module(void)
|
||||||
{
|
{
|
||||||
save_emul_imprecise = alpha_fp_emul_imprecise;
|
save_emul_imprecise = alpha_fp_emul_imprecise;
|
||||||
save_emul = alpha_fp_emul;
|
save_emul = alpha_fp_emul;
|
||||||
@@ -73,12 +73,14 @@ int init_module(void)
|
|||||||
alpha_fp_emul = do_alpha_fp_emul;
|
alpha_fp_emul = do_alpha_fp_emul;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
module_init(alpha_fp_emul_init_module);
|
||||||
|
|
||||||
void cleanup_module(void)
|
static void alpha_fp_emul_cleanup_module(void)
|
||||||
{
|
{
|
||||||
alpha_fp_emul_imprecise = save_emul_imprecise;
|
alpha_fp_emul_imprecise = save_emul_imprecise;
|
||||||
alpha_fp_emul = save_emul;
|
alpha_fp_emul = save_emul;
|
||||||
}
|
}
|
||||||
|
module_exit(alpha_fp_emul_cleanup_module);
|
||||||
|
|
||||||
#undef alpha_fp_emul_imprecise
|
#undef alpha_fp_emul_imprecise
|
||||||
#define alpha_fp_emul_imprecise do_alpha_fp_emul_imprecise
|
#define alpha_fp_emul_imprecise do_alpha_fp_emul_imprecise
|
||||||
@@ -401,3 +403,5 @@ alpha_fp_emul_imprecise (struct pt_regs *regs, unsigned long write_mask)
|
|||||||
egress:
|
egress:
|
||||||
return si_code;
|
return si_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(__udiv_qrnnd);
|
||||||
|
|||||||
@@ -409,7 +409,7 @@ choice
|
|||||||
help
|
help
|
||||||
Depending on the configuration, CPU can contain DSP registers
|
Depending on the configuration, CPU can contain DSP registers
|
||||||
(ACC0_GLO, ACC0_GHI, DSP_BFLY0, DSP_CTRL, DSP_FFT_CTRL).
|
(ACC0_GLO, ACC0_GHI, DSP_BFLY0, DSP_CTRL, DSP_FFT_CTRL).
|
||||||
Bellow is options describing how to handle these registers in
|
Below are options describing how to handle these registers in
|
||||||
interrupt entry / exit and in context switch.
|
interrupt entry / exit and in context switch.
|
||||||
|
|
||||||
config ARC_DSP_NONE
|
config ARC_DSP_NONE
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
static inline __sum16 csum_fold(__wsum s)
|
static inline __sum16 csum_fold(__wsum s)
|
||||||
{
|
{
|
||||||
unsigned r = s << 16 | s >> 16; /* ror */
|
unsigned int r = s << 16 | s >> 16; /* ror */
|
||||||
s = ~s;
|
s = ~s;
|
||||||
s -= r;
|
s -= r;
|
||||||
return s >> 16;
|
return s >> 16;
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ static const char * const arc_pmu_ev_hw_map[] = {
|
|||||||
#define C(_x) PERF_COUNT_HW_CACHE_##_x
|
#define C(_x) PERF_COUNT_HW_CACHE_##_x
|
||||||
#define CACHE_OP_UNSUPPORTED 0xffff
|
#define CACHE_OP_UNSUPPORTED 0xffff
|
||||||
|
|
||||||
static const unsigned arc_pmu_cache_map[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
|
static const unsigned int arc_pmu_cache_map[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
|
||||||
[C(L1D)] = {
|
[C(L1D)] = {
|
||||||
[C(OP_READ)] = {
|
[C(OP_READ)] = {
|
||||||
[C(RESULT_ACCESS)] = PERF_COUNT_ARC_LDC,
|
[C(RESULT_ACCESS)] = PERF_COUNT_ARC_LDC,
|
||||||
|
|||||||
@@ -57,23 +57,26 @@ void fpu_save_restore(struct task_struct *prev, struct task_struct *next)
|
|||||||
|
|
||||||
void fpu_init_task(struct pt_regs *regs)
|
void fpu_init_task(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
const unsigned int fwe = 0x80000000;
|
||||||
|
|
||||||
/* default rounding mode */
|
/* default rounding mode */
|
||||||
write_aux_reg(ARC_REG_FPU_CTRL, 0x100);
|
write_aux_reg(ARC_REG_FPU_CTRL, 0x100);
|
||||||
|
|
||||||
/* set "Write enable" to allow explicit write to exception flags */
|
/* Initialize to zero: setting requires FWE be set */
|
||||||
write_aux_reg(ARC_REG_FPU_STATUS, 0x80000000);
|
write_aux_reg(ARC_REG_FPU_STATUS, fwe);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fpu_save_restore(struct task_struct *prev, struct task_struct *next)
|
void fpu_save_restore(struct task_struct *prev, struct task_struct *next)
|
||||||
{
|
{
|
||||||
struct arc_fpu *save = &prev->thread.fpu;
|
struct arc_fpu *save = &prev->thread.fpu;
|
||||||
struct arc_fpu *restore = &next->thread.fpu;
|
struct arc_fpu *restore = &next->thread.fpu;
|
||||||
|
const unsigned int fwe = 0x80000000;
|
||||||
|
|
||||||
save->ctrl = read_aux_reg(ARC_REG_FPU_CTRL);
|
save->ctrl = read_aux_reg(ARC_REG_FPU_CTRL);
|
||||||
save->status = read_aux_reg(ARC_REG_FPU_STATUS);
|
save->status = read_aux_reg(ARC_REG_FPU_STATUS);
|
||||||
|
|
||||||
write_aux_reg(ARC_REG_FPU_CTRL, restore->ctrl);
|
write_aux_reg(ARC_REG_FPU_CTRL, restore->ctrl);
|
||||||
write_aux_reg(ARC_REG_FPU_STATUS, restore->status);
|
write_aux_reg(ARC_REG_FPU_STATUS, (fwe | restore->status));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ static void init_unwind_hdr(struct unwind_table *table,
|
|||||||
{
|
{
|
||||||
const u8 *ptr;
|
const u8 *ptr;
|
||||||
unsigned long tableSize = table->size, hdrSize;
|
unsigned long tableSize = table->size, hdrSize;
|
||||||
unsigned n;
|
unsigned int n;
|
||||||
const u32 *fde;
|
const u32 *fde;
|
||||||
struct {
|
struct {
|
||||||
u8 version;
|
u8 version;
|
||||||
@@ -462,7 +462,7 @@ static uleb128_t get_uleb128(const u8 **pcur, const u8 *end)
|
|||||||
{
|
{
|
||||||
const u8 *cur = *pcur;
|
const u8 *cur = *pcur;
|
||||||
uleb128_t value;
|
uleb128_t value;
|
||||||
unsigned shift;
|
unsigned int shift;
|
||||||
|
|
||||||
for (shift = 0, value = 0; cur < end; shift += 7) {
|
for (shift = 0, value = 0; cur < end; shift += 7) {
|
||||||
if (shift + 7 > 8 * sizeof(value)
|
if (shift + 7 > 8 * sizeof(value)
|
||||||
@@ -483,7 +483,7 @@ static sleb128_t get_sleb128(const u8 **pcur, const u8 *end)
|
|||||||
{
|
{
|
||||||
const u8 *cur = *pcur;
|
const u8 *cur = *pcur;
|
||||||
sleb128_t value;
|
sleb128_t value;
|
||||||
unsigned shift;
|
unsigned int shift;
|
||||||
|
|
||||||
for (shift = 0, value = 0; cur < end; shift += 7) {
|
for (shift = 0, value = 0; cur < end; shift += 7) {
|
||||||
if (shift + 7 > 8 * sizeof(value)
|
if (shift + 7 > 8 * sizeof(value)
|
||||||
@@ -609,7 +609,7 @@ static unsigned long read_pointer(const u8 **pLoc, const void *end,
|
|||||||
static signed fde_pointer_type(const u32 *cie)
|
static signed fde_pointer_type(const u32 *cie)
|
||||||
{
|
{
|
||||||
const u8 *ptr = (const u8 *)(cie + 2);
|
const u8 *ptr = (const u8 *)(cie + 2);
|
||||||
unsigned version = *ptr;
|
unsigned int version = *ptr;
|
||||||
|
|
||||||
if (*++ptr) {
|
if (*++ptr) {
|
||||||
const char *aug;
|
const char *aug;
|
||||||
@@ -904,7 +904,7 @@ int arc_unwind(struct unwind_frame_info *frame)
|
|||||||
const u8 *ptr = NULL, *end = NULL;
|
const u8 *ptr = NULL, *end = NULL;
|
||||||
unsigned long pc = UNW_PC(frame) - frame->call_frame;
|
unsigned long pc = UNW_PC(frame) - frame->call_frame;
|
||||||
unsigned long startLoc = 0, endLoc = 0, cfa;
|
unsigned long startLoc = 0, endLoc = 0, cfa;
|
||||||
unsigned i;
|
unsigned int i;
|
||||||
signed ptrType = -1;
|
signed ptrType = -1;
|
||||||
uleb128_t retAddrReg = 0;
|
uleb128_t retAddrReg = 0;
|
||||||
const struct unwind_table *table;
|
const struct unwind_table *table;
|
||||||
|
|||||||
@@ -88,6 +88,8 @@ SECTIONS
|
|||||||
CPUIDLE_TEXT
|
CPUIDLE_TEXT
|
||||||
LOCK_TEXT
|
LOCK_TEXT
|
||||||
KPROBES_TEXT
|
KPROBES_TEXT
|
||||||
|
IRQENTRY_TEXT
|
||||||
|
SOFTIRQENTRY_TEXT
|
||||||
*(.fixup)
|
*(.fixup)
|
||||||
*(.gnu.warning)
|
*(.gnu.warning)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,7 +95,6 @@ config ARM
|
|||||||
select HAVE_FUNCTION_TRACER if !XIP_KERNEL
|
select HAVE_FUNCTION_TRACER if !XIP_KERNEL
|
||||||
select HAVE_GCC_PLUGINS
|
select HAVE_GCC_PLUGINS
|
||||||
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7)
|
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7)
|
||||||
select HAVE_IDE if PCI || ISA || PCMCIA
|
|
||||||
select HAVE_IRQ_TIME_ACCOUNTING
|
select HAVE_IRQ_TIME_ACCOUNTING
|
||||||
select HAVE_KERNEL_GZIP
|
select HAVE_KERNEL_GZIP
|
||||||
select HAVE_KERNEL_LZ4
|
select HAVE_KERNEL_LZ4
|
||||||
@@ -361,7 +360,6 @@ config ARCH_FOOTBRIDGE
|
|||||||
bool "FootBridge"
|
bool "FootBridge"
|
||||||
select CPU_SA110
|
select CPU_SA110
|
||||||
select FOOTBRIDGE
|
select FOOTBRIDGE
|
||||||
select HAVE_IDE
|
|
||||||
select NEED_MACH_IO_H if !MMU
|
select NEED_MACH_IO_H if !MMU
|
||||||
select NEED_MACH_MEMORY_H
|
select NEED_MACH_MEMORY_H
|
||||||
help
|
help
|
||||||
@@ -430,7 +428,6 @@ config ARCH_PXA
|
|||||||
select GENERIC_IRQ_MULTI_HANDLER
|
select GENERIC_IRQ_MULTI_HANDLER
|
||||||
select GPIO_PXA
|
select GPIO_PXA
|
||||||
select GPIOLIB
|
select GPIOLIB
|
||||||
select HAVE_IDE
|
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
select PLAT_PXA
|
select PLAT_PXA
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
@@ -446,7 +443,6 @@ config ARCH_RPC
|
|||||||
select ARM_HAS_SG_CHAIN
|
select ARM_HAS_SG_CHAIN
|
||||||
select CPU_SA110
|
select CPU_SA110
|
||||||
select FIQ
|
select FIQ
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_PATA_PLATFORM
|
select HAVE_PATA_PLATFORM
|
||||||
select ISA_DMA_API
|
select ISA_DMA_API
|
||||||
select LEGACY_TIMER_TICK
|
select LEGACY_TIMER_TICK
|
||||||
@@ -469,7 +465,6 @@ config ARCH_SA1100
|
|||||||
select CPU_SA1100
|
select CPU_SA1100
|
||||||
select GENERIC_IRQ_MULTI_HANDLER
|
select GENERIC_IRQ_MULTI_HANDLER
|
||||||
select GPIOLIB
|
select GPIOLIB
|
||||||
select HAVE_IDE
|
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
select ISA
|
select ISA
|
||||||
select NEED_MACH_MEMORY_H
|
select NEED_MACH_MEMORY_H
|
||||||
@@ -505,7 +500,6 @@ config ARCH_OMAP1
|
|||||||
select GENERIC_IRQ_CHIP
|
select GENERIC_IRQ_CHIP
|
||||||
select GENERIC_IRQ_MULTI_HANDLER
|
select GENERIC_IRQ_MULTI_HANDLER
|
||||||
select GPIOLIB
|
select GPIOLIB
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_LEGACY_CLK
|
select HAVE_LEGACY_CLK
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
select NEED_MACH_IO_H if PCCARD
|
select NEED_MACH_IO_H if PCCARD
|
||||||
|
|||||||
@@ -1595,7 +1595,7 @@
|
|||||||
compatible = "ti,am4372-d_can", "ti,am3352-d_can";
|
compatible = "ti,am4372-d_can", "ti,am3352-d_can";
|
||||||
reg = <0x0 0x2000>;
|
reg = <0x0 0x2000>;
|
||||||
clocks = <&dcan1_fck>;
|
clocks = <&dcan1_fck>;
|
||||||
clock-name = "fck";
|
clock-names = "fck";
|
||||||
syscon-raminit = <&scm_conf 0x644 1>;
|
syscon-raminit = <&scm_conf 0x644 1>;
|
||||||
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|||||||
@@ -582,7 +582,7 @@
|
|||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&i2c0_pins>;
|
pinctrl-0 = <&i2c0_pins>;
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <100000>;
|
||||||
|
|
||||||
tps65218: tps65218@24 {
|
tps65218: tps65218@24 {
|
||||||
reg = <0x24>;
|
reg = <0x24>;
|
||||||
|
|||||||
@@ -388,13 +388,13 @@
|
|||||||
|
|
||||||
pinctrl_power_button: powerbutgrp {
|
pinctrl_power_button: powerbutgrp {
|
||||||
fsl,pins = <
|
fsl,pins = <
|
||||||
MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4
|
MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
pinctrl_power_out: poweroutgrp {
|
pinctrl_power_out: poweroutgrp {
|
||||||
fsl,pins = <
|
fsl,pins = <
|
||||||
MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4
|
MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,13 @@
|
|||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_microsom_enet_ar8035>;
|
pinctrl-0 = <&pinctrl_microsom_enet_ar8035>;
|
||||||
phy-mode = "rgmii-id";
|
phy-mode = "rgmii-id";
|
||||||
phy-reset-duration = <2>;
|
|
||||||
|
/*
|
||||||
|
* The PHY seems to require a long-enough reset duration to avoid
|
||||||
|
* some rare issues where the PHY gets stuck in an inconsistent and
|
||||||
|
* non-functional state at boot-up. 10ms proved to be fine .
|
||||||
|
*/
|
||||||
|
phy-reset-duration = <10>;
|
||||||
phy-reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>;
|
phy-reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
assigned-clock-rates = <0>, <198000000>;
|
assigned-clock-rates = <0>, <198000000>;
|
||||||
cap-power-off-card;
|
cap-power-off-card;
|
||||||
keep-power-in-suspend;
|
keep-power-in-suspend;
|
||||||
|
max-frequency = <25000000>;
|
||||||
mmc-pwrseq = <&wifi_pwrseq>;
|
mmc-pwrseq = <&wifi_pwrseq>;
|
||||||
no-1-8-v;
|
no-1-8-v;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|||||||
@@ -30,14 +30,6 @@
|
|||||||
regulator-max-microvolt = <5000000>;
|
regulator-max-microvolt = <5000000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
vdds_1v8_main: fixedregulator-vdds_1v8_main {
|
|
||||||
compatible = "regulator-fixed";
|
|
||||||
regulator-name = "vdds_1v8_main";
|
|
||||||
vin-supply = <&smps7_reg>;
|
|
||||||
regulator-min-microvolt = <1800000>;
|
|
||||||
regulator-max-microvolt = <1800000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
vmmcsd_fixed: fixedregulator-mmcsd {
|
vmmcsd_fixed: fixedregulator-mmcsd {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "vmmcsd_fixed";
|
regulator-name = "vmmcsd_fixed";
|
||||||
@@ -487,6 +479,7 @@
|
|||||||
regulator-boot-on;
|
regulator-boot-on;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
vdds_1v8_main:
|
||||||
smps7_reg: smps7 {
|
smps7_reg: smps7 {
|
||||||
/* VDDS_1v8_OMAP over VDDS_1v8_MAIN */
|
/* VDDS_1v8_OMAP over VDDS_1v8_MAIN */
|
||||||
regulator-name = "smps7";
|
regulator-name = "smps7";
|
||||||
|
|||||||
@@ -755,14 +755,14 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
vica: intc@10140000 {
|
vica: interrupt-controller@10140000 {
|
||||||
compatible = "arm,versatile-vic";
|
compatible = "arm,versatile-vic";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
reg = <0x10140000 0x20>;
|
reg = <0x10140000 0x20>;
|
||||||
};
|
};
|
||||||
|
|
||||||
vicb: intc@10140020 {
|
vicb: interrupt-controller@10140020 {
|
||||||
compatible = "arm,versatile-vic";
|
compatible = "arm,versatile-vic";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
poll-interval = <20>;
|
poll-interval = <20>;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The EXTi IRQ line 3 is shared with touchscreen and ethernet,
|
* The EXTi IRQ line 3 is shared with ethernet,
|
||||||
* so mark this as polled GPIO key.
|
* so mark this as polled GPIO key.
|
||||||
*/
|
*/
|
||||||
button-0 {
|
button-0 {
|
||||||
@@ -46,6 +46,16 @@
|
|||||||
gpios = <&gpiof 3 GPIO_ACTIVE_LOW>;
|
gpios = <&gpiof 3 GPIO_ACTIVE_LOW>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The EXTi IRQ line 6 is shared with touchscreen,
|
||||||
|
* so mark this as polled GPIO key.
|
||||||
|
*/
|
||||||
|
button-1 {
|
||||||
|
label = "TA2-GPIO-B";
|
||||||
|
linux,code = <KEY_B>;
|
||||||
|
gpios = <&gpiod 6 GPIO_ACTIVE_LOW>;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The EXTi IRQ line 0 is shared with PMIC,
|
* The EXTi IRQ line 0 is shared with PMIC,
|
||||||
* so mark this as polled GPIO key.
|
* so mark this as polled GPIO key.
|
||||||
@@ -60,13 +70,6 @@
|
|||||||
gpio-keys {
|
gpio-keys {
|
||||||
compatible = "gpio-keys";
|
compatible = "gpio-keys";
|
||||||
|
|
||||||
button-1 {
|
|
||||||
label = "TA2-GPIO-B";
|
|
||||||
linux,code = <KEY_B>;
|
|
||||||
gpios = <&gpiod 6 GPIO_ACTIVE_LOW>;
|
|
||||||
wakeup-source;
|
|
||||||
};
|
|
||||||
|
|
||||||
button-3 {
|
button-3 {
|
||||||
label = "TA4-GPIO-D";
|
label = "TA4-GPIO-D";
|
||||||
linux,code = <KEY_D>;
|
linux,code = <KEY_D>;
|
||||||
@@ -82,6 +85,7 @@
|
|||||||
label = "green:led5";
|
label = "green:led5";
|
||||||
gpios = <&gpioc 6 GPIO_ACTIVE_HIGH>;
|
gpios = <&gpioc 6 GPIO_ACTIVE_HIGH>;
|
||||||
default-state = "off";
|
default-state = "off";
|
||||||
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
led-1 {
|
led-1 {
|
||||||
@@ -185,8 +189,8 @@
|
|||||||
touchscreen@38 {
|
touchscreen@38 {
|
||||||
compatible = "edt,edt-ft5406";
|
compatible = "edt,edt-ft5406";
|
||||||
reg = <0x38>;
|
reg = <0x38>;
|
||||||
interrupt-parent = <&gpiog>;
|
interrupt-parent = <&gpioc>;
|
||||||
interrupts = <2 IRQ_TYPE_EDGE_FALLING>; /* GPIO E */
|
interrupts = <6 IRQ_TYPE_EDGE_FALLING>; /* GPIO E */
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
aliases {
|
aliases {
|
||||||
ethernet0 = ðernet0;
|
ethernet0 = ðernet0;
|
||||||
ethernet1 = &ksz8851;
|
ethernet1 = &ksz8851;
|
||||||
|
rtc0 = &hwrtc;
|
||||||
|
rtc1 = &rtc;
|
||||||
};
|
};
|
||||||
|
|
||||||
memory@c0000000 {
|
memory@c0000000 {
|
||||||
@@ -138,6 +140,7 @@
|
|||||||
reset-gpios = <&gpioh 3 GPIO_ACTIVE_LOW>;
|
reset-gpios = <&gpioh 3 GPIO_ACTIVE_LOW>;
|
||||||
reset-assert-us = <500>;
|
reset-assert-us = <500>;
|
||||||
reset-deassert-us = <500>;
|
reset-deassert-us = <500>;
|
||||||
|
smsc,disable-energy-detect;
|
||||||
interrupt-parent = <&gpioi>;
|
interrupt-parent = <&gpioi>;
|
||||||
interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
|
interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
|
||||||
};
|
};
|
||||||
@@ -248,7 +251,7 @@
|
|||||||
/delete-property/dmas;
|
/delete-property/dmas;
|
||||||
/delete-property/dma-names;
|
/delete-property/dma-names;
|
||||||
|
|
||||||
rtc@32 {
|
hwrtc: rtc@32 {
|
||||||
compatible = "microcrystal,rv8803";
|
compatible = "microcrystal,rv8803";
|
||||||
reg = <0x32>;
|
reg = <0x32>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ menuconfig ARCH_DAVINCI
|
|||||||
select PM_GENERIC_DOMAINS_OF if PM && OF
|
select PM_GENERIC_DOMAINS_OF if PM && OF
|
||||||
select REGMAP_MMIO
|
select REGMAP_MMIO
|
||||||
select RESET_CONTROLLER
|
select RESET_CONTROLLER
|
||||||
select HAVE_IDE
|
|
||||||
select PINCTRL_SINGLE
|
select PINCTRL_SINGLE
|
||||||
|
|
||||||
if ARCH_DAVINCI
|
if ARCH_DAVINCI
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ void imx_set_cpu_arg(int cpu, u32 arg);
|
|||||||
void v7_secondary_startup(void);
|
void v7_secondary_startup(void);
|
||||||
void imx_scu_map_io(void);
|
void imx_scu_map_io(void);
|
||||||
void imx_smp_prepare(void);
|
void imx_smp_prepare(void);
|
||||||
void imx_gpcv2_set_core1_pdn_pup_by_software(bool pdn);
|
|
||||||
#else
|
#else
|
||||||
static inline void imx_scu_map_io(void) {}
|
static inline void imx_scu_map_io(void) {}
|
||||||
static inline void imx_smp_prepare(void) {}
|
static inline void imx_smp_prepare(void) {}
|
||||||
@@ -81,6 +80,7 @@ void imx_gpc_mask_all(void);
|
|||||||
void imx_gpc_restore_all(void);
|
void imx_gpc_restore_all(void);
|
||||||
void imx_gpc_hwirq_mask(unsigned int hwirq);
|
void imx_gpc_hwirq_mask(unsigned int hwirq);
|
||||||
void imx_gpc_hwirq_unmask(unsigned int hwirq);
|
void imx_gpc_hwirq_unmask(unsigned int hwirq);
|
||||||
|
void imx_gpcv2_set_core1_pdn_pup_by_software(bool pdn);
|
||||||
void imx_anatop_init(void);
|
void imx_anatop_init(void);
|
||||||
void imx_anatop_pre_suspend(void);
|
void imx_anatop_pre_suspend(void);
|
||||||
void imx_anatop_post_resume(void);
|
void imx_anatop_post_resume(void);
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ struct mmdc_pmu {
|
|||||||
struct perf_event *mmdc_events[MMDC_NUM_COUNTERS];
|
struct perf_event *mmdc_events[MMDC_NUM_COUNTERS];
|
||||||
struct hlist_node node;
|
struct hlist_node node;
|
||||||
struct fsl_mmdc_devtype_data *devtype_data;
|
struct fsl_mmdc_devtype_data *devtype_data;
|
||||||
|
struct clk *mmdc_ipg_clk;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -462,11 +463,14 @@ static int imx_mmdc_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node);
|
cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node);
|
||||||
perf_pmu_unregister(&pmu_mmdc->pmu);
|
perf_pmu_unregister(&pmu_mmdc->pmu);
|
||||||
|
iounmap(pmu_mmdc->mmdc_base);
|
||||||
|
clk_disable_unprepare(pmu_mmdc->mmdc_ipg_clk);
|
||||||
kfree(pmu_mmdc);
|
kfree(pmu_mmdc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base)
|
static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base,
|
||||||
|
struct clk *mmdc_ipg_clk)
|
||||||
{
|
{
|
||||||
struct mmdc_pmu *pmu_mmdc;
|
struct mmdc_pmu *pmu_mmdc;
|
||||||
char *name;
|
char *name;
|
||||||
@@ -494,6 +498,7 @@ static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_b
|
|||||||
}
|
}
|
||||||
|
|
||||||
mmdc_num = mmdc_pmu_init(pmu_mmdc, mmdc_base, &pdev->dev);
|
mmdc_num = mmdc_pmu_init(pmu_mmdc, mmdc_base, &pdev->dev);
|
||||||
|
pmu_mmdc->mmdc_ipg_clk = mmdc_ipg_clk;
|
||||||
if (mmdc_num == 0)
|
if (mmdc_num == 0)
|
||||||
name = "mmdc";
|
name = "mmdc";
|
||||||
else
|
else
|
||||||
@@ -529,7 +534,7 @@ pmu_free:
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
#define imx_mmdc_remove NULL
|
#define imx_mmdc_remove NULL
|
||||||
#define imx_mmdc_perf_init(pdev, mmdc_base) 0
|
#define imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk) 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int imx_mmdc_probe(struct platform_device *pdev)
|
static int imx_mmdc_probe(struct platform_device *pdev)
|
||||||
@@ -567,7 +572,13 @@ static int imx_mmdc_probe(struct platform_device *pdev)
|
|||||||
val &= ~(1 << BP_MMDC_MAPSR_PSD);
|
val &= ~(1 << BP_MMDC_MAPSR_PSD);
|
||||||
writel_relaxed(val, reg);
|
writel_relaxed(val, reg);
|
||||||
|
|
||||||
return imx_mmdc_perf_init(pdev, mmdc_base);
|
err = imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk);
|
||||||
|
if (err) {
|
||||||
|
iounmap(mmdc_base);
|
||||||
|
clk_disable_unprepare(mmdc_ipg_clk);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int imx_mmdc_get_ddr_type(void)
|
int imx_mmdc_get_ddr_type(void)
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ config MACH_IXDP465
|
|||||||
|
|
||||||
config MACH_GORAMO_MLR
|
config MACH_GORAMO_MLR
|
||||||
bool "GORAMO Multi Link Router"
|
bool "GORAMO Multi Link Router"
|
||||||
|
depends on IXP4XX_PCI_LEGACY
|
||||||
help
|
help
|
||||||
Say 'Y' here if you want your kernel to support GORAMO
|
Say 'Y' here if you want your kernel to support GORAMO
|
||||||
MultiLink router.
|
MultiLink router.
|
||||||
|
|||||||
@@ -3776,6 +3776,7 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
|
|||||||
struct omap_hwmod_ocp_if *oi;
|
struct omap_hwmod_ocp_if *oi;
|
||||||
struct clockdomain *clkdm;
|
struct clockdomain *clkdm;
|
||||||
struct clk_hw_omap *clk;
|
struct clk_hw_omap *clk;
|
||||||
|
struct clk_hw *hw;
|
||||||
|
|
||||||
if (!oh)
|
if (!oh)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -3792,7 +3793,14 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
|
|||||||
c = oi->_clk;
|
c = oi->_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk = to_clk_hw_omap(__clk_get_hw(c));
|
hw = __clk_get_hw(c);
|
||||||
|
if (!hw)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
clk = to_clk_hw_omap(hw);
|
||||||
|
if (!clk)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
clkdm = clk->clkdm;
|
clkdm = clk->clkdm;
|
||||||
if (!clkdm)
|
if (!clkdm)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ static int __init parse_tag_acorn(const struct tag *tag)
|
|||||||
fallthrough; /* ??? */
|
fallthrough; /* ??? */
|
||||||
case 256:
|
case 256:
|
||||||
vram_size += PAGE_SIZE * 256;
|
vram_size += PAGE_SIZE * 256;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1602,6 +1602,9 @@ exit:
|
|||||||
rn = arm_bpf_get_reg32(src_lo, tmp2[1], ctx);
|
rn = arm_bpf_get_reg32(src_lo, tmp2[1], ctx);
|
||||||
emit_ldx_r(dst, rn, off, ctx, BPF_SIZE(code));
|
emit_ldx_r(dst, rn, off, ctx, BPF_SIZE(code));
|
||||||
break;
|
break;
|
||||||
|
/* speculation barrier */
|
||||||
|
case BPF_ST | BPF_NOSPEC:
|
||||||
|
break;
|
||||||
/* ST: *(size *)(dst + off) = imm */
|
/* ST: *(size *)(dst + off) = imm */
|
||||||
case BPF_ST | BPF_MEM | BPF_W:
|
case BPF_ST | BPF_MEM | BPF_W:
|
||||||
case BPF_ST | BPF_MEM | BPF_H:
|
case BPF_ST | BPF_MEM | BPF_H:
|
||||||
|
|||||||
@@ -1800,11 +1800,11 @@ config RANDOMIZE_BASE
|
|||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
config RANDOMIZE_MODULE_REGION_FULL
|
config RANDOMIZE_MODULE_REGION_FULL
|
||||||
bool "Randomize the module region over a 4 GB range"
|
bool "Randomize the module region over a 2 GB range"
|
||||||
depends on RANDOMIZE_BASE
|
depends on RANDOMIZE_BASE
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Randomizes the location of the module region inside a 4 GB window
|
Randomizes the location of the module region inside a 2 GB window
|
||||||
covering the core kernel. This way, it is less likely for modules
|
covering the core kernel. This way, it is less likely for modules
|
||||||
to leak information about the location of core kernel data structures
|
to leak information about the location of core kernel data structures
|
||||||
but it does imply that function calls between modules and the core
|
but it does imply that function calls between modules and the core
|
||||||
@@ -1812,7 +1812,10 @@ config RANDOMIZE_MODULE_REGION_FULL
|
|||||||
|
|
||||||
When this option is not set, the module region will be randomized over
|
When this option is not set, the module region will be randomized over
|
||||||
a limited range that contains the [_stext, _etext] interval of the
|
a limited range that contains the [_stext, _etext] interval of the
|
||||||
core kernel, so branch relocations are always in range.
|
core kernel, so branch relocations are almost always in range unless
|
||||||
|
ARM64_MODULE_PLTS is enabled and the region is exhausted. In this
|
||||||
|
particular case of region exhaustion, modules might be able to fall
|
||||||
|
back to a larger 2GB area.
|
||||||
|
|
||||||
config CC_HAVE_STACKPROTECTOR_SYSREG
|
config CC_HAVE_STACKPROTECTOR_SYSREG
|
||||||
def_bool $(cc-option,-mstack-protector-guard=sysreg -mstack-protector-guard-reg=sp_el0 -mstack-protector-guard-offset=0)
|
def_bool $(cc-option,-mstack-protector-guard=sysreg -mstack-protector-guard-reg=sp_el0 -mstack-protector-guard-offset=0)
|
||||||
|
|||||||
@@ -21,19 +21,11 @@ LDFLAGS_vmlinux += -shared -Bsymbolic -z notext \
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
|
ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
|
||||||
ifneq ($(CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419),y)
|
ifeq ($(CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419),y)
|
||||||
$(warning ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum)
|
|
||||||
else
|
|
||||||
LDFLAGS_vmlinux += --fix-cortex-a53-843419
|
LDFLAGS_vmlinux += --fix-cortex-a53-843419
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_ARM64_USE_LSE_ATOMICS), y)
|
|
||||||
ifneq ($(CONFIG_ARM64_LSE_ATOMICS), y)
|
|
||||||
$(warning LSE atomics not supported by binutils)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
cc_has_k_constraint := $(call try-run,echo \
|
cc_has_k_constraint := $(call try-run,echo \
|
||||||
'int main(void) { \
|
'int main(void) { \
|
||||||
asm volatile("and w0, w0, %w0" :: "K" (4294967295)); \
|
asm volatile("and w0, w0, %w0" :: "K" (4294967295)); \
|
||||||
@@ -179,6 +171,17 @@ vdso_install:
|
|||||||
|
|
||||||
archprepare:
|
archprepare:
|
||||||
$(Q)$(MAKE) $(build)=arch/arm64/tools kapi
|
$(Q)$(MAKE) $(build)=arch/arm64/tools kapi
|
||||||
|
ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
|
||||||
|
ifneq ($(CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419),y)
|
||||||
|
@echo "warning: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum" >&2
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_ARM64_USE_LSE_ATOMICS),y)
|
||||||
|
ifneq ($(CONFIG_ARM64_LSE_ATOMICS),y)
|
||||||
|
@echo "warning: LSE atomics not supported by binutils" >&2
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
# We use MRPROPER_FILES and CLEAN_FILES now
|
# We use MRPROPER_FILES and CLEAN_FILES now
|
||||||
archclean:
|
archclean:
|
||||||
|
|||||||
@@ -54,6 +54,7 @@
|
|||||||
|
|
||||||
&mscc_felix_port0 {
|
&mscc_felix_port0 {
|
||||||
label = "swp0";
|
label = "swp0";
|
||||||
|
managed = "in-band-status";
|
||||||
phy-handle = <&phy0>;
|
phy-handle = <&phy0>;
|
||||||
phy-mode = "sgmii";
|
phy-mode = "sgmii";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
@@ -61,6 +62,7 @@
|
|||||||
|
|
||||||
&mscc_felix_port1 {
|
&mscc_felix_port1 {
|
||||||
label = "swp1";
|
label = "swp1";
|
||||||
|
managed = "in-band-status";
|
||||||
phy-handle = <&phy1>;
|
phy-handle = <&phy1>;
|
||||||
phy-mode = "sgmii";
|
phy-mode = "sgmii";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
sysclk: clock-sysclk {
|
sysclk: sysclk {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <100000000>;
|
clock-frequency = <100000000>;
|
||||||
|
|||||||
@@ -579,7 +579,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
flexcan1: can@308c0000 {
|
flexcan1: can@308c0000 {
|
||||||
compatible = "fsl,imx8mp-flexcan", "fsl,imx6q-flexcan";
|
compatible = "fsl,imx8mp-flexcan";
|
||||||
reg = <0x308c0000 0x10000>;
|
reg = <0x308c0000 0x10000>;
|
||||||
interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
|
clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
|
||||||
@@ -594,7 +594,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
flexcan2: can@308d0000 {
|
flexcan2: can@308d0000 {
|
||||||
compatible = "fsl,imx8mp-flexcan", "fsl,imx6q-flexcan";
|
compatible = "fsl,imx8mp-flexcan";
|
||||||
reg = <0x308d0000 0x10000>;
|
reg = <0x308d0000 0x10000>;
|
||||||
interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
|
clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
aliases {
|
aliases {
|
||||||
spi0 = &spi0;
|
spi0 = &spi0;
|
||||||
ethernet1 = ð1;
|
ethernet1 = ð1;
|
||||||
|
mmc0 = &sdhci0;
|
||||||
|
mmc1 = &sdhci1;
|
||||||
};
|
};
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
@@ -119,6 +121,7 @@
|
|||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&i2c1_pins>;
|
pinctrl-0 = <&i2c1_pins>;
|
||||||
clock-frequency = <100000>;
|
clock-frequency = <100000>;
|
||||||
|
/delete-property/ mrvl,i2c-fast-mode;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
rtc@6f {
|
rtc@6f {
|
||||||
|
|||||||
@@ -1840,7 +1840,11 @@
|
|||||||
|
|
||||||
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE1R &emc>,
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE1R &emc>,
|
||||||
<&mc TEGRA194_MEMORY_CLIENT_PCIE1W &emc>;
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE1W &emc>;
|
||||||
interconnect-names = "read", "write";
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE1>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE1 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie@14120000 {
|
pcie@14120000 {
|
||||||
@@ -1890,7 +1894,11 @@
|
|||||||
|
|
||||||
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE2AR &emc>,
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE2AR &emc>,
|
||||||
<&mc TEGRA194_MEMORY_CLIENT_PCIE2AW &emc>;
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE2AW &emc>;
|
||||||
interconnect-names = "read", "write";
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE2>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE2 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie@14140000 {
|
pcie@14140000 {
|
||||||
@@ -1940,7 +1948,11 @@
|
|||||||
|
|
||||||
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE3R &emc>,
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE3R &emc>,
|
||||||
<&mc TEGRA194_MEMORY_CLIENT_PCIE3W &emc>;
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE3W &emc>;
|
||||||
interconnect-names = "read", "write";
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE3>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE3 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie@14160000 {
|
pcie@14160000 {
|
||||||
@@ -1990,7 +2002,11 @@
|
|||||||
|
|
||||||
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE4R &emc>,
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE4R &emc>,
|
||||||
<&mc TEGRA194_MEMORY_CLIENT_PCIE4W &emc>;
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE4W &emc>;
|
||||||
interconnect-names = "read", "write";
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE4>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE4 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie@14180000 {
|
pcie@14180000 {
|
||||||
@@ -2040,7 +2056,11 @@
|
|||||||
|
|
||||||
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE0R &emc>,
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE0R &emc>,
|
||||||
<&mc TEGRA194_MEMORY_CLIENT_PCIE0W &emc>;
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE0W &emc>;
|
||||||
interconnect-names = "read", "write";
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE0>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE0 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie@141a0000 {
|
pcie@141a0000 {
|
||||||
@@ -2094,7 +2114,11 @@
|
|||||||
|
|
||||||
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE5R &emc>,
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE5R &emc>,
|
||||||
<&mc TEGRA194_MEMORY_CLIENT_PCIE5W &emc>;
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE5W &emc>;
|
||||||
interconnect-names = "read", "write";
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE5>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE5 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie_ep@14160000 {
|
pcie_ep@14160000 {
|
||||||
@@ -2127,6 +2151,14 @@
|
|||||||
nvidia,aspm-cmrt-us = <60>;
|
nvidia,aspm-cmrt-us = <60>;
|
||||||
nvidia,aspm-pwr-on-t-us = <20>;
|
nvidia,aspm-pwr-on-t-us = <20>;
|
||||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||||
|
|
||||||
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE4R &emc>,
|
||||||
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE4W &emc>;
|
||||||
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE4>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE4 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie_ep@14180000 {
|
pcie_ep@14180000 {
|
||||||
@@ -2159,6 +2191,14 @@
|
|||||||
nvidia,aspm-cmrt-us = <60>;
|
nvidia,aspm-cmrt-us = <60>;
|
||||||
nvidia,aspm-pwr-on-t-us = <20>;
|
nvidia,aspm-pwr-on-t-us = <20>;
|
||||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||||
|
|
||||||
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE0R &emc>,
|
||||||
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE0W &emc>;
|
||||||
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE0>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE0 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie_ep@141a0000 {
|
pcie_ep@141a0000 {
|
||||||
@@ -2194,6 +2234,14 @@
|
|||||||
nvidia,aspm-cmrt-us = <60>;
|
nvidia,aspm-cmrt-us = <60>;
|
||||||
nvidia,aspm-pwr-on-t-us = <20>;
|
nvidia,aspm-pwr-on-t-us = <20>;
|
||||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||||
|
|
||||||
|
interconnects = <&mc TEGRA194_MEMORY_CLIENT_PCIE5R &emc>,
|
||||||
|
<&mc TEGRA194_MEMORY_CLIENT_PCIE5W &emc>;
|
||||||
|
interconnect-names = "dma-mem", "write";
|
||||||
|
iommus = <&smmu TEGRA194_SID_PCIE5>;
|
||||||
|
iommu-map = <0x0 &smmu TEGRA194_SID_PCIE5 0x1000>;
|
||||||
|
iommu-map-mask = <0x0>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
sram@40000000 {
|
sram@40000000 {
|
||||||
|
|||||||
@@ -213,10 +213,8 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG];
|
|||||||
|
|
||||||
/* AArch32 EABI. */
|
/* AArch32 EABI. */
|
||||||
#define EF_ARM_EABI_MASK 0xff000000
|
#define EF_ARM_EABI_MASK 0xff000000
|
||||||
#define compat_elf_check_arch(x) (system_supports_32bit_el0() && \
|
int compat_elf_check_arch(const struct elf32_hdr *);
|
||||||
((x)->e_machine == EM_ARM) && \
|
#define compat_elf_check_arch compat_elf_check_arch
|
||||||
((x)->e_flags & EF_ARM_EABI_MASK))
|
|
||||||
|
|
||||||
#define compat_start_thread compat_start_thread
|
#define compat_start_thread compat_start_thread
|
||||||
/*
|
/*
|
||||||
* Unlike the native SET_PERSONALITY macro, the compat version maintains
|
* Unlike the native SET_PERSONALITY macro, the compat version maintains
|
||||||
|
|||||||
@@ -231,6 +231,19 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
|||||||
update_saved_ttbr0(tsk, next);
|
update_saved_ttbr0(tsk, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const struct cpumask *
|
||||||
|
task_cpu_possible_mask(struct task_struct *p)
|
||||||
|
{
|
||||||
|
if (!static_branch_unlikely(&arm64_mismatched_32bit_el0))
|
||||||
|
return cpu_possible_mask;
|
||||||
|
|
||||||
|
if (!is_compat_thread(task_thread_info(p)))
|
||||||
|
return cpu_possible_mask;
|
||||||
|
|
||||||
|
return system_32bit_el0_cpumask();
|
||||||
|
}
|
||||||
|
#define task_cpu_possible_mask task_cpu_possible_mask
|
||||||
|
|
||||||
void verify_cpu_asid_bits(void);
|
void verify_cpu_asid_bits(void);
|
||||||
void post_ttbr_update_workaround(void);
|
void post_ttbr_update_workaround(void);
|
||||||
|
|
||||||
|
|||||||
@@ -320,7 +320,17 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
|
|||||||
|
|
||||||
static inline unsigned long regs_return_value(struct pt_regs *regs)
|
static inline unsigned long regs_return_value(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
return regs->regs[0];
|
unsigned long val = regs->regs[0];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Audit currently uses regs_return_value() instead of
|
||||||
|
* syscall_get_return_value(). Apply the same sign-extension here until
|
||||||
|
* audit is updated to use syscall_get_return_value().
|
||||||
|
*/
|
||||||
|
if (compat_user_mode(regs))
|
||||||
|
val = sign_extend64(val, 31);
|
||||||
|
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
|
static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ struct stack_info {
|
|||||||
* accounting information necessary for robust unwinding.
|
* accounting information necessary for robust unwinding.
|
||||||
*
|
*
|
||||||
* @fp: The fp value in the frame record (or the real fp)
|
* @fp: The fp value in the frame record (or the real fp)
|
||||||
* @pc: The fp value in the frame record (or the real lr)
|
* @pc: The lr value in the frame record (or the real lr)
|
||||||
*
|
*
|
||||||
* @stacks_done: Stacks which have been entirely unwound, for which it is no
|
* @stacks_done: Stacks which have been entirely unwound, for which it is no
|
||||||
* longer valid to unwind to.
|
* longer valid to unwind to.
|
||||||
|
|||||||
@@ -29,24 +29,25 @@ static inline void syscall_rollback(struct task_struct *task,
|
|||||||
regs->regs[0] = regs->orig_x0;
|
regs->regs[0] = regs->orig_x0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline long syscall_get_return_value(struct task_struct *task,
|
||||||
|
struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
unsigned long val = regs->regs[0];
|
||||||
|
|
||||||
|
if (is_compat_thread(task_thread_info(task)))
|
||||||
|
val = sign_extend64(val, 31);
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
static inline long syscall_get_error(struct task_struct *task,
|
static inline long syscall_get_error(struct task_struct *task,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long error = regs->regs[0];
|
unsigned long error = syscall_get_return_value(task, regs);
|
||||||
|
|
||||||
if (is_compat_thread(task_thread_info(task)))
|
|
||||||
error = sign_extend64(error, 31);
|
|
||||||
|
|
||||||
return IS_ERR_VALUE(error) ? error : 0;
|
return IS_ERR_VALUE(error) ? error : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline long syscall_get_return_value(struct task_struct *task,
|
|
||||||
struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
return regs->regs[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void syscall_set_return_value(struct task_struct *task,
|
static inline void syscall_set_return_value(struct task_struct *task,
|
||||||
struct pt_regs *regs,
|
struct pt_regs *regs,
|
||||||
int error, long val)
|
int error, long val)
|
||||||
|
|||||||
@@ -67,6 +67,7 @@
|
|||||||
#include <linux/crash_dump.h>
|
#include <linux/crash_dump.h>
|
||||||
#include <linux/sort.h>
|
#include <linux/sort.h>
|
||||||
#include <linux/stop_machine.h>
|
#include <linux/stop_machine.h>
|
||||||
|
#include <linux/sysfs.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/minmax.h>
|
#include <linux/minmax.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
@@ -1321,6 +1322,31 @@ const struct cpumask *system_32bit_el0_cpumask(void)
|
|||||||
return cpu_possible_mask;
|
return cpu_possible_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __init parse_32bit_el0_param(char *str)
|
||||||
|
{
|
||||||
|
allow_mismatched_32bit_el0 = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
early_param("allow_mismatched_32bit_el0", parse_32bit_el0_param);
|
||||||
|
|
||||||
|
static ssize_t aarch32_el0_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
const struct cpumask *mask = system_32bit_el0_cpumask();
|
||||||
|
|
||||||
|
return sysfs_emit(buf, "%*pbl\n", cpumask_pr_args(mask));
|
||||||
|
}
|
||||||
|
static const DEVICE_ATTR_RO(aarch32_el0);
|
||||||
|
|
||||||
|
static int __init aarch32_el0_sysfs_init(void)
|
||||||
|
{
|
||||||
|
if (!allow_mismatched_32bit_el0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return device_create_file(cpu_subsys.dev_root, &dev_attr_aarch32_el0);
|
||||||
|
}
|
||||||
|
device_initcall(aarch32_el0_sysfs_init);
|
||||||
|
|
||||||
static bool has_32bit_el0(const struct arm64_cpu_capabilities *entry, int scope)
|
static bool has_32bit_el0(const struct arm64_cpu_capabilities *entry, int scope)
|
||||||
{
|
{
|
||||||
if (!has_cpuid_feature(entry, scope))
|
if (!has_cpuid_feature(entry, scope))
|
||||||
@@ -2902,15 +2928,38 @@ void __init setup_cpu_features(void)
|
|||||||
|
|
||||||
static int enable_mismatched_32bit_el0(unsigned int cpu)
|
static int enable_mismatched_32bit_el0(unsigned int cpu)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* The first 32-bit-capable CPU we detected and so can no longer
|
||||||
|
* be offlined by userspace. -1 indicates we haven't yet onlined
|
||||||
|
* a 32-bit-capable CPU.
|
||||||
|
*/
|
||||||
|
static int lucky_winner = -1;
|
||||||
|
|
||||||
struct cpuinfo_arm64 *info = &per_cpu(cpu_data, cpu);
|
struct cpuinfo_arm64 *info = &per_cpu(cpu_data, cpu);
|
||||||
bool cpu_32bit = id_aa64pfr0_32bit_el0(info->reg_id_aa64pfr0);
|
bool cpu_32bit = id_aa64pfr0_32bit_el0(info->reg_id_aa64pfr0);
|
||||||
|
|
||||||
if (cpu_32bit) {
|
if (cpu_32bit) {
|
||||||
cpumask_set_cpu(cpu, cpu_32bit_el0_mask);
|
cpumask_set_cpu(cpu, cpu_32bit_el0_mask);
|
||||||
static_branch_enable_cpuslocked(&arm64_mismatched_32bit_el0);
|
static_branch_enable_cpuslocked(&arm64_mismatched_32bit_el0);
|
||||||
setup_elf_hwcaps(compat_elf_hwcaps);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cpumask_test_cpu(0, cpu_32bit_el0_mask) == cpu_32bit)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (lucky_winner >= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We've detected a mismatch. We need to keep one of our CPUs with
|
||||||
|
* 32-bit EL0 online so that is_cpu_allowed() doesn't end up rejecting
|
||||||
|
* every CPU in the system for a 32-bit task.
|
||||||
|
*/
|
||||||
|
lucky_winner = cpu_32bit ? cpu : cpumask_any_and(cpu_32bit_el0_mask,
|
||||||
|
cpu_active_mask);
|
||||||
|
get_cpu_device(lucky_winner)->offline_disabled = true;
|
||||||
|
setup_elf_hwcaps(compat_elf_hwcaps);
|
||||||
|
pr_info("Asymmetric 32-bit EL0 support detected on CPU %u; CPU hot-unplug disabled on CPU %u\n",
|
||||||
|
cpu, lucky_winner);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -162,7 +162,9 @@ u64 __init kaslr_early_init(void)
|
|||||||
* a PAGE_SIZE multiple in the range [_etext - MODULES_VSIZE,
|
* a PAGE_SIZE multiple in the range [_etext - MODULES_VSIZE,
|
||||||
* _stext) . This guarantees that the resulting region still
|
* _stext) . This guarantees that the resulting region still
|
||||||
* covers [_stext, _etext], and that all relative branches can
|
* covers [_stext, _etext], and that all relative branches can
|
||||||
* be resolved without veneers.
|
* be resolved without veneers unless this region is exhausted
|
||||||
|
* and we fall back to a larger 2GB window in module_alloc()
|
||||||
|
* when ARM64_MODULE_PLTS is enabled.
|
||||||
*/
|
*/
|
||||||
module_range = MODULES_VSIZE - (u64)(_etext - _stext);
|
module_range = MODULES_VSIZE - (u64)(_etext - _stext);
|
||||||
module_alloc_base = (u64)_etext + offset - MODULES_VSIZE;
|
module_alloc_base = (u64)_etext + offset - MODULES_VSIZE;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include <linux/mman.h>
|
#include <linux/mman.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/nospec.h>
|
#include <linux/nospec.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/sysctl.h>
|
#include <linux/sysctl.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
@@ -472,15 +473,6 @@ static void erratum_1418040_thread_switch(struct task_struct *prev,
|
|||||||
write_sysreg(val, cntkctl_el1);
|
write_sysreg(val, cntkctl_el1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compat_thread_switch(struct task_struct *next)
|
|
||||||
{
|
|
||||||
if (!is_compat_thread(task_thread_info(next)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (static_branch_unlikely(&arm64_mismatched_32bit_el0))
|
|
||||||
set_tsk_thread_flag(next, TIF_NOTIFY_RESUME);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* __switch_to() checks current->thread.sctlr_user as an optimisation. Therefore
|
* __switch_to() checks current->thread.sctlr_user as an optimisation. Therefore
|
||||||
* this function must be called with preemption disabled and the update to
|
* this function must be called with preemption disabled and the update to
|
||||||
@@ -515,7 +507,6 @@ __notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev,
|
|||||||
ssbs_thread_switch(next);
|
ssbs_thread_switch(next);
|
||||||
erratum_1418040_thread_switch(prev, next);
|
erratum_1418040_thread_switch(prev, next);
|
||||||
ptrauth_thread_switch_user(next);
|
ptrauth_thread_switch_user(next);
|
||||||
compat_thread_switch(next);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Complete any pending TLB or cache maintenance on this CPU in case
|
* Complete any pending TLB or cache maintenance on this CPU in case
|
||||||
@@ -576,6 +567,28 @@ unsigned long arch_align_stack(unsigned long sp)
|
|||||||
return sp & ~0xf;
|
return sp & ~0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
int compat_elf_check_arch(const struct elf32_hdr *hdr)
|
||||||
|
{
|
||||||
|
if (!system_supports_32bit_el0())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((hdr)->e_machine != EM_ARM)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!((hdr)->e_flags & EF_ARM_EABI_MASK))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prevent execve() of a 32-bit program from a deadline task
|
||||||
|
* if the restricted affinity mask would be inadmissible on an
|
||||||
|
* asymmetric system.
|
||||||
|
*/
|
||||||
|
return !static_branch_unlikely(&arm64_mismatched_32bit_el0) ||
|
||||||
|
!dl_task_check_affinity(current, system_32bit_el0_cpumask());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called from setup_new_exec() after (COMPAT_)SET_PERSONALITY.
|
* Called from setup_new_exec() after (COMPAT_)SET_PERSONALITY.
|
||||||
*/
|
*/
|
||||||
@@ -585,8 +598,20 @@ void arch_setup_new_exec(void)
|
|||||||
|
|
||||||
if (is_compat_task()) {
|
if (is_compat_task()) {
|
||||||
mmflags = MMCF_AARCH32;
|
mmflags = MMCF_AARCH32;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restrict the CPU affinity mask for a 32-bit task so that
|
||||||
|
* it contains only 32-bit-capable CPUs.
|
||||||
|
*
|
||||||
|
* From the perspective of the task, this looks similar to
|
||||||
|
* what would happen if the 64-bit-only CPUs were hot-unplugged
|
||||||
|
* at the point of execve(), although we try a bit harder to
|
||||||
|
* honour the cpuset hierarchy.
|
||||||
|
*/
|
||||||
if (static_branch_unlikely(&arm64_mismatched_32bit_el0))
|
if (static_branch_unlikely(&arm64_mismatched_32bit_el0))
|
||||||
set_tsk_thread_flag(current, TIF_NOTIFY_RESUME);
|
force_compatible_cpus_allowed_ptr(current);
|
||||||
|
} else if (static_branch_unlikely(&arm64_mismatched_32bit_el0)) {
|
||||||
|
relax_compatible_cpus_allowed_ptr(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
current->mm->context.flags = mmflags;
|
current->mm->context.flags = mmflags;
|
||||||
|
|||||||
@@ -1867,7 +1867,7 @@ void syscall_trace_exit(struct pt_regs *regs)
|
|||||||
audit_syscall_exit(regs);
|
audit_syscall_exit(regs);
|
||||||
|
|
||||||
if (flags & _TIF_SYSCALL_TRACEPOINT)
|
if (flags & _TIF_SYSCALL_TRACEPOINT)
|
||||||
trace_sys_exit(regs, regs_return_value(regs));
|
trace_sys_exit(regs, syscall_get_return_value(current, regs));
|
||||||
|
|
||||||
if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP))
|
if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP))
|
||||||
tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);
|
tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/fpsimd.h>
|
#include <asm/fpsimd.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
#include <asm/syscall.h>
|
||||||
#include <asm/signal32.h>
|
#include <asm/signal32.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
#include <asm/vdso.h>
|
#include <asm/vdso.h>
|
||||||
@@ -895,7 +896,7 @@ static void do_signal(struct pt_regs *regs)
|
|||||||
retval == -ERESTART_RESTARTBLOCK ||
|
retval == -ERESTART_RESTARTBLOCK ||
|
||||||
(retval == -ERESTARTSYS &&
|
(retval == -ERESTARTSYS &&
|
||||||
!(ksig.ka.sa.sa_flags & SA_RESTART)))) {
|
!(ksig.ka.sa.sa_flags & SA_RESTART)))) {
|
||||||
regs->regs[0] = -EINTR;
|
syscall_set_return_value(current, regs, -EINTR, 0);
|
||||||
regs->pc = continue_addr;
|
regs->pc = continue_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -916,19 +917,6 @@ static void do_signal(struct pt_regs *regs)
|
|||||||
restore_saved_sigmask();
|
restore_saved_sigmask();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool cpu_affinity_invalid(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
if (!compat_user_mode(regs))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We're preemptible, but a reschedule will cause us to check the
|
|
||||||
* affinity again.
|
|
||||||
*/
|
|
||||||
return !cpumask_test_cpu(raw_smp_processor_id(),
|
|
||||||
system_32bit_el0_cpumask());
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_notify_resume(struct pt_regs *regs, unsigned long thread_flags)
|
void do_notify_resume(struct pt_regs *regs, unsigned long thread_flags)
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
@@ -955,19 +943,6 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_flags)
|
|||||||
if (thread_flags & _TIF_NOTIFY_RESUME) {
|
if (thread_flags & _TIF_NOTIFY_RESUME) {
|
||||||
tracehook_notify_resume(regs);
|
tracehook_notify_resume(regs);
|
||||||
rseq_handle_notify_resume(NULL, regs);
|
rseq_handle_notify_resume(NULL, regs);
|
||||||
|
|
||||||
/*
|
|
||||||
* If we reschedule after checking the affinity
|
|
||||||
* then we must ensure that TIF_NOTIFY_RESUME
|
|
||||||
* is set so that we check the affinity again.
|
|
||||||
* Since tracehook_notify_resume() clears the
|
|
||||||
* flag, ensure that the compiler doesn't move
|
|
||||||
* it after the affinity check.
|
|
||||||
*/
|
|
||||||
barrier();
|
|
||||||
|
|
||||||
if (cpu_affinity_invalid(regs))
|
|
||||||
force_sig(SIGKILL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thread_flags & _TIF_FOREIGN_FPSTATE)
|
if (thread_flags & _TIF_FOREIGN_FPSTATE)
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ void show_stack(struct task_struct *tsk, unsigned long *sp, const char *loglvl)
|
|||||||
|
|
||||||
#ifdef CONFIG_STACKTRACE
|
#ifdef CONFIG_STACKTRACE
|
||||||
|
|
||||||
noinline void arch_stack_walk(stack_trace_consume_fn consume_entry,
|
noinline notrace void arch_stack_walk(stack_trace_consume_fn consume_entry,
|
||||||
void *cookie, struct task_struct *task,
|
void *cookie, struct task_struct *task,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -54,10 +54,7 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
|
|||||||
ret = do_ni_syscall(regs, scno);
|
ret = do_ni_syscall(regs, scno);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_compat_task())
|
syscall_set_return_value(current, regs, 0, ret);
|
||||||
ret = lower_32_bits(ret);
|
|
||||||
|
|
||||||
regs->regs[0] = ret;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(),
|
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(),
|
||||||
@@ -115,7 +112,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
|
|||||||
* syscall. do_notify_resume() will send a signal to userspace
|
* syscall. do_notify_resume() will send a signal to userspace
|
||||||
* before the syscall is restarted.
|
* before the syscall is restarted.
|
||||||
*/
|
*/
|
||||||
regs->regs[0] = -ERESTARTNOINTR;
|
syscall_set_return_value(current, regs, -ERESTARTNOINTR, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +133,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
|
|||||||
* anyway.
|
* anyway.
|
||||||
*/
|
*/
|
||||||
if (scno == NO_SYSCALL)
|
if (scno == NO_SYSCALL)
|
||||||
regs->regs[0] = -ENOSYS;
|
syscall_set_return_value(current, regs, -ENOSYS, 0);
|
||||||
scno = syscall_trace_enter(regs);
|
scno = syscall_trace_enter(regs);
|
||||||
if (scno == NO_SYSCALL)
|
if (scno == NO_SYSCALL)
|
||||||
goto trace_exit;
|
goto trace_exit;
|
||||||
|
|||||||
@@ -94,10 +94,14 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
|
|||||||
kvm->arch.return_nisv_io_abort_to_user = true;
|
kvm->arch.return_nisv_io_abort_to_user = true;
|
||||||
break;
|
break;
|
||||||
case KVM_CAP_ARM_MTE:
|
case KVM_CAP_ARM_MTE:
|
||||||
if (!system_supports_mte() || kvm->created_vcpus)
|
mutex_lock(&kvm->lock);
|
||||||
return -EINVAL;
|
if (!system_supports_mte() || kvm->created_vcpus) {
|
||||||
|
r = -EINVAL;
|
||||||
|
} else {
|
||||||
r = 0;
|
r = 0;
|
||||||
kvm->arch.mte_enabled = true;
|
kvm->arch.mte_enabled = true;
|
||||||
|
}
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
r = -EINVAL;
|
r = -EINVAL;
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ static bool range_is_memory(u64 start, u64 end)
|
|||||||
{
|
{
|
||||||
struct kvm_mem_range r1, r2;
|
struct kvm_mem_range r1, r2;
|
||||||
|
|
||||||
if (!find_mem_range(start, &r1) || !find_mem_range(end, &r2))
|
if (!find_mem_range(start, &r1) || !find_mem_range(end - 1, &r2))
|
||||||
return false;
|
return false;
|
||||||
if (r1.start != r2.start)
|
if (r1.start != r2.start)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -947,7 +947,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
|||||||
vma_shift = get_vma_page_shift(vma, hva);
|
vma_shift = get_vma_page_shift(vma, hva);
|
||||||
}
|
}
|
||||||
|
|
||||||
shared = (vma->vm_flags & VM_PFNMAP);
|
shared = (vma->vm_flags & VM_SHARED);
|
||||||
|
|
||||||
switch (vma_shift) {
|
switch (vma_shift) {
|
||||||
#ifndef __PAGETABLE_PMD_FOLDED
|
#ifndef __PAGETABLE_PMD_FOLDED
|
||||||
|
|||||||
@@ -823,6 +823,19 @@ emit_cond_jmp:
|
|||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* speculation barrier */
|
||||||
|
case BPF_ST | BPF_NOSPEC:
|
||||||
|
/*
|
||||||
|
* Nothing required here.
|
||||||
|
*
|
||||||
|
* In case of arm64, we rely on the firmware mitigation of
|
||||||
|
* Speculative Store Bypass as controlled via the ssbd kernel
|
||||||
|
* parameter. Whenever the mitigation is enabled, it works
|
||||||
|
* for all of the kernel code with no need to provide any
|
||||||
|
* additional instructions.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
|
||||||
/* ST: *(size *)(dst + off) = imm */
|
/* ST: *(size *)(dst + off) = imm */
|
||||||
case BPF_ST | BPF_MEM | BPF_W:
|
case BPF_ST | BPF_MEM | BPF_W:
|
||||||
case BPF_ST | BPF_MEM | BPF_H:
|
case BPF_ST | BPF_MEM | BPF_H:
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ config H8300_H8MAX
|
|||||||
bool "H8MAX"
|
bool "H8MAX"
|
||||||
select H83069
|
select H83069
|
||||||
select RAMKERNEL
|
select RAMKERNEL
|
||||||
select HAVE_IDE
|
|
||||||
help
|
help
|
||||||
H8MAX Evaluation Board Support
|
H8MAX Evaluation Board Support
|
||||||
More Information. (Japanese Only)
|
More Information. (Japanese Only)
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ config IA64
|
|||||||
select HAVE_ASM_MODVERSIONS
|
select HAVE_ASM_MODVERSIONS
|
||||||
select HAVE_UNSTABLE_SCHED_CLOCK
|
select HAVE_UNSTABLE_SCHED_CLOCK
|
||||||
select HAVE_EXIT_THREAD
|
select HAVE_EXIT_THREAD
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_KPROBES
|
select HAVE_KPROBES
|
||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
select HAVE_FTRACE_MCOUNT_RECORD
|
select HAVE_FTRACE_MCOUNT_RECORD
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ config M68K
|
|||||||
select HAVE_DEBUG_BUGVERBOSE
|
select HAVE_DEBUG_BUGVERBOSE
|
||||||
select HAVE_EFFICIENT_UNALIGNED_ACCESS if !CPU_HAS_NO_UNALIGNED
|
select HAVE_EFFICIENT_UNALIGNED_ACCESS if !CPU_HAS_NO_UNALIGNED
|
||||||
select HAVE_FUTEX_CMPXCHG if MMU && FUTEX
|
select HAVE_FUTEX_CMPXCHG if MMU && FUTEX
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_MOD_ARCH_SPECIFIC
|
select HAVE_MOD_ARCH_SPECIFIC
|
||||||
select HAVE_UID16
|
select HAVE_UID16
|
||||||
select MMU_GATHER_NO_RANGE if MMU
|
select MMU_GATHER_NO_RANGE if MMU
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ DEFINE_CLK(pll, "pll.0", MCF_CLK);
|
|||||||
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
|
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
|
||||||
|
|
||||||
static struct clk_lookup m525x_clk_lookup[] = {
|
static struct clk_lookup m525x_clk_lookup[] = {
|
||||||
CLKDEV_INIT(NULL, "pll.0", &pll),
|
CLKDEV_INIT(NULL, "pll.0", &clk_pll),
|
||||||
CLKDEV_INIT(NULL, "sys.0", &clk_sys),
|
CLKDEV_INIT(NULL, "sys.0", &clk_sys),
|
||||||
CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
|
CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
|
||||||
CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
|
CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ config MIPS
|
|||||||
select HAVE_FUNCTION_TRACER
|
select HAVE_FUNCTION_TRACER
|
||||||
select HAVE_GCC_PLUGINS
|
select HAVE_GCC_PLUGINS
|
||||||
select HAVE_GENERIC_VDSO
|
select HAVE_GENERIC_VDSO
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_IOREMAP_PROT
|
select HAVE_IOREMAP_PROT
|
||||||
select HAVE_IRQ_EXIT_ON_IRQ_STACK
|
select HAVE_IRQ_EXIT_ON_IRQ_STACK
|
||||||
select HAVE_IRQ_TIME_ACCOUNTING
|
select HAVE_IRQ_TIME_ACCOUNTING
|
||||||
|
|||||||
@@ -321,7 +321,7 @@ KBUILD_LDFLAGS += -m $(ld-emul)
|
|||||||
|
|
||||||
ifdef CONFIG_MIPS
|
ifdef CONFIG_MIPS
|
||||||
CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
|
CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
|
||||||
egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \
|
egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \
|
||||||
sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
|
sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
@@ -58,15 +58,20 @@ do { \
|
|||||||
|
|
||||||
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||||
{
|
{
|
||||||
pmd_t *pmd = NULL;
|
pmd_t *pmd;
|
||||||
struct page *pg;
|
struct page *pg;
|
||||||
|
|
||||||
pg = alloc_pages(GFP_KERNEL | __GFP_ACCOUNT, PMD_ORDER);
|
pg = alloc_pages(GFP_KERNEL_ACCOUNT, PMD_ORDER);
|
||||||
if (pg) {
|
if (!pg)
|
||||||
pgtable_pmd_page_ctor(pg);
|
return NULL;
|
||||||
|
|
||||||
|
if (!pgtable_pmd_page_ctor(pg)) {
|
||||||
|
__free_pages(pg, PMD_ORDER);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
pmd = (pmd_t *)page_address(pg);
|
pmd = (pmd_t *)page_address(pg);
|
||||||
pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
|
pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
|
||||||
}
|
|
||||||
return pmd;
|
return pmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ static struct plat_serial8250_port uart8250_data[] = {
|
|||||||
.mapbase = 0x1f000900, /* The CBUS UART */
|
.mapbase = 0x1f000900, /* The CBUS UART */
|
||||||
.irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2,
|
.irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2,
|
||||||
.uartclk = 3686400, /* Twice the usual clk! */
|
.uartclk = 3686400, /* Twice the usual clk! */
|
||||||
.iotype = UPIO_MEM32,
|
.iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
|
||||||
|
UPIO_MEM32BE : UPIO_MEM32,
|
||||||
.flags = CBUS_UART_FLAGS,
|
.flags = CBUS_UART_FLAGS,
|
||||||
.regshift = 3,
|
.regshift = 3,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1355,6 +1355,9 @@ jeq_common:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case BPF_ST | BPF_NOSPEC: /* speculation barrier */
|
||||||
|
break;
|
||||||
|
|
||||||
case BPF_ST | BPF_B | BPF_MEM:
|
case BPF_ST | BPF_B | BPF_MEM:
|
||||||
case BPF_ST | BPF_H | BPF_MEM:
|
case BPF_ST | BPF_H | BPF_MEM:
|
||||||
case BPF_ST | BPF_W | BPF_MEM:
|
case BPF_ST | BPF_W | BPF_MEM:
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ config PARISC
|
|||||||
def_bool y
|
def_bool y
|
||||||
select ARCH_32BIT_OFF_T if !64BIT
|
select ARCH_32BIT_OFF_T if !64BIT
|
||||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_FUNCTION_TRACER
|
select HAVE_FUNCTION_TRACER
|
||||||
select HAVE_FUNCTION_GRAPH_TRACER
|
select HAVE_FUNCTION_GRAPH_TRACER
|
||||||
select HAVE_SYSCALL_TRACEPOINTS
|
select HAVE_SYSCALL_TRACEPOINTS
|
||||||
|
|||||||
@@ -220,7 +220,6 @@ config PPC
|
|||||||
select HAVE_HARDLOCKUP_DETECTOR_ARCH if PPC_BOOK3S_64 && SMP
|
select HAVE_HARDLOCKUP_DETECTOR_ARCH if PPC_BOOK3S_64 && SMP
|
||||||
select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH
|
select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||||
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
|
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_IOREMAP_PROT
|
select HAVE_IOREMAP_PROT
|
||||||
select HAVE_IRQ_EXIT_ON_IRQ_STACK
|
select HAVE_IRQ_EXIT_ON_IRQ_STACK
|
||||||
select HAVE_IRQ_TIME_ACCOUNTING
|
select HAVE_IRQ_TIME_ACCOUNTING
|
||||||
|
|||||||
@@ -583,6 +583,9 @@ DECLARE_INTERRUPT_HANDLER_NMI(hmi_exception_realmode);
|
|||||||
|
|
||||||
DECLARE_INTERRUPT_HANDLER_ASYNC(TAUException);
|
DECLARE_INTERRUPT_HANDLER_ASYNC(TAUException);
|
||||||
|
|
||||||
|
/* irq.c */
|
||||||
|
DECLARE_INTERRUPT_HANDLER_ASYNC(do_IRQ);
|
||||||
|
|
||||||
void __noreturn unrecoverable_exception(struct pt_regs *regs);
|
void __noreturn unrecoverable_exception(struct pt_regs *regs);
|
||||||
|
|
||||||
void replay_system_reset(void);
|
void replay_system_reset(void);
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ extern void *mcheckirq_ctx[NR_CPUS];
|
|||||||
extern void *hardirq_ctx[NR_CPUS];
|
extern void *hardirq_ctx[NR_CPUS];
|
||||||
extern void *softirq_ctx[NR_CPUS];
|
extern void *softirq_ctx[NR_CPUS];
|
||||||
|
|
||||||
extern void do_IRQ(struct pt_regs *regs);
|
void __do_IRQ(struct pt_regs *regs);
|
||||||
extern void __init init_IRQ(void);
|
extern void __init init_IRQ(void);
|
||||||
extern void __do_irq(struct pt_regs *regs);
|
extern void __do_irq(struct pt_regs *regs);
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,22 @@ struct pt_regs
|
|||||||
unsigned long __pad[4]; /* Maintain 16 byte interrupt stack alignment */
|
unsigned long __pad[4]; /* Maintain 16 byte interrupt stack alignment */
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CONFIG_PPC32) && defined(CONFIG_BOOKE)
|
||||||
|
struct { /* Must be a multiple of 16 bytes */
|
||||||
|
unsigned long mas0;
|
||||||
|
unsigned long mas1;
|
||||||
|
unsigned long mas2;
|
||||||
|
unsigned long mas3;
|
||||||
|
unsigned long mas6;
|
||||||
|
unsigned long mas7;
|
||||||
|
unsigned long srr0;
|
||||||
|
unsigned long srr1;
|
||||||
|
unsigned long csrr0;
|
||||||
|
unsigned long csrr1;
|
||||||
|
unsigned long dsrr0;
|
||||||
|
unsigned long dsrr1;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -309,24 +309,21 @@ int main(void)
|
|||||||
STACK_PT_REGS_OFFSET(STACK_REGS_IAMR, iamr);
|
STACK_PT_REGS_OFFSET(STACK_REGS_IAMR, iamr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PPC32)
|
#if defined(CONFIG_PPC32) && defined(CONFIG_BOOKE)
|
||||||
#if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
|
STACK_PT_REGS_OFFSET(MAS0, mas0);
|
||||||
DEFINE(EXC_LVL_SIZE, STACK_EXC_LVL_FRAME_SIZE);
|
|
||||||
DEFINE(MAS0, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas0));
|
|
||||||
/* we overload MMUCR for 44x on MAS0 since they are mutually exclusive */
|
/* we overload MMUCR for 44x on MAS0 since they are mutually exclusive */
|
||||||
DEFINE(MMUCR, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas0));
|
STACK_PT_REGS_OFFSET(MMUCR, mas0);
|
||||||
DEFINE(MAS1, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas1));
|
STACK_PT_REGS_OFFSET(MAS1, mas1);
|
||||||
DEFINE(MAS2, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas2));
|
STACK_PT_REGS_OFFSET(MAS2, mas2);
|
||||||
DEFINE(MAS3, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas3));
|
STACK_PT_REGS_OFFSET(MAS3, mas3);
|
||||||
DEFINE(MAS6, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas6));
|
STACK_PT_REGS_OFFSET(MAS6, mas6);
|
||||||
DEFINE(MAS7, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas7));
|
STACK_PT_REGS_OFFSET(MAS7, mas7);
|
||||||
DEFINE(_SRR0, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, srr0));
|
STACK_PT_REGS_OFFSET(_SRR0, srr0);
|
||||||
DEFINE(_SRR1, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, srr1));
|
STACK_PT_REGS_OFFSET(_SRR1, srr1);
|
||||||
DEFINE(_CSRR0, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, csrr0));
|
STACK_PT_REGS_OFFSET(_CSRR0, csrr0);
|
||||||
DEFINE(_CSRR1, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, csrr1));
|
STACK_PT_REGS_OFFSET(_CSRR1, csrr1);
|
||||||
DEFINE(_DSRR0, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, dsrr0));
|
STACK_PT_REGS_OFFSET(_DSRR0, dsrr0);
|
||||||
DEFINE(_DSRR1, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, dsrr1));
|
STACK_PT_REGS_OFFSET(_DSRR1, dsrr1);
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* About the CPU features table */
|
/* About the CPU features table */
|
||||||
|
|||||||
@@ -300,7 +300,7 @@ ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE)
|
|||||||
EXCEPTION_PROLOG_1
|
EXCEPTION_PROLOG_1
|
||||||
EXCEPTION_PROLOG_2 INTERRUPT_DATA_STORAGE DataAccess handle_dar_dsisr=1
|
EXCEPTION_PROLOG_2 INTERRUPT_DATA_STORAGE DataAccess handle_dar_dsisr=1
|
||||||
prepare_transfer_to_handler
|
prepare_transfer_to_handler
|
||||||
lwz r5, _DSISR(r11)
|
lwz r5, _DSISR(r1)
|
||||||
andis. r0, r5, DSISR_DABRMATCH@h
|
andis. r0, r5, DSISR_DABRMATCH@h
|
||||||
bne- 1f
|
bne- 1f
|
||||||
bl do_page_fault
|
bl do_page_fault
|
||||||
|
|||||||
@@ -168,20 +168,18 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)
|
|||||||
/* only on e500mc */
|
/* only on e500mc */
|
||||||
#define DBG_STACK_BASE dbgirq_ctx
|
#define DBG_STACK_BASE dbgirq_ctx
|
||||||
|
|
||||||
#define EXC_LVL_FRAME_OVERHEAD (THREAD_SIZE - INT_FRAME_SIZE - EXC_LVL_SIZE)
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
#define BOOKE_LOAD_EXC_LEVEL_STACK(level) \
|
#define BOOKE_LOAD_EXC_LEVEL_STACK(level) \
|
||||||
mfspr r8,SPRN_PIR; \
|
mfspr r8,SPRN_PIR; \
|
||||||
slwi r8,r8,2; \
|
slwi r8,r8,2; \
|
||||||
addis r8,r8,level##_STACK_BASE@ha; \
|
addis r8,r8,level##_STACK_BASE@ha; \
|
||||||
lwz r8,level##_STACK_BASE@l(r8); \
|
lwz r8,level##_STACK_BASE@l(r8); \
|
||||||
addi r8,r8,EXC_LVL_FRAME_OVERHEAD;
|
addi r8,r8,THREAD_SIZE - INT_FRAME_SIZE;
|
||||||
#else
|
#else
|
||||||
#define BOOKE_LOAD_EXC_LEVEL_STACK(level) \
|
#define BOOKE_LOAD_EXC_LEVEL_STACK(level) \
|
||||||
lis r8,level##_STACK_BASE@ha; \
|
lis r8,level##_STACK_BASE@ha; \
|
||||||
lwz r8,level##_STACK_BASE@l(r8); \
|
lwz r8,level##_STACK_BASE@l(r8); \
|
||||||
addi r8,r8,EXC_LVL_FRAME_OVERHEAD;
|
addi r8,r8,THREAD_SIZE - INT_FRAME_SIZE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -208,7 +206,7 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)
|
|||||||
mtmsr r11; \
|
mtmsr r11; \
|
||||||
mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
|
mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
|
||||||
lwz r11, TASK_STACK - THREAD(r11); /* this thread's kernel stack */\
|
lwz r11, TASK_STACK - THREAD(r11); /* this thread's kernel stack */\
|
||||||
addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\
|
addi r11,r11,THREAD_SIZE - INT_FRAME_SIZE; /* allocate stack frame */\
|
||||||
beq 1f; \
|
beq 1f; \
|
||||||
/* COMING FROM USER MODE */ \
|
/* COMING FROM USER MODE */ \
|
||||||
stw r9,_CCR(r11); /* save CR */\
|
stw r9,_CCR(r11); /* save CR */\
|
||||||
@@ -516,24 +514,5 @@ label:
|
|||||||
bl kernel_fp_unavailable_exception; \
|
bl kernel_fp_unavailable_exception; \
|
||||||
b interrupt_return
|
b interrupt_return
|
||||||
|
|
||||||
#else /* __ASSEMBLY__ */
|
|
||||||
struct exception_regs {
|
|
||||||
unsigned long mas0;
|
|
||||||
unsigned long mas1;
|
|
||||||
unsigned long mas2;
|
|
||||||
unsigned long mas3;
|
|
||||||
unsigned long mas6;
|
|
||||||
unsigned long mas7;
|
|
||||||
unsigned long srr0;
|
|
||||||
unsigned long srr1;
|
|
||||||
unsigned long csrr0;
|
|
||||||
unsigned long csrr1;
|
|
||||||
unsigned long dsrr0;
|
|
||||||
unsigned long dsrr1;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ensure this structure is always sized to a multiple of the stack alignment */
|
|
||||||
#define STACK_EXC_LVL_FRAME_SIZE ALIGN(sizeof (struct exception_regs), 16)
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
#endif /* __HEAD_BOOKE_H__ */
|
#endif /* __HEAD_BOOKE_H__ */
|
||||||
|
|||||||
@@ -750,7 +750,7 @@ void __do_irq(struct pt_regs *regs)
|
|||||||
trace_irq_exit(regs);
|
trace_irq_exit(regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERRUPT_HANDLER_ASYNC(do_IRQ)
|
void __do_IRQ(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
void *cursp, *irqsp, *sirqsp;
|
void *cursp, *irqsp, *sirqsp;
|
||||||
@@ -774,6 +774,11 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(do_IRQ)
|
|||||||
set_irq_regs(old_regs);
|
set_irq_regs(old_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_INTERRUPT_HANDLER_ASYNC(do_IRQ)
|
||||||
|
{
|
||||||
|
__do_IRQ(regs);
|
||||||
|
}
|
||||||
|
|
||||||
static void *__init alloc_vm_stack(void)
|
static void *__init alloc_vm_stack(void)
|
||||||
{
|
{
|
||||||
return __vmalloc_node(THREAD_SIZE, THREAD_ALIGN, THREADINFO_GFP,
|
return __vmalloc_node(THREAD_SIZE, THREAD_ALIGN, THREADINFO_GFP,
|
||||||
|
|||||||
@@ -292,7 +292,8 @@ int kprobe_handler(struct pt_regs *regs)
|
|||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!(regs->msr & MSR_IR) || !(regs->msr & MSR_DR))
|
if (!IS_ENABLED(CONFIG_BOOKE) &&
|
||||||
|
(!(regs->msr & MSR_IR) || !(regs->msr & MSR_DR)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1167,7 +1167,7 @@ static int __init topology_init(void)
|
|||||||
* CPU. For instance, the boot cpu might never be valid
|
* CPU. For instance, the boot cpu might never be valid
|
||||||
* for hotplugging.
|
* for hotplugging.
|
||||||
*/
|
*/
|
||||||
if (smp_ops->cpu_offline_self)
|
if (smp_ops && smp_ops->cpu_offline_self)
|
||||||
c->hotpluggable = 1;
|
c->hotpluggable = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -586,7 +586,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
|
|||||||
|
|
||||||
#if defined(CONFIG_PPC32) && defined(CONFIG_PPC_PMAC)
|
#if defined(CONFIG_PPC32) && defined(CONFIG_PPC_PMAC)
|
||||||
if (atomic_read(&ppc_n_lost_interrupts) != 0)
|
if (atomic_read(&ppc_n_lost_interrupts) != 0)
|
||||||
do_IRQ(regs);
|
__do_IRQ(regs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
old_regs = set_irq_regs(regs);
|
old_regs = set_irq_regs(regs);
|
||||||
|
|||||||
@@ -1104,7 +1104,7 @@ DEFINE_INTERRUPT_HANDLER(RunModeException)
|
|||||||
_exception(SIGTRAP, regs, TRAP_UNK, 0);
|
_exception(SIGTRAP, regs, TRAP_UNK, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERRUPT_HANDLER(single_step_exception)
|
static void __single_step_exception(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
clear_single_step(regs);
|
clear_single_step(regs);
|
||||||
clear_br_trace(regs);
|
clear_br_trace(regs);
|
||||||
@@ -1121,6 +1121,11 @@ DEFINE_INTERRUPT_HANDLER(single_step_exception)
|
|||||||
_exception(SIGTRAP, regs, TRAP_TRACE, regs->nip);
|
_exception(SIGTRAP, regs, TRAP_TRACE, regs->nip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_INTERRUPT_HANDLER(single_step_exception)
|
||||||
|
{
|
||||||
|
__single_step_exception(regs);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* After we have successfully emulated an instruction, we have to
|
* After we have successfully emulated an instruction, we have to
|
||||||
* check if the instruction was being single-stepped, and if so,
|
* check if the instruction was being single-stepped, and if so,
|
||||||
@@ -1130,7 +1135,7 @@ DEFINE_INTERRUPT_HANDLER(single_step_exception)
|
|||||||
static void emulate_single_step(struct pt_regs *regs)
|
static void emulate_single_step(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
if (single_stepping(regs))
|
if (single_stepping(regs))
|
||||||
single_step_exception(regs);
|
__single_step_exception(regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int __parse_fpscr(unsigned long fpscr)
|
static inline int __parse_fpscr(unsigned long fpscr)
|
||||||
|
|||||||
@@ -27,6 +27,13 @@ KASAN_SANITIZE := n
|
|||||||
|
|
||||||
ccflags-y := -shared -fno-common -fno-builtin -nostdlib \
|
ccflags-y := -shared -fno-common -fno-builtin -nostdlib \
|
||||||
-Wl,-soname=linux-vdso64.so.1 -Wl,--hash-style=both
|
-Wl,-soname=linux-vdso64.so.1 -Wl,--hash-style=both
|
||||||
|
|
||||||
|
# Go prior to 1.16.x assumes r30 is not clobbered by any VDSO code. That used to be true
|
||||||
|
# by accident when the VDSO was hand-written asm code, but may not be now that the VDSO is
|
||||||
|
# compiler generated. To avoid breaking Go tell GCC not to use r30. Impact on code
|
||||||
|
# generation is minimal, it will just use r29 instead.
|
||||||
|
ccflags-y += $(call cc-option, -ffixed-r30)
|
||||||
|
|
||||||
asflags-y := -D__VDSO64__ -s
|
asflags-y := -D__VDSO64__ -s
|
||||||
|
|
||||||
targets += vdso64.lds
|
targets += vdso64.lds
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user