Merge 6.10-rc6 into char-misc-next

We need the char/misc/iio fixes in here as well to build on top of.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Greg Kroah-Hartman 2024-07-01 13:55:39 +02:00
commit 19ed3bb558
600 changed files with 7811 additions and 4103 deletions

View File

@ -608,6 +608,7 @@ Simon Kelley <simon@thekelleys.org.uk>
Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org> Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org>
Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org> Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org>
Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org> Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org>
Stanislav Fomichev <sdf@fomichev.me> <sdf@google.com>
Stefan Wahren <wahrenst@gmx.net> <stefan.wahren@i2se.com> Stefan Wahren <wahrenst@gmx.net> <stefan.wahren@i2se.com>
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr> Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
Stephen Hemminger <stephen@networkplumber.org> <shemminger@linux-foundation.org> Stephen Hemminger <stephen@networkplumber.org> <shemminger@linux-foundation.org>

View File

@ -788,25 +788,6 @@
Documentation/networking/netconsole.rst for an Documentation/networking/netconsole.rst for an
alternative. alternative.
<DEVNAME>:<n>.<n>[,options]
Use the specified serial port on the serial core bus.
The addressing uses DEVNAME of the physical serial port
device, followed by the serial core controller instance,
and the serial port instance. The options are the same
as documented for the ttyS addressing above.
The mapping of the serial ports to the tty instances
can be viewed with:
$ ls -d /sys/bus/serial-base/devices/*:*.*/tty/*
/sys/bus/serial-base/devices/00:04:0.0/tty/ttyS0
In the above example, the console can be addressed with
console=00:04:0.0. Note that a console addressed this
way will only get added when the related device driver
is ready. The use of an earlycon parameter in addition to
the console may be desired for console output early on.
uart[8250],io,<addr>[,options] uart[8250],io,<addr>[,options]
uart[8250],mmio,<addr>[,options] uart[8250],mmio,<addr>[,options]
uart[8250],mmio16,<addr>[,options] uart[8250],mmio16,<addr>[,options]
@ -2192,12 +2173,6 @@
Format: 0 | 1 Format: 0 | 1
Default set by CONFIG_INIT_ON_FREE_DEFAULT_ON. Default set by CONFIG_INIT_ON_FREE_DEFAULT_ON.
init_mlocked_on_free= [MM] Fill freed userspace memory with zeroes if
it was mlock'ed and not explicitly munlock'ed
afterwards.
Format: 0 | 1
Default set by CONFIG_INIT_MLOCKED_ON_FREE_DEFAULT_ON
init_pkru= [X86] Specify the default memory protection keys rights init_pkru= [X86] Specify the default memory protection keys rights
register contents for all processes. 0x55555554 by register contents for all processes. 0x55555554 by
default (disallow access to all but pkey 0). Can default (disallow access to all but pkey 0). Can

View File

@ -59,8 +59,8 @@ properties:
- 3 - 3
dma-channels: dma-channels:
minItems: 1 minimum: 1
maxItems: 64 maximum: 64
clocks: clocks:
minItems: 1 minItems: 1

View File

@ -77,7 +77,7 @@ required:
- clocks - clocks
allOf: allOf:
- $ref: i2c-controller.yaml - $ref: /schemas/i2c/i2c-controller.yaml#
- if: - if:
properties: properties:
compatible: compatible:

View File

@ -21,7 +21,7 @@ description: |
google,cros-ec-spi or google,cros-ec-i2c. google,cros-ec-spi or google,cros-ec-i2c.
allOf: allOf:
- $ref: i2c-controller.yaml# - $ref: /schemas/i2c/i2c-controller.yaml#
properties: properties:
compatible: compatible:

View File

@ -128,7 +128,6 @@ required:
- cell-index - cell-index
- reg - reg
- fsl,fman-ports - fsl,fman-ports
- ptp-timer
dependencies: dependencies:
pcs-handle-names: pcs-handle-names:

View File

@ -29,7 +29,6 @@ properties:
- qcom,pm7325-gpio - qcom,pm7325-gpio
- qcom,pm7550ba-gpio - qcom,pm7550ba-gpio
- qcom,pm8005-gpio - qcom,pm8005-gpio
- qcom,pm8008-gpio
- qcom,pm8018-gpio - qcom,pm8018-gpio
- qcom,pm8019-gpio - qcom,pm8019-gpio
- qcom,pm8038-gpio - qcom,pm8038-gpio
@ -126,7 +125,6 @@ allOf:
compatible: compatible:
contains: contains:
enum: enum:
- qcom,pm8008-gpio
- qcom,pmi8950-gpio - qcom,pmi8950-gpio
- qcom,pmr735d-gpio - qcom,pmr735d-gpio
then: then:
@ -448,7 +446,6 @@ $defs:
- gpio1-gpio10 for pm7325 - gpio1-gpio10 for pm7325
- gpio1-gpio8 for pm7550ba - gpio1-gpio8 for pm7550ba
- gpio1-gpio4 for pm8005 - gpio1-gpio4 for pm8005
- gpio1-gpio2 for pm8008
- gpio1-gpio6 for pm8018 - gpio1-gpio6 for pm8018
- gpio1-gpio12 for pm8038 - gpio1-gpio12 for pm8038
- gpio1-gpio40 for pm8058 - gpio1-gpio40 for pm8058

View File

@ -571,6 +571,7 @@ encoded manner. The codes are the following:
um userfaultfd missing tracking um userfaultfd missing tracking
uw userfaultfd wr-protect tracking uw userfaultfd wr-protect tracking
ss shadow stack page ss shadow stack page
sl sealed
== ======================================= == =======================================
Note that there is no guarantee that every flag and associated mnemonic will Note that there is no guarantee that every flag and associated mnemonic will

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<!-- Updated to inclusive terminology by Wolfram Sang -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
@ -1120,7 +1121,7 @@
<rect <rect
style="opacity:1;fill:#ffb9b9;fill-opacity:1;stroke:#f00000;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" style="opacity:1;fill:#ffb9b9;fill-opacity:1;stroke:#f00000;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4424-3-2-9-7" id="rect4424-3-2-9-7"
width="112.5" width="134.5"
height="113.75008" height="113.75008"
x="112.5" x="112.5"
y="471.11221" y="471.11221"
@ -1133,15 +1134,15 @@
y="521.46259" y="521.46259"
id="text4349"><tspan id="text4349"><tspan
sodipodi:role="line" sodipodi:role="line"
x="167.5354" x="178.5354"
y="521.46259" y="521.46259"
style="font-size:25px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle" style="font-size:25px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle"
id="tspan1273">I2C</tspan><tspan id="tspan1273">I2C</tspan><tspan
sodipodi:role="line" sodipodi:role="line"
x="167.5354" x="178.5354"
y="552.71259" y="552.71259"
style="font-size:25px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle" style="font-size:25px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle"
id="tspan1285">Master</tspan></text> id="tspan1285">Controller</tspan></text>
<rect <rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b9ffb9;fill-opacity:1;fill-rule:nonzero;stroke:#006400;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b9ffb9;fill-opacity:1;fill-rule:nonzero;stroke:#006400;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4424-3-2-9-7-3-3-5-3" id="rect4424-3-2-9-7-3-3-5-3"
@ -1171,7 +1172,7 @@
x="318.59131" x="318.59131"
y="552.08752" y="552.08752"
style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px" style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px"
id="tspan1287">Slave</tspan></text> id="tspan1287">Target</tspan></text>
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99968767;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99968767;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 112.49995,677.36223 c 712.50005,0 712.50005,0 712.50005,0" d="m 112.49995,677.36223 c 712.50005,0 712.50005,0 712.50005,0"
@ -1233,7 +1234,7 @@
x="468.59131" x="468.59131"
y="552.08746" y="552.08746"
style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px" style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px"
id="tspan1287-6">Slave</tspan></text> id="tspan1287-6">Target</tspan></text>
<rect <rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#b9ffb9;fill-opacity:1;fill-rule:nonzero;stroke:#006400;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#b9ffb9;fill-opacity:1;fill-rule:nonzero;stroke:#006400;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4424-3-2-9-7-3-3-5-3-1" id="rect4424-3-2-9-7-3-3-5-3-1"
@ -1258,7 +1259,7 @@
x="618.59131" x="618.59131"
y="552.08746" y="552.08746"
style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px" style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px"
id="tspan1287-9">Slave</tspan></text> id="tspan1287-9">Target</tspan></text>
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99968743;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#DotM)" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99968743;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#DotM)"
d="m 150,583.61221 v 93.75" d="m 150,583.61221 v 93.75"

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -3,29 +3,27 @@ Introduction to I2C and SMBus
============================= =============================
I²C (pronounce: I squared C and written I2C in the kernel documentation) is I²C (pronounce: I squared C and written I2C in the kernel documentation) is
a protocol developed by Philips. It is a slow two-wire protocol (variable a protocol developed by Philips. It is a two-wire protocol with variable
speed, up to 400 kHz), with a high speed extension (3.4 MHz). It provides speed (typically up to 400 kHz, high speed modes up to 5 MHz). It provides
an inexpensive bus for connecting many types of devices with infrequent or an inexpensive bus for connecting many types of devices with infrequent or
low bandwidth communications needs. I2C is widely used with embedded low bandwidth communications needs. I2C is widely used with embedded
systems. Some systems use variants that don't meet branding requirements, systems. Some systems use variants that don't meet branding requirements,
and so are not advertised as being I2C but come under different names, and so are not advertised as being I2C but come under different names,
e.g. TWI (Two Wire Interface), IIC. e.g. TWI (Two Wire Interface), IIC.
The latest official I2C specification is the `"I2C-bus specification and user The latest official I2C specification is the `"I²C-bus specification and user
manual" (UM10204) <https://www.nxp.com/webapp/Download?colCode=UM10204>`_ manual" (UM10204) <https://www.nxp.com/docs/en/user-guide/UM10204.pdf>`_
published by NXP Semiconductors. However, you need to log-in to the site to published by NXP Semiconductors, version 7 as of this writing.
access the PDF. An older version of the specification (revision 6) is archived
`here <https://web.archive.org/web/20210813122132/https://www.nxp.com/docs/en/user-guide/UM10204.pdf>`_.
SMBus (System Management Bus) is based on the I2C protocol, and is mostly SMBus (System Management Bus) is based on the I2C protocol, and is mostly
a subset of I2C protocols and signaling. Many I2C devices will work on an a subset of I2C protocols and signaling. Many I2C devices will work on an
SMBus, but some SMBus protocols add semantics beyond what is required to SMBus, but some SMBus protocols add semantics beyond what is required to
achieve I2C branding. Modern PC mainboards rely on SMBus. The most common achieve I2C branding. Modern PC mainboards rely on SMBus. The most common
devices connected through SMBus are RAM modules configured using I2C EEPROMs, devices connected through SMBus are RAM modules configured using I2C EEPROMs,
and hardware monitoring chips. and hardware monitoring chips.
Because the SMBus is mostly a subset of the generalized I2C bus, we can Because the SMBus is mostly a subset of the generalized I2C bus, we can
use its protocols on many I2C systems. However, there are systems that don't use its protocols on many I2C systems. However, there are systems that don't
meet both SMBus and I2C electrical constraints; and others which can't meet both SMBus and I2C electrical constraints; and others which can't
implement all the common SMBus protocol semantics or messages. implement all the common SMBus protocol semantics or messages.
@ -33,29 +31,52 @@ implement all the common SMBus protocol semantics or messages.
Terminology Terminology
=========== ===========
Using the terminology from the official documentation, the I2C bus connects The I2C bus connects one or more controller chips and one or more target chips.
one or more *master* chips and one or more *slave* chips.
.. kernel-figure:: i2c_bus.svg .. kernel-figure:: i2c_bus.svg
:alt: Simple I2C bus with one master and 3 slaves :alt: Simple I2C bus with one controller and 3 targets
Simple I2C bus Simple I2C bus
A **master** chip is a node that starts communications with slaves. In the A **controller** chip is a node that starts communications with targets. In the
Linux kernel implementation it is called an **adapter** or bus. Adapter Linux kernel implementation it is also called an "adapter" or "bus". Controller
drivers are in the ``drivers/i2c/busses/`` subdirectory. drivers are usually in the ``drivers/i2c/busses/`` subdirectory.
An **algorithm** contains general code that can be used to implement a An **algorithm** contains general code that can be used to implement a whole
whole class of I2C adapters. Each specific adapter driver either depends on class of I2C controllers. Each specific controller driver either depends on an
an algorithm driver in the ``drivers/i2c/algos/`` subdirectory, or includes algorithm driver in the ``drivers/i2c/algos/`` subdirectory, or includes its
its own implementation. own implementation.
A **slave** chip is a node that responds to communications when addressed A **target** chip is a node that responds to communications when addressed by a
by the master. In Linux it is called a **client**. Client drivers are kept controller. In the Linux kernel implementation it is also called a "client".
in a directory specific to the feature they provide, for example While targets are usually separate external chips, Linux can also act as a
``drivers/media/gpio/`` for GPIO expanders and ``drivers/media/i2c/`` for target (needs hardware support) and respond to another controller on the bus.
This is then called a **local target**. In contrast, an external chip is called
a **remote target**.
Target drivers are kept in a directory specific to the feature they provide,
for example ``drivers/gpio/`` for GPIO expanders and ``drivers/media/i2c/`` for
video-related chips. video-related chips.
For the example configuration in figure, you will need a driver for your For the example configuration in the figure above, you will need one driver for
I2C adapter, and drivers for your I2C devices (usually one driver for each the I2C controller, and drivers for your I2C targets. Usually one driver for
device). each target.
Synonyms
--------
As mentioned above, the Linux I2C implementation historically uses the terms
"adapter" for controller and "client" for target. A number of data structures
have these synonyms in their name. So, when discussing implementation details,
you should be aware of these terms as well. The official wording is preferred,
though.
Outdated terminology
--------------------
In earlier I2C specifications, controller was named "master" and target was
named "slave". These terms have been obsoleted with v7 of the specification and
their use is also discouraged by the Linux Kernel Code of Conduct. You may
still find them in references to documentation which has not been updated. The
general attitude, however, is to use the inclusive terms: controller and
target. Work to replace the old terminology in the Linux Kernel is on-going.

View File

@ -128,7 +128,7 @@ executed to make module versioning work.
modules_install modules_install
Install the external module(s). The default location is Install the external module(s). The default location is
/lib/modules/<kernel_release>/extra/, but a prefix may /lib/modules/<kernel_release>/updates/, but a prefix may
be added with INSTALL_MOD_PATH (discussed in section 5). be added with INSTALL_MOD_PATH (discussed in section 5).
clean clean
@ -417,7 +417,7 @@ directory:
And external modules are installed in: And external modules are installed in:
/lib/modules/$(KERNELRELEASE)/extra/ /lib/modules/$(KERNELRELEASE)/updates/
5.1 INSTALL_MOD_PATH 5.1 INSTALL_MOD_PATH
-------------------- --------------------
@ -438,10 +438,10 @@ And external modules are installed in:
------------------- -------------------
External modules are by default installed to a directory under External modules are by default installed to a directory under
/lib/modules/$(KERNELRELEASE)/extra/, but you may wish to /lib/modules/$(KERNELRELEASE)/updates/, but you may wish to
locate modules for a specific functionality in a separate locate modules for a specific functionality in a separate
directory. For this purpose, use INSTALL_MOD_DIR to specify an directory. For this purpose, use INSTALL_MOD_DIR to specify an
alternative name to "extra.":: alternative name to "updates."::
$ make INSTALL_MOD_DIR=gandalf -C $KDIR \ $ make INSTALL_MOD_DIR=gandalf -C $KDIR \
M=$PWD modules_install M=$PWD modules_install

View File

@ -1603,7 +1603,7 @@ operations:
attributes: attributes:
- header - header
reply: reply:
attributes: &pse attributes:
- header - header
- podl-pse-admin-state - podl-pse-admin-state
- podl-pse-admin-control - podl-pse-admin-control
@ -1620,7 +1620,10 @@ operations:
do: do:
request: request:
attributes: *pse attributes:
- header
- podl-pse-admin-control
- c33-pse-admin-control
- -
name: rss-get name: rss-get
doc: Get RSS params. doc: Get RSS params.

View File

@ -123,8 +123,6 @@ operations:
doc: dump pending nfsd rpc doc: dump pending nfsd rpc
attribute-set: rpc-status attribute-set: rpc-status
dump: dump:
pre: nfsd-nl-rpc-status-get-start
post: nfsd-nl-rpc-status-get-done
reply: reply:
attributes: attributes:
- xid - xid

View File

@ -32,6 +32,7 @@ Security-related interfaces
seccomp_filter seccomp_filter
landlock landlock
lsm lsm
mfd_noexec
spec_ctrl spec_ctrl
tee tee

View File

@ -0,0 +1,86 @@
.. SPDX-License-Identifier: GPL-2.0
==================================
Introduction of non-executable mfd
==================================
:Author:
Daniel Verkamp <dverkamp@chromium.org>
Jeff Xu <jeffxu@chromium.org>
:Contributor:
Aleksa Sarai <cyphar@cyphar.com>
Since Linux introduced the memfd feature, memfds have always had their
execute bit set, and the memfd_create() syscall doesn't allow setting
it differently.
However, in a secure-by-default system, such as ChromeOS, (where all
executables should come from the rootfs, which is protected by verified
boot), this executable nature of memfd opens a door for NoExec bypass
and enables “confused deputy attack”. E.g, in VRP bug [1]: cros_vm
process created a memfd to share the content with an external process,
however the memfd is overwritten and used for executing arbitrary code
and root escalation. [2] lists more VRP of this kind.
On the other hand, executable memfd has its legit use: runc uses memfds
seal and executable feature to copy the contents of the binary then
execute them. For such a system, we need a solution to differentiate runc's
use of executable memfds and an attacker's [3].
To address those above:
- Let memfd_create() set X bit at creation time.
- Let memfd be sealed for modifying X bit when NX is set.
- Add a new pid namespace sysctl: vm.memfd_noexec to help applications in
migrating and enforcing non-executable MFD.
User API
========
``int memfd_create(const char *name, unsigned int flags)``
``MFD_NOEXEC_SEAL``
When MFD_NOEXEC_SEAL bit is set in the ``flags``, memfd is created
with NX. F_SEAL_EXEC is set and the memfd can't be modified to
add X later. MFD_ALLOW_SEALING is also implied.
This is the most common case for the application to use memfd.
``MFD_EXEC``
When MFD_EXEC bit is set in the ``flags``, memfd is created with X.
Note:
``MFD_NOEXEC_SEAL`` implies ``MFD_ALLOW_SEALING``. In case that
an app doesn't want sealing, it can add F_SEAL_SEAL after creation.
Sysctl:
========
``pid namespaced sysctl vm.memfd_noexec``
The new pid namespaced sysctl vm.memfd_noexec has 3 values:
- 0: MEMFD_NOEXEC_SCOPE_EXEC
memfd_create() without MFD_EXEC nor MFD_NOEXEC_SEAL acts like
MFD_EXEC was set.
- 1: MEMFD_NOEXEC_SCOPE_NOEXEC_SEAL
memfd_create() without MFD_EXEC nor MFD_NOEXEC_SEAL acts like
MFD_NOEXEC_SEAL was set.
- 2: MEMFD_NOEXEC_SCOPE_NOEXEC_ENFORCED
memfd_create() without MFD_NOEXEC_SEAL will be rejected.
The sysctl allows finer control of memfd_create for old software that
doesn't set the executable bit; for example, a container with
vm.memfd_noexec=1 means the old software will create non-executable memfd
by default while new software can create executable memfd by setting
MFD_EXEC.
The value of vm.memfd_noexec is passed to child namespace at creation
time. In addition, the setting is hierarchical, i.e. during memfd_create,
we will search from current ns to root ns and use the most restrictive
setting.
[1] https://crbug.com/1305267
[2] https://bugs.chromium.org/p/chromium/issues/list?q=type%3Dbug-security%20memfd%20escalation&can=1
[3] https://lwn.net/Articles/781013/

View File

@ -62,12 +62,21 @@ shared page with scale and offset values into user space. User
space code performs the same algorithm of reading the TSC and space code performs the same algorithm of reading the TSC and
applying the scale and offset to get the constant 10 MHz clock. applying the scale and offset to get the constant 10 MHz clock.
Linux clockevents are based on Hyper-V synthetic timer 0. While Linux clockevents are based on Hyper-V synthetic timer 0 (stimer0).
Hyper-V offers 4 synthetic timers for each CPU, Linux only uses While Hyper-V offers 4 synthetic timers for each CPU, Linux only uses
timer 0. Interrupts from stimer0 are recorded on the "HVS" line in timer 0. In older versions of Hyper-V, an interrupt from stimer0
/proc/interrupts. Clockevents based on the virtualized PIT and results in a VMBus control message that is demultiplexed by
local APIC timer also work, but the Hyper-V synthetic timer is vmbus_isr() as described in the Documentation/virt/hyperv/vmbus.rst
preferred. documentation. In newer versions of Hyper-V, stimer0 interrupts can
be mapped to an architectural interrupt, which is referred to as
"Direct Mode". Linux prefers to use Direct Mode when available. Since
x86/x64 doesn't support per-CPU interrupts, Direct Mode statically
allocates an x86 interrupt vector (HYPERV_STIMER0_VECTOR) across all CPUs
and explicitly codes it to call the stimer0 interrupt handler. Hence
interrupts from stimer0 are recorded on the "HVS" line in /proc/interrupts
rather than being associated with a Linux IRQ. Clockevents based on the
virtualized PIT and local APIC timer also work, but Hyper-V stimer0
is preferred.
The driver for the Hyper-V synthetic system clock and timers is The driver for the Hyper-V synthetic system clock and timers is
drivers/clocksource/hyperv_timer.c. drivers/clocksource/hyperv_timer.c.

View File

@ -40,7 +40,7 @@ Linux guests communicate with Hyper-V in four different ways:
arm64, these synthetic registers must be accessed using explicit arm64, these synthetic registers must be accessed using explicit
hypercalls. hypercalls.
* VMbus: VMbus is a higher-level software construct that is built on * VMBus: VMBus is a higher-level software construct that is built on
the other 3 mechanisms. It is a message passing interface between the other 3 mechanisms. It is a message passing interface between
the Hyper-V host and the Linux guest. It uses memory that is shared the Hyper-V host and the Linux guest. It uses memory that is shared
between Hyper-V and the guest, along with various signaling between Hyper-V and the guest, along with various signaling
@ -54,8 +54,8 @@ x86/x64 architecture only.
.. _Hyper-V Top Level Functional Spec (TLFS): https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/tlfs .. _Hyper-V Top Level Functional Spec (TLFS): https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/tlfs
VMbus is not documented. This documentation provides a high-level VMBus is not documented. This documentation provides a high-level
overview of VMbus and how it works, but the details can be discerned overview of VMBus and how it works, but the details can be discerned
only from the code. only from the code.
Sharing Memory Sharing Memory
@ -74,7 +74,7 @@ follows:
physical address space. How Hyper-V is told about the GPA or list physical address space. How Hyper-V is told about the GPA or list
of GPAs varies. In some cases, a single GPA is written to a of GPAs varies. In some cases, a single GPA is written to a
synthetic register. In other cases, a GPA or list of GPAs is sent synthetic register. In other cases, a GPA or list of GPAs is sent
in a VMbus message. in a VMBus message.
* Hyper-V translates the GPAs into "real" physical memory addresses, * Hyper-V translates the GPAs into "real" physical memory addresses,
and creates a virtual mapping that it can use to access the memory. and creates a virtual mapping that it can use to access the memory.
@ -133,9 +133,9 @@ only the CPUs actually present in the VM, so Linux does not report
any hot-add CPUs. any hot-add CPUs.
A Linux guest CPU may be taken offline using the normal Linux A Linux guest CPU may be taken offline using the normal Linux
mechanisms, provided no VMbus channel interrupts are assigned to mechanisms, provided no VMBus channel interrupts are assigned to
the CPU. See the section on VMbus Interrupts for more details the CPU. See the section on VMBus Interrupts for more details
on how VMbus channel interrupts can be re-assigned to permit on how VMBus channel interrupts can be re-assigned to permit
taking a CPU offline. taking a CPU offline.
32-bit and 64-bit 32-bit and 64-bit
@ -169,14 +169,14 @@ and functionality. Hyper-V indicates feature/function availability
via flags in synthetic MSRs that Hyper-V provides to the guest, via flags in synthetic MSRs that Hyper-V provides to the guest,
and the guest code tests these flags. and the guest code tests these flags.
VMbus has its own protocol version that is negotiated during the VMBus has its own protocol version that is negotiated during the
initial VMbus connection from the guest to Hyper-V. This version initial VMBus connection from the guest to Hyper-V. This version
number is also output to dmesg during boot. This version number number is also output to dmesg during boot. This version number
is checked in a few places in the code to determine if specific is checked in a few places in the code to determine if specific
functionality is present. functionality is present.
Furthermore, each synthetic device on VMbus also has a protocol Furthermore, each synthetic device on VMBus also has a protocol
version that is separate from the VMbus protocol version. Device version that is separate from the VMBus protocol version. Device
drivers for these synthetic devices typically negotiate the device drivers for these synthetic devices typically negotiate the device
protocol version, and may test that protocol version to determine protocol version, and may test that protocol version to determine
if specific device functionality is present. if specific device functionality is present.

View File

@ -1,8 +1,8 @@
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
VMbus VMBus
===== =====
VMbus is a software construct provided by Hyper-V to guest VMs. It VMBus is a software construct provided by Hyper-V to guest VMs. It
consists of a control path and common facilities used by synthetic consists of a control path and common facilities used by synthetic
devices that Hyper-V presents to guest VMs. The control path is devices that Hyper-V presents to guest VMs. The control path is
used to offer synthetic devices to the guest VM and, in some cases, used to offer synthetic devices to the guest VM and, in some cases,
@ -12,9 +12,9 @@ and the synthetic device implementation that is part of Hyper-V, and
signaling primitives to allow Hyper-V and the guest to interrupt signaling primitives to allow Hyper-V and the guest to interrupt
each other. each other.
VMbus is modeled in Linux as a bus, with the expected /sys/bus/vmbus VMBus is modeled in Linux as a bus, with the expected /sys/bus/vmbus
entry in a running Linux guest. The VMbus driver (drivers/hv/vmbus_drv.c) entry in a running Linux guest. The VMBus driver (drivers/hv/vmbus_drv.c)
establishes the VMbus control path with the Hyper-V host, then establishes the VMBus control path with the Hyper-V host, then
registers itself as a Linux bus driver. It implements the standard registers itself as a Linux bus driver. It implements the standard
bus functions for adding and removing devices to/from the bus. bus functions for adding and removing devices to/from the bus.
@ -49,9 +49,9 @@ synthetic NIC is referred to as "netvsc" and the Linux driver for
the synthetic SCSI controller is "storvsc". These drivers contain the synthetic SCSI controller is "storvsc". These drivers contain
functions with names like "storvsc_connect_to_vsp". functions with names like "storvsc_connect_to_vsp".
VMbus channels VMBus channels
-------------- --------------
An instance of a synthetic device uses VMbus channels to communicate An instance of a synthetic device uses VMBus channels to communicate
between the VSP and the VSC. Channels are bi-directional and used between the VSP and the VSC. Channels are bi-directional and used
for passing messages. Most synthetic devices use a single channel, for passing messages. Most synthetic devices use a single channel,
but the synthetic SCSI controller and synthetic NIC may use multiple but the synthetic SCSI controller and synthetic NIC may use multiple
@ -73,7 +73,7 @@ write indices and some control flags, followed by the memory for the
actual ring. The size of the ring is determined by the VSC in the actual ring. The size of the ring is determined by the VSC in the
guest and is specific to each synthetic device. The list of GPAs guest and is specific to each synthetic device. The list of GPAs
making up the ring is communicated to the Hyper-V host over the making up the ring is communicated to the Hyper-V host over the
VMbus control path as a GPA Descriptor List (GPADL). See function VMBus control path as a GPA Descriptor List (GPADL). See function
vmbus_establish_gpadl(). vmbus_establish_gpadl().
Each ring buffer is mapped into contiguous Linux kernel virtual Each ring buffer is mapped into contiguous Linux kernel virtual
@ -102,10 +102,10 @@ resources. For Windows Server 2019 and later, this limit is
approximately 1280 Mbytes. For versions prior to Windows Server approximately 1280 Mbytes. For versions prior to Windows Server
2019, the limit is approximately 384 Mbytes. 2019, the limit is approximately 384 Mbytes.
VMbus messages VMBus channel messages
-------------- ----------------------
All VMbus messages have a standard header that includes the message All messages sent in a VMBus channel have a standard header that includes
length, the offset of the message payload, some flags, and a the message length, the offset of the message payload, some flags, and a
transactionID. The portion of the message after the header is transactionID. The portion of the message after the header is
unique to each VSP/VSC pair. unique to each VSP/VSC pair.
@ -137,7 +137,7 @@ control message contains a list of GPAs that describe the data
buffer. For example, the storvsc driver uses this approach to buffer. For example, the storvsc driver uses this approach to
specify the data buffers to/from which disk I/O is done. specify the data buffers to/from which disk I/O is done.
Three functions exist to send VMbus messages: Three functions exist to send VMBus channel messages:
1. vmbus_sendpacket(): Control-only messages and messages with 1. vmbus_sendpacket(): Control-only messages and messages with
embedded data -- no GPAs embedded data -- no GPAs
@ -154,20 +154,51 @@ Historically, Linux guests have trusted Hyper-V to send well-formed
and valid messages, and Linux drivers for synthetic devices did not and valid messages, and Linux drivers for synthetic devices did not
fully validate messages. With the introduction of processor fully validate messages. With the introduction of processor
technologies that fully encrypt guest memory and that allow the technologies that fully encrypt guest memory and that allow the
guest to not trust the hypervisor (AMD SNP-SEV, Intel TDX), trusting guest to not trust the hypervisor (AMD SEV-SNP, Intel TDX), trusting
the Hyper-V host is no longer a valid assumption. The drivers for the Hyper-V host is no longer a valid assumption. The drivers for
VMbus synthetic devices are being updated to fully validate any VMBus synthetic devices are being updated to fully validate any
values read from memory that is shared with Hyper-V, which includes values read from memory that is shared with Hyper-V, which includes
messages from VMbus devices. To facilitate such validation, messages from VMBus devices. To facilitate such validation,
messages read by the guest from the "in" ring buffer are copied to a messages read by the guest from the "in" ring buffer are copied to a
temporary buffer that is not shared with Hyper-V. Validation is temporary buffer that is not shared with Hyper-V. Validation is
performed in this temporary buffer without the risk of Hyper-V performed in this temporary buffer without the risk of Hyper-V
maliciously modifying the message after it is validated but before maliciously modifying the message after it is validated but before
it is used. it is used.
VMbus interrupts Synthetic Interrupt Controller (synic)
--------------------------------------
Hyper-V provides each guest CPU with a synthetic interrupt controller
that is used by VMBus for host-guest communication. While each synic
defines 16 synthetic interrupts (SINT), Linux uses only one of the 16
(VMBUS_MESSAGE_SINT). All interrupts related to communication between
the Hyper-V host and a guest CPU use that SINT.
The SINT is mapped to a single per-CPU architectural interrupt (i.e,
an 8-bit x86/x64 interrupt vector, or an arm64 PPI INTID). Because
each CPU in the guest has a synic and may receive VMBus interrupts,
they are best modeled in Linux as per-CPU interrupts. This model works
well on arm64 where a single per-CPU Linux IRQ is allocated for
VMBUS_MESSAGE_SINT. This IRQ appears in /proc/interrupts as an IRQ labelled
"Hyper-V VMbus". Since x86/x64 lacks support for per-CPU IRQs, an x86
interrupt vector is statically allocated (HYPERVISOR_CALLBACK_VECTOR)
across all CPUs and explicitly coded to call vmbus_isr(). In this case,
there's no Linux IRQ, and the interrupts are visible in aggregate in
/proc/interrupts on the "HYP" line.
The synic provides the means to demultiplex the architectural interrupt into
one or more logical interrupts and route the logical interrupt to the proper
VMBus handler in Linux. This demultiplexing is done by vmbus_isr() and
related functions that access synic data structures.
The synic is not modeled in Linux as an irq chip or irq domain,
and the demultiplexed logical interrupts are not Linux IRQs. As such,
they don't appear in /proc/interrupts or /proc/irq. The CPU
affinity for one of these logical interrupts is controlled via an
entry under /sys/bus/vmbus as described below.
VMBus interrupts
---------------- ----------------
VMbus provides a mechanism for the guest to interrupt the host when VMBus provides a mechanism for the guest to interrupt the host when
the guest has queued new messages in a ring buffer. The host the guest has queued new messages in a ring buffer. The host
expects that the guest will send an interrupt only when an "out" expects that the guest will send an interrupt only when an "out"
ring buffer transitions from empty to non-empty. If the guest sends ring buffer transitions from empty to non-empty. If the guest sends
@ -176,63 +207,55 @@ unnecessary. If a guest sends an excessive number of unnecessary
interrupts, the host may throttle that guest by suspending its interrupts, the host may throttle that guest by suspending its
execution for a few seconds to prevent a denial-of-service attack. execution for a few seconds to prevent a denial-of-service attack.
Similarly, the host will interrupt the guest when it sends a new Similarly, the host will interrupt the guest via the synic when
message on the VMbus control path, or when a VMbus channel "in" ring it sends a new message on the VMBus control path, or when a VMBus
buffer transitions from empty to non-empty. Each CPU in the guest channel "in" ring buffer transitions from empty to non-empty due to
may receive VMbus interrupts, so they are best modeled as per-CPU the host inserting a new VMBus channel message. The control message stream
interrupts in Linux. This model works well on arm64 where a single and each VMBus channel "in" ring buffer are separate logical interrupts
per-CPU IRQ is allocated for VMbus. Since x86/x64 lacks support for that are demultiplexed by vmbus_isr(). It demultiplexes by first checking
per-CPU IRQs, an x86 interrupt vector is statically allocated (see for channel interrupts by calling vmbus_chan_sched(), which looks at a synic
HYPERVISOR_CALLBACK_VECTOR) across all CPUs and explicitly coded to bitmap to determine which channels have pending interrupts on this CPU.
call the VMbus interrupt service routine. These interrupts are If multiple channels have pending interrupts for this CPU, they are
visible in /proc/interrupts on the "HYP" line. processed sequentially. When all channel interrupts have been processed,
vmbus_isr() checks for and processes any messages received on the VMBus
control path.
The guest CPU that a VMbus channel will interrupt is selected by the The guest CPU that a VMBus channel will interrupt is selected by the
guest when the channel is created, and the host is informed of that guest when the channel is created, and the host is informed of that
selection. VMbus devices are broadly grouped into two categories: selection. VMBus devices are broadly grouped into two categories:
1. "Slow" devices that need only one VMbus channel. The devices 1. "Slow" devices that need only one VMBus channel. The devices
(such as keyboard, mouse, heartbeat, and timesync) generate (such as keyboard, mouse, heartbeat, and timesync) generate
relatively few interrupts. Their VMbus channels are all relatively few interrupts. Their VMBus channels are all
assigned to interrupt the VMBUS_CONNECT_CPU, which is always assigned to interrupt the VMBUS_CONNECT_CPU, which is always
CPU 0. CPU 0.
2. "High speed" devices that may use multiple VMbus channels for 2. "High speed" devices that may use multiple VMBus channels for
higher parallelism and performance. These devices include the higher parallelism and performance. These devices include the
synthetic SCSI controller and synthetic NIC. Their VMbus synthetic SCSI controller and synthetic NIC. Their VMBus
channels interrupts are assigned to CPUs that are spread out channels interrupts are assigned to CPUs that are spread out
among the available CPUs in the VM so that interrupts on among the available CPUs in the VM so that interrupts on
multiple channels can be processed in parallel. multiple channels can be processed in parallel.
The assignment of VMbus channel interrupts to CPUs is done in the The assignment of VMBus channel interrupts to CPUs is done in the
function init_vp_index(). This assignment is done outside of the function init_vp_index(). This assignment is done outside of the
normal Linux interrupt affinity mechanism, so the interrupts are normal Linux interrupt affinity mechanism, so the interrupts are
neither "unmanaged" nor "managed" interrupts. neither "unmanaged" nor "managed" interrupts.
The CPU that a VMbus channel will interrupt can be seen in The CPU that a VMBus channel will interrupt can be seen in
/sys/bus/vmbus/devices/<deviceGUID>/ channels/<channelRelID>/cpu. /sys/bus/vmbus/devices/<deviceGUID>/ channels/<channelRelID>/cpu.
When running on later versions of Hyper-V, the CPU can be changed When running on later versions of Hyper-V, the CPU can be changed
by writing a new value to this sysfs entry. Because the interrupt by writing a new value to this sysfs entry. Because VMBus channel
assignment is done outside of the normal Linux affinity mechanism, interrupts are not Linux IRQs, there are no entries in /proc/interrupts
there are no entries in /proc/irq corresponding to individual or /proc/irq corresponding to individual VMBus channel interrupts.
VMbus channel interrupts.
An online CPU in a Linux guest may not be taken offline if it has An online CPU in a Linux guest may not be taken offline if it has
VMbus channel interrupts assigned to it. Any such channel VMBus channel interrupts assigned to it. Any such channel
interrupts must first be manually reassigned to another CPU as interrupts must first be manually reassigned to another CPU as
described above. When no channel interrupts are assigned to the described above. When no channel interrupts are assigned to the
CPU, it can be taken offline. CPU, it can be taken offline.
When a guest CPU receives a VMbus interrupt from the host, the The VMBus channel interrupt handling code is designed to work
function vmbus_isr() handles the interrupt. It first checks for
channel interrupts by calling vmbus_chan_sched(), which looks at a
bitmap setup by the host to determine which channels have pending
interrupts on this CPU. If multiple channels have pending
interrupts for this CPU, they are processed sequentially. When all
channel interrupts have been processed, vmbus_isr() checks for and
processes any message received on the VMbus control path.
The VMbus channel interrupt handling code is designed to work
correctly even if an interrupt is received on a CPU other than the correctly even if an interrupt is received on a CPU other than the
CPU assigned to the channel. Specifically, the code does not use CPU assigned to the channel. Specifically, the code does not use
CPU-based exclusion for correctness. In normal operation, Hyper-V CPU-based exclusion for correctness. In normal operation, Hyper-V
@ -242,23 +265,23 @@ when Hyper-V will make the transition. The code must work correctly
even if there is a time lag before Hyper-V starts interrupting the even if there is a time lag before Hyper-V starts interrupting the
new CPU. See comments in target_cpu_store(). new CPU. See comments in target_cpu_store().
VMbus device creation/deletion VMBus device creation/deletion
------------------------------ ------------------------------
Hyper-V and the Linux guest have a separate message-passing path Hyper-V and the Linux guest have a separate message-passing path
that is used for synthetic device creation and deletion. This that is used for synthetic device creation and deletion. This
path does not use a VMbus channel. See vmbus_post_msg() and path does not use a VMBus channel. See vmbus_post_msg() and
vmbus_on_msg_dpc(). vmbus_on_msg_dpc().
The first step is for the guest to connect to the generic The first step is for the guest to connect to the generic
Hyper-V VMbus mechanism. As part of establishing this connection, Hyper-V VMBus mechanism. As part of establishing this connection,
the guest and Hyper-V agree on a VMbus protocol version they will the guest and Hyper-V agree on a VMBus protocol version they will
use. This negotiation allows newer Linux kernels to run on older use. This negotiation allows newer Linux kernels to run on older
Hyper-V versions, and vice versa. Hyper-V versions, and vice versa.
The guest then tells Hyper-V to "send offers". Hyper-V sends an The guest then tells Hyper-V to "send offers". Hyper-V sends an
offer message to the guest for each synthetic device that the VM offer message to the guest for each synthetic device that the VM
is configured to have. Each VMbus device type has a fixed GUID is configured to have. Each VMBus device type has a fixed GUID
known as the "class ID", and each VMbus device instance is also known as the "class ID", and each VMBus device instance is also
identified by a GUID. The offer message from Hyper-V contains identified by a GUID. The offer message from Hyper-V contains
both GUIDs to uniquely (within the VM) identify the device. both GUIDs to uniquely (within the VM) identify the device.
There is one offer message for each device instance, so a VM with There is one offer message for each device instance, so a VM with
@ -275,7 +298,7 @@ type based on the class ID, and invokes the correct driver to set up
the device. Driver/device matching is performed using the standard the device. Driver/device matching is performed using the standard
Linux mechanism. Linux mechanism.
The device driver probe function opens the primary VMbus channel to The device driver probe function opens the primary VMBus channel to
the corresponding VSP. It allocates guest memory for the channel the corresponding VSP. It allocates guest memory for the channel
ring buffers and shares the ring buffer with the Hyper-V host by ring buffers and shares the ring buffer with the Hyper-V host by
giving the host a list of GPAs for the ring buffer memory. See giving the host a list of GPAs for the ring buffer memory. See
@ -285,7 +308,7 @@ Once the ring buffer is set up, the device driver and VSP exchange
setup messages via the primary channel. These messages may include setup messages via the primary channel. These messages may include
negotiating the device protocol version to be used between the Linux negotiating the device protocol version to be used between the Linux
VSC and the VSP on the Hyper-V host. The setup messages may also VSC and the VSP on the Hyper-V host. The setup messages may also
include creating additional VMbus channels, which are somewhat include creating additional VMBus channels, which are somewhat
mis-named as "sub-channels" since they are functionally mis-named as "sub-channels" since they are functionally
equivalent to the primary channel once they are created. equivalent to the primary channel once they are created.

View File

@ -1054,7 +1054,7 @@ M: Joerg Roedel <joro@8bytes.org>
R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
L: iommu@lists.linux.dev L: iommu@lists.linux.dev
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
F: drivers/iommu/amd/ F: drivers/iommu/amd/
F: include/linux/amd-iommu.h F: include/linux/amd-iommu.h
@ -3990,7 +3990,7 @@ R: Song Liu <song@kernel.org>
R: Yonghong Song <yonghong.song@linux.dev> R: Yonghong Song <yonghong.song@linux.dev>
R: John Fastabend <john.fastabend@gmail.com> R: John Fastabend <john.fastabend@gmail.com>
R: KP Singh <kpsingh@kernel.org> R: KP Singh <kpsingh@kernel.org>
R: Stanislav Fomichev <sdf@google.com> R: Stanislav Fomichev <sdf@fomichev.me>
R: Hao Luo <haoluo@google.com> R: Hao Luo <haoluo@google.com>
R: Jiri Olsa <jolsa@kernel.org> R: Jiri Olsa <jolsa@kernel.org>
L: bpf@vger.kernel.org L: bpf@vger.kernel.org
@ -4093,12 +4093,13 @@ F: kernel/bpf/ringbuf.c
BPF [SECURITY & LSM] (Security Audit and Enforcement using BPF) BPF [SECURITY & LSM] (Security Audit and Enforcement using BPF)
M: KP Singh <kpsingh@kernel.org> M: KP Singh <kpsingh@kernel.org>
R: Matt Bobrowski <mattbobrowski@google.com> M: Matt Bobrowski <mattbobrowski@google.com>
L: bpf@vger.kernel.org L: bpf@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/bpf/prog_lsm.rst F: Documentation/bpf/prog_lsm.rst
F: include/linux/bpf_lsm.h F: include/linux/bpf_lsm.h
F: kernel/bpf/bpf_lsm.c F: kernel/bpf/bpf_lsm.c
F: kernel/trace/bpf_trace.c
F: security/bpf/ F: security/bpf/
BPF [SELFTESTS] (Test Runners & Infrastructure) BPF [SELFTESTS] (Test Runners & Infrastructure)
@ -5305,7 +5306,7 @@ F: drivers/infiniband/hw/usnic/
CLANG CONTROL FLOW INTEGRITY SUPPORT CLANG CONTROL FLOW INTEGRITY SUPPORT
M: Sami Tolvanen <samitolvanen@google.com> M: Sami Tolvanen <samitolvanen@google.com>
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Nathan Chancellor <nathan@kernel.org> R: Nathan Chancellor <nathan@kernel.org>
L: llvm@lists.linux.dev L: llvm@lists.linux.dev
S: Supported S: Supported
@ -8221,7 +8222,7 @@ F: rust/kernel/net/phy.rs
EXEC & BINFMT API, ELF EXEC & BINFMT API, ELF
R: Eric Biederman <ebiederm@xmission.com> R: Eric Biederman <ebiederm@xmission.com>
R: Kees Cook <keescook@chromium.org> R: Kees Cook <kees@kernel.org>
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/execve T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/execve
@ -8622,7 +8623,7 @@ S: Maintained
F: drivers/net/ethernet/nvidia/* F: drivers/net/ethernet/nvidia/*
FORTIFY_SOURCE FORTIFY_SOURCE
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
@ -9112,7 +9113,7 @@ F: include/linux/mfd/gsc.h
F: include/linux/platform_data/gsc_hwmon.h F: include/linux/platform_data/gsc_hwmon.h
GCC PLUGINS GCC PLUGINS
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
@ -9246,7 +9247,7 @@ S: Maintained
F: drivers/input/touchscreen/resistive-adc-touch.c F: drivers/input/touchscreen/resistive-adc-touch.c
GENERIC STRING LIBRARY GENERIC STRING LIBRARY
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Andy Shevchenko <andy@kernel.org> R: Andy Shevchenko <andy@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Supported S: Supported
@ -11166,7 +11167,7 @@ M: David Woodhouse <dwmw2@infradead.org>
M: Lu Baolu <baolu.lu@linux.intel.com> M: Lu Baolu <baolu.lu@linux.intel.com>
L: iommu@lists.linux.dev L: iommu@lists.linux.dev
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
F: drivers/iommu/intel/ F: drivers/iommu/intel/
INTEL IPU3 CSI-2 CIO2 DRIVER INTEL IPU3 CSI-2 CIO2 DRIVER
@ -11540,7 +11541,7 @@ IOMMU DMA-API LAYER
M: Robin Murphy <robin.murphy@arm.com> M: Robin Murphy <robin.murphy@arm.com>
L: iommu@lists.linux.dev L: iommu@lists.linux.dev
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
F: drivers/iommu/dma-iommu.c F: drivers/iommu/dma-iommu.c
F: drivers/iommu/dma-iommu.h F: drivers/iommu/dma-iommu.h
F: drivers/iommu/iova.c F: drivers/iommu/iova.c
@ -11552,7 +11553,7 @@ M: Will Deacon <will@kernel.org>
R: Robin Murphy <robin.murphy@arm.com> R: Robin Murphy <robin.murphy@arm.com>
L: iommu@lists.linux.dev L: iommu@lists.linux.dev
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
F: Documentation/devicetree/bindings/iommu/ F: Documentation/devicetree/bindings/iommu/
F: Documentation/userspace-api/iommu.rst F: Documentation/userspace-api/iommu.rst
F: drivers/iommu/ F: drivers/iommu/
@ -11961,7 +11962,7 @@ F: scripts/package/
F: usr/ F: usr/
KERNEL HARDENING (not covered by other areas) KERNEL HARDENING (not covered by other areas)
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Gustavo A. R. Silva <gustavoars@kernel.org> R: Gustavo A. R. Silva <gustavoars@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Supported S: Supported
@ -12393,7 +12394,6 @@ F: drivers/video/backlight/ktz8866.c
KVM PARAVIRT (KVM/paravirt) KVM PARAVIRT (KVM/paravirt)
M: Paolo Bonzini <pbonzini@redhat.com> M: Paolo Bonzini <pbonzini@redhat.com>
R: Wanpeng Li <wanpengli@tencent.com>
R: Vitaly Kuznetsov <vkuznets@redhat.com> R: Vitaly Kuznetsov <vkuznets@redhat.com>
L: kvm@vger.kernel.org L: kvm@vger.kernel.org
S: Supported S: Supported
@ -12489,7 +12489,7 @@ F: drivers/scsi/53c700*
LEAKING_ADDRESSES LEAKING_ADDRESSES
M: Tycho Andersen <tycho@tycho.pizza> M: Tycho Andersen <tycho@tycho.pizza>
R: Kees Cook <keescook@chromium.org> R: Kees Cook <kees@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
@ -12785,7 +12785,7 @@ F: arch/powerpc/platforms/8xx/
F: arch/powerpc/platforms/83xx/ F: arch/powerpc/platforms/83xx/
LINUX KERNEL DUMP TEST MODULE (LKDTM) LINUX KERNEL DUMP TEST MODULE (LKDTM)
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
S: Maintained S: Maintained
F: drivers/misc/lkdtm/* F: drivers/misc/lkdtm/*
F: tools/testing/selftests/lkdtm/* F: tools/testing/selftests/lkdtm/*
@ -12915,7 +12915,7 @@ Q: http://patchwork.linuxtv.org/project/linux-media/list/
F: drivers/media/usb/dvb-usb-v2/lmedm04* F: drivers/media/usb/dvb-usb-v2/lmedm04*
LOADPIN SECURITY MODULE LOADPIN SECURITY MODULE
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
F: Documentation/admin-guide/LSM/LoadPin.rst F: Documentation/admin-guide/LSM/LoadPin.rst
@ -17543,7 +17543,6 @@ F: include/linux/peci.h
PENSANDO ETHERNET DRIVERS PENSANDO ETHERNET DRIVERS
M: Shannon Nelson <shannon.nelson@amd.com> M: Shannon Nelson <shannon.nelson@amd.com>
M: Brett Creeley <brett.creeley@amd.com> M: Brett Creeley <brett.creeley@amd.com>
M: drivers@pensando.io
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Supported
F: Documentation/networking/device_drivers/ethernet/pensando/ionic.rst F: Documentation/networking/device_drivers/ethernet/pensando/ionic.rst
@ -18007,7 +18006,7 @@ F: tools/testing/selftests/proc/
PROC SYSCTL PROC SYSCTL
M: Luis Chamberlain <mcgrof@kernel.org> M: Luis Chamberlain <mcgrof@kernel.org>
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
M: Joel Granados <j.granados@samsung.com> M: Joel Granados <j.granados@samsung.com>
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
L: linux-fsdevel@vger.kernel.org L: linux-fsdevel@vger.kernel.org
@ -18063,7 +18062,7 @@ F: Documentation/devicetree/bindings/net/pse-pd/
F: drivers/net/pse-pd/ F: drivers/net/pse-pd/
PSTORE FILESYSTEM PSTORE FILESYSTEM
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Tony Luck <tony.luck@intel.com> R: Tony Luck <tony.luck@intel.com>
R: Guilherme G. Piccoli <gpiccoli@igalia.com> R: Guilherme G. Piccoli <gpiccoli@igalia.com>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
@ -18221,6 +18220,7 @@ QCOM AUDIO (ASoC) DRIVERS
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
M: Banajit Goswami <bgoswami@quicinc.com> M: Banajit Goswami <bgoswami@quicinc.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
L: linux-arm-msm@vger.kernel.org
S: Supported S: Supported
F: Documentation/devicetree/bindings/soc/qcom/qcom,apr* F: Documentation/devicetree/bindings/soc/qcom/qcom,apr*
F: Documentation/devicetree/bindings/sound/qcom,* F: Documentation/devicetree/bindings/sound/qcom,*
@ -20077,7 +20077,7 @@ F: drivers/media/cec/platform/seco/seco-cec.c
F: drivers/media/cec/platform/seco/seco-cec.h F: drivers/media/cec/platform/seco/seco-cec.h
SECURE COMPUTING SECURE COMPUTING
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Andy Lutomirski <luto@amacapital.net> R: Andy Lutomirski <luto@amacapital.net>
R: Will Drewry <wad@chromium.org> R: Will Drewry <wad@chromium.org>
S: Supported S: Supported
@ -22765,7 +22765,7 @@ M: Jarkko Sakkinen <jarkko@kernel.org>
R: Jason Gunthorpe <jgg@ziepe.ca> R: Jason Gunthorpe <jgg@ziepe.ca>
L: linux-integrity@vger.kernel.org L: linux-integrity@vger.kernel.org
S: Maintained S: Maintained
W: https://gitlab.com/jarkkojs/linux-tpmdd-test W: https://codeberg.org/jarkko/linux-tpmdd-test
Q: https://patchwork.kernel.org/project/linux-integrity/list/ Q: https://patchwork.kernel.org/project/linux-integrity/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
F: Documentation/devicetree/bindings/tpm/ F: Documentation/devicetree/bindings/tpm/
@ -22991,7 +22991,7 @@ F: drivers/block/ublk_drv.c
F: include/uapi/linux/ublk_cmd.h F: include/uapi/linux/ublk_cmd.h
UBSAN UBSAN
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Marco Elver <elver@google.com> R: Marco Elver <elver@google.com>
R: Andrey Konovalov <andreyknvl@gmail.com> R: Andrey Konovalov <andreyknvl@gmail.com>
R: Andrey Ryabinin <ryabinin.a.a@gmail.com> R: Andrey Ryabinin <ryabinin.a.a@gmail.com>
@ -23993,7 +23993,6 @@ VMALLOC
M: Andrew Morton <akpm@linux-foundation.org> M: Andrew Morton <akpm@linux-foundation.org>
R: Uladzislau Rezki <urezki@gmail.com> R: Uladzislau Rezki <urezki@gmail.com>
R: Christoph Hellwig <hch@infradead.org> R: Christoph Hellwig <hch@infradead.org>
R: Lorenzo Stoakes <lstoakes@gmail.com>
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Maintained S: Maintained
W: http://www.linux-mm.org W: http://www.linux-mm.org
@ -24829,7 +24828,7 @@ F: drivers/net/hamradio/yam*
F: include/linux/yam.h F: include/linux/yam.h
YAMA SECURITY MODULE YAMA SECURITY MODULE
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
F: Documentation/admin-guide/LSM/Yama.rst F: Documentation/admin-guide/LSM/Yama.rst

View File

@ -2,7 +2,7 @@
VERSION = 6 VERSION = 6
PATCHLEVEL = 10 PATCHLEVEL = 10
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc4 EXTRAVERSION = -rc6
NAME = Baby Opossum Posse NAME = Baby Opossum Posse
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -85,7 +85,7 @@
}; };
}; };
panel { panel_dpi: panel {
compatible = "sii,43wvf1g"; compatible = "sii,43wvf1g";
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_display_power>; pinctrl-0 = <&pinctrl_display_power>;

View File

@ -10,8 +10,6 @@
/plugin/; /plugin/;
&{/} { &{/} {
/delete-node/ panel;
hdmi: connector-hdmi { hdmi: connector-hdmi {
compatible = "hdmi-connector"; compatible = "hdmi-connector";
label = "hdmi"; label = "hdmi";
@ -82,6 +80,10 @@
}; };
}; };
&panel_dpi {
status = "disabled";
};
&tve { &tve {
status = "disabled"; status = "disabled";
}; };

View File

@ -14,6 +14,7 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/uaccess.h>
#ifdef CONFIG_EFI #ifdef CONFIG_EFI
void efi_init(void); void efi_init(void);
@ -25,6 +26,18 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md, boo
#define arch_efi_call_virt_setup() efi_virtmap_load() #define arch_efi_call_virt_setup() efi_virtmap_load()
#define arch_efi_call_virt_teardown() efi_virtmap_unload() #define arch_efi_call_virt_teardown() efi_virtmap_unload()
#ifdef CONFIG_CPU_TTBR0_PAN
#undef arch_efi_call_virt
#define arch_efi_call_virt(p, f, args...) ({ \
unsigned int flags = uaccess_save_and_enable(); \
efi_status_t res = _Generic((p)->f(args), \
efi_status_t: (p)->f(args), \
default: ((p)->f(args), EFI_ABORTED)); \
uaccess_restore(flags); \
res; \
})
#endif
#define ARCH_EFI_IRQ_FLAGS_MASK \ #define ARCH_EFI_IRQ_FLAGS_MASK \
(PSR_J_BIT | PSR_E_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT | \ (PSR_J_BIT | PSR_E_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT | \
PSR_T_BIT | MODE_MASK) PSR_T_BIT | MODE_MASK)

View File

@ -6,6 +6,7 @@
#include <dt-bindings/phy/phy-imx8-pcie.h> #include <dt-bindings/phy/phy-imx8-pcie.h>
#include <dt-bindings/pwm/pwm.h> #include <dt-bindings/pwm/pwm.h>
#include "imx8mm.dtsi" #include "imx8mm.dtsi"
#include "imx8mm-overdrive.dtsi"
/ { / {
chosen { chosen {
@ -935,7 +936,7 @@
/* Verdin GPIO_9_DSI (pulled-up as active-low) */ /* Verdin GPIO_9_DSI (pulled-up as active-low) */
pinctrl_gpio_9_dsi: gpio9dsigrp { pinctrl_gpio_9_dsi: gpio9dsigrp {
fsl,pins = fsl,pins =
<MX8MM_IOMUXC_NAND_RE_B_GPIO3_IO15 0x146>; /* SODIMM 17 */ <MX8MM_IOMUXC_NAND_RE_B_GPIO3_IO15 0x1c6>; /* SODIMM 17 */
}; };
/* Verdin GPIO_10_DSI (pulled-up as active-low) */ /* Verdin GPIO_10_DSI (pulled-up as active-low) */

