mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 21:51:40 +00:00
Linux 6.10-rc6
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmaB0NweHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGkvwH/36UJRk/o6wvXnyH E6QjCSWo2226APyWks22NjtC3I/8Iqdvkneuh6wG0qL2sXAB078EMjUq5R81bF8H wWFBJwetjYTp8GEyLioMEb2wCH/J3R29dLFC4UYTplafXRGP6//xcpJaKmTxcgdR 31IzvTPXbApZ7L3k1U6rA2bK9PNKcFCOvZlrNMUCuwMrabymHsDfOUt1DqXyg2xp zjqiWYBwlklozmgawSWt/mdEgkWuTcAbg+KyqDVQF59s9aj/OOwZ0j+HACq5V8CM quTPIAYL6CC9p7uxa69lGr/sgC0Is/BZLPX7RTZAwCgarGvnX+1HUsjDcaFCtrVg O6fPUV8= =pgUx -----END PGP SIGNATURE----- Merge v6.10-rc6 into drm-next The exynos-next pull is based on a newer -rc than drm-next. hence backmerge first to make sure the unrelated conflicts we accumulated don't end up randomly in the exynos merge pull, but are separated out. Conflicts are all benign: Adjacent changes in amdgpu and fbdev-dma code, and cherry-pick conflict in xe. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
commit
86634fa4e6
@ -5,7 +5,6 @@ root = true
|
|||||||
[{*.{awk,c,dts,dtsi,dtso,h,mk,s,S},Kconfig,Makefile,Makefile.*}]
|
[{*.{awk,c,dts,dtsi,dtso,h,mk,s,S},Kconfig,Makefile,Makefile.*}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
indent_size = 8
|
indent_size = 8
|
||||||
@ -13,7 +12,6 @@ indent_size = 8
|
|||||||
[*.{json,py,rs}]
|
[*.{json,py,rs}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
@ -26,7 +24,6 @@ indent_size = 8
|
|||||||
[*.yaml]
|
[*.yaml]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
trim_trailing_whitespace = unset
|
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
4
.mailmap
4
.mailmap
@ -72,6 +72,8 @@ Andrey Ryabinin <ryabinin.a.a@gmail.com> <aryabinin@virtuozzo.com>
|
|||||||
Andrzej Hajda <andrzej.hajda@intel.com> <a.hajda@samsung.com>
|
Andrzej Hajda <andrzej.hajda@intel.com> <a.hajda@samsung.com>
|
||||||
André Almeida <andrealmeid@igalia.com> <andrealmeid@collabora.com>
|
André Almeida <andrealmeid@igalia.com> <andrealmeid@collabora.com>
|
||||||
Andy Adamson <andros@citi.umich.edu>
|
Andy Adamson <andros@citi.umich.edu>
|
||||||
|
Andy Shevchenko <andy@kernel.org> <andy@smile.org.ua>
|
||||||
|
Andy Shevchenko <andy@kernel.org> <ext-andriy.shevchenko@nokia.com>
|
||||||
Anilkumar Kolli <quic_akolli@quicinc.com> <akolli@codeaurora.org>
|
Anilkumar Kolli <quic_akolli@quicinc.com> <akolli@codeaurora.org>
|
||||||
Anirudh Ghayal <quic_aghayal@quicinc.com> <aghayal@codeaurora.org>
|
Anirudh Ghayal <quic_aghayal@quicinc.com> <aghayal@codeaurora.org>
|
||||||
Antoine Tenart <atenart@kernel.org> <antoine.tenart@bootlin.com>
|
Antoine Tenart <atenart@kernel.org> <antoine.tenart@bootlin.com>
|
||||||
@ -217,6 +219,7 @@ Geliang Tang <geliang@kernel.org> <geliang.tang@suse.com>
|
|||||||
Geliang Tang <geliang@kernel.org> <geliangtang@xiaomi.com>
|
Geliang Tang <geliang@kernel.org> <geliangtang@xiaomi.com>
|
||||||
Geliang Tang <geliang@kernel.org> <geliangtang@gmail.com>
|
Geliang Tang <geliang@kernel.org> <geliangtang@gmail.com>
|
||||||
Geliang Tang <geliang@kernel.org> <geliangtang@163.com>
|
Geliang Tang <geliang@kernel.org> <geliangtang@163.com>
|
||||||
|
Geliang Tang <geliang@kernel.org> <tanggeliang@kylinos.cn>
|
||||||
Georgi Djakov <djakov@kernel.org> <georgi.djakov@linaro.org>
|
Georgi Djakov <djakov@kernel.org> <georgi.djakov@linaro.org>
|
||||||
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <geraldsc@de.ibm.com>
|
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <geraldsc@de.ibm.com>
|
||||||
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <gerald.schaefer@de.ibm.com>
|
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <gerald.schaefer@de.ibm.com>
|
||||||
@ -605,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>
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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:
|
||||||
|
@ -139,7 +139,7 @@ allOf:
|
|||||||
Voltage output range of the channel as <minimum, maximum>
|
Voltage output range of the channel as <minimum, maximum>
|
||||||
Required connections:
|
Required connections:
|
||||||
Rfb1x for: 0 to 2.5 V; 0 to 3V; 0 to 5 V;
|
Rfb1x for: 0 to 2.5 V; 0 to 3V; 0 to 5 V;
|
||||||
Rfb2x for: 0 to 10 V; 2.5 to 7.5V; -5 to 5 V;
|
Rfb2x for: 0 to 10 V; -2.5 to 7.5V; -5 to 5 V;
|
||||||
oneOf:
|
oneOf:
|
||||||
- items:
|
- items:
|
||||||
- const: 0
|
- const: 0
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -65,6 +65,7 @@ patternProperties:
|
|||||||
description: The hard wired USB devices
|
description: The hard wired USB devices
|
||||||
type: object
|
type: object
|
||||||
$ref: /schemas/usb/usb-device.yaml
|
$ref: /schemas/usb/usb-device.yaml
|
||||||
|
additionalProperties: true
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- peer-hub
|
- peer-hub
|
||||||
|
@ -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
|
||||||
|
@ -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 |
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -32,6 +32,7 @@ Security-related interfaces
|
|||||||
seccomp_filter
|
seccomp_filter
|
||||||
landlock
|
landlock
|
||||||
lsm
|
lsm
|
||||||
|
mfd_noexec
|
||||||
spec_ctrl
|
spec_ctrl
|
||||||
tee
|
tee
|
||||||
|
|
||||||
|
86
Documentation/userspace-api/mfd_noexec.rst
Normal file
86
Documentation/userspace-api/mfd_noexec.rst
Normal 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 memfd’s
|
||||||
|
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/
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
50
MAINTAINERS
50
MAINTAINERS
@ -1044,7 +1044,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
|
||||||
|
|
||||||
@ -3980,7 +3980,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
|
||||||
@ -4083,12 +4083,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)
|
||||||
@ -5295,7 +5296,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
|
||||||
@ -8217,7 +8218,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
|
||||||
@ -8618,7 +8619,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
|
||||||
@ -9108,7 +9109,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
|
||||||
@ -9242,7 +9243,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
|
||||||
@ -11042,6 +11043,7 @@ F: include/uapi/drm/i915_drm.h
|
|||||||
INTEL DRM XE DRIVER (Lunar Lake and newer)
|
INTEL DRM XE DRIVER (Lunar Lake and newer)
|
||||||
M: Lucas De Marchi <lucas.demarchi@intel.com>
|
M: Lucas De Marchi <lucas.demarchi@intel.com>
|
||||||
M: Thomas Hellström <thomas.hellstrom@linux.intel.com>
|
M: Thomas Hellström <thomas.hellstrom@linux.intel.com>
|
||||||
|
M: Rodrigo Vivi <rodrigo.vivi@intel.com>
|
||||||
L: intel-xe@lists.freedesktop.org
|
L: intel-xe@lists.freedesktop.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://drm.pages.freedesktop.org/intel-docs/
|
W: https://drm.pages.freedesktop.org/intel-docs/
|
||||||
@ -11162,7 +11164,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
|
||||||
@ -11535,7 +11537,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
|
||||||
@ -11547,7 +11549,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/
|
||||||
@ -11956,7 +11958,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
|
||||||
@ -12388,7 +12390,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
|
||||||
@ -12484,7 +12485,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
|
||||||
@ -12780,7 +12781,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/*
|
||||||
@ -12910,7 +12911,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
|
||||||
@ -15831,7 +15832,7 @@ F: drivers/nfc/virtual_ncidev.c
|
|||||||
F: tools/testing/selftests/nci/
|
F: tools/testing/selftests/nci/
|
||||||
|
|
||||||
NFS, SUNRPC, AND LOCKD CLIENTS
|
NFS, SUNRPC, AND LOCKD CLIENTS
|
||||||
M: Trond Myklebust <trond.myklebust@hammerspace.com>
|
M: Trond Myklebust <trondmy@kernel.org>
|
||||||
M: Anna Schumaker <anna@kernel.org>
|
M: Anna Schumaker <anna@kernel.org>
|
||||||
L: linux-nfs@vger.kernel.org
|
L: linux-nfs@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -17538,7 +17539,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
|
||||||
@ -18002,7 +18002,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
|
||||||
@ -18058,7 +18058,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
|
||||||
@ -18216,6 +18216,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,*
|
||||||
@ -20064,7 +20065,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
|
||||||
@ -22752,7 +22753,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/
|
||||||
@ -22978,7 +22979,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>
|
||||||
@ -23980,7 +23981,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
|
||||||
@ -24816,7 +24816,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
|
||||||
|
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
|||||||
VERSION = 6
|
VERSION = 6
|
||||||
PATCHLEVEL = 10
|
PATCHLEVEL = 10
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc6
|
||||||
NAME = Baby Opossum Posse
|
NAME = Baby Opossum Posse
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -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>;
|
||||||
|
@ -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";
|
||||||
};
|
};
|
||||||
|
@ -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)
|
||||||
|
@ -232,11 +232,24 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
|||||||
unsigned long old;
|
unsigned long old;
|
||||||
|
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
|
err_out:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_UNWINDER_FRAME_POINTER)) {
|
if (IS_ENABLED(CONFIG_UNWINDER_FRAME_POINTER)) {
|
||||||
/* FP points one word below parent's top of stack */
|
/*
|
||||||
frame_pointer += 4;
|
* Usually, the stack frames are contiguous in memory but cases
|
||||||
|
* have been observed where the next stack frame does not live
|
||||||
|
* at 'frame_pointer + 4' as this code used to assume.
|
||||||
|
*
|
||||||
|
* Instead, dereference the field in the stack frame that
|
||||||
|
* stores the SP of the calling frame: to avoid unbounded
|
||||||
|
* recursion, this cannot involve any ftrace instrumented
|
||||||
|
* functions, so use the __get_kernel_nofault() primitive
|
||||||
|
* directly.
|
||||||
|
*/
|
||||||
|
__get_kernel_nofault(&frame_pointer,
|
||||||
|
(unsigned long *)(frame_pointer - 8),
|
||||||
|
unsigned long, err_out);
|
||||||
} else {
|
} else {
|
||||||
struct stackframe frame = {
|
struct stackframe frame = {
|
||||||
.fp = frame_pointer,
|
.fp = frame_pointer,
|
||||||
|
@ -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) */
|
||||||
|
@ -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";
|
||||||
|
|
||||||
|
@ -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>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -296,7 +296,6 @@
|
|||||||
vmmc-supply = <®_usdhc2_vmmc>;
|
vmmc-supply = <®_usdhc2_vmmc>;
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
no-sdio;
|
|
||||||
no-mmc;
|
no-mmc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)))
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
6
arch/hexagon/include/asm/syscalls.h
Normal file
6
arch/hexagon/include/asm/syscalls.h
Normal 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);
|
@ -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>
|
||||||
|
@ -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>
|
||||||
};
|
};
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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)); \
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -31,18 +31,17 @@ void flush_cache_all_local(void);
|
|||||||
void flush_cache_all(void);
|
void flush_cache_all(void);
|
||||||
void flush_cache_mm(struct mm_struct *mm);
|
void flush_cache_mm(struct mm_struct *mm);
|
||||||
|
|
||||||
void flush_kernel_dcache_page_addr(const void *addr);
|
|
||||||
|
|
||||||
#define flush_kernel_dcache_range(start,size) \
|
#define flush_kernel_dcache_range(start,size) \
|
||||||
flush_kernel_dcache_range_asm((start), (start)+(size));
|
flush_kernel_dcache_range_asm((start), (start)+(size));
|
||||||
|
|
||||||
|
/* The only way to flush a vmap range is to flush whole cache */
|
||||||
#define ARCH_IMPLEMENTS_FLUSH_KERNEL_VMAP_RANGE 1
|
#define ARCH_IMPLEMENTS_FLUSH_KERNEL_VMAP_RANGE 1
|
||||||
void flush_kernel_vmap_range(void *vaddr, int size);
|
void flush_kernel_vmap_range(void *vaddr, int size);
|
||||||
void invalidate_kernel_vmap_range(void *vaddr, int size);
|
void invalidate_kernel_vmap_range(void *vaddr, int size);
|
||||||
|
|
||||||
#define flush_cache_vmap(start, end) flush_cache_all()
|
void flush_cache_vmap(unsigned long start, unsigned long end);
|
||||||
#define flush_cache_vmap_early(start, end) do { } while (0)
|
#define flush_cache_vmap_early(start, end) do { } while (0)
|
||||||
#define flush_cache_vunmap(start, end) flush_cache_all()
|
void flush_cache_vunmap(unsigned long start, unsigned long end);
|
||||||
|
|
||||||
void flush_dcache_folio(struct folio *folio);
|
void flush_dcache_folio(struct folio *folio);
|
||||||
#define flush_dcache_folio flush_dcache_folio
|
#define flush_dcache_folio flush_dcache_folio
|
||||||
@ -77,17 +76,11 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr,
|
|||||||
void flush_cache_range(struct vm_area_struct *vma,
|
void flush_cache_range(struct vm_area_struct *vma,
|
||||||
unsigned long start, unsigned long end);
|
unsigned long start, unsigned long end);
|
||||||
|
|
||||||
/* defined in pacache.S exported in cache.c used by flush_anon_page */
|
|
||||||
void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
|
|
||||||
|
|
||||||
#define ARCH_HAS_FLUSH_ANON_PAGE
|
#define ARCH_HAS_FLUSH_ANON_PAGE
|
||||||
void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr);
|
void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr);
|
||||||
|
|
||||||
#define ARCH_HAS_FLUSH_ON_KUNMAP
|
#define ARCH_HAS_FLUSH_ON_KUNMAP
|
||||||
static inline void kunmap_flush_on_unmap(const void *addr)
|
void kunmap_flush_on_unmap(const void *addr);
|
||||||
{
|
|
||||||
flush_kernel_dcache_page_addr(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _PARISC_CACHEFLUSH_H */
|
#endif /* _PARISC_CACHEFLUSH_H */
|
||||||
|
|
||||||
|
@ -448,14 +448,17 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)
|
|||||||
return pte;
|
return pte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline pte_t ptep_get(pte_t *ptep)
|
||||||
|
{
|
||||||
|
return READ_ONCE(*ptep);
|
||||||
|
}
|
||||||
|
#define ptep_get ptep_get
|
||||||
|
|
||||||
static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
|
static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
|
||||||
{
|
{
|
||||||
pte_t pte;
|
pte_t pte;
|
||||||
|
|
||||||
if (!pte_young(*ptep))
|
pte = ptep_get(ptep);
|
||||||
return 0;
|
|
||||||
|
|
||||||
pte = *ptep;
|
|
||||||
if (!pte_young(pte)) {
|
if (!pte_young(pte)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -463,17 +466,10 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ptep_clear_flush_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep);
|
||||||
|
pte_t ptep_clear_flush(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep);
|
||||||
|
|
||||||
struct mm_struct;
|
struct mm_struct;
|
||||||
static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
|
||||||
{
|
|
||||||
pte_t old_pte;
|
|
||||||
|
|
||||||
old_pte = *ptep;
|
|
||||||
set_pte(ptep, __pte(0));
|
|
||||||
|
|
||||||
return old_pte;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
||||||
{
|
{
|
||||||
set_pte(ptep, pte_wrprotect(*ptep));
|
set_pte(ptep, pte_wrprotect(*ptep));
|
||||||
@ -511,7 +507,8 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
|
|||||||
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
|
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
|
||||||
|
|
||||||
#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
|
#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
|
||||||
#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
|
#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
|
||||||
|
#define __HAVE_ARCH_PTEP_CLEAR_FLUSH
|
||||||
#define __HAVE_ARCH_PTEP_SET_WRPROTECT
|
#define __HAVE_ARCH_PTEP_SET_WRPROTECT
|
||||||
#define __HAVE_ARCH_PTE_SAME
|
#define __HAVE_ARCH_PTE_SAME
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/mm.h>
|
#include <linux/sched/mm.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
|
#include <linux/vmalloc.h>
|
||||||
#include <asm/pdc.h>
|
#include <asm/pdc.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
@ -31,20 +32,31 @@
|
|||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/cachectl.h>
|
#include <asm/cachectl.h>
|
||||||
|
|
||||||
|
#define PTR_PAGE_ALIGN_DOWN(addr) PTR_ALIGN_DOWN(addr, PAGE_SIZE)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When nonzero, use _PAGE_ACCESSED bit to try to reduce the number
|
||||||
|
* of page flushes done flush_cache_page_if_present. There are some
|
||||||
|
* pros and cons in using this option. It may increase the risk of
|
||||||
|
* random segmentation faults.
|
||||||
|
*/
|
||||||
|
#define CONFIG_FLUSH_PAGE_ACCESSED 0
|
||||||
|
|
||||||
int split_tlb __ro_after_init;
|
int split_tlb __ro_after_init;
|
||||||
int dcache_stride __ro_after_init;
|
int dcache_stride __ro_after_init;
|
||||||
int icache_stride __ro_after_init;
|
int icache_stride __ro_after_init;
|
||||||
EXPORT_SYMBOL(dcache_stride);
|
EXPORT_SYMBOL(dcache_stride);
|
||||||
|
|
||||||
|
/* Internal implementation in arch/parisc/kernel/pacache.S */
|
||||||
void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
|
void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
|
||||||
EXPORT_SYMBOL(flush_dcache_page_asm);
|
EXPORT_SYMBOL(flush_dcache_page_asm);
|
||||||
void purge_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
|
void purge_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
|
||||||
void flush_icache_page_asm(unsigned long phys_addr, unsigned long vaddr);
|
void flush_icache_page_asm(unsigned long phys_addr, unsigned long vaddr);
|
||||||
|
|
||||||
/* Internal implementation in arch/parisc/kernel/pacache.S */
|
|
||||||
void flush_data_cache_local(void *); /* flushes local data-cache only */
|
void flush_data_cache_local(void *); /* flushes local data-cache only */
|
||||||
void flush_instruction_cache_local(void); /* flushes local code-cache only */
|
void flush_instruction_cache_local(void); /* flushes local code-cache only */
|
||||||
|
|
||||||
|
static void flush_kernel_dcache_page_addr(const void *addr);
|
||||||
|
|
||||||
/* On some machines (i.e., ones with the Merced bus), there can be
|
/* On some machines (i.e., ones with the Merced bus), there can be
|
||||||
* only a single PxTLB broadcast at a time; this must be guaranteed
|
* only a single PxTLB broadcast at a time; this must be guaranteed
|
||||||
* by software. We need a spinlock around all TLB flushes to ensure
|
* by software. We need a spinlock around all TLB flushes to ensure
|
||||||
@ -321,6 +333,18 @@ __flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr,
|
|||||||
{
|
{
|
||||||
if (!static_branch_likely(&parisc_has_cache))
|
if (!static_branch_likely(&parisc_has_cache))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The TLB is the engine of coherence on parisc. The CPU is
|
||||||
|
* entitled to speculate any page with a TLB mapping, so here
|
||||||
|
* we kill the mapping then flush the page along a special flush
|
||||||
|
* only alias mapping. This guarantees that the page is no-longer
|
||||||
|
* in the cache for any process and nor may it be speculatively
|
||||||
|
* read in (until the user or kernel specifically accesses it,
|
||||||
|
* of course).
|
||||||
|
*/
|
||||||
|
flush_tlb_page(vma, vmaddr);
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
flush_dcache_page_asm(physaddr, vmaddr);
|
flush_dcache_page_asm(physaddr, vmaddr);
|
||||||
if (vma->vm_flags & VM_EXEC)
|
if (vma->vm_flags & VM_EXEC)
|
||||||
@ -328,46 +352,44 @@ __flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr,
|
|||||||
preempt_enable();
|
preempt_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void flush_user_cache_page(struct vm_area_struct *vma, unsigned long vmaddr)
|
static void flush_kernel_dcache_page_addr(const void *addr)
|
||||||
{
|
{
|
||||||
unsigned long flags, space, pgd, prot;
|
unsigned long vaddr = (unsigned long)addr;
|
||||||
#ifdef CONFIG_TLB_PTLOCK
|
unsigned long flags;
|
||||||
unsigned long pgd_lock;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
vmaddr &= PAGE_MASK;
|
/* Purge TLB entry to remove translation on all CPUs */
|
||||||
|
purge_tlb_start(flags);
|
||||||
|
pdtlb(SR_KERNEL, addr);
|
||||||
|
purge_tlb_end(flags);
|
||||||
|
|
||||||
|
/* Use tmpalias flush to prevent data cache move-in */
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
flush_dcache_page_asm(__pa(vaddr), vaddr);
|
||||||
/* Set context for flush */
|
|
||||||
local_irq_save(flags);
|
|
||||||
prot = mfctl(8);
|
|
||||||
space = mfsp(SR_USER);
|
|
||||||
pgd = mfctl(25);
|
|
||||||
#ifdef CONFIG_TLB_PTLOCK
|
|
||||||
pgd_lock = mfctl(28);
|
|
||||||
#endif
|
|
||||||
switch_mm_irqs_off(NULL, vma->vm_mm, NULL);
|
|
||||||
local_irq_restore(flags);
|
|
||||||
|
|
||||||
flush_user_dcache_range_asm(vmaddr, vmaddr + PAGE_SIZE);
|
|
||||||
if (vma->vm_flags & VM_EXEC)
|
|
||||||
flush_user_icache_range_asm(vmaddr, vmaddr + PAGE_SIZE);
|
|
||||||
flush_tlb_page(vma, vmaddr);
|
|
||||||
|
|
||||||
/* Restore previous context */
|
|
||||||
local_irq_save(flags);
|
|
||||||
#ifdef CONFIG_TLB_PTLOCK
|
|
||||||
mtctl(pgd_lock, 28);
|
|
||||||
#endif
|
|
||||||
mtctl(pgd, 25);
|
|
||||||
mtsp(space, SR_USER);
|
|
||||||
mtctl(prot, 8);
|
|
||||||
local_irq_restore(flags);
|
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void flush_kernel_icache_page_addr(const void *addr)
|
||||||
|
{
|
||||||
|
unsigned long vaddr = (unsigned long)addr;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
/* Purge TLB entry to remove translation on all CPUs */
|
||||||
|
purge_tlb_start(flags);
|
||||||
|
pdtlb(SR_KERNEL, addr);
|
||||||
|
purge_tlb_end(flags);
|
||||||
|
|
||||||
|
/* Use tmpalias flush to prevent instruction cache move-in */
|
||||||
|
preempt_disable();
|
||||||
|
flush_icache_page_asm(__pa(vaddr), vaddr);
|
||||||
|
preempt_enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void kunmap_flush_on_unmap(const void *addr)
|
||||||
|
{
|
||||||
|
flush_kernel_dcache_page_addr(addr);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(kunmap_flush_on_unmap);
|
||||||
|
|
||||||
void flush_icache_pages(struct vm_area_struct *vma, struct page *page,
|
void flush_icache_pages(struct vm_area_struct *vma, struct page *page,
|
||||||
unsigned int nr)
|
unsigned int nr)
|
||||||
{
|
{
|
||||||
@ -375,13 +397,16 @@ void flush_icache_pages(struct vm_area_struct *vma, struct page *page,
|
|||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
flush_kernel_dcache_page_addr(kaddr);
|
flush_kernel_dcache_page_addr(kaddr);
|
||||||
flush_kernel_icache_page(kaddr);
|
flush_kernel_icache_page_addr(kaddr);
|
||||||
if (--nr == 0)
|
if (--nr == 0)
|
||||||
break;
|
break;
|
||||||
kaddr += PAGE_SIZE;
|
kaddr += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Walk page directory for MM to find PTEP pointer for address ADDR.
|
||||||
|
*/
|
||||||
static inline pte_t *get_ptep(struct mm_struct *mm, unsigned long addr)
|
static inline pte_t *get_ptep(struct mm_struct *mm, unsigned long addr)
|
||||||
{
|
{
|
||||||
pte_t *ptep = NULL;
|
pte_t *ptep = NULL;
|
||||||
@ -410,6 +435,41 @@ static inline bool pte_needs_flush(pte_t pte)
|
|||||||
== (_PAGE_PRESENT | _PAGE_ACCESSED);
|
== (_PAGE_PRESENT | _PAGE_ACCESSED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return user physical address. Returns 0 if page is not present.
|
||||||
|
*/
|
||||||
|
static inline unsigned long get_upa(struct mm_struct *mm, unsigned long addr)
|
||||||
|
{
|
||||||
|
unsigned long flags, space, pgd, prot, pa;
|
||||||
|
#ifdef CONFIG_TLB_PTLOCK
|
||||||
|
unsigned long pgd_lock;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Save context */
|
||||||
|
local_irq_save(flags);
|
||||||
|
prot = mfctl(8);
|
||||||
|
space = mfsp(SR_USER);
|
||||||
|
pgd = mfctl(25);
|
||||||
|
#ifdef CONFIG_TLB_PTLOCK
|
||||||
|
pgd_lock = mfctl(28);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set context for lpa_user */
|
||||||
|
switch_mm_irqs_off(NULL, mm, NULL);
|
||||||
|
pa = lpa_user(addr);
|
||||||
|
|
||||||
|
/* Restore previous context */
|
||||||
|
#ifdef CONFIG_TLB_PTLOCK
|
||||||
|
mtctl(pgd_lock, 28);
|
||||||
|
#endif
|
||||||
|
mtctl(pgd, 25);
|
||||||
|
mtsp(space, SR_USER);
|
||||||
|
mtctl(prot, 8);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
|
||||||
|
return pa;
|
||||||
|
}
|
||||||
|
|
||||||
void flush_dcache_folio(struct folio *folio)
|
void flush_dcache_folio(struct folio *folio)
|
||||||
{
|
{
|
||||||
struct address_space *mapping = folio_flush_mapping(folio);
|
struct address_space *mapping = folio_flush_mapping(folio);
|
||||||
@ -458,50 +518,23 @@ void flush_dcache_folio(struct folio *folio)
|
|||||||
if (addr + nr * PAGE_SIZE > vma->vm_end)
|
if (addr + nr * PAGE_SIZE > vma->vm_end)
|
||||||
nr = (vma->vm_end - addr) / PAGE_SIZE;
|
nr = (vma->vm_end - addr) / PAGE_SIZE;
|
||||||
|
|
||||||
if (parisc_requires_coherency()) {
|
if (old_addr == 0 || (old_addr & (SHM_COLOUR - 1))
|
||||||
for (i = 0; i < nr; i++) {
|
|
||||||
pte_t *ptep = get_ptep(vma->vm_mm,
|
|
||||||
addr + i * PAGE_SIZE);
|
|
||||||
if (!ptep)
|
|
||||||
continue;
|
|
||||||
if (pte_needs_flush(*ptep))
|
|
||||||
flush_user_cache_page(vma,
|
|
||||||
addr + i * PAGE_SIZE);
|
|
||||||
/* Optimise accesses to the same table? */
|
|
||||||
pte_unmap(ptep);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* The TLB is the engine of coherence on parisc:
|
|
||||||
* The CPU is entitled to speculate any page
|
|
||||||
* with a TLB mapping, so here we kill the
|
|
||||||
* mapping then flush the page along a special
|
|
||||||
* flush only alias mapping. This guarantees that
|
|
||||||
* the page is no-longer in the cache for any
|
|
||||||
* process and nor may it be speculatively read
|
|
||||||
* in (until the user or kernel specifically
|
|
||||||
* accesses it, of course)
|
|
||||||
*/
|
|
||||||
for (i = 0; i < nr; i++)
|
|
||||||
flush_tlb_page(vma, addr + i * PAGE_SIZE);
|
|
||||||
if (old_addr == 0 || (old_addr & (SHM_COLOUR - 1))
|
|
||||||
!= (addr & (SHM_COLOUR - 1))) {
|
!= (addr & (SHM_COLOUR - 1))) {
|
||||||
for (i = 0; i < nr; i++)
|
for (i = 0; i < nr; i++)
|
||||||
__flush_cache_page(vma,
|
__flush_cache_page(vma,
|
||||||
addr + i * PAGE_SIZE,
|
addr + i * PAGE_SIZE,
|
||||||
(pfn + i) * PAGE_SIZE);
|
(pfn + i) * PAGE_SIZE);
|
||||||
/*
|
/*
|
||||||
* Software is allowed to have any number
|
* Software is allowed to have any number
|
||||||
* of private mappings to a page.
|
* of private mappings to a page.
|
||||||
*/
|
*/
|
||||||
if (!(vma->vm_flags & VM_SHARED))
|
if (!(vma->vm_flags & VM_SHARED))
|
||||||
continue;
|
continue;
|
||||||
if (old_addr)
|
if (old_addr)
|
||||||
pr_err("INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %pD\n",
|
pr_err("INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %pD\n",
|
||||||
old_addr, addr, vma->vm_file);
|
old_addr, addr, vma->vm_file);
|
||||||
if (nr == folio_nr_pages(folio))
|
if (nr == folio_nr_pages(folio))
|
||||||
old_addr = addr;
|
old_addr = addr;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
WARN_ON(++count == 4096);
|
WARN_ON(++count == 4096);
|
||||||
}
|
}
|
||||||
@ -591,35 +624,28 @@ extern void purge_kernel_dcache_page_asm(unsigned long);
|
|||||||
extern void clear_user_page_asm(void *, unsigned long);
|
extern void clear_user_page_asm(void *, unsigned long);
|
||||||
extern void copy_user_page_asm(void *, void *, unsigned long);
|
extern void copy_user_page_asm(void *, void *, unsigned long);
|
||||||
|
|
||||||
void flush_kernel_dcache_page_addr(const void *addr)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
flush_kernel_dcache_page_asm(addr);
|
|
||||||
purge_tlb_start(flags);
|
|
||||||
pdtlb(SR_KERNEL, addr);
|
|
||||||
purge_tlb_end(flags);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
|
|
||||||
|
|
||||||
static void flush_cache_page_if_present(struct vm_area_struct *vma,
|
static void flush_cache_page_if_present(struct vm_area_struct *vma,
|
||||||
unsigned long vmaddr, unsigned long pfn)
|
unsigned long vmaddr)
|
||||||
{
|
{
|
||||||
|
#if CONFIG_FLUSH_PAGE_ACCESSED
|
||||||
bool needs_flush = false;
|
bool needs_flush = false;
|
||||||
pte_t *ptep;
|
pte_t *ptep, pte;
|
||||||
|
|
||||||
/*
|
|
||||||
* The pte check is racy and sometimes the flush will trigger
|
|
||||||
* a non-access TLB miss. Hopefully, the page has already been
|
|
||||||
* flushed.
|
|
||||||
*/
|
|
||||||
ptep = get_ptep(vma->vm_mm, vmaddr);
|
ptep = get_ptep(vma->vm_mm, vmaddr);
|
||||||
if (ptep) {
|
if (ptep) {
|
||||||
needs_flush = pte_needs_flush(*ptep);
|
pte = ptep_get(ptep);
|
||||||
|
needs_flush = pte_needs_flush(pte);
|
||||||
pte_unmap(ptep);
|
pte_unmap(ptep);
|
||||||
}
|
}
|
||||||
if (needs_flush)
|
if (needs_flush)
|
||||||
flush_cache_page(vma, vmaddr, pfn);
|
__flush_cache_page(vma, vmaddr, PFN_PHYS(pte_pfn(pte)));
|
||||||
|
#else
|
||||||
|
struct mm_struct *mm = vma->vm_mm;
|
||||||
|
unsigned long physaddr = get_upa(mm, vmaddr);
|
||||||
|
|
||||||
|
if (physaddr)
|
||||||
|
__flush_cache_page(vma, vmaddr, PAGE_ALIGN_DOWN(physaddr));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy_user_highpage(struct page *to, struct page *from,
|
void copy_user_highpage(struct page *to, struct page *from,
|
||||||
@ -629,7 +655,7 @@ void copy_user_highpage(struct page *to, struct page *from,
|
|||||||
|
|
||||||
kfrom = kmap_local_page(from);
|
kfrom = kmap_local_page(from);
|
||||||
kto = kmap_local_page(to);
|
kto = kmap_local_page(to);
|
||||||
flush_cache_page_if_present(vma, vaddr, page_to_pfn(from));
|
__flush_cache_page(vma, vaddr, PFN_PHYS(page_to_pfn(from)));
|
||||||
copy_page_asm(kto, kfrom);
|
copy_page_asm(kto, kfrom);
|
||||||
kunmap_local(kto);
|
kunmap_local(kto);
|
||||||
kunmap_local(kfrom);
|
kunmap_local(kfrom);
|
||||||
@ -638,16 +664,17 @@ void copy_user_highpage(struct page *to, struct page *from,
|
|||||||
void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
||||||
unsigned long user_vaddr, void *dst, void *src, int len)
|
unsigned long user_vaddr, void *dst, void *src, int len)
|
||||||
{
|
{
|
||||||
flush_cache_page_if_present(vma, user_vaddr, page_to_pfn(page));
|
__flush_cache_page(vma, user_vaddr, PFN_PHYS(page_to_pfn(page)));
|
||||||
memcpy(dst, src, len);
|
memcpy(dst, src, len);
|
||||||
flush_kernel_dcache_range_asm((unsigned long)dst, (unsigned long)dst + len);
|
flush_kernel_dcache_page_addr(PTR_PAGE_ALIGN_DOWN(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
|
void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
|
||||||
unsigned long user_vaddr, void *dst, void *src, int len)
|
unsigned long user_vaddr, void *dst, void *src, int len)
|
||||||
{
|
{
|
||||||
flush_cache_page_if_present(vma, user_vaddr, page_to_pfn(page));
|
__flush_cache_page(vma, user_vaddr, PFN_PHYS(page_to_pfn(page)));
|
||||||
memcpy(dst, src, len);
|
memcpy(dst, src, len);
|
||||||
|
flush_kernel_dcache_page_addr(PTR_PAGE_ALIGN_DOWN(src));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* __flush_tlb_range()
|
/* __flush_tlb_range()
|
||||||
@ -681,32 +708,10 @@ int __flush_tlb_range(unsigned long sid, unsigned long start,
|
|||||||
|
|
||||||
static void flush_cache_pages(struct vm_area_struct *vma, unsigned long start, unsigned long end)
|
static void flush_cache_pages(struct vm_area_struct *vma, unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
unsigned long addr, pfn;
|
unsigned long addr;
|
||||||
pte_t *ptep;
|
|
||||||
|
|
||||||
for (addr = start; addr < end; addr += PAGE_SIZE) {
|
for (addr = start; addr < end; addr += PAGE_SIZE)
|
||||||
bool needs_flush = false;
|
flush_cache_page_if_present(vma, addr);
|
||||||
/*
|
|
||||||
* The vma can contain pages that aren't present. Although
|
|
||||||
* the pte search is expensive, we need the pte to find the
|
|
||||||
* page pfn and to check whether the page should be flushed.
|
|
||||||
*/
|
|
||||||
ptep = get_ptep(vma->vm_mm, addr);
|
|
||||||
if (ptep) {
|
|
||||||
needs_flush = pte_needs_flush(*ptep);
|
|
||||||
pfn = pte_pfn(*ptep);
|
|
||||||
pte_unmap(ptep);
|
|
||||||
}
|
|
||||||
if (needs_flush) {
|
|
||||||
if (parisc_requires_coherency()) {
|
|
||||||
flush_user_cache_page(vma, addr);
|
|
||||||
} else {
|
|
||||||
if (WARN_ON(!pfn_valid(pfn)))
|
|
||||||
return;
|
|
||||||
__flush_cache_page(vma, addr, PFN_PHYS(pfn));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long mm_total_size(struct mm_struct *mm)
|
static inline unsigned long mm_total_size(struct mm_struct *mm)
|
||||||
@ -757,21 +762,19 @@ void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned
|
|||||||
if (WARN_ON(IS_ENABLED(CONFIG_SMP) && arch_irqs_disabled()))
|
if (WARN_ON(IS_ENABLED(CONFIG_SMP) && arch_irqs_disabled()))
|
||||||
return;
|
return;
|
||||||
flush_tlb_range(vma, start, end);
|
flush_tlb_range(vma, start, end);
|
||||||
flush_cache_all();
|
if (vma->vm_flags & VM_EXEC)
|
||||||
|
flush_cache_all();
|
||||||
|
else
|
||||||
|
flush_data_cache();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_cache_pages(vma, start, end);
|
flush_cache_pages(vma, start & PAGE_MASK, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn)
|
void flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn)
|
||||||
{
|
{
|
||||||
if (WARN_ON(!pfn_valid(pfn)))
|
__flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
||||||
return;
|
|
||||||
if (parisc_requires_coherency())
|
|
||||||
flush_user_cache_page(vma, vmaddr);
|
|
||||||
else
|
|
||||||
__flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
|
void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
|
||||||
@ -779,34 +782,133 @@ void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned lon
|
|||||||
if (!PageAnon(page))
|
if (!PageAnon(page))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (parisc_requires_coherency()) {
|
__flush_cache_page(vma, vmaddr, PFN_PHYS(page_to_pfn(page)));
|
||||||
if (vma->vm_flags & VM_SHARED)
|
}
|
||||||
flush_data_cache();
|
|
||||||
else
|
int ptep_clear_flush_young(struct vm_area_struct *vma, unsigned long addr,
|
||||||
flush_user_cache_page(vma, vmaddr);
|
pte_t *ptep)
|
||||||
|
{
|
||||||
|
pte_t pte = ptep_get(ptep);
|
||||||
|
|
||||||
|
if (!pte_young(pte))
|
||||||
|
return 0;
|
||||||
|
set_pte(ptep, pte_mkold(pte));
|
||||||
|
#if CONFIG_FLUSH_PAGE_ACCESSED
|
||||||
|
__flush_cache_page(vma, addr, PFN_PHYS(pte_pfn(pte)));
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* After a PTE is cleared, we have no way to flush the cache for
|
||||||
|
* the physical page. On PA8800 and PA8900 processors, these lines
|
||||||
|
* can cause random cache corruption. Thus, we must flush the cache
|
||||||
|
* as well as the TLB when clearing a PTE that's valid.
|
||||||
|
*/
|
||||||
|
pte_t ptep_clear_flush(struct vm_area_struct *vma, unsigned long addr,
|
||||||
|
pte_t *ptep)
|
||||||
|
{
|
||||||
|
struct mm_struct *mm = (vma)->vm_mm;
|
||||||
|
pte_t pte = ptep_get_and_clear(mm, addr, ptep);
|
||||||
|
unsigned long pfn = pte_pfn(pte);
|
||||||
|
|
||||||
|
if (pfn_valid(pfn))
|
||||||
|
__flush_cache_page(vma, addr, PFN_PHYS(pfn));
|
||||||
|
else if (pte_accessible(mm, pte))
|
||||||
|
flush_tlb_page(vma, addr);
|
||||||
|
|
||||||
|
return pte;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The physical address for pages in the ioremap case can be obtained
|
||||||
|
* from the vm_struct struct. I wasn't able to successfully handle the
|
||||||
|
* vmalloc and vmap cases. We have an array of struct page pointers in
|
||||||
|
* the uninitialized vmalloc case but the flush failed using page_to_pfn.
|
||||||
|
*/
|
||||||
|
void flush_cache_vmap(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
unsigned long addr, physaddr;
|
||||||
|
struct vm_struct *vm;
|
||||||
|
|
||||||
|
/* Prevent cache move-in */
|
||||||
|
flush_tlb_kernel_range(start, end);
|
||||||
|
|
||||||
|
if (end - start >= parisc_cache_flush_threshold) {
|
||||||
|
flush_cache_all();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_tlb_page(vma, vmaddr);
|
if (WARN_ON_ONCE(!is_vmalloc_addr((void *)start))) {
|
||||||
preempt_disable();
|
flush_cache_all();
|
||||||
flush_dcache_page_asm(page_to_phys(page), vmaddr);
|
return;
|
||||||
preempt_enable();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
vm = find_vm_area((void *)start);
|
||||||
|
if (WARN_ON_ONCE(!vm)) {
|
||||||
|
flush_cache_all();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The physical addresses of IOREMAP regions are contiguous */
|
||||||
|
if (vm->flags & VM_IOREMAP) {
|
||||||
|
physaddr = vm->phys_addr;
|
||||||
|
for (addr = start; addr < end; addr += PAGE_SIZE) {
|
||||||
|
preempt_disable();
|
||||||
|
flush_dcache_page_asm(physaddr, start);
|
||||||
|
flush_icache_page_asm(physaddr, start);
|
||||||
|
preempt_enable();
|
||||||
|
physaddr += PAGE_SIZE;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
flush_cache_all();
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(flush_cache_vmap);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The vm_struct has been retired and the page table is set up. The
|
||||||
|
* last page in the range is a guard page. Its physical address can't
|
||||||
|
* be determined using lpa, so there is no way to flush the range
|
||||||
|
* using flush_dcache_page_asm.
|
||||||
|
*/
|
||||||
|
void flush_cache_vunmap(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
/* Prevent cache move-in */
|
||||||
|
flush_tlb_kernel_range(start, end);
|
||||||
|
flush_data_cache();
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(flush_cache_vunmap);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On systems with PA8800/PA8900 processors, there is no way to flush
|
||||||
|
* a vmap range other than using the architected loop to flush the
|
||||||
|
* entire cache. The page directory is not set up, so we can't use
|
||||||
|
* fdc, etc. FDCE/FICE don't work to flush a portion of the cache.
|
||||||
|
* L2 is physically indexed but FDCE/FICE instructions in virtual
|
||||||
|
* mode output their virtual address on the core bus, not their
|
||||||
|
* real address. As a result, the L2 cache index formed from the
|
||||||
|
* virtual address will most likely not be the same as the L2 index
|
||||||
|
* formed from the real address.
|
||||||
|
*/
|
||||||
void flush_kernel_vmap_range(void *vaddr, int size)
|
void flush_kernel_vmap_range(void *vaddr, int size)
|
||||||
{
|
{
|
||||||
unsigned long start = (unsigned long)vaddr;
|
unsigned long start = (unsigned long)vaddr;
|
||||||
unsigned long end = start + size;
|
unsigned long end = start + size;
|
||||||
|
|
||||||
if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
|
flush_tlb_kernel_range(start, end);
|
||||||
(unsigned long)size >= parisc_cache_flush_threshold) {
|
|
||||||
flush_tlb_kernel_range(start, end);
|
if (!static_branch_likely(&parisc_has_dcache))
|
||||||
flush_data_cache();
|
return;
|
||||||
|
|
||||||
|
/* If interrupts are disabled, we can only do local flush */
|
||||||
|
if (WARN_ON(IS_ENABLED(CONFIG_SMP) && arch_irqs_disabled())) {
|
||||||
|
flush_data_cache_local(NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_kernel_dcache_range_asm(start, end);
|
flush_data_cache();
|
||||||
flush_tlb_kernel_range(start, end);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(flush_kernel_vmap_range);
|
EXPORT_SYMBOL(flush_kernel_vmap_range);
|
||||||
|
|
||||||
@ -818,15 +920,18 @@ void invalidate_kernel_vmap_range(void *vaddr, int size)
|
|||||||
/* Ensure DMA is complete */
|
/* Ensure DMA is complete */
|
||||||
asm_syncdma();
|
asm_syncdma();
|
||||||
|
|
||||||
if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
|
flush_tlb_kernel_range(start, end);
|
||||||
(unsigned long)size >= parisc_cache_flush_threshold) {
|
|
||||||
flush_tlb_kernel_range(start, end);
|
if (!static_branch_likely(&parisc_has_dcache))
|
||||||
flush_data_cache();
|
return;
|
||||||
|
|
||||||
|
/* If interrupts are disabled, we can only do local flush */
|
||||||
|
if (WARN_ON(IS_ENABLED(CONFIG_SMP) && arch_irqs_disabled())) {
|
||||||
|
flush_data_cache_local(NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
purge_kernel_dcache_range_asm(start, end);
|
flush_data_cache();
|
||||||
flush_tlb_kernel_range(start, end);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(invalidate_kernel_vmap_range);
|
EXPORT_SYMBOL(invalidate_kernel_vmap_range);
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
|
@ -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
|
||||||
|
2
arch/powerpc/crypto/.gitignore
vendored
2
arch/powerpc/crypto/.gitignore
vendored
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
no-1-8-v;
|
no-1-8-v;
|
||||||
no-mmc;
|
no-mmc;
|
||||||
no-sdio;
|
no-sdio;
|
||||||
|
disable-wp;
|
||||||
};
|
};
|
||||||
|
|
||||||
&uart0 {
|
&uart0 {
|
||||||
|
@ -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
|
||||||
|
@ -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(¶m->cpu_count) <= num_online_cpus())
|
while (atomic_read(¶m->cpu_count) <= num_online_cpus())
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
}
|
|
||||||
|
|
||||||
local_flush_icache_all();
|
local_flush_icache_all();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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),
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -384,7 +387,7 @@ static void fixup_vmlinux_info(void)
|
|||||||
void startup_kernel(void)
|
void startup_kernel(void)
|
||||||
{
|
{
|
||||||
unsigned long kernel_size = vmlinux.image_size + vmlinux.bss_size;
|
unsigned long kernel_size = vmlinux.image_size + vmlinux.bss_size;
|
||||||
unsigned long nokaslr_offset_phys = mem_safe_offset();
|
unsigned long nokaslr_offset_phys, kaslr_large_page_offset;
|
||||||
unsigned long amode31_lma = 0;
|
unsigned long amode31_lma = 0;
|
||||||
unsigned long max_physmem_end;
|
unsigned long max_physmem_end;
|
||||||
unsigned long asce_limit;
|
unsigned long asce_limit;
|
||||||
@ -393,6 +396,12 @@ void startup_kernel(void)
|
|||||||
|
|
||||||
fixup_vmlinux_info();
|
fixup_vmlinux_info();
|
||||||
setup_lpp();
|
setup_lpp();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Non-randomized kernel physical start address must be _SEGMENT_SIZE
|
||||||
|
* aligned (see blow).
|
||||||
|
*/
|
||||||
|
nokaslr_offset_phys = ALIGN(mem_safe_offset(), _SEGMENT_SIZE);
|
||||||
safe_addr = PAGE_ALIGN(nokaslr_offset_phys + kernel_size);
|
safe_addr = PAGE_ALIGN(nokaslr_offset_phys + kernel_size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -425,10 +434,25 @@ void startup_kernel(void)
|
|||||||
save_ipl_cert_comp_list();
|
save_ipl_cert_comp_list();
|
||||||
rescue_initrd(safe_addr, ident_map_size);
|
rescue_initrd(safe_addr, ident_map_size);
|
||||||
|
|
||||||
if (kaslr_enabled())
|
/*
|
||||||
__kaslr_offset_phys = randomize_within_range(kernel_size, THREAD_SIZE, 0, ident_map_size);
|
* __kaslr_offset_phys must be _SEGMENT_SIZE aligned, so the lower
|
||||||
|
* 20 bits (the offset within a large page) are zero. Copy the last
|
||||||
|
* 20 bits of __kaslr_offset, which is THREAD_SIZE aligned, to
|
||||||
|
* __kaslr_offset_phys.
|
||||||
|
*
|
||||||
|
* With this the last 20 bits of __kaslr_offset_phys and __kaslr_offset
|
||||||
|
* are identical, which is required to allow for large mappings of the
|
||||||
|
* kernel image.
|
||||||
|
*/
|
||||||
|
kaslr_large_page_offset = __kaslr_offset & ~_SEGMENT_MASK;
|
||||||
|
if (kaslr_enabled()) {
|
||||||
|
unsigned long end = ident_map_size - kaslr_large_page_offset;
|
||||||
|
|
||||||
|
__kaslr_offset_phys = randomize_within_range(kernel_size, _SEGMENT_SIZE, 0, end);
|
||||||
|
}
|
||||||
if (!__kaslr_offset_phys)
|
if (!__kaslr_offset_phys)
|
||||||
__kaslr_offset_phys = nokaslr_offset_phys;
|
__kaslr_offset_phys = nokaslr_offset_phys;
|
||||||
|
__kaslr_offset_phys |= kaslr_large_page_offset;
|
||||||
kaslr_adjust_vmlinux_info(__kaslr_offset_phys);
|
kaslr_adjust_vmlinux_info(__kaslr_offset_phys);
|
||||||
physmem_reserve(RR_VMLINUX, __kaslr_offset_phys, kernel_size);
|
physmem_reserve(RR_VMLINUX, __kaslr_offset_phys, kernel_size);
|
||||||
deploy_kernel((void *)__kaslr_offset_phys);
|
deploy_kernel((void *)__kaslr_offset_phys);
|
||||||
|
@ -261,21 +261,27 @@ static unsigned long _pa(unsigned long addr, unsigned long size, enum populate_m
|
|||||||
|
|
||||||
static bool large_allowed(enum populate_mode mode)
|
static bool large_allowed(enum populate_mode mode)
|
||||||
{
|
{
|
||||||
return (mode == POPULATE_DIRECT) || (mode == POPULATE_IDENTITY);
|
return (mode == POPULATE_DIRECT) || (mode == POPULATE_IDENTITY) || (mode == POPULATE_KERNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool can_large_pud(pud_t *pu_dir, unsigned long addr, unsigned long end,
|
static bool can_large_pud(pud_t *pu_dir, unsigned long addr, unsigned long end,
|
||||||
enum populate_mode mode)
|
enum populate_mode mode)
|
||||||
{
|
{
|
||||||
|
unsigned long size = end - addr;
|
||||||
|
|
||||||
return machine.has_edat2 && large_allowed(mode) &&
|
return machine.has_edat2 && large_allowed(mode) &&
|
||||||
IS_ALIGNED(addr, PUD_SIZE) && (end - addr) >= PUD_SIZE;
|
IS_ALIGNED(addr, PUD_SIZE) && (size >= PUD_SIZE) &&
|
||||||
|
IS_ALIGNED(_pa(addr, size, mode), PUD_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool can_large_pmd(pmd_t *pm_dir, unsigned long addr, unsigned long end,
|
static bool can_large_pmd(pmd_t *pm_dir, unsigned long addr, unsigned long end,
|
||||||
enum populate_mode mode)
|
enum populate_mode mode)
|
||||||
{
|
{
|
||||||
|
unsigned long size = end - addr;
|
||||||
|
|
||||||
return machine.has_edat1 && large_allowed(mode) &&
|
return machine.has_edat1 && large_allowed(mode) &&
|
||||||
IS_ALIGNED(addr, PMD_SIZE) && (end - addr) >= PMD_SIZE;
|
IS_ALIGNED(addr, PMD_SIZE) && (size >= PMD_SIZE) &&
|
||||||
|
IS_ALIGNED(_pa(addr, size, mode), PMD_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pgtable_pte_populate(pmd_t *pmd, unsigned long addr, unsigned long end,
|
static void pgtable_pte_populate(pmd_t *pmd, unsigned long addr, unsigned long end,
|
||||||
|
@ -109,6 +109,7 @@ SECTIONS
|
|||||||
#ifdef CONFIG_KERNEL_UNCOMPRESSED
|
#ifdef CONFIG_KERNEL_UNCOMPRESSED
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
. += AMODE31_SIZE; /* .amode31 section */
|
. += AMODE31_SIZE; /* .amode31 section */
|
||||||
|
. = ALIGN(1 << 20); /* _SEGMENT_SIZE */
|
||||||
#else
|
#else
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
#endif
|
#endif
|
||||||
|
@ -43,7 +43,6 @@ CONFIG_PROFILING=y
|
|||||||
CONFIG_KEXEC=y
|
CONFIG_KEXEC=y
|
||||||
CONFIG_KEXEC_FILE=y
|
CONFIG_KEXEC_FILE=y
|
||||||
CONFIG_KEXEC_SIG=y
|
CONFIG_KEXEC_SIG=y
|
||||||
CONFIG_CRASH_DUMP=y
|
|
||||||
CONFIG_LIVEPATCH=y
|
CONFIG_LIVEPATCH=y
|
||||||
CONFIG_MARCH_Z13=y
|
CONFIG_MARCH_Z13=y
|
||||||
CONFIG_NR_CPUS=512
|
CONFIG_NR_CPUS=512
|
||||||
@ -51,6 +50,7 @@ CONFIG_NUMA=y
|
|||||||
CONFIG_HZ_100=y
|
CONFIG_HZ_100=y
|
||||||
CONFIG_CERT_STORE=y
|
CONFIG_CERT_STORE=y
|
||||||
CONFIG_EXPOLINE=y
|
CONFIG_EXPOLINE=y
|
||||||
|
# CONFIG_EXPOLINE_EXTERN is not set
|
||||||
CONFIG_EXPOLINE_AUTO=y
|
CONFIG_EXPOLINE_AUTO=y
|
||||||
CONFIG_CHSC_SCH=y
|
CONFIG_CHSC_SCH=y
|
||||||
CONFIG_VFIO_CCW=m
|
CONFIG_VFIO_CCW=m
|
||||||
@ -76,6 +76,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
|
|||||||
CONFIG_MODULE_UNLOAD_TAINT_TRACKING=y
|
CONFIG_MODULE_UNLOAD_TAINT_TRACKING=y
|
||||||
CONFIG_MODVERSIONS=y
|
CONFIG_MODVERSIONS=y
|
||||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||||
|
CONFIG_MODULE_SIG_SHA256=y
|
||||||
CONFIG_BLK_DEV_THROTTLING=y
|
CONFIG_BLK_DEV_THROTTLING=y
|
||||||
CONFIG_BLK_WBT=y
|
CONFIG_BLK_WBT=y
|
||||||
CONFIG_BLK_CGROUP_IOLATENCY=y
|
CONFIG_BLK_CGROUP_IOLATENCY=y
|
||||||
@ -100,7 +101,6 @@ CONFIG_MEMORY_HOTPLUG=y
|
|||||||
CONFIG_MEMORY_HOTREMOVE=y
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
CONFIG_KSM=y
|
CONFIG_KSM=y
|
||||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||||
CONFIG_CMA_DEBUG=y
|
|
||||||
CONFIG_CMA_DEBUGFS=y
|
CONFIG_CMA_DEBUGFS=y
|
||||||
CONFIG_CMA_SYSFS=y
|
CONFIG_CMA_SYSFS=y
|
||||||
CONFIG_CMA_AREAS=7
|
CONFIG_CMA_AREAS=7
|
||||||
@ -119,6 +119,7 @@ CONFIG_UNIX_DIAG=m
|
|||||||
CONFIG_XFRM_USER=m
|
CONFIG_XFRM_USER=m
|
||||||
CONFIG_NET_KEY=m
|
CONFIG_NET_KEY=m
|
||||||
CONFIG_SMC_DIAG=m
|
CONFIG_SMC_DIAG=m
|
||||||
|
CONFIG_SMC_LO=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
CONFIG_IP_MULTICAST=y
|
CONFIG_IP_MULTICAST=y
|
||||||
CONFIG_IP_ADVANCED_ROUTER=y
|
CONFIG_IP_ADVANCED_ROUTER=y
|
||||||
@ -133,7 +134,6 @@ CONFIG_IP_MROUTE=y
|
|||||||
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
|
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
|
||||||
CONFIG_IP_PIMSM_V1=y
|
CONFIG_IP_PIMSM_V1=y
|
||||||
CONFIG_IP_PIMSM_V2=y
|
CONFIG_IP_PIMSM_V2=y
|
||||||
CONFIG_SYN_COOKIES=y
|
|
||||||
CONFIG_NET_IPVTI=m
|
CONFIG_NET_IPVTI=m
|
||||||
CONFIG_INET_AH=m
|
CONFIG_INET_AH=m
|
||||||
CONFIG_INET_ESP=m
|
CONFIG_INET_ESP=m
|
||||||
@ -167,6 +167,7 @@ CONFIG_BRIDGE_NETFILTER=m
|
|||||||
CONFIG_NETFILTER_NETLINK_HOOK=m
|
CONFIG_NETFILTER_NETLINK_HOOK=m
|
||||||
CONFIG_NF_CONNTRACK=m
|
CONFIG_NF_CONNTRACK=m
|
||||||
CONFIG_NF_CONNTRACK_SECMARK=y
|
CONFIG_NF_CONNTRACK_SECMARK=y
|
||||||
|
CONFIG_NF_CONNTRACK_ZONES=y
|
||||||
CONFIG_NF_CONNTRACK_PROCFS=y
|
CONFIG_NF_CONNTRACK_PROCFS=y
|
||||||
CONFIG_NF_CONNTRACK_EVENTS=y
|
CONFIG_NF_CONNTRACK_EVENTS=y
|
||||||
CONFIG_NF_CONNTRACK_TIMEOUT=y
|
CONFIG_NF_CONNTRACK_TIMEOUT=y
|
||||||
@ -183,17 +184,39 @@ CONFIG_NF_CONNTRACK_SIP=m
|
|||||||
CONFIG_NF_CONNTRACK_TFTP=m
|
CONFIG_NF_CONNTRACK_TFTP=m
|
||||||
CONFIG_NF_CT_NETLINK=m
|
CONFIG_NF_CT_NETLINK=m
|
||||||
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
||||||
|
CONFIG_NF_CT_NETLINK_HELPER=m
|
||||||
|
CONFIG_NETFILTER_NETLINK_GLUE_CT=y
|
||||||
CONFIG_NF_TABLES=m
|
CONFIG_NF_TABLES=m
|
||||||
CONFIG_NF_TABLES_INET=y
|
CONFIG_NF_TABLES_INET=y
|
||||||
|
CONFIG_NF_TABLES_NETDEV=y
|
||||||
|
CONFIG_NFT_NUMGEN=m
|
||||||
CONFIG_NFT_CT=m
|
CONFIG_NFT_CT=m
|
||||||
|
CONFIG_NFT_FLOW_OFFLOAD=m
|
||||||
|
CONFIG_NFT_CONNLIMIT=m
|
||||||
CONFIG_NFT_LOG=m
|
CONFIG_NFT_LOG=m
|
||||||
CONFIG_NFT_LIMIT=m
|
CONFIG_NFT_LIMIT=m
|
||||||
|
CONFIG_NFT_MASQ=m
|
||||||
|
CONFIG_NFT_REDIR=m
|
||||||
CONFIG_NFT_NAT=m
|
CONFIG_NFT_NAT=m
|
||||||
|
CONFIG_NFT_TUNNEL=m
|
||||||
|
CONFIG_NFT_QUEUE=m
|
||||||
|
CONFIG_NFT_QUOTA=m
|
||||||
CONFIG_NFT_REJECT=m
|
CONFIG_NFT_REJECT=m
|
||||||
CONFIG_NFT_COMPAT=m
|
CONFIG_NFT_COMPAT=m
|
||||||
CONFIG_NFT_HASH=m
|
CONFIG_NFT_HASH=m
|
||||||
CONFIG_NFT_FIB_INET=m
|
CONFIG_NFT_FIB_INET=m
|
||||||
CONFIG_NETFILTER_XTABLES_COMPAT=y
|
CONFIG_NFT_XFRM=m
|
||||||
|
CONFIG_NFT_SOCKET=m
|
||||||
|
CONFIG_NFT_OSF=m
|
||||||
|
CONFIG_NFT_TPROXY=m
|
||||||
|
CONFIG_NFT_SYNPROXY=m
|
||||||
|
CONFIG_NFT_DUP_NETDEV=m
|
||||||
|
CONFIG_NFT_FWD_NETDEV=m
|
||||||
|
CONFIG_NFT_FIB_NETDEV=m
|
||||||
|
CONFIG_NFT_REJECT_NETDEV=m
|
||||||
|
CONFIG_NF_FLOW_TABLE_INET=m
|
||||||
|
CONFIG_NF_FLOW_TABLE=m
|
||||||
|
CONFIG_NF_FLOW_TABLE_PROCFS=y
|
||||||
CONFIG_NETFILTER_XT_SET=m
|
CONFIG_NETFILTER_XT_SET=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
|
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||||
@ -206,8 +229,10 @@ CONFIG_NETFILTER_XT_TARGET_HMARK=m
|
|||||||
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
|
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_LOG=m
|
CONFIG_NETFILTER_XT_TARGET_LOG=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_MARK=m
|
CONFIG_NETFILTER_XT_TARGET_MARK=m
|
||||||
|
CONFIG_NETFILTER_XT_TARGET_NETMAP=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
|
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
|
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
|
||||||
|
CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_TEE=m
|
CONFIG_NETFILTER_XT_TARGET_TEE=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
|
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_TRACE=m
|
CONFIG_NETFILTER_XT_TARGET_TRACE=m
|
||||||
@ -216,6 +241,7 @@ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
|
|||||||
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
|
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
|
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_BPF=m
|
CONFIG_NETFILTER_XT_MATCH_BPF=m
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
|
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
|
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
|
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
|
||||||
@ -230,6 +256,7 @@ CONFIG_NETFILTER_XT_MATCH_DSCP=m
|
|||||||
CONFIG_NETFILTER_XT_MATCH_ESP=m
|
CONFIG_NETFILTER_XT_MATCH_ESP=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
|
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_HELPER=m
|
CONFIG_NETFILTER_XT_MATCH_HELPER=m
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_IPCOMP=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
|
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_IPVS=m
|
CONFIG_NETFILTER_XT_MATCH_IPVS=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
|
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
|
||||||
@ -247,6 +274,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m
|
|||||||
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
|
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_REALM=m
|
CONFIG_NETFILTER_XT_MATCH_REALM=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_RECENT=m
|
CONFIG_NETFILTER_XT_MATCH_RECENT=m
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_STATE=m
|
CONFIG_NETFILTER_XT_MATCH_STATE=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
|
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_STRING=m
|
CONFIG_NETFILTER_XT_MATCH_STRING=m
|
||||||
@ -302,7 +330,6 @@ CONFIG_IP_NF_TARGET_ECN=m
|
|||||||
CONFIG_IP_NF_TARGET_TTL=m
|
CONFIG_IP_NF_TARGET_TTL=m
|
||||||
CONFIG_IP_NF_RAW=m
|
CONFIG_IP_NF_RAW=m
|
||||||
CONFIG_IP_NF_SECURITY=m
|
CONFIG_IP_NF_SECURITY=m
|
||||||
CONFIG_IP_NF_ARPTABLES=m
|
|
||||||
CONFIG_IP_NF_ARPFILTER=m
|
CONFIG_IP_NF_ARPFILTER=m
|
||||||
CONFIG_IP_NF_ARP_MANGLE=m
|
CONFIG_IP_NF_ARP_MANGLE=m
|
||||||
CONFIG_NFT_FIB_IPV6=m
|
CONFIG_NFT_FIB_IPV6=m
|
||||||
@ -373,7 +400,6 @@ CONFIG_NET_ACT_POLICE=m
|
|||||||
CONFIG_NET_ACT_GACT=m
|
CONFIG_NET_ACT_GACT=m
|
||||||
CONFIG_GACT_PROB=y
|
CONFIG_GACT_PROB=y
|
||||||
CONFIG_NET_ACT_MIRRED=m
|
CONFIG_NET_ACT_MIRRED=m
|
||||||
CONFIG_NET_ACT_IPT=m
|
|
||||||
CONFIG_NET_ACT_NAT=m
|
CONFIG_NET_ACT_NAT=m
|
||||||
CONFIG_NET_ACT_PEDIT=m
|
CONFIG_NET_ACT_PEDIT=m
|
||||||
CONFIG_NET_ACT_SIMP=m
|
CONFIG_NET_ACT_SIMP=m
|
||||||
@ -462,6 +488,7 @@ CONFIG_DM_VERITY=m
|
|||||||
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
|
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
|
||||||
CONFIG_DM_SWITCH=m
|
CONFIG_DM_SWITCH=m
|
||||||
CONFIG_DM_INTEGRITY=m
|
CONFIG_DM_INTEGRITY=m
|
||||||
|
CONFIG_DM_VDO=m
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_BONDING=m
|
CONFIG_BONDING=m
|
||||||
CONFIG_DUMMY=m
|
CONFIG_DUMMY=m
|
||||||
@ -574,7 +601,6 @@ CONFIG_WATCHDOG=y
|
|||||||
CONFIG_WATCHDOG_NOWAYOUT=y
|
CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
CONFIG_SOFT_WATCHDOG=m
|
CONFIG_SOFT_WATCHDOG=m
|
||||||
CONFIG_DIAG288_WATCHDOG=m
|
CONFIG_DIAG288_WATCHDOG=m
|
||||||
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
|
|
||||||
CONFIG_FB=y
|
CONFIG_FB=y
|
||||||
# CONFIG_FB_DEVICE is not set
|
# CONFIG_FB_DEVICE is not set
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
@ -645,7 +671,6 @@ CONFIG_MSDOS_FS=m
|
|||||||
CONFIG_VFAT_FS=m
|
CONFIG_VFAT_FS=m
|
||||||
CONFIG_EXFAT_FS=m
|
CONFIG_EXFAT_FS=m
|
||||||
CONFIG_NTFS_FS=m
|
CONFIG_NTFS_FS=m
|
||||||
CONFIG_NTFS_RW=y
|
|
||||||
CONFIG_PROC_KCORE=y
|
CONFIG_PROC_KCORE=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_TMPFS_POSIX_ACL=y
|
CONFIG_TMPFS_POSIX_ACL=y
|
||||||
@ -663,6 +688,7 @@ CONFIG_SQUASHFS_XZ=y
|
|||||||
CONFIG_SQUASHFS_ZSTD=y
|
CONFIG_SQUASHFS_ZSTD=y
|
||||||
CONFIG_ROMFS_FS=m
|
CONFIG_ROMFS_FS=m
|
||||||
CONFIG_NFS_FS=m
|
CONFIG_NFS_FS=m
|
||||||
|
CONFIG_NFS_V2=m
|
||||||
CONFIG_NFS_V3_ACL=y
|
CONFIG_NFS_V3_ACL=y
|
||||||
CONFIG_NFS_V4=m
|
CONFIG_NFS_V4=m
|
||||||
CONFIG_NFS_SWAP=y
|
CONFIG_NFS_SWAP=y
|
||||||
@ -879,6 +905,5 @@ CONFIG_RBTREE_TEST=y
|
|||||||
CONFIG_INTERVAL_TREE_TEST=m
|
CONFIG_INTERVAL_TREE_TEST=m
|
||||||
CONFIG_PERCPU_TEST=m
|
CONFIG_PERCPU_TEST=m
|
||||||
CONFIG_ATOMIC64_SELFTEST=y
|
CONFIG_ATOMIC64_SELFTEST=y
|
||||||
CONFIG_STRING_SELFTEST=y
|
|
||||||
CONFIG_TEST_BITOPS=m
|
CONFIG_TEST_BITOPS=m
|
||||||
CONFIG_TEST_BPF=m
|
CONFIG_TEST_BPF=m
|
||||||
|
@ -41,7 +41,6 @@ CONFIG_PROFILING=y
|
|||||||
CONFIG_KEXEC=y
|
CONFIG_KEXEC=y
|
||||||
CONFIG_KEXEC_FILE=y
|
CONFIG_KEXEC_FILE=y
|
||||||
CONFIG_KEXEC_SIG=y
|
CONFIG_KEXEC_SIG=y
|
||||||
CONFIG_CRASH_DUMP=y
|
|
||||||
CONFIG_LIVEPATCH=y
|
CONFIG_LIVEPATCH=y
|
||||||
CONFIG_MARCH_Z13=y
|
CONFIG_MARCH_Z13=y
|
||||||
CONFIG_NR_CPUS=512
|
CONFIG_NR_CPUS=512
|
||||||
@ -49,6 +48,7 @@ CONFIG_NUMA=y
|
|||||||
CONFIG_HZ_100=y
|
CONFIG_HZ_100=y
|
||||||
CONFIG_CERT_STORE=y
|
CONFIG_CERT_STORE=y
|
||||||
CONFIG_EXPOLINE=y
|
CONFIG_EXPOLINE=y
|
||||||
|
# CONFIG_EXPOLINE_EXTERN is not set
|
||||||
CONFIG_EXPOLINE_AUTO=y
|
CONFIG_EXPOLINE_AUTO=y
|
||||||
CONFIG_CHSC_SCH=y
|
CONFIG_CHSC_SCH=y
|
||||||
CONFIG_VFIO_CCW=m
|
CONFIG_VFIO_CCW=m
|
||||||
@ -71,6 +71,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
|
|||||||
CONFIG_MODULE_UNLOAD_TAINT_TRACKING=y
|
CONFIG_MODULE_UNLOAD_TAINT_TRACKING=y
|
||||||
CONFIG_MODVERSIONS=y
|
CONFIG_MODVERSIONS=y
|
||||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||||
|
CONFIG_MODULE_SIG_SHA256=y
|
||||||
CONFIG_BLK_DEV_THROTTLING=y
|
CONFIG_BLK_DEV_THROTTLING=y
|
||||||
CONFIG_BLK_WBT=y
|
CONFIG_BLK_WBT=y
|
||||||
CONFIG_BLK_CGROUP_IOLATENCY=y
|
CONFIG_BLK_CGROUP_IOLATENCY=y
|
||||||
@ -110,6 +111,7 @@ CONFIG_UNIX_DIAG=m
|
|||||||
CONFIG_XFRM_USER=m
|
CONFIG_XFRM_USER=m
|
||||||
CONFIG_NET_KEY=m
|
CONFIG_NET_KEY=m
|
||||||
CONFIG_SMC_DIAG=m
|
CONFIG_SMC_DIAG=m
|
||||||
|
CONFIG_SMC_LO=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
CONFIG_IP_MULTICAST=y
|
CONFIG_IP_MULTICAST=y
|
||||||
CONFIG_IP_ADVANCED_ROUTER=y
|
CONFIG_IP_ADVANCED_ROUTER=y
|
||||||
@ -124,7 +126,6 @@ CONFIG_IP_MROUTE=y
|
|||||||
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
|
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
|
||||||
CONFIG_IP_PIMSM_V1=y
|
CONFIG_IP_PIMSM_V1=y
|
||||||
CONFIG_IP_PIMSM_V2=y
|
CONFIG_IP_PIMSM_V2=y
|
||||||
CONFIG_SYN_COOKIES=y
|
|
||||||
CONFIG_NET_IPVTI=m
|
CONFIG_NET_IPVTI=m
|
||||||
CONFIG_INET_AH=m
|
CONFIG_INET_AH=m
|
||||||
CONFIG_INET_ESP=m
|
CONFIG_INET_ESP=m
|
||||||
@ -158,6 +159,7 @@ CONFIG_BRIDGE_NETFILTER=m
|
|||||||
CONFIG_NETFILTER_NETLINK_HOOK=m
|
CONFIG_NETFILTER_NETLINK_HOOK=m
|
||||||
CONFIG_NF_CONNTRACK=m
|
CONFIG_NF_CONNTRACK=m
|
||||||
CONFIG_NF_CONNTRACK_SECMARK=y
|
CONFIG_NF_CONNTRACK_SECMARK=y
|
||||||
|
CONFIG_NF_CONNTRACK_ZONES=y
|
||||||
CONFIG_NF_CONNTRACK_PROCFS=y
|
CONFIG_NF_CONNTRACK_PROCFS=y
|
||||||
CONFIG_NF_CONNTRACK_EVENTS=y
|
CONFIG_NF_CONNTRACK_EVENTS=y
|
||||||
CONFIG_NF_CONNTRACK_TIMEOUT=y
|
CONFIG_NF_CONNTRACK_TIMEOUT=y
|
||||||
@ -174,17 +176,39 @@ CONFIG_NF_CONNTRACK_SIP=m
|
|||||||
CONFIG_NF_CONNTRACK_TFTP=m
|
CONFIG_NF_CONNTRACK_TFTP=m
|
||||||
CONFIG_NF_CT_NETLINK=m
|
CONFIG_NF_CT_NETLINK=m
|
||||||
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
||||||
|
CONFIG_NF_CT_NETLINK_HELPER=m
|
||||||
|
CONFIG_NETFILTER_NETLINK_GLUE_CT=y
|
||||||
CONFIG_NF_TABLES=m
|
CONFIG_NF_TABLES=m
|
||||||
CONFIG_NF_TABLES_INET=y
|
CONFIG_NF_TABLES_INET=y
|
||||||
|
CONFIG_NF_TABLES_NETDEV=y
|
||||||
|
CONFIG_NFT_NUMGEN=m
|
||||||
CONFIG_NFT_CT=m
|
CONFIG_NFT_CT=m
|
||||||
|
CONFIG_NFT_FLOW_OFFLOAD=m
|
||||||
|
CONFIG_NFT_CONNLIMIT=m
|
||||||
CONFIG_NFT_LOG=m
|
CONFIG_NFT_LOG=m
|
||||||
CONFIG_NFT_LIMIT=m
|
CONFIG_NFT_LIMIT=m
|
||||||
|
CONFIG_NFT_MASQ=m
|
||||||
|
CONFIG_NFT_REDIR=m
|
||||||
CONFIG_NFT_NAT=m
|
CONFIG_NFT_NAT=m
|
||||||
|
CONFIG_NFT_TUNNEL=m
|
||||||
|
CONFIG_NFT_QUEUE=m
|
||||||
|
CONFIG_NFT_QUOTA=m
|
||||||
CONFIG_NFT_REJECT=m
|
CONFIG_NFT_REJECT=m
|
||||||
CONFIG_NFT_COMPAT=m
|
CONFIG_NFT_COMPAT=m
|
||||||
CONFIG_NFT_HASH=m
|
CONFIG_NFT_HASH=m
|
||||||
CONFIG_NFT_FIB_INET=m
|
CONFIG_NFT_FIB_INET=m
|
||||||
CONFIG_NETFILTER_XTABLES_COMPAT=y
|
CONFIG_NFT_XFRM=m
|
||||||
|
CONFIG_NFT_SOCKET=m
|
||||||
|
CONFIG_NFT_OSF=m
|
||||||
|
CONFIG_NFT_TPROXY=m
|
||||||
|
CONFIG_NFT_SYNPROXY=m
|
||||||
|
CONFIG_NFT_DUP_NETDEV=m
|
||||||
|
CONFIG_NFT_FWD_NETDEV=m
|
||||||
|
CONFIG_NFT_FIB_NETDEV=m
|
||||||
|
CONFIG_NFT_REJECT_NETDEV=m
|
||||||
|
CONFIG_NF_FLOW_TABLE_INET=m
|
||||||
|
CONFIG_NF_FLOW_TABLE=m
|
||||||
|
CONFIG_NF_FLOW_TABLE_PROCFS=y
|
||||||
CONFIG_NETFILTER_XT_SET=m
|
CONFIG_NETFILTER_XT_SET=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
|
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||||
@ -197,8 +221,10 @@ CONFIG_NETFILTER_XT_TARGET_HMARK=m
|
|||||||
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
|
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_LOG=m
|
CONFIG_NETFILTER_XT_TARGET_LOG=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_MARK=m
|
CONFIG_NETFILTER_XT_TARGET_MARK=m
|
||||||
|
CONFIG_NETFILTER_XT_TARGET_NETMAP=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
|
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
|
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
|
||||||
|
CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_TEE=m
|
CONFIG_NETFILTER_XT_TARGET_TEE=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
|
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_TRACE=m
|
CONFIG_NETFILTER_XT_TARGET_TRACE=m
|
||||||
@ -207,6 +233,7 @@ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
|
|||||||
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
|
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
|
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_BPF=m
|
CONFIG_NETFILTER_XT_MATCH_BPF=m
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
|
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
|
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
|
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
|
||||||
@ -221,6 +248,7 @@ CONFIG_NETFILTER_XT_MATCH_DSCP=m
|
|||||||
CONFIG_NETFILTER_XT_MATCH_ESP=m
|
CONFIG_NETFILTER_XT_MATCH_ESP=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
|
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_HELPER=m
|
CONFIG_NETFILTER_XT_MATCH_HELPER=m
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_IPCOMP=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
|
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_IPVS=m
|
CONFIG_NETFILTER_XT_MATCH_IPVS=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
|
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
|
||||||
@ -238,6 +266,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m
|
|||||||
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
|
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_REALM=m
|
CONFIG_NETFILTER_XT_MATCH_REALM=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_RECENT=m
|
CONFIG_NETFILTER_XT_MATCH_RECENT=m
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_STATE=m
|
CONFIG_NETFILTER_XT_MATCH_STATE=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
|
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_STRING=m
|
CONFIG_NETFILTER_XT_MATCH_STRING=m
|
||||||
@ -293,7 +322,6 @@ CONFIG_IP_NF_TARGET_ECN=m
|
|||||||
CONFIG_IP_NF_TARGET_TTL=m
|
CONFIG_IP_NF_TARGET_TTL=m
|
||||||
CONFIG_IP_NF_RAW=m
|
CONFIG_IP_NF_RAW=m
|
||||||
CONFIG_IP_NF_SECURITY=m
|
CONFIG_IP_NF_SECURITY=m
|
||||||
CONFIG_IP_NF_ARPTABLES=m
|
|
||||||
CONFIG_IP_NF_ARPFILTER=m
|
CONFIG_IP_NF_ARPFILTER=m
|
||||||
CONFIG_IP_NF_ARP_MANGLE=m
|
CONFIG_IP_NF_ARP_MANGLE=m
|
||||||
CONFIG_NFT_FIB_IPV6=m
|
CONFIG_NFT_FIB_IPV6=m
|
||||||
@ -363,7 +391,6 @@ CONFIG_NET_ACT_POLICE=m
|
|||||||
CONFIG_NET_ACT_GACT=m
|
CONFIG_NET_ACT_GACT=m
|
||||||
CONFIG_GACT_PROB=y
|
CONFIG_GACT_PROB=y
|
||||||
CONFIG_NET_ACT_MIRRED=m
|
CONFIG_NET_ACT_MIRRED=m
|
||||||
CONFIG_NET_ACT_IPT=m
|
|
||||||
CONFIG_NET_ACT_NAT=m
|
CONFIG_NET_ACT_NAT=m
|
||||||
CONFIG_NET_ACT_PEDIT=m
|
CONFIG_NET_ACT_PEDIT=m
|
||||||
CONFIG_NET_ACT_SIMP=m
|
CONFIG_NET_ACT_SIMP=m
|
||||||
@ -452,6 +479,7 @@ CONFIG_DM_VERITY=m
|
|||||||
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
|
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
|
||||||
CONFIG_DM_SWITCH=m
|
CONFIG_DM_SWITCH=m
|
||||||
CONFIG_DM_INTEGRITY=m
|
CONFIG_DM_INTEGRITY=m
|
||||||
|
CONFIG_DM_VDO=m
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_BONDING=m
|
CONFIG_BONDING=m
|
||||||
CONFIG_DUMMY=m
|
CONFIG_DUMMY=m
|
||||||
@ -630,7 +658,6 @@ CONFIG_MSDOS_FS=m
|
|||||||
CONFIG_VFAT_FS=m
|
CONFIG_VFAT_FS=m
|
||||||
CONFIG_EXFAT_FS=m
|
CONFIG_EXFAT_FS=m
|
||||||
CONFIG_NTFS_FS=m
|
CONFIG_NTFS_FS=m
|
||||||
CONFIG_NTFS_RW=y
|
|
||||||
CONFIG_PROC_KCORE=y
|
CONFIG_PROC_KCORE=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_TMPFS_POSIX_ACL=y
|
CONFIG_TMPFS_POSIX_ACL=y
|
||||||
@ -649,6 +676,7 @@ CONFIG_SQUASHFS_XZ=y
|
|||||||
CONFIG_SQUASHFS_ZSTD=y
|
CONFIG_SQUASHFS_ZSTD=y
|
||||||
CONFIG_ROMFS_FS=m
|
CONFIG_ROMFS_FS=m
|
||||||
CONFIG_NFS_FS=m
|
CONFIG_NFS_FS=m
|
||||||
|
CONFIG_NFS_V2=m
|
||||||
CONFIG_NFS_V3_ACL=y
|
CONFIG_NFS_V3_ACL=y
|
||||||
CONFIG_NFS_V4=m
|
CONFIG_NFS_V4=m
|
||||||
CONFIG_NFS_SWAP=y
|
CONFIG_NFS_SWAP=y
|
||||||
|
@ -9,25 +9,22 @@ CONFIG_BPF_SYSCALL=y
|
|||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||||
CONFIG_KEXEC=y
|
CONFIG_KEXEC=y
|
||||||
CONFIG_CRASH_DUMP=y
|
|
||||||
CONFIG_MARCH_Z13=y
|
CONFIG_MARCH_Z13=y
|
||||||
CONFIG_NR_CPUS=2
|
CONFIG_NR_CPUS=2
|
||||||
CONFIG_HZ_100=y
|
CONFIG_HZ_100=y
|
||||||
# CONFIG_CHSC_SCH is not set
|
# CONFIG_CHSC_SCH is not set
|
||||||
# CONFIG_SCM_BUS is not set
|
# CONFIG_SCM_BUS is not set
|
||||||
|
# CONFIG_AP is not set
|
||||||
# CONFIG_PFAULT is not set
|
# CONFIG_PFAULT is not set
|
||||||
# CONFIG_S390_HYPFS is not set
|
# CONFIG_S390_HYPFS is not set
|
||||||
# CONFIG_VIRTUALIZATION is not set
|
# CONFIG_VIRTUALIZATION is not set
|
||||||
# CONFIG_S390_GUEST is not set
|
# CONFIG_S390_GUEST is not set
|
||||||
# CONFIG_SECCOMP is not set
|
# CONFIG_SECCOMP is not set
|
||||||
# CONFIG_GCC_PLUGINS is not set
|
|
||||||
# CONFIG_BLOCK_LEGACY_AUTOLOAD is not set
|
# CONFIG_BLOCK_LEGACY_AUTOLOAD is not set
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
# CONFIG_COMPACTION is not set
|
|
||||||
# CONFIG_MIGRATION is not set
|
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
# CONFIG_IUCV is not set
|
# CONFIG_IUCV is not set
|
||||||
# CONFIG_PCPU_DEV_REFCNT is not set
|
# CONFIG_PCPU_DEV_REFCNT is not set
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
|
||||||
|
@ -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
|
||||||
|
@ -105,9 +105,9 @@ vmlinux-objs-$(CONFIG_UNACCEPTED_MEMORY) += $(obj)/mem.o
|
|||||||
|
|
||||||
vmlinux-objs-$(CONFIG_EFI) += $(obj)/efi.o
|
vmlinux-objs-$(CONFIG_EFI) += $(obj)/efi.o
|
||||||
vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_mixed.o
|
vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_mixed.o
|
||||||
vmlinux-objs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
|
vmlinux-libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
|
||||||
|
|
||||||
$(obj)/vmlinux: $(vmlinux-objs-y) FORCE
|
$(obj)/vmlinux: $(vmlinux-objs-y) $(vmlinux-libs-y) FORCE
|
||||||
$(call if_changed,ld)
|
$(call if_changed,ld)
|
||||||
|
|
||||||
OBJCOPYFLAGS_vmlinux.bin := -R .comment -S
|
OBJCOPYFLAGS_vmlinux.bin := -R .comment -S
|
||||||
|
@ -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
|
||||||
|
@ -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)) \
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -78,10 +78,10 @@ extern int __get_user_bad(void);
|
|||||||
int __ret_gu; \
|
int __ret_gu; \
|
||||||
register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX); \
|
register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX); \
|
||||||
__chk_user_ptr(ptr); \
|
__chk_user_ptr(ptr); \
|
||||||
asm volatile("call __" #fn "_%c4" \
|
asm volatile("call __" #fn "_%c[size]" \
|
||||||
: "=a" (__ret_gu), "=r" (__val_gu), \
|
: "=a" (__ret_gu), "=r" (__val_gu), \
|
||||||
ASM_CALL_CONSTRAINT \
|
ASM_CALL_CONSTRAINT \
|
||||||
: "0" (ptr), "i" (sizeof(*(ptr)))); \
|
: "0" (ptr), [size] "i" (sizeof(*(ptr)))); \
|
||||||
instrument_get_user(__val_gu); \
|
instrument_get_user(__val_gu); \
|
||||||
(x) = (__force __typeof__(*(ptr))) __val_gu; \
|
(x) = (__force __typeof__(*(ptr))) __val_gu; \
|
||||||
__builtin_expect(__ret_gu, 0); \
|
__builtin_expect(__ret_gu, 0); \
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
|
@ -44,7 +44,11 @@
|
|||||||
or %rdx, %rax
|
or %rdx, %rax
|
||||||
.else
|
.else
|
||||||
cmp $TASK_SIZE_MAX-\size+1, %eax
|
cmp $TASK_SIZE_MAX-\size+1, %eax
|
||||||
|
.if \size != 8
|
||||||
jae .Lbad_get_user
|
jae .Lbad_get_user
|
||||||
|
.else
|
||||||
|
jae .Lbad_get_user_8
|
||||||
|
.endif
|
||||||
sbb %edx, %edx /* array_index_mask_nospec() */
|
sbb %edx, %edx /* array_index_mask_nospec() */
|
||||||
and %edx, %eax
|
and %edx, %eax
|
||||||
.endif
|
.endif
|
||||||
@ -154,7 +158,7 @@ SYM_CODE_END(__get_user_handle_exception)
|
|||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
SYM_CODE_START_LOCAL(__get_user_8_handle_exception)
|
SYM_CODE_START_LOCAL(__get_user_8_handle_exception)
|
||||||
ASM_CLAC
|
ASM_CLAC
|
||||||
bad_get_user_8:
|
.Lbad_get_user_8:
|
||||||
xor %edx,%edx
|
xor %edx,%edx
|
||||||
xor %ecx,%ecx
|
xor %ecx,%ecx
|
||||||
mov $(-EFAULT),%_ASM_AX
|
mov $(-EFAULT),%_ASM_AX
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user