View File

@ -254,7 +254,7 @@
<&clk IMX8MP_CLK_CLKOUT2>, <&clk IMX8MP_CLK_CLKOUT2>,
<&clk IMX8MP_AUDIO_PLL2_OUT>; <&clk IMX8MP_AUDIO_PLL2_OUT>;
assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL2_OUT>; assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL2_OUT>;
assigned-clock-rates = <13000000>, <13000000>, <156000000>; assigned-clock-rates = <13000000>, <13000000>, <208000000>;
reset-gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>; reset-gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>;
status = "disabled"; status = "disabled";

View File

@ -219,7 +219,7 @@
bluetooth { bluetooth {
compatible = "brcm,bcm4330-bt"; compatible = "brcm,bcm4330-bt";
shutdown-gpios = <&gpio4 16 GPIO_ACTIVE_HIGH>; shutdown-gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
}; };
}; };

View File

@ -36,7 +36,7 @@
regulator-name = "SD1_SPWR"; regulator-name = "SD1_SPWR";
regulator-min-microvolt = <3000000>; regulator-min-microvolt = <3000000>;
regulator-max-microvolt = <3000000>; regulator-max-microvolt = <3000000>;
gpio = <&lsio_gpio4 19 GPIO_ACTIVE_HIGH>; gpio = <&lsio_gpio4 7 GPIO_ACTIVE_HIGH>;
enable-active-high; enable-active-high;
}; };

View File

@ -296,7 +296,6 @@
vmmc-supply = <&reg_usdhc2_vmmc>; vmmc-supply = <&reg_usdhc2_vmmc>;
bus-width = <4>; bus-width = <4>;
status = "okay"; status = "okay";
no-sdio;
no-mmc; no-mmc;
}; };

View File

@ -170,6 +170,7 @@
#define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */ #define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */
#define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */ #define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */
#define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */ #define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */
#define PTE_SWBITS_MASK _AT(pteval_t, (BIT(63) | GENMASK(58, 55)))
#define PTE_ADDR_LOW (((_AT(pteval_t, 1) << (50 - PAGE_SHIFT)) - 1) << PAGE_SHIFT) #define PTE_ADDR_LOW (((_AT(pteval_t, 1) << (50 - PAGE_SHIFT)) - 1) << PAGE_SHIFT)
#ifdef CONFIG_ARM64_PA_BITS_52 #ifdef CONFIG_ARM64_PA_BITS_52

View File

@ -840,7 +840,7 @@ __SYSCALL(__NR_pselect6_time64, compat_sys_pselect6_time64)
#define __NR_ppoll_time64 414 #define __NR_ppoll_time64 414
__SYSCALL(__NR_ppoll_time64, compat_sys_ppoll_time64) __SYSCALL(__NR_ppoll_time64, compat_sys_ppoll_time64)
#define __NR_io_pgetevents_time64 416 #define __NR_io_pgetevents_time64 416
__SYSCALL(__NR_io_pgetevents_time64, sys_io_pgetevents) __SYSCALL(__NR_io_pgetevents_time64, compat_sys_io_pgetevents_time64)
#define __NR_recvmmsg_time64 417 #define __NR_recvmmsg_time64 417
__SYSCALL(__NR_recvmmsg_time64, compat_sys_recvmmsg_time64) __SYSCALL(__NR_recvmmsg_time64, compat_sys_recvmmsg_time64)
#define __NR_mq_timedsend_time64 418 #define __NR_mq_timedsend_time64 418

View File

@ -9,6 +9,7 @@
#include <linux/efi.h> #include <linux/efi.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kmemleak.h>
#include <linux/screen_info.h> #include <linux/screen_info.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
@ -213,6 +214,7 @@ l: if (!p) {
return -ENOMEM; return -ENOMEM;
} }
kmemleak_not_leak(p);
efi_rt_stack_top = p + THREAD_SIZE; efi_rt_stack_top = p + THREAD_SIZE;
return 0; return 0;
} }

View File

@ -173,7 +173,7 @@ static void __init remap_idmap_for_lpa2(void)
* Don't bother with the FDT, we no longer need it after this. * Don't bother with the FDT, we no longer need it after this.
*/ */
memset(init_idmap_pg_dir, 0, memset(init_idmap_pg_dir, 0,
(u64)init_idmap_pg_dir - (u64)init_idmap_pg_end); (u64)init_idmap_pg_end - (u64)init_idmap_pg_dir);
create_init_idmap(init_idmap_pg_dir, mask); create_init_idmap(init_idmap_pg_dir, mask);
dsb(ishst); dsb(ishst);

View File

@ -53,17 +53,15 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
syscall_set_return_value(current, regs, 0, ret); syscall_set_return_value(current, regs, 0, ret);
/* /*
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(), * This value will get limited by KSTACK_OFFSET_MAX(), which is 10
* but not enough for arm64 stack utilization comfort. To keep * bits. The actual entropy will be further reduced by the compiler
* reasonable stack head room, reduce the maximum offset to 9 bits. * when applying stack alignment constraints: the AAPCS mandates a
* 16-byte aligned SP at function boundaries, which will remove the
* 4 low bits from any entropy chosen here.
* *
* The actual entropy will be further reduced by the compiler when * The resulting 6 bits of entropy is seen in SP[9:4].
* applying stack alignment constraints: the AAPCS mandates a
* 16-byte (i.e. 4-bit) aligned SP at function boundaries.
*
* The resulting 5 bits of entropy is seen in SP[8:4].
*/ */
choose_random_kstack_offset(get_random_u16() & 0x1FF); choose_random_kstack_offset(get_random_u16());
} }
static inline bool has_syscall_work(unsigned long flags) static inline bool has_syscall_work(unsigned long flags)

View File

@ -177,6 +177,14 @@ static void ffa_retrieve_req(struct arm_smccc_res *res, u32 len)
res); res);
} }
static void ffa_rx_release(struct arm_smccc_res *res)
{
arm_smccc_1_1_smc(FFA_RX_RELEASE,
0, 0,
0, 0, 0, 0, 0,
res);
}
static void do_ffa_rxtx_map(struct arm_smccc_res *res, static void do_ffa_rxtx_map(struct arm_smccc_res *res,
struct kvm_cpu_context *ctxt) struct kvm_cpu_context *ctxt)
{ {
@ -543,16 +551,19 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *res,
if (WARN_ON(offset > len || if (WARN_ON(offset > len ||
fraglen > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE)) { fraglen > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE)) {
ret = FFA_RET_ABORTED; ret = FFA_RET_ABORTED;
ffa_rx_release(res);
goto out_unlock; goto out_unlock;
} }
if (len > ffa_desc_buf.len) { if (len > ffa_desc_buf.len) {
ret = FFA_RET_NO_MEMORY; ret = FFA_RET_NO_MEMORY;
ffa_rx_release(res);
goto out_unlock; goto out_unlock;
} }
buf = ffa_desc_buf.buf; buf = ffa_desc_buf.buf;
memcpy(buf, hyp_buffers.rx, fraglen); memcpy(buf, hyp_buffers.rx, fraglen);
ffa_rx_release(res);
for (fragoff = fraglen; fragoff < len; fragoff += fraglen) { for (fragoff = fraglen; fragoff < len; fragoff += fraglen) {
ffa_mem_frag_rx(res, handle_lo, handle_hi, fragoff); ffa_mem_frag_rx(res, handle_lo, handle_hi, fragoff);
@ -563,6 +574,7 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *res,
fraglen = res->a3; fraglen = res->a3;
memcpy((void *)buf + fragoff, hyp_buffers.rx, fraglen); memcpy((void *)buf + fragoff, hyp_buffers.rx, fraglen);
ffa_rx_release(res);
} }
ffa_mem_reclaim(res, handle_lo, handle_hi, flags); ffa_mem_reclaim(res, handle_lo, handle_hi, flags);

View File

@ -391,7 +391,7 @@ static void kvm_vgic_dist_destroy(struct kvm *kvm)
if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) { if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) {
list_for_each_entry_safe(rdreg, next, &dist->rd_regions, list) list_for_each_entry_safe(rdreg, next, &dist->rd_regions, list)
vgic_v3_free_redist_region(rdreg); vgic_v3_free_redist_region(kvm, rdreg);
INIT_LIST_HEAD(&dist->rd_regions); INIT_LIST_HEAD(&dist->rd_regions);
} else { } else {
dist->vgic_cpu_base = VGIC_ADDR_UNDEF; dist->vgic_cpu_base = VGIC_ADDR_UNDEF;

View File

@ -919,8 +919,19 @@ free:
return ret; return ret;
} }
void vgic_v3_free_redist_region(struct vgic_redist_region *rdreg) void vgic_v3_free_redist_region(struct kvm *kvm, struct vgic_redist_region *rdreg)
{ {
struct kvm_vcpu *vcpu;
unsigned long c;
lockdep_assert_held(&kvm->arch.config_lock);
/* Garbage collect the region */
kvm_for_each_vcpu(c, vcpu, kvm) {
if (vcpu->arch.vgic_cpu.rdreg == rdreg)
vcpu->arch.vgic_cpu.rdreg = NULL;
}
list_del(&rdreg->list); list_del(&rdreg->list);
kfree(rdreg); kfree(rdreg);
} }
@ -945,7 +956,7 @@ int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count)
mutex_lock(&kvm->arch.config_lock); mutex_lock(&kvm->arch.config_lock);
rdreg = vgic_v3_rdist_region_from_index(kvm, index); rdreg = vgic_v3_rdist_region_from_index(kvm, index);
vgic_v3_free_redist_region(rdreg); vgic_v3_free_redist_region(kvm, rdreg);
mutex_unlock(&kvm->arch.config_lock); mutex_unlock(&kvm->arch.config_lock);
return ret; return ret;
} }

View File

@ -316,7 +316,7 @@ vgic_v3_rd_region_size(struct kvm *kvm, struct vgic_redist_region *rdreg)
struct vgic_redist_region *vgic_v3_rdist_region_from_index(struct kvm *kvm, struct vgic_redist_region *vgic_v3_rdist_region_from_index(struct kvm *kvm,
u32 index); u32 index);
void vgic_v3_free_redist_region(struct vgic_redist_region *rdreg); void vgic_v3_free_redist_region(struct kvm *kvm, struct vgic_redist_region *rdreg);
bool vgic_v3_rdist_overlap(struct kvm *kvm, gpa_t base, size_t size); bool vgic_v3_rdist_overlap(struct kvm *kvm, gpa_t base, size_t size);

View File

@ -124,7 +124,8 @@ bool pgattr_change_is_safe(u64 old, u64 new)
* The following mapping attributes may be updated in live * The following mapping attributes may be updated in live
* kernel mappings without the need for break-before-make. * kernel mappings without the need for break-before-make.
*/ */
pteval_t mask = PTE_PXN | PTE_RDONLY | PTE_WRITE | PTE_NG; pteval_t mask = PTE_PXN | PTE_RDONLY | PTE_WRITE | PTE_NG |
PTE_SWBITS_MASK;
/* creating or taking down mappings is always safe */ /* creating or taking down mappings is always safe */
if (!pte_valid(__pte(old)) || !pte_valid(__pte(new))) if (!pte_valid(__pte(old)) || !pte_valid(__pte(new)))

View File

@ -6,6 +6,7 @@
#define __ARCH_WANT_SYS_CLONE3 #define __ARCH_WANT_SYS_CLONE3
#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SET_GET_RLIMIT
#define __ARCH_WANT_TIME32_SYSCALLS #define __ARCH_WANT_TIME32_SYSCALLS
#define __ARCH_WANT_SYNC_FILE_RANGE2
#include <asm-generic/unistd.h> #include <asm-generic/unistd.h>
#define __NR_set_thread_area (__NR_arch_specific_syscall + 0) #define __NR_set_thread_area (__NR_arch_specific_syscall + 0)

View File

@ -20,7 +20,7 @@ SYSCALL_DEFINE6(mmap2,
unsigned long, prot, unsigned long, prot,
unsigned long, flags, unsigned long, flags,
unsigned long, fd, unsigned long, fd,
off_t, offset) unsigned long, offset)
{ {
if (unlikely(offset & (~PAGE_MASK >> 12))) if (unlikely(offset & (~PAGE_MASK >> 12)))
return -EINVAL; return -EINVAL;

View File

@ -0,0 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 */
#include <asm-generic/syscalls.h>
asmlinkage long sys_hexagon_fadvise64_64(int fd, int advice,
u32 a2, u32 a3, u32 a4, u32 a5);

View File

@ -36,5 +36,6 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_TIME32_SYSCALLS #define __ARCH_WANT_TIME32_SYSCALLS
#define __ARCH_WANT_SYNC_FILE_RANGE2
#include <asm-generic/unistd.h> #include <asm-generic/unistd.h>

View File

@ -14,6 +14,13 @@
#undef __SYSCALL #undef __SYSCALL
#define __SYSCALL(nr, call) [nr] = (call), #define __SYSCALL(nr, call) [nr] = (call),
SYSCALL_DEFINE6(hexagon_fadvise64_64, int, fd, int, advice,
SC_ARG64(offset), SC_ARG64(len))
{
return ksys_fadvise64_64(fd, SC_VAL64(loff_t, offset), SC_VAL64(loff_t, len), advice);
}
#define sys_fadvise64_64 sys_hexagon_fadvise64_64
void *sys_call_table[__NR_syscalls] = { void *sys_call_table[__NR_syscalls] = {
#include <asm/unistd.h> #include <asm/unistd.h>
}; };

View File

@ -143,7 +143,7 @@ config LOONGARCH
select HAVE_LIVEPATCH select HAVE_LIVEPATCH
select HAVE_MOD_ARCH_SPECIFIC select HAVE_MOD_ARCH_SPECIFIC
select HAVE_NMI select HAVE_NMI
select HAVE_OBJTOOL if AS_HAS_EXPLICIT_RELOCS select HAVE_OBJTOOL if AS_HAS_EXPLICIT_RELOCS && AS_HAS_THIN_ADD_SUB && !CC_IS_CLANG
select HAVE_PCI select HAVE_PCI
select HAVE_PERF_EVENTS select HAVE_PERF_EVENTS
select HAVE_PERF_REGS select HAVE_PERF_REGS
@ -261,6 +261,9 @@ config AS_HAS_EXPLICIT_RELOCS
config AS_HAS_FCSR_CLASS config AS_HAS_FCSR_CLASS
def_bool $(as-instr,movfcsr2gr \$t0$(comma)\$fcsr0) def_bool $(as-instr,movfcsr2gr \$t0$(comma)\$fcsr0)
config AS_HAS_THIN_ADD_SUB
def_bool $(cc-option,-Wa$(comma)-mthin-add-sub)
config AS_HAS_LSX_EXTENSION config AS_HAS_LSX_EXTENSION
def_bool $(as-instr,vld \$vr0$(comma)\$a0$(comma)0) def_bool $(as-instr,vld \$vr0$(comma)\$a0$(comma)0)

View File

@ -28,6 +28,7 @@ config UNWINDER_PROLOGUE
config UNWINDER_ORC config UNWINDER_ORC
bool "ORC unwinder" bool "ORC unwinder"
depends on HAVE_OBJTOOL
select OBJTOOL select OBJTOOL
help help
This option enables the ORC (Oops Rewind Capability) unwinder for This option enables the ORC (Oops Rewind Capability) unwinder for

View File

@ -75,6 +75,8 @@ do { \
#define CSR_MWPC_NUM 0x3f #define CSR_MWPC_NUM 0x3f
#define CTRL_PLV_ENABLE 0x1e #define CTRL_PLV_ENABLE 0x1e
#define CTRL_PLV0_ENABLE 0x02
#define CTRL_PLV3_ENABLE 0x10
#define MWPnCFG3_LoadEn 8 #define MWPnCFG3_LoadEn 8
#define MWPnCFG3_StoreEn 9 #define MWPnCFG3_StoreEn 9
@ -101,7 +103,7 @@ struct perf_event;
struct perf_event_attr; struct perf_event_attr;
extern int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl, extern int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl,
int *gen_len, int *gen_type, int *offset); int *gen_len, int *gen_type);
extern int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw); extern int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw);
extern int hw_breakpoint_arch_parse(struct perf_event *bp, extern int hw_breakpoint_arch_parse(struct perf_event *bp,
const struct perf_event_attr *attr, const struct perf_event_attr *attr,

View File

@ -174,11 +174,21 @@ void flush_ptrace_hw_breakpoint(struct task_struct *tsk)
static int hw_breakpoint_control(struct perf_event *bp, static int hw_breakpoint_control(struct perf_event *bp,
enum hw_breakpoint_ops ops) enum hw_breakpoint_ops ops)
{ {
u32 ctrl; u32 ctrl, privilege;
int i, max_slots, enable; int i, max_slots, enable;
struct pt_regs *regs;
struct perf_event **slots; struct perf_event **slots;
struct arch_hw_breakpoint *info = counter_arch_bp(bp); struct arch_hw_breakpoint *info = counter_arch_bp(bp);
if (arch_check_bp_in_kernelspace(info))
privilege = CTRL_PLV0_ENABLE;
else
privilege = CTRL_PLV3_ENABLE;
/* Whether bp belongs to a task. */
if (bp->hw.target)
regs = task_pt_regs(bp->hw.target);
if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) { if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) {
/* Breakpoint */ /* Breakpoint */
slots = this_cpu_ptr(bp_on_reg); slots = this_cpu_ptr(bp_on_reg);
@ -197,31 +207,38 @@ static int hw_breakpoint_control(struct perf_event *bp,
switch (ops) { switch (ops) {
case HW_BREAKPOINT_INSTALL: case HW_BREAKPOINT_INSTALL:
/* Set the FWPnCFG/MWPnCFG 1~4 register. */ /* Set the FWPnCFG/MWPnCFG 1~4 register. */
write_wb_reg(CSR_CFG_ADDR, i, 0, info->address);
write_wb_reg(CSR_CFG_ADDR, i, 1, info->address);
write_wb_reg(CSR_CFG_MASK, i, 0, info->mask);
write_wb_reg(CSR_CFG_MASK, i, 1, info->mask);
write_wb_reg(CSR_CFG_ASID, i, 0, 0);
write_wb_reg(CSR_CFG_ASID, i, 1, 0);
if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) { if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) {
write_wb_reg(CSR_CFG_CTRL, i, 0, CTRL_PLV_ENABLE); write_wb_reg(CSR_CFG_ADDR, i, 0, info->address);
write_wb_reg(CSR_CFG_MASK, i, 0, info->mask);
write_wb_reg(CSR_CFG_ASID, i, 0, 0);
write_wb_reg(CSR_CFG_CTRL, i, 0, privilege);
} else { } else {
write_wb_reg(CSR_CFG_ADDR, i, 1, info->address);
write_wb_reg(CSR_CFG_MASK, i, 1, info->mask);
write_wb_reg(CSR_CFG_ASID, i, 1, 0);
ctrl = encode_ctrl_reg(info->ctrl); ctrl = encode_ctrl_reg(info->ctrl);
write_wb_reg(CSR_CFG_CTRL, i, 1, ctrl | CTRL_PLV_ENABLE); write_wb_reg(CSR_CFG_CTRL, i, 1, ctrl | privilege);
} }
enable = csr_read64(LOONGARCH_CSR_CRMD); enable = csr_read64(LOONGARCH_CSR_CRMD);
csr_write64(CSR_CRMD_WE | enable, LOONGARCH_CSR_CRMD); csr_write64(CSR_CRMD_WE | enable, LOONGARCH_CSR_CRMD);
if (bp->hw.target)
regs->csr_prmd |= CSR_PRMD_PWE;
break; break;
case HW_BREAKPOINT_UNINSTALL: case HW_BREAKPOINT_UNINSTALL:
/* Reset the FWPnCFG/MWPnCFG 1~4 register. */ /* Reset the FWPnCFG/MWPnCFG 1~4 register. */
write_wb_reg(CSR_CFG_ADDR, i, 0, 0); if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) {
write_wb_reg(CSR_CFG_ADDR, i, 1, 0); write_wb_reg(CSR_CFG_ADDR, i, 0, 0);
write_wb_reg(CSR_CFG_MASK, i, 0, 0); write_wb_reg(CSR_CFG_MASK, i, 0, 0);
write_wb_reg(CSR_CFG_MASK, i, 1, 0); write_wb_reg(CSR_CFG_CTRL, i, 0, 0);
write_wb_reg(CSR_CFG_CTRL, i, 0, 0); write_wb_reg(CSR_CFG_ASID, i, 0, 0);
write_wb_reg(CSR_CFG_CTRL, i, 1, 0); } else {
write_wb_reg(CSR_CFG_ASID, i, 0, 0); write_wb_reg(CSR_CFG_ADDR, i, 1, 0);
write_wb_reg(CSR_CFG_ASID, i, 1, 0); write_wb_reg(CSR_CFG_MASK, i, 1, 0);
write_wb_reg(CSR_CFG_CTRL, i, 1, 0);
write_wb_reg(CSR_CFG_ASID, i, 1, 0);
}
if (bp->hw.target)
regs->csr_prmd &= ~CSR_PRMD_PWE;
break; break;
} }
@ -283,7 +300,7 @@ int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw)
* to generic breakpoint descriptions. * to generic breakpoint descriptions.
*/ */
int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl, int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl,
int *gen_len, int *gen_type, int *offset) int *gen_len, int *gen_type)
{ {
/* Type */ /* Type */
switch (ctrl.type) { switch (ctrl.type) {
@ -303,11 +320,6 @@ int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl,
return -EINVAL; return -EINVAL;
} }
if (!ctrl.len)
return -EINVAL;
*offset = __ffs(ctrl.len);
/* Len */ /* Len */
switch (ctrl.len) { switch (ctrl.len) {
case LOONGARCH_BREAKPOINT_LEN_1: case LOONGARCH_BREAKPOINT_LEN_1:
@ -386,21 +398,17 @@ int hw_breakpoint_arch_parse(struct perf_event *bp,
struct arch_hw_breakpoint *hw) struct arch_hw_breakpoint *hw)
{ {
int ret; int ret;
u64 alignment_mask, offset; u64 alignment_mask;
/* Build the arch_hw_breakpoint. */ /* Build the arch_hw_breakpoint. */
ret = arch_build_bp_info(bp, attr, hw); ret = arch_build_bp_info(bp, attr, hw);
if (ret) if (ret)
return ret; return ret;
if (hw->ctrl.type != LOONGARCH_BREAKPOINT_EXECUTE) if (hw->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) {
alignment_mask = 0x7;
else
alignment_mask = 0x3; alignment_mask = 0x3;
offset = hw->address & alignment_mask; hw->address &= ~alignment_mask;
}
hw->address &= ~alignment_mask;
hw->ctrl.len <<= offset;
return 0; return 0;
} }
@ -471,12 +479,15 @@ void breakpoint_handler(struct pt_regs *regs)
slots = this_cpu_ptr(bp_on_reg); slots = this_cpu_ptr(bp_on_reg);
for (i = 0; i < boot_cpu_data.watch_ireg_count; ++i) { for (i = 0; i < boot_cpu_data.watch_ireg_count; ++i) {
bp = slots[i]; if ((csr_read32(LOONGARCH_CSR_FWPS) & (0x1 << i))) {
if (bp == NULL) bp = slots[i];
continue; if (bp == NULL)
perf_bp_event(bp, regs); continue;
perf_bp_event(bp, regs);
csr_write32(0x1 << i, LOONGARCH_CSR_FWPS);
update_bp_registers(regs, 0, 0);
}
} }
update_bp_registers(regs, 0, 0);
} }
NOKPROBE_SYMBOL(breakpoint_handler); NOKPROBE_SYMBOL(breakpoint_handler);
@ -488,12 +499,15 @@ void watchpoint_handler(struct pt_regs *regs)
slots = this_cpu_ptr(wp_on_reg); slots = this_cpu_ptr(wp_on_reg);
for (i = 0; i < boot_cpu_data.watch_dreg_count; ++i) { for (i = 0; i < boot_cpu_data.watch_dreg_count; ++i) {
wp = slots[i]; if ((csr_read32(LOONGARCH_CSR_MWPS) & (0x1 << i))) {
if (wp == NULL) wp = slots[i];
continue; if (wp == NULL)
perf_bp_event(wp, regs); continue;
perf_bp_event(wp, regs);
csr_write32(0x1 << i, LOONGARCH_CSR_MWPS);
update_bp_registers(regs, 0, 1);
}
} }
update_bp_registers(regs, 0, 1);
} }
NOKPROBE_SYMBOL(watchpoint_handler); NOKPROBE_SYMBOL(watchpoint_handler);

View File

@ -494,28 +494,14 @@ static int ptrace_hbp_fill_attr_ctrl(unsigned int note_type,
struct arch_hw_breakpoint_ctrl ctrl, struct arch_hw_breakpoint_ctrl ctrl,
struct perf_event_attr *attr) struct perf_event_attr *attr)
{ {
int err, len, type, offset; int err, len, type;
err = arch_bp_generic_fields(ctrl, &len, &type, &offset); err = arch_bp_generic_fields(ctrl, &len, &type);
if (err) if (err)
return err; return err;
switch (note_type) {
case NT_LOONGARCH_HW_BREAK:
if ((type & HW_BREAKPOINT_X) != type)
return -EINVAL;
break;
case NT_LOONGARCH_HW_WATCH:
if ((type & HW_BREAKPOINT_RW) != type)
return -EINVAL;
break;
default:
return -EINVAL;
}
attr->bp_len = len; attr->bp_len = len;
attr->bp_type = type; attr->bp_type = type;
attr->bp_addr += offset;
return 0; return 0;
} }
@ -609,10 +595,27 @@ static int ptrace_hbp_set_ctrl(unsigned int note_type,
return PTR_ERR(bp); return PTR_ERR(bp);
attr = bp->attr; attr = bp->attr;
decode_ctrl_reg(uctrl, &ctrl);
err = ptrace_hbp_fill_attr_ctrl(note_type, ctrl, &attr); switch (note_type) {
if (err) case NT_LOONGARCH_HW_BREAK:
return err; ctrl.type = LOONGARCH_BREAKPOINT_EXECUTE;
ctrl.len = LOONGARCH_BREAKPOINT_LEN_4;
break;
case NT_LOONGARCH_HW_WATCH:
decode_ctrl_reg(uctrl, &ctrl);
break;
default:
return -EINVAL;
}
if (uctrl & CTRL_PLV_ENABLE) {
err = ptrace_hbp_fill_attr_ctrl(note_type, ctrl, &attr);
if (err)
return err;
attr.disabled = 0;
} else {
attr.disabled = 1;
}
return modify_user_hw_breakpoint(bp, &attr); return modify_user_hw_breakpoint(bp, &attr);
} }
@ -643,6 +646,10 @@ static int ptrace_hbp_set_addr(unsigned int note_type,
struct perf_event *bp; struct perf_event *bp;
struct perf_event_attr attr; struct perf_event_attr attr;
/* Kernel-space address cannot be monitored by user-space */
if ((unsigned long)addr >= XKPRANGE)
return -EINVAL;
bp = ptrace_hbp_get_initialised_bp(note_type, tsk, idx); bp = ptrace_hbp_get_initialised_bp(note_type, tsk, idx);
if (IS_ERR(bp)) if (IS_ERR(bp))
return PTR_ERR(bp); return PTR_ERR(bp);

View File

@ -22,7 +22,7 @@
#define __SYSCALL(nr, call) [nr] = (call), #define __SYSCALL(nr, call) [nr] = (call),
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long, SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long,
prot, unsigned long, flags, unsigned long, fd, off_t, offset) prot, unsigned long, flags, unsigned long, fd, unsigned long, offset)
{ {
if (offset & ~PAGE_MASK) if (offset & ~PAGE_MASK)
return -EINVAL; return -EINVAL;

View File

@ -761,7 +761,7 @@ static void kvm_handle_service(struct kvm_vcpu *vcpu)
default: default:
ret = KVM_HCALL_INVALID_CODE; ret = KVM_HCALL_INVALID_CODE;
break; break;
}; }
kvm_write_reg(vcpu, LOONGARCH_GPR_A0, ret); kvm_write_reg(vcpu, LOONGARCH_GPR_A0, ret);
} }

View File

@ -35,7 +35,7 @@
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
unsigned long, prot, unsigned long, flags, unsigned long, fd, unsigned long, prot, unsigned long, flags, unsigned long, fd,
off_t, pgoff) unsigned long, pgoff)
{ {
if (pgoff & ~PAGE_MASK) if (pgoff & ~PAGE_MASK)
return -EINVAL; return -EINVAL;

View File

@ -110,7 +110,8 @@ static void bcm6358_quirks(void)
* RAC flush causes kernel panics on BCM6358 when booting from TP1 * RAC flush causes kernel panics on BCM6358 when booting from TP1
* because the bootloader is not initializing it properly. * because the bootloader is not initializing it properly.
*/ */
bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31)); bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31)) ||
!!BMIPS_GET_CBR();
} }
static void bcm6368_quirks(void) static void bcm6368_quirks(void)

View File

@ -322,7 +322,7 @@ static inline void ehb(void)
" .set push \n" \ " .set push \n" \
" .set "MIPS_ISA_LEVEL" \n" \ " .set "MIPS_ISA_LEVEL" \n" \
_ASM_SET_MFTC0 \ _ASM_SET_MFTC0 \
" mftc0 $1, " #rt ", " #sel " \n" \ " mftc0 %0, " #rt ", " #sel " \n" \
_ASM_UNSET_MFTC0 \ _ASM_UNSET_MFTC0 \
" .set pop \n" \ " .set pop \n" \
: "=r" (__res)); \ : "=r" (__res)); \

View File

@ -354,7 +354,7 @@
412 n32 utimensat_time64 sys_utimensat 412 n32 utimensat_time64 sys_utimensat
413 n32 pselect6_time64 compat_sys_pselect6_time64 413 n32 pselect6_time64 compat_sys_pselect6_time64
414 n32 ppoll_time64 compat_sys_ppoll_time64 414 n32 ppoll_time64 compat_sys_ppoll_time64
416 n32 io_pgetevents_time64 sys_io_pgetevents 416 n32 io_pgetevents_time64 compat_sys_io_pgetevents_time64
417 n32 recvmmsg_time64 compat_sys_recvmmsg_time64 417 n32 recvmmsg_time64 compat_sys_recvmmsg_time64
418 n32 mq_timedsend_time64 sys_mq_timedsend 418 n32 mq_timedsend_time64 sys_mq_timedsend
419 n32 mq_timedreceive_time64 sys_mq_timedreceive 419 n32 mq_timedreceive_time64 sys_mq_timedreceive

View File

@ -27,7 +27,7 @@
17 o32 break sys_ni_syscall 17 o32 break sys_ni_syscall
# 18 was sys_stat # 18 was sys_stat
18 o32 unused18 sys_ni_syscall 18 o32 unused18 sys_ni_syscall
19 o32 lseek sys_lseek 19 o32 lseek sys_lseek compat_sys_lseek
20 o32 getpid sys_getpid 20 o32 getpid sys_getpid
21 o32 mount sys_mount 21 o32 mount sys_mount
22 o32 umount sys_oldumount 22 o32 umount sys_oldumount
@ -403,7 +403,7 @@
412 o32 utimensat_time64 sys_utimensat sys_utimensat 412 o32 utimensat_time64 sys_utimensat sys_utimensat
413 o32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64 413 o32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
414 o32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64 414 o32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
416 o32 io_pgetevents_time64 sys_io_pgetevents sys_io_pgetevents 416 o32 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
417 o32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64 417 o32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
418 o32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend 418 o32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend
419 o32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive 419 o32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive

View File

@ -112,8 +112,8 @@ retry:
* gives them time to settle * gives them time to settle
*/ */
if (where == PCI_VENDOR_ID) { if (where == PCI_VENDOR_ID) {
if (ret == 0xffffffff || ret == 0x00000000 || if (*val == 0xffffffff || *val == 0x00000000 ||
ret == 0x0000ffff || ret == 0xffff0000) { *val == 0x0000ffff || *val == 0xffff0000) {
if (delay > 4) if (delay > 4)
return 0; return 0;
delay *= 2; delay *= 2;

View File

@ -16,6 +16,7 @@ config PARISC
select ARCH_HAS_UBSAN select ARCH_HAS_UBSAN
select ARCH_HAS_PTE_SPECIAL select ARCH_HAS_PTE_SPECIAL
select ARCH_NO_SG_CHAIN select ARCH_NO_SG_CHAIN
select ARCH_SPLIT_ARG64 if !64BIT
select ARCH_SUPPORTS_HUGETLBFS if PA20 select ARCH_SUPPORTS_HUGETLBFS if PA20
select ARCH_SUPPORTS_MEMORY_FAILURE select ARCH_SUPPORTS_MEMORY_FAILURE
select ARCH_STACKWALK select ARCH_STACKWALK

View File

@ -23,12 +23,3 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23,
current->comm, current->pid, r20); current->comm, current->pid, r20);
return -ENOSYS; return -ENOSYS;
} }
asmlinkage long sys32_fanotify_mark(compat_int_t fanotify_fd, compat_uint_t flags,
compat_uint_t mask0, compat_uint_t mask1, compat_int_t dfd,
const char __user * pathname)
{
return sys_fanotify_mark(fanotify_fd, flags,
((__u64)mask1 << 32) | mask0,
dfd, pathname);
}

View File

@ -108,7 +108,7 @@
95 common fchown sys_fchown 95 common fchown sys_fchown
96 common getpriority sys_getpriority 96 common getpriority sys_getpriority
97 common setpriority sys_setpriority 97 common setpriority sys_setpriority
98 common recv sys_recv 98 common recv sys_recv compat_sys_recv
99 common statfs sys_statfs compat_sys_statfs 99 common statfs sys_statfs compat_sys_statfs
100 common fstatfs sys_fstatfs compat_sys_fstatfs 100 common fstatfs sys_fstatfs compat_sys_fstatfs
101 common stat64 sys_stat64 101 common stat64 sys_stat64
@ -135,7 +135,7 @@
120 common clone sys_clone_wrapper 120 common clone sys_clone_wrapper
121 common setdomainname sys_setdomainname 121 common setdomainname sys_setdomainname
122 common sendfile sys_sendfile compat_sys_sendfile 122 common sendfile sys_sendfile compat_sys_sendfile
123 common recvfrom sys_recvfrom 123 common recvfrom sys_recvfrom compat_sys_recvfrom
124 32 adjtimex sys_adjtimex_time32 124 32 adjtimex sys_adjtimex_time32
124 64 adjtimex sys_adjtimex 124 64 adjtimex sys_adjtimex
125 common mprotect sys_mprotect 125 common mprotect sys_mprotect
@ -364,7 +364,7 @@
320 common accept4 sys_accept4 320 common accept4 sys_accept4
321 common prlimit64 sys_prlimit64 321 common prlimit64 sys_prlimit64
322 common fanotify_init sys_fanotify_init 322 common fanotify_init sys_fanotify_init
323 common fanotify_mark sys_fanotify_mark sys32_fanotify_mark 323 common fanotify_mark sys_fanotify_mark compat_sys_fanotify_mark
324 32 clock_adjtime sys_clock_adjtime32 324 32 clock_adjtime sys_clock_adjtime32
324 64 clock_adjtime sys_clock_adjtime 324 64 clock_adjtime sys_clock_adjtime
325 common name_to_handle_at sys_name_to_handle_at 325 common name_to_handle_at sys_name_to_handle_at

View File

@ -1,3 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
aesp10-ppc.S aesp10-ppc.S
aesp8-ppc.S
ghashp10-ppc.S ghashp10-ppc.S
ghashp8-ppc.S

View File

@ -230,8 +230,10 @@
178 nospu rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend 178 nospu rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend
179 32 pread64 sys_ppc_pread64 compat_sys_ppc_pread64 179 32 pread64 sys_ppc_pread64 compat_sys_ppc_pread64
179 64 pread64 sys_pread64 179 64 pread64 sys_pread64
179 spu pread64 sys_pread64
180 32 pwrite64 sys_ppc_pwrite64 compat_sys_ppc_pwrite64 180 32 pwrite64 sys_ppc_pwrite64 compat_sys_ppc_pwrite64
180 64 pwrite64 sys_pwrite64 180 64 pwrite64 sys_pwrite64
180 spu pwrite64 sys_pwrite64
181 common chown sys_chown 181 common chown sys_chown
182 common getcwd sys_getcwd 182 common getcwd sys_getcwd
183 common capget sys_capget 183 common capget sys_capget
@ -246,6 +248,7 @@
190 common ugetrlimit sys_getrlimit compat_sys_getrlimit 190 common ugetrlimit sys_getrlimit compat_sys_getrlimit
191 32 readahead sys_ppc_readahead compat_sys_ppc_readahead 191 32 readahead sys_ppc_readahead compat_sys_ppc_readahead
191 64 readahead sys_readahead 191 64 readahead sys_readahead
191 spu readahead sys_readahead
192 32 mmap2 sys_mmap2 compat_sys_mmap2 192 32 mmap2 sys_mmap2 compat_sys_mmap2
193 32 truncate64 sys_ppc_truncate64 compat_sys_ppc_truncate64 193 32 truncate64 sys_ppc_truncate64 compat_sys_ppc_truncate64
194 32 ftruncate64 sys_ppc_ftruncate64 compat_sys_ppc_ftruncate64 194 32 ftruncate64 sys_ppc_ftruncate64 compat_sys_ppc_ftruncate64
@ -293,6 +296,7 @@
232 nospu set_tid_address sys_set_tid_address 232 nospu set_tid_address sys_set_tid_address
233 32 fadvise64 sys_ppc32_fadvise64 compat_sys_ppc32_fadvise64 233 32 fadvise64 sys_ppc32_fadvise64 compat_sys_ppc32_fadvise64
233 64 fadvise64 sys_fadvise64 233 64 fadvise64 sys_fadvise64
233 spu fadvise64 sys_fadvise64
234 nospu exit_group sys_exit_group 234 nospu exit_group sys_exit_group
235 nospu lookup_dcookie sys_ni_syscall 235 nospu lookup_dcookie sys_ni_syscall
236 common epoll_create sys_epoll_create 236 common epoll_create sys_epoll_create
@ -502,7 +506,7 @@
412 32 utimensat_time64 sys_utimensat sys_utimensat 412 32 utimensat_time64 sys_utimensat sys_utimensat
413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64 413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64 414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
416 32 io_pgetevents_time64 sys_io_pgetevents sys_io_pgetevents 416 32 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64 417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
418 32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend 418 32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend
419 32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive 419 32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive

View File

@ -130,14 +130,16 @@ long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
} }
rcu_read_unlock(); rcu_read_unlock();
fdput(f); if (!found) {
fdput(f);
if (!found)
return -EINVAL; return -EINVAL;
}
table_group = iommu_group_get_iommudata(grp); table_group = iommu_group_get_iommudata(grp);
if (WARN_ON(!table_group)) if (WARN_ON(!table_group)) {
fdput(f);
return -EFAULT; return -EFAULT;
}
for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) { for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
struct iommu_table *tbltmp = table_group->tables[i]; struct iommu_table *tbltmp = table_group->tables[i];
@ -158,8 +160,10 @@ long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
break; break;
} }
} }
if (!tbl) if (!tbl) {
fdput(f);
return -EINVAL; return -EINVAL;
}
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(stit, &stt->iommu_tables, next) { list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
@ -170,6 +174,7 @@ long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
/* stit is being destroyed */ /* stit is being destroyed */
iommu_tce_table_put(tbl); iommu_tce_table_put(tbl);
rcu_read_unlock(); rcu_read_unlock();
fdput(f);
return -ENOTTY; return -ENOTTY;
} }
/* /*
@ -177,6 +182,7 @@ long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
* its KVM reference counter and can return. * its KVM reference counter and can return.
*/ */
rcu_read_unlock(); rcu_read_unlock();
fdput(f);
return 0; return 0;
} }
rcu_read_unlock(); rcu_read_unlock();
@ -184,6 +190,7 @@ long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
stit = kzalloc(sizeof(*stit), GFP_KERNEL); stit = kzalloc(sizeof(*stit), GFP_KERNEL);
if (!stit) { if (!stit) {
iommu_tce_table_put(tbl); iommu_tce_table_put(tbl);
fdput(f);
return -ENOMEM; return -ENOMEM;
} }
@ -192,6 +199,7 @@ long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
list_add_rcu(&stit->next, &stt->iommu_tables); list_add_rcu(&stit->next, &stt->iommu_tables);
fdput(f);
return 0; return 0;
} }

View File

@ -45,6 +45,7 @@
no-1-8-v; no-1-8-v;
no-mmc; no-mmc;
no-sdio; no-sdio;
disable-wp;
}; };
&uart0 { &uart0 {

View File

@ -145,7 +145,7 @@
/* parts of opcode for RVF, RVD and RVQ */ /* parts of opcode for RVF, RVD and RVQ */
#define RVFDQ_FL_FS_WIDTH_OFF 12 #define RVFDQ_FL_FS_WIDTH_OFF 12
#define RVFDQ_FL_FS_WIDTH_MASK GENMASK(3, 0) #define RVFDQ_FL_FS_WIDTH_MASK GENMASK(2, 0)
#define RVFDQ_FL_FS_WIDTH_W 2 #define RVFDQ_FL_FS_WIDTH_W 2
#define RVFDQ_FL_FS_WIDTH_D 3 #define RVFDQ_FL_FS_WIDTH_D 3
#define RVFDQ_LS_FS_WIDTH_Q 4 #define RVFDQ_LS_FS_WIDTH_Q 4

View File

@ -120,9 +120,6 @@ int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec)
out = ftrace_make_nop(mod, rec, MCOUNT_ADDR); out = ftrace_make_nop(mod, rec, MCOUNT_ADDR);
mutex_unlock(&text_mutex); mutex_unlock(&text_mutex);
if (!mod)
local_flush_icache_range(rec->ip, rec->ip + MCOUNT_INSN_SIZE);
return out; return out;
} }
@ -156,9 +153,9 @@ static int __ftrace_modify_code(void *data)
} else { } else {
while (atomic_read(&param->cpu_count) <= num_online_cpus()) while (atomic_read(&param->cpu_count) <= num_online_cpus())
cpu_relax(); cpu_relax();
}
local_flush_icache_all(); local_flush_icache_all();
}
return 0; return 0;
} }

View File

@ -89,6 +89,14 @@ static int __patch_insn_set(void *addr, u8 c, size_t len)
memset(waddr, c, len); memset(waddr, c, len);
/*
* We could have just patched a function that is about to be
* called so make sure we don't execute partially patched
* instructions by flushing the icache as soon as possible.
*/
local_flush_icache_range((unsigned long)waddr,
(unsigned long)waddr + len);
patch_unmap(FIX_TEXT_POKE0); patch_unmap(FIX_TEXT_POKE0);
if (across_pages) if (across_pages)
@ -135,6 +143,14 @@ static int __patch_insn_write(void *addr, const void *insn, size_t len)
ret = copy_to_kernel_nofault(waddr, insn, len); ret = copy_to_kernel_nofault(waddr, insn, len);
/*
* We could have just patched a function that is about to be
* called so make sure we don't execute partially patched
* instructions by flushing the icache as soon as possible.
*/
local_flush_icache_range((unsigned long)waddr,
(unsigned long)waddr + len);
patch_unmap(FIX_TEXT_POKE0); patch_unmap(FIX_TEXT_POKE0);
if (across_pages) if (across_pages)
@ -189,9 +205,6 @@ int patch_text_set_nosync(void *addr, u8 c, size_t len)
ret = patch_insn_set(tp, c, len); ret = patch_insn_set(tp, c, len);
if (!ret)
flush_icache_range((uintptr_t)tp, (uintptr_t)tp + len);
return ret; return ret;
} }
NOKPROBE_SYMBOL(patch_text_set_nosync); NOKPROBE_SYMBOL(patch_text_set_nosync);
@ -224,9 +237,6 @@ int patch_text_nosync(void *addr, const void *insns, size_t len)
ret = patch_insn_write(tp, insns, len); ret = patch_insn_write(tp, insns, len);
if (!ret)
flush_icache_range((uintptr_t) tp, (uintptr_t) tp + len);
return ret; return ret;
} }
NOKPROBE_SYMBOL(patch_text_nosync); NOKPROBE_SYMBOL(patch_text_nosync);
@ -253,9 +263,9 @@ static int patch_text_cb(void *data)
} else { } else {
while (atomic_read(&patch->cpu_count) <= num_online_cpus()) while (atomic_read(&patch->cpu_count) <= num_online_cpus())
cpu_relax(); cpu_relax();
}
local_flush_icache_all(); local_flush_icache_all();
}
return ret; return ret;
} }

View File

@ -156,7 +156,7 @@ unsigned long __get_wchan(struct task_struct *task)
return pc; return pc;
} }
noinline void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, noinline noinstr void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
struct task_struct *task, struct pt_regs *regs) struct task_struct *task, struct pt_regs *regs)
{ {
walk_stackframe(task, regs, consume_entry, cookie); walk_stackframe(task, regs, consume_entry, cookie);

View File

@ -23,7 +23,7 @@ static long riscv_sys_mmap(unsigned long addr, unsigned long len,
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
unsigned long, prot, unsigned long, flags, unsigned long, prot, unsigned long, flags,
unsigned long, fd, off_t, offset) unsigned long, fd, unsigned long, offset)
{ {
return riscv_sys_mmap(addr, len, prot, flags, fd, offset, 0); return riscv_sys_mmap(addr, len, prot, flags, fd, offset, 0);
} }
@ -32,7 +32,7 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT) #if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len,
unsigned long, prot, unsigned long, flags, unsigned long, prot, unsigned long, flags,
unsigned long, fd, off_t, offset) unsigned long, fd, unsigned long, offset)
{ {
/* /*
* Note that the shift for mmap2 is constant (12), * Note that the shift for mmap2 is constant (12),

View File

@ -170,11 +170,14 @@ static void kaslr_adjust_got(unsigned long offset)
u64 *entry; u64 *entry;
/* /*
* Even without -fPIE, Clang still uses a global offset table for some * Adjust GOT entries, except for ones for undefined weak symbols
* reason. Adjust the GOT entries. * that resolved to zero. This also skips the first three reserved
* entries on s390x that are zero.
*/ */
for (entry = (u64 *)vmlinux.got_start; entry < (u64 *)vmlinux.got_end; entry++) for (entry = (u64 *)vmlinux.got_start; entry < (u64 *)vmlinux.got_end; entry++) {
*entry += offset - __START_KERNEL; if (*entry)
*entry += offset - __START_KERNEL;
}
} }
/* /*

View File

@ -54,7 +54,7 @@ static __always_inline void arch_exit_to_user_mode(void)
static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs, static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
unsigned long ti_work) unsigned long ti_work)
{ {
choose_random_kstack_offset(get_tod_clock_fast() & 0xff); choose_random_kstack_offset(get_tod_clock_fast());
} }
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare #define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare

View File

@ -38,33 +38,6 @@
#include "entry.h" #include "entry.h"
/*
* Perform the mmap() system call. Linux for S/390 isn't able to handle more
* than 5 system call parameters, so this system call uses a memory block
* for parameter passing.
*/
struct s390_mmap_arg_struct {
unsigned long addr;
unsigned long len;
unsigned long prot;
unsigned long flags;
unsigned long fd;
unsigned long offset;
};
SYSCALL_DEFINE1(mmap2, struct s390_mmap_arg_struct __user *, arg)
{
struct s390_mmap_arg_struct a;
int error = -EFAULT;
if (copy_from_user(&a, arg, sizeof(a)))
goto out;
error = ksys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
out:
return error;
}
#ifdef CONFIG_SYSVIPC #ifdef CONFIG_SYSVIPC
/* /*
* sys_ipc() is the de-multiplexer for the SysV IPC calls. * sys_ipc() is the de-multiplexer for the SysV IPC calls.

View File

@ -418,7 +418,7 @@
412 32 utimensat_time64 - sys_utimensat 412 32 utimensat_time64 - sys_utimensat
413 32 pselect6_time64 - compat_sys_pselect6_time64 413 32 pselect6_time64 - compat_sys_pselect6_time64
414 32 ppoll_time64 - compat_sys_ppoll_time64 414 32 ppoll_time64 - compat_sys_ppoll_time64
416 32 io_pgetevents_time64 - sys_io_pgetevents 416 32 io_pgetevents_time64 - compat_sys_io_pgetevents_time64
417 32 recvmmsg_time64 - compat_sys_recvmmsg_time64 417 32 recvmmsg_time64 - compat_sys_recvmmsg_time64
418 32 mq_timedsend_time64 - sys_mq_timedsend 418 32 mq_timedsend_time64 - sys_mq_timedsend
419 32 mq_timedreceive_time64 - sys_mq_timedreceive 419 32 mq_timedreceive_time64 - sys_mq_timedreceive

View File

@ -410,7 +410,7 @@ static void __init cpu_enable_directed_irq(void *unused)
union zpci_sic_iib iib = {{0}}; union zpci_sic_iib iib = {{0}};
union zpci_sic_iib ziib = {{0}}; union zpci_sic_iib ziib = {{0}};
iib.cdiib.dibv_addr = (u64) zpci_ibv[smp_processor_id()]->vector; iib.cdiib.dibv_addr = virt_to_phys(zpci_ibv[smp_processor_id()]->vector);
zpci_set_irq_ctrl(SIC_IRQ_MODE_SET_CPU, 0, &iib); zpci_set_irq_ctrl(SIC_IRQ_MODE_SET_CPU, 0, &iib);
zpci_set_irq_ctrl(SIC_IRQ_MODE_D_SINGLE, PCI_ISC, &ziib); zpci_set_irq_ctrl(SIC_IRQ_MODE_D_SINGLE, PCI_ISC, &ziib);

View File

@ -59,3 +59,14 @@ asmlinkage int sys_fadvise64_64_wrapper(int fd, u32 offset0, u32 offset1,
(u64)len0 << 32 | len1, advice); (u64)len0 << 32 | len1, advice);
#endif #endif
} }
/*
* swap the arguments the way that libc wants them instead of
* moving flags ahead of the 64-bit nbytes argument
*/
SYSCALL_DEFINE6(sh_sync_file_range6, int, fd, SC_ARG64(offset),
SC_ARG64(nbytes), unsigned int, flags)
{
return ksys_sync_file_range(fd, SC_VAL64(loff_t, offset),
SC_VAL64(loff_t, nbytes), flags);
}

View File

@ -321,7 +321,7 @@
311 common set_robust_list sys_set_robust_list 311 common set_robust_list sys_set_robust_list
312 common get_robust_list sys_get_robust_list 312 common get_robust_list sys_get_robust_list
313 common splice sys_splice 313 common splice sys_splice
314 common sync_file_range sys_sync_file_range 314 common sync_file_range sys_sh_sync_file_range6
315 common tee sys_tee 315 common tee sys_tee
316 common vmsplice sys_vmsplice 316 common vmsplice sys_vmsplice
317 common move_pages sys_move_pages 317 common move_pages sys_move_pages
@ -395,6 +395,7 @@
385 common pkey_alloc sys_pkey_alloc 385 common pkey_alloc sys_pkey_alloc
386 common pkey_free sys_pkey_free 386 common pkey_free sys_pkey_free
387 common rseq sys_rseq 387 common rseq sys_rseq
388 common sync_file_range2 sys_sync_file_range2
# room for arch specific syscalls # room for arch specific syscalls
393 common semget sys_semget 393 common semget sys_semget
394 common semctl sys_semctl 394 common semctl sys_semctl

View File

@ -18,224 +18,3 @@ sys32_mmap2:
sethi %hi(sys_mmap), %g1 sethi %hi(sys_mmap), %g1
jmpl %g1 + %lo(sys_mmap), %g0 jmpl %g1 + %lo(sys_mmap), %g0
sllx %o5, 12, %o5 sllx %o5, 12, %o5
.align 32
.globl sys32_socketcall
sys32_socketcall: /* %o0=call, %o1=args */
cmp %o0, 1
bl,pn %xcc, do_einval
cmp %o0, 18
bg,pn %xcc, do_einval
sub %o0, 1, %o0
sllx %o0, 5, %o0
sethi %hi(__socketcall_table_begin), %g2
or %g2, %lo(__socketcall_table_begin), %g2
jmpl %g2 + %o0, %g0
nop
do_einval:
retl
mov -EINVAL, %o0
.align 32
__socketcall_table_begin:
/* Each entry is exactly 32 bytes. */
do_sys_socket: /* sys_socket(int, int, int) */
1: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_socket), %g1
2: ldswa [%o1 + 0x8] %asi, %o2
jmpl %g1 + %lo(sys_socket), %g0
3: ldswa [%o1 + 0x4] %asi, %o1
nop
nop
nop
do_sys_bind: /* sys_bind(int fd, struct sockaddr *, int) */
4: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_bind), %g1
5: ldswa [%o1 + 0x8] %asi, %o2
jmpl %g1 + %lo(sys_bind), %g0
6: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
nop
do_sys_connect: /* sys_connect(int, struct sockaddr *, int) */
7: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_connect), %g1
8: ldswa [%o1 + 0x8] %asi, %o2
jmpl %g1 + %lo(sys_connect), %g0
9: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
nop
do_sys_listen: /* sys_listen(int, int) */
10: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_listen), %g1
jmpl %g1 + %lo(sys_listen), %g0
11: ldswa [%o1 + 0x4] %asi, %o1
nop
nop
nop
nop
do_sys_accept: /* sys_accept(int, struct sockaddr *, int *) */
12: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_accept), %g1
13: lduwa [%o1 + 0x8] %asi, %o2
jmpl %g1 + %lo(sys_accept), %g0
14: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
nop
do_sys_getsockname: /* sys_getsockname(int, struct sockaddr *, int *) */
15: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_getsockname), %g1
16: lduwa [%o1 + 0x8] %asi, %o2
jmpl %g1 + %lo(sys_getsockname), %g0
17: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
nop
do_sys_getpeername: /* sys_getpeername(int, struct sockaddr *, int *) */
18: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_getpeername), %g1
19: lduwa [%o1 + 0x8] %asi, %o2
jmpl %g1 + %lo(sys_getpeername), %g0
20: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
nop
do_sys_socketpair: /* sys_socketpair(int, int, int, int *) */
21: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_socketpair), %g1
22: ldswa [%o1 + 0x8] %asi, %o2
23: lduwa [%o1 + 0xc] %asi, %o3
jmpl %g1 + %lo(sys_socketpair), %g0
24: ldswa [%o1 + 0x4] %asi, %o1
nop
nop
do_sys_send: /* sys_send(int, void *, size_t, unsigned int) */
25: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_send), %g1
26: lduwa [%o1 + 0x8] %asi, %o2
27: lduwa [%o1 + 0xc] %asi, %o3
jmpl %g1 + %lo(sys_send), %g0
28: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
do_sys_recv: /* sys_recv(int, void *, size_t, unsigned int) */
29: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_recv), %g1
30: lduwa [%o1 + 0x8] %asi, %o2
31: lduwa [%o1 + 0xc] %asi, %o3
jmpl %g1 + %lo(sys_recv), %g0
32: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
do_sys_sendto: /* sys_sendto(int, u32, compat_size_t, unsigned int, u32, int) */
33: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_sendto), %g1
34: lduwa [%o1 + 0x8] %asi, %o2
35: lduwa [%o1 + 0xc] %asi, %o3
36: lduwa [%o1 + 0x10] %asi, %o4
37: ldswa [%o1 + 0x14] %asi, %o5
jmpl %g1 + %lo(sys_sendto), %g0
38: lduwa [%o1 + 0x4] %asi, %o1
do_sys_recvfrom: /* sys_recvfrom(int, u32, compat_size_t, unsigned int, u32, u32) */
39: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_recvfrom), %g1
40: lduwa [%o1 + 0x8] %asi, %o2
41: lduwa [%o1 + 0xc] %asi, %o3
42: lduwa [%o1 + 0x10] %asi, %o4
43: lduwa [%o1 + 0x14] %asi, %o5
jmpl %g1 + %lo(sys_recvfrom), %g0
44: lduwa [%o1 + 0x4] %asi, %o1
do_sys_shutdown: /* sys_shutdown(int, int) */
45: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_shutdown), %g1
jmpl %g1 + %lo(sys_shutdown), %g0
46: ldswa [%o1 + 0x4] %asi, %o1
nop
nop
nop
nop
do_sys_setsockopt: /* sys_setsockopt(int, int, int, char *, int) */
47: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_setsockopt), %g1
48: ldswa [%o1 + 0x8] %asi, %o2
49: lduwa [%o1 + 0xc] %asi, %o3
50: ldswa [%o1 + 0x10] %asi, %o4
jmpl %g1 + %lo(sys_setsockopt), %g0
51: ldswa [%o1 + 0x4] %asi, %o1
nop
do_sys_getsockopt: /* sys_getsockopt(int, int, int, u32, u32) */
52: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_getsockopt), %g1
53: ldswa [%o1 + 0x8] %asi, %o2
54: lduwa [%o1 + 0xc] %asi, %o3
55: lduwa [%o1 + 0x10] %asi, %o4
jmpl %g1 + %lo(sys_getsockopt), %g0
56: ldswa [%o1 + 0x4] %asi, %o1
nop
do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
57: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(compat_sys_sendmsg), %g1
58: lduwa [%o1 + 0x8] %asi, %o2
jmpl %g1 + %lo(compat_sys_sendmsg), %g0
59: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
nop
do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) */
60: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(compat_sys_recvmsg), %g1
61: lduwa [%o1 + 0x8] %asi, %o2
jmpl %g1 + %lo(compat_sys_recvmsg), %g0
62: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
nop
do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */
63: ldswa [%o1 + 0x0] %asi, %o0
sethi %hi(sys_accept4), %g1
64: lduwa [%o1 + 0x8] %asi, %o2
65: ldswa [%o1 + 0xc] %asi, %o3
jmpl %g1 + %lo(sys_accept4), %g0
66: lduwa [%o1 + 0x4] %asi, %o1
nop
nop
.section __ex_table,"a"
.align 4
.word 1b, __retl_efault, 2b, __retl_efault
.word 3b, __retl_efault, 4b, __retl_efault
.word 5b, __retl_efault, 6b, __retl_efault
.word 7b, __retl_efault, 8b, __retl_efault
.word 9b, __retl_efault, 10b, __retl_efault
.word 11b, __retl_efault, 12b, __retl_efault
.word 13b, __retl_efault, 14b, __retl_efault
.word 15b, __retl_efault, 16b, __retl_efault
.word 17b, __retl_efault, 18b, __retl_efault
.word 19b, __retl_efault, 20b, __retl_efault
.word 21b, __retl_efault, 22b, __retl_efault
.word 23b, __retl_efault, 24b, __retl_efault
.word 25b, __retl_efault, 26b, __retl_efault
.word 27b, __retl_efault, 28b, __retl_efault
.word 29b, __retl_efault, 30b, __retl_efault
.word 31b, __retl_efault, 32b, __retl_efault
.word 33b, __retl_efault, 34b, __retl_efault
.word 35b, __retl_efault, 36b, __retl_efault
.word 37b, __retl_efault, 38b, __retl_efault
.word 39b, __retl_efault, 40b, __retl_efault
.word 41b, __retl_efault, 42b, __retl_efault
.word 43b, __retl_efault, 44b, __retl_efault
.word 45b, __retl_efault, 46b, __retl_efault
.word 47b, __retl_efault, 48b, __retl_efault
.word 49b, __retl_efault, 50b, __retl_efault
.word 51b, __retl_efault, 52b, __retl_efault
.word 53b, __retl_efault, 54b, __retl_efault
.word 55b, __retl_efault, 56b, __retl_efault
.word 57b, __retl_efault, 58b, __retl_efault
.word 59b, __retl_efault, 60b, __retl_efault
.word 61b, __retl_efault, 62b, __retl_efault
.word 63b, __retl_efault, 64b, __retl_efault
.word 65b, __retl_efault, 66b, __retl_efault
.previous

View File

@ -117,7 +117,7 @@
90 common dup2 sys_dup2 90 common dup2 sys_dup2
91 32 setfsuid32 sys_setfsuid 91 32 setfsuid32 sys_setfsuid
92 common fcntl sys_fcntl compat_sys_fcntl 92 common fcntl sys_fcntl compat_sys_fcntl
93 common select sys_select 93 common select sys_select compat_sys_select
94 32 setfsgid32 sys_setfsgid 94 32 setfsgid32 sys_setfsgid
95 common fsync sys_fsync 95 common fsync sys_fsync
96 common setpriority sys_setpriority 96 common setpriority sys_setpriority
@ -155,7 +155,7 @@
123 32 fchown sys_fchown16 123 32 fchown sys_fchown16
123 64 fchown sys_fchown 123 64 fchown sys_fchown
124 common fchmod sys_fchmod 124 common fchmod sys_fchmod
125 common recvfrom sys_recvfrom 125 common recvfrom sys_recvfrom compat_sys_recvfrom
126 32 setreuid sys_setreuid16 126 32 setreuid sys_setreuid16
126 64 setreuid sys_setreuid 126 64 setreuid sys_setreuid
127 32 setregid sys_setregid16 127 32 setregid sys_setregid16
@ -247,7 +247,7 @@
204 32 readdir sys_old_readdir compat_sys_old_readdir 204 32 readdir sys_old_readdir compat_sys_old_readdir
204 64 readdir sys_nis_syscall 204 64 readdir sys_nis_syscall
205 common readahead sys_readahead compat_sys_readahead 205 common readahead sys_readahead compat_sys_readahead
206 common socketcall sys_socketcall sys32_socketcall 206 common socketcall sys_socketcall compat_sys_socketcall
207 common syslog sys_syslog 207 common syslog sys_syslog
208 common lookup_dcookie sys_ni_syscall 208 common lookup_dcookie sys_ni_syscall
209 common fadvise64 sys_fadvise64 compat_sys_fadvise64 209 common fadvise64 sys_fadvise64 compat_sys_fadvise64
@ -461,7 +461,7 @@
412 32 utimensat_time64 sys_utimensat sys_utimensat 412 32 utimensat_time64 sys_utimensat sys_utimensat
413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64 413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64 414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
416 32 io_pgetevents_time64 sys_io_pgetevents sys_io_pgetevents 416 32 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64 417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
418 32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend 418 32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend
419 32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive 419 32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive

View File

@ -420,7 +420,7 @@
412 i386 utimensat_time64 sys_utimensat 412 i386 utimensat_time64 sys_utimensat
413 i386 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64 413 i386 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
414 i386 ppoll_time64 sys_ppoll compat_sys_ppoll_time64 414 i386 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
416 i386 io_pgetevents_time64 sys_io_pgetevents 416 i386 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
417 i386 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64 417 i386 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
418 i386 mq_timedsend_time64 sys_mq_timedsend 418 i386 mq_timedsend_time64 sys_mq_timedsend
419 i386 mq_timedreceive_time64 sys_mq_timedreceive 419 i386 mq_timedreceive_time64 sys_mq_timedreceive

View File

@ -93,10 +93,9 @@ static __always_inline bool __try_cmpxchg64_local(volatile u64 *ptr, u64 *oldp,
\ \
asm volatile(ALTERNATIVE(_lock_loc \ asm volatile(ALTERNATIVE(_lock_loc \
"call cmpxchg8b_emu", \ "call cmpxchg8b_emu", \
_lock "cmpxchg8b %[ptr]", X86_FEATURE_CX8) \ _lock "cmpxchg8b %a[ptr]", X86_FEATURE_CX8) \
: [ptr] "+m" (*(_ptr)), \ : "+a" (o.low), "+d" (o.high) \
"+a" (o.low), "+d" (o.high) \ : "b" (n.low), "c" (n.high), [ptr] "S" (_ptr) \
: "b" (n.low), "c" (n.high), "S" (_ptr) \
: "memory"); \ : "memory"); \
\ \
o.full; \ o.full; \
@ -122,12 +121,11 @@ static __always_inline u64 arch_cmpxchg64_local(volatile u64 *ptr, u64 old, u64
\ \
asm volatile(ALTERNATIVE(_lock_loc \ asm volatile(ALTERNATIVE(_lock_loc \
"call cmpxchg8b_emu", \ "call cmpxchg8b_emu", \
_lock "cmpxchg8b %[ptr]", X86_FEATURE_CX8) \ _lock "cmpxchg8b %a[ptr]", X86_FEATURE_CX8) \
CC_SET(e) \ CC_SET(e) \
: CC_OUT(e) (ret), \ : CC_OUT(e) (ret), \
[ptr] "+m" (*(_ptr)), \
"+a" (o.low), "+d" (o.high) \ "+a" (o.low), "+d" (o.high) \
: "b" (n.low), "c" (n.high), "S" (_ptr) \ : "b" (n.low), "c" (n.high), [ptr] "S" (_ptr) \
: "memory"); \ : "memory"); \
\ \
if (unlikely(!ret)) \ if (unlikely(!ret)) \

View File

@ -401,7 +401,6 @@ extern int __init efi_memmap_alloc(unsigned int num_entries,
struct efi_memory_map_data *data); struct efi_memory_map_data *data);
extern void __efi_memmap_free(u64 phys, unsigned long size, extern void __efi_memmap_free(u64 phys, unsigned long size,
unsigned long flags); unsigned long flags);
#define __efi_memmap_free __efi_memmap_free
extern int __init efi_memmap_install(struct efi_memory_map_data *data); extern int __init efi_memmap_install(struct efi_memory_map_data *data);
extern int __init efi_memmap_split_count(efi_memory_desc_t *md, extern int __init efi_memmap_split_count(efi_memory_desc_t *md,

View File

@ -73,19 +73,16 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
#endif #endif
/* /*
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(), * This value will get limited by KSTACK_OFFSET_MAX(), which is 10
* but not enough for x86 stack utilization comfort. To keep * bits. The actual entropy will be further reduced by the compiler
* reasonable stack head room, reduce the maximum offset to 8 bits. * when applying stack alignment constraints (see cc_stack_align4/8 in
*
* The actual entropy will be further reduced by the compiler when
* applying stack alignment constraints (see cc_stack_align4/8 in
* arch/x86/Makefile), which will remove the 3 (x86_64) or 2 (ia32) * arch/x86/Makefile), which will remove the 3 (x86_64) or 2 (ia32)
* low bits from any entropy chosen here. * low bits from any entropy chosen here.
* *
* Therefore, final stack offset entropy will be 5 (x86_64) or * Therefore, final stack offset entropy will be 7 (x86_64) or
* 6 (ia32) bits. * 8 (ia32) bits.
*/ */
choose_random_kstack_offset(rdtsc() & 0xFF); choose_random_kstack_offset(rdtsc());
} }
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare #define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare

View File

@ -519,7 +519,8 @@ void free_rmid(u32 closid, u32 rmid)
* allows architectures that ignore the closid parameter to avoid an * allows architectures that ignore the closid parameter to avoid an
* unnecessary check. * unnecessary check.
*/ */
if (idx == resctrl_arch_rmid_idx_encode(RESCTRL_RESERVED_CLOSID, if (!resctrl_arch_mon_capable() ||
idx == resctrl_arch_rmid_idx_encode(RESCTRL_RESERVED_CLOSID,
RESCTRL_RESERVED_RMID)) RESCTRL_RESERVED_RMID))
return; return;

View File

@ -27,25 +27,7 @@
unsigned long profile_pc(struct pt_regs *regs) unsigned long profile_pc(struct pt_regs *regs)
{ {
unsigned long pc = instruction_pointer(regs); return instruction_pointer(regs);
if (!user_mode(regs) && in_lock_functions(pc)) {
#ifdef CONFIG_FRAME_POINTER
return *(unsigned long *)(regs->bp + sizeof(long));
#else
unsigned long *sp = (unsigned long *)regs->sp;
/*
* Return address is either directly at stack pointer
* or above a saved flags. Eflags has bits 22-31 zero,
* kernel addresses don't.
*/
if (sp[0] >> 22)
return sp[0];
if (sp[1] >> 22)
return sp[1];
#endif
}
return pc;
} }
EXPORT_SYMBOL(profile_pc); EXPORT_SYMBOL(profile_pc);

View File

@ -2843,7 +2843,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
if (sev_es_prevent_msr_access(vcpu, msr_info)) { if (sev_es_prevent_msr_access(vcpu, msr_info)) {
msr_info->data = 0; msr_info->data = 0;
return -EINVAL; return vcpu->kvm->arch.has_protected_state ? -EINVAL : 0;
} }
switch (msr_info->index) { switch (msr_info->index) {
@ -2998,7 +2998,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
u64 data = msr->data; u64 data = msr->data;
if (sev_es_prevent_msr_access(vcpu, msr)) if (sev_es_prevent_msr_access(vcpu, msr))
return -EINVAL; return vcpu->kvm->arch.has_protected_state ? -EINVAL : 0;
switch (ecx) { switch (ecx) {
case MSR_AMD64_TSC_RATIO: case MSR_AMD64_TSC_RATIO:

View File

@ -10718,13 +10718,12 @@ static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu)
bitmap_zero(vcpu->arch.ioapic_handled_vectors, 256); bitmap_zero(vcpu->arch.ioapic_handled_vectors, 256);
static_call_cond(kvm_x86_sync_pir_to_irr)(vcpu);
if (irqchip_split(vcpu->kvm)) if (irqchip_split(vcpu->kvm))
kvm_scan_ioapic_routes(vcpu, vcpu->arch.ioapic_handled_vectors); kvm_scan_ioapic_routes(vcpu, vcpu->arch.ioapic_handled_vectors);
else { else if (ioapic_in_kernel(vcpu->kvm))
static_call_cond(kvm_x86_sync_pir_to_irr)(vcpu); kvm_ioapic_scan_entry(vcpu, vcpu->arch.ioapic_handled_vectors);
if (ioapic_in_kernel(vcpu->kvm))
kvm_ioapic_scan_entry(vcpu, vcpu->arch.ioapic_handled_vectors);
}
if (is_guest_mode(vcpu)) if (is_guest_mode(vcpu))
vcpu->arch.load_eoi_exitmap_pending = true; vcpu->arch.load_eoi_exitmap_pending = true;

View File

@ -92,12 +92,22 @@ int __init efi_memmap_alloc(unsigned int num_entries,
*/ */
int __init efi_memmap_install(struct efi_memory_map_data *data) int __init efi_memmap_install(struct efi_memory_map_data *data)
{ {
unsigned long size = efi.memmap.desc_size * efi.memmap.nr_map;
unsigned long flags = efi.memmap.flags;
u64 phys = efi.memmap.phys_map;
int ret;
efi_memmap_unmap(); efi_memmap_unmap();
if (efi_enabled(EFI_PARAVIRT)) if (efi_enabled(EFI_PARAVIRT))
return 0; return 0;
return __efi_memmap_init(data); ret = __efi_memmap_init(data);
if (ret)
return ret;
__efi_memmap_free(phys, size, flags);
return 0;
} }
/** /**

View File

@ -44,7 +44,6 @@ acpi_ex_system_memory_space_handler(u32 function,
struct acpi_mem_mapping *mm = mem_info->cur_mm; struct acpi_mem_mapping *mm = mem_info->cur_mm;
u32 length; u32 length;
acpi_size map_length; acpi_size map_length;
acpi_size page_boundary_map_length;
#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
u32 remainder; u32 remainder;
#endif #endif
@ -138,26 +137,8 @@ acpi_ex_system_memory_space_handler(u32 function,
map_length = (acpi_size) map_length = (acpi_size)
((mem_info->address + mem_info->length) - address); ((mem_info->address + mem_info->length) - address);
/* if (map_length > ACPI_DEFAULT_PAGE_SIZE)
* If mapping the entire remaining portion of the region will cross map_length = ACPI_DEFAULT_PAGE_SIZE;
* a page boundary, just map up to the page boundary, do not cross.
* On some systems, crossing a page boundary while mapping regions
* can cause warnings if the pages have different attributes
* due to resource management.
*
* This has the added benefit of constraining a single mapping to
* one page, which is similar to the original code that used a 4k
* maximum window.
*/
page_boundary_map_length = (acpi_size)
(ACPI_ROUND_UP(address, ACPI_DEFAULT_PAGE_SIZE) - address);
if (page_boundary_map_length == 0) {
page_boundary_map_length = ACPI_DEFAULT_PAGE_SIZE;
}
if (map_length > page_boundary_map_length) {
map_length = page_boundary_map_length;
}
/* Create a new mapping starting at the address given */ /* Create a new mapping starting at the address given */

View File

@ -302,6 +302,10 @@ void acpi_mipi_check_crs_csi2(acpi_handle handle);
void acpi_mipi_scan_crs_csi2(void); void acpi_mipi_scan_crs_csi2(void);
void acpi_mipi_init_crs_csi2_swnodes(void); void acpi_mipi_init_crs_csi2_swnodes(void);
void acpi_mipi_crs_csi2_cleanup(void); void acpi_mipi_crs_csi2_cleanup(void);
#ifdef CONFIG_X86
bool acpi_graph_ignore_port(acpi_handle handle); bool acpi_graph_ignore_port(acpi_handle handle);
#else
static inline bool acpi_graph_ignore_port(acpi_handle handle) { return false; }
#endif
#endif /* _ACPI_INTERNAL_H_ */ #endif /* _ACPI_INTERNAL_H_ */

View File

@ -725,14 +725,20 @@ void acpi_mipi_crs_csi2_cleanup(void)
acpi_mipi_del_crs_csi2(csi2); acpi_mipi_del_crs_csi2(csi2);
} }
static const struct dmi_system_id dmi_ignore_port_nodes[] = { #ifdef CONFIG_X86
{ #include <asm/cpu_device_id.h>
.matches = { #include <asm/intel-family.h>
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "XPS 9315"), /* CPU matches for Dell generations with broken ACPI MIPI DISCO info */
}, static const struct x86_cpu_id dell_broken_mipi_disco_cpu_gens[] = {
}, X86_MATCH_VFM(INTEL_TIGERLAKE, NULL),
{ } X86_MATCH_VFM(INTEL_TIGERLAKE_L, NULL),
X86_MATCH_VFM(INTEL_ALDERLAKE, NULL),
X86_MATCH_VFM(INTEL_ALDERLAKE_L, NULL),
X86_MATCH_VFM(INTEL_RAPTORLAKE, NULL),
X86_MATCH_VFM(INTEL_RAPTORLAKE_P, NULL),
X86_MATCH_VFM(INTEL_RAPTORLAKE_S, NULL),
{}
}; };
static const char *strnext(const char *s1, const char *s2) static const char *strnext(const char *s1, const char *s2)
@ -761,7 +767,10 @@ bool acpi_graph_ignore_port(acpi_handle handle)
static bool dmi_tested, ignore_port; static bool dmi_tested, ignore_port;
if (!dmi_tested) { if (!dmi_tested) {
ignore_port = dmi_first_match(dmi_ignore_port_nodes); if (dmi_name_in_vendors("Dell Inc.") &&
x86_match_cpu(dell_broken_mipi_disco_cpu_gens))
ignore_port = true;
dmi_tested = true; dmi_tested = true;
} }
@ -794,3 +803,4 @@ out_free:
kfree(orig_path); kfree(orig_path);
return false; return false;
} }
#endif

View File

@ -1735,6 +1735,14 @@ static void ahci_update_initial_lpm_policy(struct ata_port *ap)
if (ap->pflags & ATA_PFLAG_EXTERNAL) if (ap->pflags & ATA_PFLAG_EXTERNAL)
return; return;
/* If no LPM states are supported by the HBA, do not bother with LPM */
if ((ap->host->flags & ATA_HOST_NO_PART) &&
(ap->host->flags & ATA_HOST_NO_SSC) &&
(ap->host->flags & ATA_HOST_NO_DEVSLP)) {
ata_port_dbg(ap, "no LPM states supported, not enabling LPM\n");
return;
}
/* user modified policy via module param */ /* user modified policy via module param */
if (mobile_lpm_policy != -1) { if (mobile_lpm_policy != -1) {
policy = mobile_lpm_policy; policy = mobile_lpm_policy;
@ -1967,8 +1975,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map)); n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map));
host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
if (!host) if (!host) {
return -ENOMEM; rc = -ENOMEM;
goto err_rm_sysfs_file;
}
host->private_data = hpriv; host->private_data = hpriv;
if (ahci_init_msi(pdev, n_ports, hpriv) < 0) { if (ahci_init_msi(pdev, n_ports, hpriv) < 0) {
@ -2023,11 +2033,11 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
/* initialize adapter */ /* initialize adapter */
rc = ahci_configure_dma_masks(pdev, hpriv); rc = ahci_configure_dma_masks(pdev, hpriv);
if (rc) if (rc)
return rc; goto err_rm_sysfs_file;
rc = ahci_pci_reset_controller(host); rc = ahci_pci_reset_controller(host);
if (rc) if (rc)
return rc; goto err_rm_sysfs_file;
ahci_pci_init_controller(host); ahci_pci_init_controller(host);
ahci_pci_print_info(host); ahci_pci_print_info(host);
@ -2036,10 +2046,15 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rc = ahci_host_activate(host, &ahci_sht); rc = ahci_host_activate(host, &ahci_sht);
if (rc) if (rc)
return rc; goto err_rm_sysfs_file;
pm_runtime_put_noidle(&pdev->dev); pm_runtime_put_noidle(&pdev->dev);
return 0; return 0;
err_rm_sysfs_file:
sysfs_remove_file_from_group(&pdev->dev.kobj,
&dev_attr_remapped_nvme.attr, NULL);
return rc;
} }
static void ahci_shutdown_one(struct pci_dev *pdev) static void ahci_shutdown_one(struct pci_dev *pdev)

View File

@ -4137,8 +4137,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
{ "PIONEER BD-RW BDR-205", NULL, ATA_HORKAGE_NOLPM }, { "PIONEER BD-RW BDR-205", NULL, ATA_HORKAGE_NOLPM },
/* Crucial devices with broken LPM support */ /* Crucial devices with broken LPM support */
{ "CT500BX100SSD1", NULL, ATA_HORKAGE_NOLPM }, { "CT*0BX*00SSD1", NULL, ATA_HORKAGE_NOLPM },
{ "CT240BX500SSD1", NULL, ATA_HORKAGE_NOLPM },
/* 512GB MX100 with MU01 firmware has both queued TRIM and LPM issues */ /* 512GB MX100 with MU01 firmware has both queued TRIM and LPM issues */
{ "Crucial_CT512MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | { "Crucial_CT512MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
@ -5490,6 +5489,18 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
return ap; return ap;
} }
void ata_port_free(struct ata_port *ap)
{
if (!ap)
return;
kfree(ap->pmp_link);
kfree(ap->slave_link);
kfree(ap->ncq_sense_buf);
kfree(ap);
}
EXPORT_SYMBOL_GPL(ata_port_free);
static void ata_devres_release(struct device *gendev, void *res) static void ata_devres_release(struct device *gendev, void *res)
{ {
struct ata_host *host = dev_get_drvdata(gendev); struct ata_host *host = dev_get_drvdata(gendev);
@ -5516,12 +5527,7 @@ static void ata_host_release(struct kref *kref)
int i; int i;
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i]; ata_port_free(host->ports[i]);
kfree(ap->pmp_link);
kfree(ap->slave_link);
kfree(ap->ncq_sense_buf);
kfree(ap);
host->ports[i] = NULL; host->ports[i] = NULL;
} }
kfree(host); kfree(host);
@ -5571,8 +5577,10 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
if (!host) if (!host)
return NULL; return NULL;
if (!devres_open_group(dev, NULL, GFP_KERNEL)) if (!devres_open_group(dev, NULL, GFP_KERNEL)) {
goto err_free; kfree(host);
return NULL;
}
dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL); dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL);
if (!dr) if (!dr)
@ -5604,8 +5612,6 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
err_out: err_out:
devres_release_group(dev, NULL); devres_release_group(dev, NULL);
err_free:
kfree(host);
return NULL; return NULL;
} }
EXPORT_SYMBOL_GPL(ata_host_alloc); EXPORT_SYMBOL_GPL(ata_host_alloc);
@ -5904,7 +5910,7 @@ int ata_host_register(struct ata_host *host, const struct scsi_host_template *sh
* allocation time. * allocation time.
*/ */
for (i = host->n_ports; host->ports[i]; i++) for (i = host->n_ports; host->ports[i]; i++)
kfree(host->ports[i]); ata_port_free(host->ports[i]);
/* give ports names and add SCSI hosts */ /* give ports names and add SCSI hosts */
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {

View File

@ -6,6 +6,7 @@
*/ */
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/counter.h> #include <linux/counter.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
@ -376,6 +377,7 @@ static int ti_eqep_probe(struct platform_device *pdev)
struct counter_device *counter; struct counter_device *counter;
struct ti_eqep_cnt *priv; struct ti_eqep_cnt *priv;
void __iomem *base; void __iomem *base;
struct clk *clk;
int err; int err;
counter = devm_counter_alloc(dev, sizeof(*priv)); counter = devm_counter_alloc(dev, sizeof(*priv));
@ -415,6 +417,10 @@ static int ti_eqep_probe(struct platform_device *pdev)
pm_runtime_enable(dev); pm_runtime_enable(dev);
pm_runtime_get_sync(dev); pm_runtime_get_sync(dev);
clk = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(clk))
return dev_err_probe(dev, PTR_ERR(clk), "failed to enable clock\n");
err = counter_add(counter); err = counter_add(counter);
if (err < 0) { if (err < 0) {
pm_runtime_put_sync(dev); pm_runtime_put_sync(dev);

View File

@ -355,15 +355,14 @@ static void intel_pstate_set_itmt_prio(int cpu)
int ret; int ret;
ret = cppc_get_perf_caps(cpu, &cppc_perf); ret = cppc_get_perf_caps(cpu, &cppc_perf);
if (ret)
return;
/* /*
* On some systems with overclocking enabled, CPPC.highest_perf is hardcoded to 0xff. * If CPPC is not available, fall back to MSR_HWP_CAPABILITIES bits [8:0].
* In this case we can't use CPPC.highest_perf to enable ITMT. *
* In this case we can look at MSR_HWP_CAPABILITIES bits [8:0] to decide. * Also, on some systems with overclocking enabled, CPPC.highest_perf is
* hardcoded to 0xff, so CPPC.highest_perf cannot be used to enable ITMT.
* Fall back to MSR_HWP_CAPABILITIES then too.
*/ */
if (cppc_perf.highest_perf == CPPC_MAX_PERF) if (ret || cppc_perf.highest_perf == CPPC_MAX_PERF)
cppc_perf.highest_perf = HWP_HIGHEST_PERF(READ_ONCE(all_cpu_data[cpu]->hwp_cap_cached)); cppc_perf.highest_perf = HWP_HIGHEST_PERF(READ_ONCE(all_cpu_data[cpu]->hwp_cap_cached));
/* /*

View File

@ -39,7 +39,8 @@ intel_qat-objs := adf_cfg.o \
adf_sysfs_rl.o \ adf_sysfs_rl.o \
qat_uclo.o \ qat_uclo.o \
qat_hal.o \ qat_hal.o \
qat_bl.o qat_bl.o \
qat_mig_dev.o
intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o \ intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o \
adf_fw_counters.o \ adf_fw_counters.o \
@ -56,6 +57,6 @@ intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o \
intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o adf_pfvf_utils.o \ intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o adf_pfvf_utils.o \
adf_pfvf_pf_msg.o adf_pfvf_pf_proto.o \ adf_pfvf_pf_msg.o adf_pfvf_pf_proto.o \
adf_pfvf_vf_msg.o adf_pfvf_vf_proto.o \ adf_pfvf_vf_msg.o adf_pfvf_vf_proto.o \
adf_gen2_pfvf.o adf_gen4_pfvf.o qat_mig_dev.o adf_gen2_pfvf.o adf_gen4_pfvf.o
intel_qat-$(CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION) += adf_heartbeat_inject.o intel_qat-$(CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION) += adf_heartbeat_inject.o

View File

@ -394,7 +394,7 @@ config LS2X_APB_DMA
config MCF_EDMA config MCF_EDMA
tristate "Freescale eDMA engine support, ColdFire mcf5441x SoCs" tristate "Freescale eDMA engine support, ColdFire mcf5441x SoCs"
depends on M5441x || COMPILE_TEST depends on M5441x || (COMPILE_TEST && FSL_EDMA=n)
select DMA_ENGINE select DMA_ENGINE
select DMA_VIRTUAL_CHANNELS select DMA_VIRTUAL_CHANNELS
help help

View File

@ -611,11 +611,13 @@ static void irq_process_work_list(struct idxd_irq_entry *irq_entry)
spin_unlock(&irq_entry->list_lock); spin_unlock(&irq_entry->list_lock);
list_for_each_entry(desc, &flist, list) { list_for_each_entry_safe(desc, n, &flist, list) {
/* /*
* Check against the original status as ABORT is software defined * Check against the original status as ABORT is software defined
* and 0xff, which DSA_COMP_STATUS_MASK can mask out. * and 0xff, which DSA_COMP_STATUS_MASK can mask out.
*/ */
list_del(&desc->list);
if (unlikely(desc->completion->status == IDXD_COMP_DESC_ABORT)) { if (unlikely(desc->completion->status == IDXD_COMP_DESC_ABORT)) {
idxd_desc_complete(desc, IDXD_COMPLETE_ABORT, true); idxd_desc_complete(desc, IDXD_COMPLETE_ABORT, true);
continue; continue;

View File

@ -534,18 +534,6 @@ err_out:
return err; return err;
} }
static int ioat_register(struct ioatdma_device *ioat_dma)
{
int err = dma_async_device_register(&ioat_dma->dma_dev);
if (err) {
ioat_disable_interrupts(ioat_dma);
dma_pool_destroy(ioat_dma->completion_pool);
}
return err;
}
static void ioat_dma_remove(struct ioatdma_device *ioat_dma) static void ioat_dma_remove(struct ioatdma_device *ioat_dma)
{ {
struct dma_device *dma = &ioat_dma->dma_dev; struct dma_device *dma = &ioat_dma->dma_dev;
@ -1181,9 +1169,9 @@ static int ioat3_dma_probe(struct ioatdma_device *ioat_dma, int dca)
ioat_chan->reg_base + IOAT_DCACTRL_OFFSET); ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
} }
err = ioat_register(ioat_dma); err = dma_async_device_register(&ioat_dma->dma_dev);
if (err) if (err)
return err; goto err_disable_interrupts;
ioat_kobject_add(ioat_dma, &ioat_ktype); ioat_kobject_add(ioat_dma, &ioat_ktype);
@ -1192,20 +1180,29 @@ static int ioat3_dma_probe(struct ioatdma_device *ioat_dma, int dca)
/* disable relaxed ordering */ /* disable relaxed ordering */
err = pcie_capability_read_word(pdev, PCI_EXP_DEVCTL, &val16); err = pcie_capability_read_word(pdev, PCI_EXP_DEVCTL, &val16);
if (err) if (err) {
return pcibios_err_to_errno(err); err = pcibios_err_to_errno(err);
goto err_disable_interrupts;
}
/* clear relaxed ordering enable */ /* clear relaxed ordering enable */
val16 &= ~PCI_EXP_DEVCTL_RELAX_EN; val16 &= ~PCI_EXP_DEVCTL_RELAX_EN;
err = pcie_capability_write_word(pdev, PCI_EXP_DEVCTL, val16); err = pcie_capability_write_word(pdev, PCI_EXP_DEVCTL, val16);
if (err) if (err) {
return pcibios_err_to_errno(err); err = pcibios_err_to_errno(err);
goto err_disable_interrupts;
}
if (ioat_dma->cap & IOAT_CAP_DPS) if (ioat_dma->cap & IOAT_CAP_DPS)
writeb(ioat_pending_level + 1, writeb(ioat_pending_level + 1,
ioat_dma->reg_base + IOAT_PREFETCH_LIMIT_OFFSET); ioat_dma->reg_base + IOAT_PREFETCH_LIMIT_OFFSET);
return 0; return 0;
err_disable_interrupts:
ioat_disable_interrupts(ioat_dma);
dma_pool_destroy(ioat_dma->completion_pool);
return err;
} }
static void ioat_shutdown(struct pci_dev *pdev) static void ioat_shutdown(struct pci_dev *pdev)
@ -1350,6 +1347,8 @@ static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
void __iomem * const *iomap; void __iomem * const *iomap;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct ioatdma_device *device; struct ioatdma_device *device;
unsigned int i;
u8 version;
int err; int err;
err = pcim_enable_device(pdev); err = pcim_enable_device(pdev);
@ -1363,6 +1362,10 @@ static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (!iomap) if (!iomap)
return -ENOMEM; return -ENOMEM;
version = readb(iomap[IOAT_MMIO_BAR] + IOAT_VER_OFFSET);
if (version < IOAT_VER_3_0)
return -ENODEV;
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
if (err) if (err)
return err; return err;
@ -1373,17 +1376,18 @@ static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
pci_set_master(pdev); pci_set_master(pdev);
pci_set_drvdata(pdev, device); pci_set_drvdata(pdev, device);
device->version = readb(device->reg_base + IOAT_VER_OFFSET); device->version = version;
if (device->version >= IOAT_VER_3_4) if (device->version >= IOAT_VER_3_4)
ioat_dca_enabled = 0; ioat_dca_enabled = 0;
if (device->version >= IOAT_VER_3_0) {
if (is_skx_ioat(pdev))
device->version = IOAT_VER_3_2;
err = ioat3_dma_probe(device, ioat_dca_enabled);
} else
return -ENODEV;
if (is_skx_ioat(pdev))
device->version = IOAT_VER_3_2;
err = ioat3_dma_probe(device, ioat_dca_enabled);
if (err) { if (err) {
for (i = 0; i < IOAT_MAX_CHANS; i++)
kfree(device->idx[i]);
kfree(device);
dev_err(dev, "Intel(R) I/OAT DMA Engine init failed\n"); dev_err(dev, "Intel(R) I/OAT DMA Engine init failed\n");
return -ENODEV; return -ENODEV;
} }
@ -1445,6 +1449,7 @@ module_init(ioat_init_module);
static void __exit ioat_exit_module(void) static void __exit ioat_exit_module(void)
{ {
pci_unregister_driver(&ioat_pci_driver); pci_unregister_driver(&ioat_pci_driver);
kmem_cache_destroy(ioat_sed_cache);
kmem_cache_destroy(ioat_cache); kmem_cache_destroy(ioat_cache);
} }
module_exit(ioat_exit_module); module_exit(ioat_exit_module);

View File

@ -200,12 +200,9 @@ of_k3_udma_glue_parse_chn_by_id(struct device_node *udmax_np, struct k3_udma_glu
ret = of_k3_udma_glue_parse(udmax_np, common); ret = of_k3_udma_glue_parse(udmax_np, common);
if (ret) if (ret)
goto out_put_spec; return ret;
ret = of_k3_udma_glue_parse_chn_common(common, thread_id, tx_chn); ret = of_k3_udma_glue_parse_chn_common(common, thread_id, tx_chn);
out_put_spec:
of_node_put(udmax_np);
return ret; return ret;
} }

View File

@ -885,11 +885,11 @@ static irqreturn_t xdma_channel_isr(int irq, void *dev_id)
u32 st; u32 st;
bool repeat_tx; bool repeat_tx;
spin_lock(&xchan->vchan.lock);
if (xchan->stop_requested) if (xchan->stop_requested)
complete(&xchan->last_interrupt); complete(&xchan->last_interrupt);
spin_lock(&xchan->vchan.lock);
/* get submitted request */ /* get submitted request */
vd = vchan_next_desc(&xchan->vchan); vd = vchan_next_desc(&xchan->vchan);
if (!vd) if (!vd)

View File

@ -15,10 +15,6 @@
#include <asm/early_ioremap.h> #include <asm/early_ioremap.h>
#include <asm/efi.h> #include <asm/efi.h>
#ifndef __efi_memmap_free
#define __efi_memmap_free(phys, size, flags) do { } while (0)
#endif
/** /**
* __efi_memmap_init - Common code for mapping the EFI memory map * __efi_memmap_init - Common code for mapping the EFI memory map
* @data: EFI memory map data * @data: EFI memory map data
@ -51,11 +47,6 @@ int __init __efi_memmap_init(struct efi_memory_map_data *data)
return -ENOMEM; return -ENOMEM;
} }
if (efi.memmap.flags & (EFI_MEMMAP_MEMBLOCK | EFI_MEMMAP_SLAB))
__efi_memmap_free(efi.memmap.phys_map,
efi.memmap.desc_size * efi.memmap.nr_map,
efi.memmap.flags);
map.phys_map = data->phys_map; map.phys_map = data->phys_map;
map.nr_map = data->size / data->desc_size; map.nr_map = data->size / data->desc_size;
map.map_end = map.map + data->size; map.map_end = map.map + data->size;

Some files were not shown because too many files have changed in this diff Show More