mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
Linux 6.6-rc7
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmU1ngkeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGrsIH/0k/+gdBBYFFdEym foRhKir9WV3ZX4oIozJjA1f7T+qVYclKs6kaYm3gNepRBb6AoG8pdgv4MMAqhYsf QMe2XHi0MrO/qKBgfNfivxEa9jq+0QK5uvTbqCRqCAB8LfwVyDqapCmg3EuiZcPW UbMITmnwLIfXgPxvp9rabmCsTqO6FLbf0GDOVIkNSAIDBXMpcO1iffjrWUbhRa7n oIoiJmWJLcXLxPWDsRKbpJwzw2cIG08YhfQYAiQnC3YaeRm1FKLDIICRBsmfYzja rWv9r4dn4TDfV4/AnjggQnsZvz2yPCxNaFSQIT88nIeiLvyuUTJ9j8aidsSfMZQf xZAbzbA= =NoQv -----END PGP SIGNATURE----- Merge tag 'v6.6-rc7' into sched/core, to pick up fixes Pick up recent sched/urgent fixes merged upstream. Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
4e5b65a22b
1
.mailmap
1
.mailmap
@ -377,6 +377,7 @@ Matthew Wilcox <willy@infradead.org> <willy@debian.org>
|
|||||||
Matthew Wilcox <willy@infradead.org> <willy@linux.intel.com>
|
Matthew Wilcox <willy@infradead.org> <willy@linux.intel.com>
|
||||||
Matthew Wilcox <willy@infradead.org> <willy@parisc-linux.org>
|
Matthew Wilcox <willy@infradead.org> <willy@parisc-linux.org>
|
||||||
Matthias Fuchs <socketcan@esd.eu> <matthias.fuchs@esd.eu>
|
Matthias Fuchs <socketcan@esd.eu> <matthias.fuchs@esd.eu>
|
||||||
|
Matthieu Baerts <matttbe@kernel.org> <matthieu.baerts@tessares.net>
|
||||||
Matthieu CASTET <castet.matthieu@free.fr>
|
Matthieu CASTET <castet.matthieu@free.fr>
|
||||||
Matti Vaittinen <mazziesaccount@gmail.com> <matti.vaittinen@fi.rohmeurope.com>
|
Matti Vaittinen <mazziesaccount@gmail.com> <matti.vaittinen@fi.rohmeurope.com>
|
||||||
Matt Ranostay <matt.ranostay@konsulko.com> <matt@ranostay.consulting>
|
Matt Ranostay <matt.ranostay@konsulko.com> <matt@ranostay.consulting>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
What: /sys/class/firmware/.../data
|
What: /sys/class/firmware/.../data
|
||||||
Date: July 2022
|
Date: July 2022
|
||||||
KernelVersion: 5.19
|
KernelVersion: 5.19
|
||||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
Contact: Russ Weight <russ.weight@linux.dev>
|
||||||
Description: The data sysfs file is used for firmware-fallback and for
|
Description: The data sysfs file is used for firmware-fallback and for
|
||||||
firmware uploads. Cat a firmware image to this sysfs file
|
firmware uploads. Cat a firmware image to this sysfs file
|
||||||
after you echo 1 to the loading sysfs file. When the firmware
|
after you echo 1 to the loading sysfs file. When the firmware
|
||||||
@ -13,7 +13,7 @@ Description: The data sysfs file is used for firmware-fallback and for
|
|||||||
What: /sys/class/firmware/.../cancel
|
What: /sys/class/firmware/.../cancel
|
||||||
Date: July 2022
|
Date: July 2022
|
||||||
KernelVersion: 5.19
|
KernelVersion: 5.19
|
||||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
Contact: Russ Weight <russ.weight@linux.dev>
|
||||||
Description: Write-only. For firmware uploads, write a "1" to this file to
|
Description: Write-only. For firmware uploads, write a "1" to this file to
|
||||||
request that the transfer of firmware data to the lower-level
|
request that the transfer of firmware data to the lower-level
|
||||||
device be canceled. This request will be rejected (EBUSY) if
|
device be canceled. This request will be rejected (EBUSY) if
|
||||||
@ -23,7 +23,7 @@ Description: Write-only. For firmware uploads, write a "1" to this file to
|
|||||||
What: /sys/class/firmware/.../error
|
What: /sys/class/firmware/.../error
|
||||||
Date: July 2022
|
Date: July 2022
|
||||||
KernelVersion: 5.19
|
KernelVersion: 5.19
|
||||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
Contact: Russ Weight <russ.weight@linux.dev>
|
||||||
Description: Read-only. Returns a string describing a failed firmware
|
Description: Read-only. Returns a string describing a failed firmware
|
||||||
upload. This string will be in the form of <STATUS>:<ERROR>,
|
upload. This string will be in the form of <STATUS>:<ERROR>,
|
||||||
where <STATUS> will be one of the status strings described
|
where <STATUS> will be one of the status strings described
|
||||||
@ -37,7 +37,7 @@ Description: Read-only. Returns a string describing a failed firmware
|
|||||||
What: /sys/class/firmware/.../loading
|
What: /sys/class/firmware/.../loading
|
||||||
Date: July 2022
|
Date: July 2022
|
||||||
KernelVersion: 5.19
|
KernelVersion: 5.19
|
||||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
Contact: Russ Weight <russ.weight@linux.dev>
|
||||||
Description: The loading sysfs file is used for both firmware-fallback and
|
Description: The loading sysfs file is used for both firmware-fallback and
|
||||||
for firmware uploads. Echo 1 onto the loading file to indicate
|
for firmware uploads. Echo 1 onto the loading file to indicate
|
||||||
you are writing a firmware file to the data sysfs node. Echo
|
you are writing a firmware file to the data sysfs node. Echo
|
||||||
@ -49,7 +49,7 @@ Description: The loading sysfs file is used for both firmware-fallback and
|
|||||||
What: /sys/class/firmware/.../remaining_size
|
What: /sys/class/firmware/.../remaining_size
|
||||||
Date: July 2022
|
Date: July 2022
|
||||||
KernelVersion: 5.19
|
KernelVersion: 5.19
|
||||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
Contact: Russ Weight <russ.weight@linux.dev>
|
||||||
Description: Read-only. For firmware upload, this file contains the size
|
Description: Read-only. For firmware upload, this file contains the size
|
||||||
of the firmware data that remains to be transferred to the
|
of the firmware data that remains to be transferred to the
|
||||||
lower-level device driver. The size value is initialized to
|
lower-level device driver. The size value is initialized to
|
||||||
@ -62,7 +62,7 @@ Description: Read-only. For firmware upload, this file contains the size
|
|||||||
What: /sys/class/firmware/.../status
|
What: /sys/class/firmware/.../status
|
||||||
Date: July 2022
|
Date: July 2022
|
||||||
KernelVersion: 5.19
|
KernelVersion: 5.19
|
||||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
Contact: Russ Weight <russ.weight@linux.dev>
|
||||||
Description: Read-only. Returns a string describing the current status of
|
Description: Read-only. Returns a string describing the current status of
|
||||||
a firmware upload. The string will be one of the following:
|
a firmware upload. The string will be one of the following:
|
||||||
idle, "receiving", "preparing", "transferring", "programming".
|
idle, "receiving", "preparing", "transferring", "programming".
|
||||||
@ -70,7 +70,7 @@ Description: Read-only. Returns a string describing the current status of
|
|||||||
What: /sys/class/firmware/.../timeout
|
What: /sys/class/firmware/.../timeout
|
||||||
Date: July 2022
|
Date: July 2022
|
||||||
KernelVersion: 5.19
|
KernelVersion: 5.19
|
||||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
Contact: Russ Weight <russ.weight@linux.dev>
|
||||||
Description: This file supports the timeout mechanism for firmware
|
Description: This file supports the timeout mechanism for firmware
|
||||||
fallback. This file has no affect on firmware uploads. For
|
fallback. This file has no affect on firmware uploads. For
|
||||||
more information on timeouts please see the documentation
|
more information on timeouts please see the documentation
|
||||||
|
@ -71,6 +71,8 @@ stable kernels.
|
|||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| ARM | Cortex-A510 | #2658417 | ARM64_ERRATUM_2658417 |
|
| ARM | Cortex-A510 | #2658417 | ARM64_ERRATUM_2658417 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
| ARM | Cortex-A520 | #2966298 | ARM64_ERRATUM_2966298 |
|
||||||
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| ARM | Cortex-A53 | #826319 | ARM64_ERRATUM_826319 |
|
| ARM | Cortex-A53 | #826319 | ARM64_ERRATUM_826319 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| ARM | Cortex-A53 | #827319 | ARM64_ERRATUM_827319 |
|
| ARM | Cortex-A53 | #827319 | ARM64_ERRATUM_827319 |
|
||||||
|
@ -244,7 +244,7 @@ unbound worker-pools and only one work item could be active at any given
|
|||||||
time thus achieving the same ordering property as ST wq.
|
time thus achieving the same ordering property as ST wq.
|
||||||
|
|
||||||
In the current implementation the above configuration only guarantees
|
In the current implementation the above configuration only guarantees
|
||||||
ST behavior within a given NUMA node. Instead ``alloc_ordered_queue()`` should
|
ST behavior within a given NUMA node. Instead ``alloc_ordered_workqueue()`` should
|
||||||
be used to achieve system-wide ST behavior.
|
be used to achieve system-wide ST behavior.
|
||||||
|
|
||||||
|
|
||||||
@ -390,7 +390,7 @@ The default affinity scope can be changed with the module parameter
|
|||||||
scope can be changed using ``apply_workqueue_attrs()``.
|
scope can be changed using ``apply_workqueue_attrs()``.
|
||||||
|
|
||||||
If ``WQ_SYSFS`` is set, the workqueue will have the following affinity scope
|
If ``WQ_SYSFS`` is set, the workqueue will have the following affinity scope
|
||||||
related interface files under its ``/sys/devices/virtual/WQ_NAME/``
|
related interface files under its ``/sys/devices/virtual/workqueue/WQ_NAME/``
|
||||||
directory.
|
directory.
|
||||||
|
|
||||||
``affinity_scope``
|
``affinity_scope``
|
||||||
|
@ -73,9 +73,6 @@ patternProperties:
|
|||||||
"^.*@[0-9a-f]+$":
|
"^.*@[0-9a-f]+$":
|
||||||
description: Devices attached to the bus
|
description: Devices attached to the bus
|
||||||
type: object
|
type: object
|
||||||
properties:
|
|
||||||
reg:
|
|
||||||
maxItems: 1
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- reg
|
- reg
|
||||||
|
@ -69,7 +69,7 @@ examples:
|
|||||||
- |
|
- |
|
||||||
#include <dt-bindings/interrupt-controller/irq.h>
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
|
||||||
cache-controller@2010000 {
|
cache-controller@13400000 {
|
||||||
compatible = "andestech,ax45mp-cache", "cache";
|
compatible = "andestech,ax45mp-cache", "cache";
|
||||||
reg = <0x13400000 0x100000>;
|
reg = <0x13400000 0x100000>;
|
||||||
interrupts = <508 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <508 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
@ -87,7 +87,7 @@ required:
|
|||||||
- interrupts
|
- interrupts
|
||||||
- ports
|
- ports
|
||||||
|
|
||||||
additionalProperties: false
|
unevaluatedProperties: false
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
- |
|
- |
|
||||||
|
@ -13,6 +13,8 @@ description: |
|
|||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Michael Tretter <m.tretter@pengutronix.de>
|
- Michael Tretter <m.tretter@pengutronix.de>
|
||||||
|
- Harini Katakam <harini.katakam@amd.com>
|
||||||
|
- Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: ../dma-controller.yaml#
|
- $ref: ../dma-controller.yaml#
|
||||||
@ -65,6 +67,7 @@ required:
|
|||||||
- interrupts
|
- interrupts
|
||||||
- clocks
|
- clocks
|
||||||
- clock-names
|
- clock-names
|
||||||
|
- xlnx,bus-width
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ patternProperties:
|
|||||||
required:
|
required:
|
||||||
- reg
|
- reg
|
||||||
|
|
||||||
additionalProperties: true
|
additionalProperties: false
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||||
|
@ -45,5 +45,6 @@ examples:
|
|||||||
light-sensor@38 {
|
light-sensor@38 {
|
||||||
compatible = "rohm,bu27010";
|
compatible = "rohm,bu27010";
|
||||||
reg = <0x38>;
|
reg = <0x38>;
|
||||||
|
vdd-supply = <&vdd>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -106,6 +106,12 @@ properties:
|
|||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
maximum: 4096
|
maximum: 4096
|
||||||
|
|
||||||
|
dma-noncoherent:
|
||||||
|
description:
|
||||||
|
Present if the GIC redistributors permit programming shareability
|
||||||
|
and cacheability attributes but are connected to a non-coherent
|
||||||
|
downstream interconnect.
|
||||||
|
|
||||||
msi-controller:
|
msi-controller:
|
||||||
description:
|
description:
|
||||||
Only present if the Message Based Interrupt functionality is
|
Only present if the Message Based Interrupt functionality is
|
||||||
@ -193,6 +199,12 @@ patternProperties:
|
|||||||
compatible:
|
compatible:
|
||||||
const: arm,gic-v3-its
|
const: arm,gic-v3-its
|
||||||
|
|
||||||
|
dma-noncoherent:
|
||||||
|
description:
|
||||||
|
Present if the GIC ITS permits programming shareability and
|
||||||
|
cacheability attributes but is connected to a non-coherent
|
||||||
|
downstream interconnect.
|
||||||
|
|
||||||
msi-controller: true
|
msi-controller: true
|
||||||
|
|
||||||
"#msi-cells":
|
"#msi-cells":
|
||||||
|
@ -37,6 +37,7 @@ properties:
|
|||||||
- renesas,intc-ex-r8a77990 # R-Car E3
|
- renesas,intc-ex-r8a77990 # R-Car E3
|
||||||
- renesas,intc-ex-r8a77995 # R-Car D3
|
- renesas,intc-ex-r8a77995 # R-Car D3
|
||||||
- renesas,intc-ex-r8a779a0 # R-Car V3U
|
- renesas,intc-ex-r8a779a0 # R-Car V3U
|
||||||
|
- renesas,intc-ex-r8a779f0 # R-Car S4-8
|
||||||
- renesas,intc-ex-r8a779g0 # R-Car V4H
|
- renesas,intc-ex-r8a779g0 # R-Car V4H
|
||||||
- const: renesas,irqc
|
- const: renesas,irqc
|
||||||
|
|
||||||
|
@ -19,20 +19,19 @@ description: |
|
|||||||
- NMI edge select (NMI is not treated as NMI exception and supports fall edge and
|
- NMI edge select (NMI is not treated as NMI exception and supports fall edge and
|
||||||
stand-up edge detection interrupts)
|
stand-up edge detection interrupts)
|
||||||
|
|
||||||
allOf:
|
|
||||||
- $ref: /schemas/interrupt-controller.yaml#
|
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
- enum:
|
- enum:
|
||||||
|
- renesas,r9a07g043u-irqc # RZ/G2UL
|
||||||
- renesas,r9a07g044-irqc # RZ/G2{L,LC}
|
- renesas,r9a07g044-irqc # RZ/G2{L,LC}
|
||||||
- renesas,r9a07g054-irqc # RZ/V2L
|
- renesas,r9a07g054-irqc # RZ/V2L
|
||||||
- const: renesas,rzg2l-irqc
|
- const: renesas,rzg2l-irqc
|
||||||
|
|
||||||
'#interrupt-cells':
|
'#interrupt-cells':
|
||||||
description: The first cell should contain external interrupt number (IRQ0-7) and the
|
description: The first cell should contain a macro RZG2L_{NMI,IRQX} included in the
|
||||||
second cell is used to specify the flag.
|
include/dt-bindings/interrupt-controller/irqc-rzg2l.h and the second
|
||||||
|
cell is used to specify the flag.
|
||||||
const: 2
|
const: 2
|
||||||
|
|
||||||
'#address-cells':
|
'#address-cells':
|
||||||
@ -44,7 +43,96 @@ properties:
|
|||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
interrupts:
|
interrupts:
|
||||||
maxItems: 41
|
minItems: 41
|
||||||
|
items:
|
||||||
|
- description: NMI interrupt
|
||||||
|
- description: IRQ0 interrupt
|
||||||
|
- description: IRQ1 interrupt
|
||||||
|
- description: IRQ2 interrupt
|
||||||
|
- description: IRQ3 interrupt
|
||||||
|
- description: IRQ4 interrupt
|
||||||
|
- description: IRQ5 interrupt
|
||||||
|
- description: IRQ6 interrupt
|
||||||
|
- description: IRQ7 interrupt
|
||||||
|
- description: GPIO interrupt, TINT0
|
||||||
|
- description: GPIO interrupt, TINT1
|
||||||
|
- description: GPIO interrupt, TINT2
|
||||||
|
- description: GPIO interrupt, TINT3
|
||||||
|
- description: GPIO interrupt, TINT4
|
||||||
|
- description: GPIO interrupt, TINT5
|
||||||
|
- description: GPIO interrupt, TINT6
|
||||||
|
- description: GPIO interrupt, TINT7
|
||||||
|
- description: GPIO interrupt, TINT8
|
||||||
|
- description: GPIO interrupt, TINT9
|
||||||
|
- description: GPIO interrupt, TINT10
|
||||||
|
- description: GPIO interrupt, TINT11
|
||||||
|
- description: GPIO interrupt, TINT12
|
||||||
|
- description: GPIO interrupt, TINT13
|
||||||
|
- description: GPIO interrupt, TINT14
|
||||||
|
- description: GPIO interrupt, TINT15
|
||||||
|
- description: GPIO interrupt, TINT16
|
||||||
|
- description: GPIO interrupt, TINT17
|
||||||
|
- description: GPIO interrupt, TINT18
|
||||||
|
- description: GPIO interrupt, TINT19
|
||||||
|
- description: GPIO interrupt, TINT20
|
||||||
|
- description: GPIO interrupt, TINT21
|
||||||
|
- description: GPIO interrupt, TINT22
|
||||||
|
- description: GPIO interrupt, TINT23
|
||||||
|
- description: GPIO interrupt, TINT24
|
||||||
|
- description: GPIO interrupt, TINT25
|
||||||
|
- description: GPIO interrupt, TINT26
|
||||||
|
- description: GPIO interrupt, TINT27
|
||||||
|
- description: GPIO interrupt, TINT28
|
||||||
|
- description: GPIO interrupt, TINT29
|
||||||
|
- description: GPIO interrupt, TINT30
|
||||||
|
- description: GPIO interrupt, TINT31
|
||||||
|
- description: Bus error interrupt
|
||||||
|
|
||||||
|
interrupt-names:
|
||||||
|
minItems: 41
|
||||||
|
items:
|
||||||
|
- const: nmi
|
||||||
|
- const: irq0
|
||||||
|
- const: irq1
|
||||||
|
- const: irq2
|
||||||
|
- const: irq3
|
||||||
|
- const: irq4
|
||||||
|
- const: irq5
|
||||||
|
- const: irq6
|
||||||
|
- const: irq7
|
||||||
|
- const: tint0
|
||||||
|
- const: tint1
|
||||||
|
- const: tint2
|
||||||
|
- const: tint3
|
||||||
|
- const: tint4
|
||||||
|
- const: tint5
|
||||||
|
- const: tint6
|
||||||
|
- const: tint7
|
||||||
|
- const: tint8
|
||||||
|
- const: tint9
|
||||||
|
- const: tint10
|
||||||
|
- const: tint11
|
||||||
|
- const: tint12
|
||||||
|
- const: tint13
|
||||||
|
- const: tint14
|
||||||
|
- const: tint15
|
||||||
|
- const: tint16
|
||||||
|
- const: tint17
|
||||||
|
- const: tint18
|
||||||
|
- const: tint19
|
||||||
|
- const: tint20
|
||||||
|
- const: tint21
|
||||||
|
- const: tint22
|
||||||
|
- const: tint23
|
||||||
|
- const: tint24
|
||||||
|
- const: tint25
|
||||||
|
- const: tint26
|
||||||
|
- const: tint27
|
||||||
|
- const: tint28
|
||||||
|
- const: tint29
|
||||||
|
- const: tint30
|
||||||
|
- const: tint31
|
||||||
|
- const: bus-err
|
||||||
|
|
||||||
clocks:
|
clocks:
|
||||||
maxItems: 2
|
maxItems: 2
|
||||||
@ -72,6 +160,23 @@ required:
|
|||||||
- power-domains
|
- power-domains
|
||||||
- resets
|
- resets
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/interrupt-controller.yaml#
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
const: renesas,r9a07g043u-irqc
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
minItems: 42
|
||||||
|
interrupt-names:
|
||||||
|
minItems: 42
|
||||||
|
required:
|
||||||
|
- interrupt-names
|
||||||
|
|
||||||
unevaluatedProperties: false
|
unevaluatedProperties: false
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
@ -126,6 +231,17 @@ examples:
|
|||||||
<GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 474 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 474 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 475 IRQ_TYPE_LEVEL_HIGH>;
|
<GIC_SPI 475 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-names = "nmi",
|
||||||
|
"irq0", "irq1", "irq2", "irq3",
|
||||||
|
"irq4", "irq5", "irq6", "irq7",
|
||||||
|
"tint0", "tint1", "tint2", "tint3",
|
||||||
|
"tint4", "tint5", "tint6", "tint7",
|
||||||
|
"tint8", "tint9", "tint10", "tint11",
|
||||||
|
"tint12", "tint13", "tint14", "tint15",
|
||||||
|
"tint16", "tint17", "tint18", "tint19",
|
||||||
|
"tint20", "tint21", "tint22", "tint23",
|
||||||
|
"tint24", "tint25", "tint26", "tint27",
|
||||||
|
"tint28", "tint29", "tint30", "tint31";
|
||||||
clocks = <&cpg CPG_MOD R9A07G044_IA55_CLK>,
|
clocks = <&cpg CPG_MOD R9A07G044_IA55_CLK>,
|
||||||
<&cpg CPG_MOD R9A07G044_IA55_PCLK>;
|
<&cpg CPG_MOD R9A07G044_IA55_PCLK>;
|
||||||
clock-names = "clk", "pclk";
|
clock-names = "clk", "pclk";
|
||||||
|
@ -270,6 +270,7 @@ allOf:
|
|||||||
contains:
|
contains:
|
||||||
enum:
|
enum:
|
||||||
- qcom,msm8998-smmu-v2
|
- qcom,msm8998-smmu-v2
|
||||||
|
- qcom,sdm630-smmu-v2
|
||||||
then:
|
then:
|
||||||
anyOf:
|
anyOf:
|
||||||
- properties:
|
- properties:
|
||||||
@ -311,7 +312,6 @@ allOf:
|
|||||||
compatible:
|
compatible:
|
||||||
contains:
|
contains:
|
||||||
enum:
|
enum:
|
||||||
- qcom,sdm630-smmu-v2
|
|
||||||
- qcom,sm6375-smmu-v2
|
- qcom,sm6375-smmu-v2
|
||||||
then:
|
then:
|
||||||
anyOf:
|
anyOf:
|
||||||
|
@ -54,6 +54,7 @@ properties:
|
|||||||
|
|
||||||
port:
|
port:
|
||||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
endpoint:
|
endpoint:
|
||||||
|
@ -69,6 +69,7 @@ properties:
|
|||||||
properties:
|
properties:
|
||||||
port@0:
|
port@0:
|
||||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||||
|
unevaluatedProperties: false
|
||||||
description: Input port
|
description: Input port
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
@ -89,6 +90,7 @@ properties:
|
|||||||
|
|
||||||
port@1:
|
port@1:
|
||||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||||
|
unevaluatedProperties: false
|
||||||
description: Output port
|
description: Output port
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
|
@ -59,7 +59,6 @@ allOf:
|
|||||||
compatible:
|
compatible:
|
||||||
contains:
|
contains:
|
||||||
enum:
|
enum:
|
||||||
- fsl,imx8mq-csi
|
|
||||||
- fsl,imx8mm-csi
|
- fsl,imx8mm-csi
|
||||||
then:
|
then:
|
||||||
required:
|
required:
|
||||||
|
@ -95,7 +95,7 @@ properties:
|
|||||||
synchronization is selected.
|
synchronization is selected.
|
||||||
default: 1
|
default: 1
|
||||||
|
|
||||||
field-active-even: true
|
field-even-active: true
|
||||||
|
|
||||||
bus-width: true
|
bus-width: true
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ properties:
|
|||||||
synchronization is selected.
|
synchronization is selected.
|
||||||
default: 1
|
default: 1
|
||||||
|
|
||||||
field-active-even: true
|
field-even-active: true
|
||||||
|
|
||||||
bus-width: true
|
bus-width: true
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@ properties:
|
|||||||
patternProperties:
|
patternProperties:
|
||||||
"^port@[01]$":
|
"^port@[01]$":
|
||||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||||
|
unevaluatedProperties: false
|
||||||
description:
|
description:
|
||||||
Camera A and camera B inputs.
|
Camera A and camera B inputs.
|
||||||
|
|
||||||
|
@ -31,10 +31,6 @@ properties:
|
|||||||
charger:
|
charger:
|
||||||
$ref: /schemas/power/supply/maxim,max77693.yaml
|
$ref: /schemas/power/supply/maxim,max77693.yaml
|
||||||
|
|
||||||
connector:
|
|
||||||
$ref: /schemas/connector/usb-connector.yaml#
|
|
||||||
unevaluatedProperties: false
|
|
||||||
|
|
||||||
led:
|
led:
|
||||||
$ref: /schemas/leds/maxim,max77693.yaml
|
$ref: /schemas/leds/maxim,max77693.yaml
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ properties:
|
|||||||
maxItems: 4
|
maxItems: 4
|
||||||
|
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 3
|
minItems: 2
|
||||||
items:
|
items:
|
||||||
- description: Main peripheral bus clock, PCLK/HCLK - AHB Bus clock
|
- description: Main peripheral bus clock, PCLK/HCLK - AHB Bus clock
|
||||||
- description: SDC MMC clock, MCLK
|
- description: SDC MMC clock, MCLK
|
||||||
|
@ -12,7 +12,6 @@ maintainers:
|
|||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: /schemas/pci/pci-bus.yaml#
|
- $ref: /schemas/pci/pci-bus.yaml#
|
||||||
- $ref: /schemas/interrupt-controller/msi-controller.yaml#
|
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
@ -34,13 +33,6 @@ properties:
|
|||||||
description: >
|
description: >
|
||||||
Base address and length of the PCIe controller I/O register space
|
Base address and length of the PCIe controller I/O register space
|
||||||
|
|
||||||
interrupt-map: true
|
|
||||||
|
|
||||||
interrupt-map-mask: true
|
|
||||||
|
|
||||||
"#interrupt-cells":
|
|
||||||
const: 1
|
|
||||||
|
|
||||||
ranges:
|
ranges:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 2
|
maxItems: 2
|
||||||
@ -54,16 +46,8 @@ properties:
|
|||||||
items:
|
items:
|
||||||
- const: pcie-phy
|
- const: pcie-phy
|
||||||
|
|
||||||
bus-range: true
|
|
||||||
|
|
||||||
dma-coherent: true
|
dma-coherent: true
|
||||||
|
|
||||||
"#address-cells": true
|
|
||||||
|
|
||||||
"#size-cells": true
|
|
||||||
|
|
||||||
device_type: true
|
|
||||||
|
|
||||||
brcm,pcie-ob:
|
brcm,pcie-ob:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: >
|
description: >
|
||||||
@ -78,21 +62,25 @@ properties:
|
|||||||
|
|
||||||
msi:
|
msi:
|
||||||
type: object
|
type: object
|
||||||
|
$ref: /schemas/interrupt-controller/msi-controller.yaml#
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
- const: brcm,iproc-msi
|
- const: brcm,iproc-msi
|
||||||
|
|
||||||
msi-parent: true
|
interrupts:
|
||||||
|
maxItems: 4
|
||||||
msi-controller: true
|
|
||||||
|
|
||||||
brcm,pcie-msi-inten:
|
brcm,pcie-msi-inten:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: >
|
description:
|
||||||
Needs to be present for some older iProc platforms that require the
|
Needs to be present for some older iProc platforms that require the
|
||||||
interrupt enable registers to be set explicitly to enable MSI
|
interrupt enable registers to be set explicitly to enable MSI
|
||||||
|
|
||||||
|
msi-parent: true
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
brcm,pcie-ob-axi-offset: ["brcm,pcie-ob"]
|
brcm,pcie-ob-axi-offset: ["brcm,pcie-ob"]
|
||||||
brcm,pcie-msi-inten: [msi-controller]
|
brcm,pcie-msi-inten: [msi-controller]
|
||||||
@ -119,10 +107,12 @@ examples:
|
|||||||
- |
|
- |
|
||||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
bus {
|
gic: interrupt-controller {
|
||||||
#address-cells = <1>;
|
interrupt-controller;
|
||||||
#size-cells = <1>;
|
#interrupt-cells = <3>;
|
||||||
pcie0: pcie@18012000 {
|
};
|
||||||
|
|
||||||
|
pcie@18012000 {
|
||||||
compatible = "brcm,iproc-pcie";
|
compatible = "brcm,iproc-pcie";
|
||||||
reg = <0x18012000 0x1000>;
|
reg = <0x18012000 0x1000>;
|
||||||
|
|
||||||
@ -159,8 +149,8 @@ examples:
|
|||||||
<GIC_SPI 99 IRQ_TYPE_NONE>;
|
<GIC_SPI 99 IRQ_TYPE_NONE>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
- |
|
||||||
pcie1: pcie@18013000 {
|
pcie@18013000 {
|
||||||
compatible = "brcm,iproc-pcie";
|
compatible = "brcm,iproc-pcie";
|
||||||
reg = <0x18013000 0x1000>;
|
reg = <0x18013000 0x1000>;
|
||||||
|
|
||||||
@ -181,4 +171,3 @@ examples:
|
|||||||
phys = <&phy 1 6>;
|
phys = <&phy 1 6>;
|
||||||
phy-names = "pcie-phy";
|
phy-names = "pcie-phy";
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
@ -70,7 +70,7 @@ examples:
|
|||||||
|
|
||||||
phy@84000 {
|
phy@84000 {
|
||||||
compatible = "qcom,ipq6018-qmp-pcie-phy";
|
compatible = "qcom,ipq6018-qmp-pcie-phy";
|
||||||
reg = <0x0 0x00084000 0x0 0x1000>;
|
reg = <0x00084000 0x1000>;
|
||||||
|
|
||||||
clocks = <&gcc GCC_PCIE0_AUX_CLK>,
|
clocks = <&gcc GCC_PCIE0_AUX_CLK>,
|
||||||
<&gcc GCC_PCIE0_AHB_CLK>,
|
<&gcc GCC_PCIE0_AHB_CLK>,
|
||||||
|
@ -91,6 +91,7 @@ properties:
|
|||||||
|
|
||||||
interrupt-controller:
|
interrupt-controller:
|
||||||
type: object
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
description: Describes the CPU's local interrupt controller
|
description: Describes the CPU's local interrupt controller
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
|
@ -82,7 +82,7 @@ properties:
|
|||||||
description:
|
description:
|
||||||
Current at which the headset micbias sense clamp will engage, 0 to
|
Current at which the headset micbias sense clamp will engage, 0 to
|
||||||
disable.
|
disable.
|
||||||
enum: [ 0, 14, 23, 41, 50, 60, 68, 86, 95 ]
|
enum: [ 0, 14, 24, 43, 52, 61, 71, 90, 99 ]
|
||||||
default: 0
|
default: 0
|
||||||
|
|
||||||
cirrus,bias-ramp-ms:
|
cirrus,bias-ramp-ms:
|
||||||
|
@ -56,6 +56,9 @@ properties:
|
|||||||
- const: clkext3
|
- const: clkext3
|
||||||
minItems: 2
|
minItems: 2
|
||||||
|
|
||||||
|
"#sound-dai-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
|
@ -26,6 +26,7 @@ properties:
|
|||||||
- const: rockchip,rk3568-spdif
|
- const: rockchip,rk3568-spdif
|
||||||
- items:
|
- items:
|
||||||
- enum:
|
- enum:
|
||||||
|
- rockchip,rk3128-spdif
|
||||||
- rockchip,rk3188-spdif
|
- rockchip,rk3188-spdif
|
||||||
- rockchip,rk3288-spdif
|
- rockchip,rk3288-spdif
|
||||||
- rockchip,rk3308-spdif
|
- rockchip,rk3308-spdif
|
||||||
|
@ -232,7 +232,7 @@ properties:
|
|||||||
# MEMSIC magnetometer
|
# MEMSIC magnetometer
|
||||||
- memsic,mmc35240
|
- memsic,mmc35240
|
||||||
# MEMSIC 3-axis accelerometer
|
# MEMSIC 3-axis accelerometer
|
||||||
- memsic,mx4005
|
- memsic,mxc4005
|
||||||
# MEMSIC 2-axis 8-bit digital accelerometer
|
# MEMSIC 2-axis 8-bit digital accelerometer
|
||||||
- memsic,mxc6225
|
- memsic,mxc6225
|
||||||
# MEMSIC 2-axis 8-bit digital accelerometer
|
# MEMSIC 2-axis 8-bit digital accelerometer
|
||||||
|
@ -58,12 +58,14 @@ Here are the main features of EROFS:
|
|||||||
|
|
||||||
- Support extended attributes as an option;
|
- Support extended attributes as an option;
|
||||||
|
|
||||||
|
- Support a bloom filter that speeds up negative extended attribute lookups;
|
||||||
|
|
||||||
- Support POSIX.1e ACLs by using extended attributes;
|
- Support POSIX.1e ACLs by using extended attributes;
|
||||||
|
|
||||||
- Support transparent data compression as an option:
|
- Support transparent data compression as an option:
|
||||||
LZ4 and MicroLZMA algorithms can be used on a per-file basis; In addition,
|
LZ4, MicroLZMA and DEFLATE algorithms can be used on a per-file basis; In
|
||||||
inplace decompression is also supported to avoid bounce compressed buffers
|
addition, inplace decompression is also supported to avoid bounce compressed
|
||||||
and page cache thrashing.
|
buffers and unnecessary page cache thrashing.
|
||||||
|
|
||||||
- Support chunk-based data deduplication and rolling-hash compressed data
|
- Support chunk-based data deduplication and rolling-hash compressed data
|
||||||
deduplication;
|
deduplication;
|
||||||
@ -268,6 +270,38 @@ details.)
|
|||||||
|
|
||||||
By the way, chunk-based files are all uncompressed for now.
|
By the way, chunk-based files are all uncompressed for now.
|
||||||
|
|
||||||
|
Long extended attribute name prefixes
|
||||||
|
-------------------------------------
|
||||||
|
There are use cases where extended attributes with different values can have
|
||||||
|
only a few common prefixes (such as overlayfs xattrs). The predefined prefixes
|
||||||
|
work inefficiently in both image size and runtime performance in such cases.
|
||||||
|
|
||||||
|
The long xattr name prefixes feature is introduced to address this issue. The
|
||||||
|
overall idea is that, apart from the existing predefined prefixes, the xattr
|
||||||
|
entry could also refer to user-specified long xattr name prefixes, e.g.
|
||||||
|
"trusted.overlay.".
|
||||||
|
|
||||||
|
When referring to a long xattr name prefix, the highest bit (bit 7) of
|
||||||
|
erofs_xattr_entry.e_name_index is set, while the lower bits (bit 0-6) as a whole
|
||||||
|
represent the index of the referred long name prefix among all long name
|
||||||
|
prefixes. Therefore, only the trailing part of the name apart from the long
|
||||||
|
xattr name prefix is stored in erofs_xattr_entry.e_name, which could be empty if
|
||||||
|
the full xattr name matches exactly as its long xattr name prefix.
|
||||||
|
|
||||||
|
All long xattr prefixes are stored one by one in the packed inode as long as
|
||||||
|
the packed inode is valid, or in the meta inode otherwise. The
|
||||||
|
xattr_prefix_count (of the on-disk superblock) indicates the total number of
|
||||||
|
long xattr name prefixes, while (xattr_prefix_start * 4) indicates the start
|
||||||
|
offset of long name prefixes in the packed/meta inode. Note that, long extended
|
||||||
|
attribute name prefixes are disabled if xattr_prefix_count is 0.
|
||||||
|
|
||||||
|
Each long name prefix is stored in the format: ALIGN({__le16 len, data}, 4),
|
||||||
|
where len represents the total size of the data part. The data part is actually
|
||||||
|
represented by 'struct erofs_xattr_long_prefix', where base_index represents the
|
||||||
|
index of the predefined xattr name prefix, e.g. EROFS_XATTR_INDEX_TRUSTED for
|
||||||
|
"trusted.overlay." long name prefix, while the infix string keeps the string
|
||||||
|
after stripping the short prefix, e.g. "overlay." for the example above.
|
||||||
|
|
||||||
Data compression
|
Data compression
|
||||||
----------------
|
----------------
|
||||||
EROFS implements fixed-sized output compression which generates fixed-sized
|
EROFS implements fixed-sized output compression which generates fixed-sized
|
||||||
|
@ -339,6 +339,18 @@ The specified lower directories will be stacked beginning from the
|
|||||||
rightmost one and going left. In the above example lower1 will be the
|
rightmost one and going left. In the above example lower1 will be the
|
||||||
top, lower2 the middle and lower3 the bottom layer.
|
top, lower2 the middle and lower3 the bottom layer.
|
||||||
|
|
||||||
|
Note: directory names containing colons can be provided as lower layer by
|
||||||
|
escaping the colons with a single backslash. For example:
|
||||||
|
|
||||||
|
mount -t overlay overlay -olowerdir=/a\:lower\:\:dir /merged
|
||||||
|
|
||||||
|
Since kernel version v6.5, directory names containing colons can also
|
||||||
|
be provided as lower layer using the fsconfig syscall from new mount api:
|
||||||
|
|
||||||
|
fsconfig(fs_fd, FSCONFIG_SET_STRING, "lowerdir", "/a:lower::dir", 0);
|
||||||
|
|
||||||
|
In the latter case, colons in lower layer directory names will be escaped
|
||||||
|
as an octal characters (\072) when displayed in /proc/self/mountinfo.
|
||||||
|
|
||||||
Metadata only copy up
|
Metadata only copy up
|
||||||
---------------------
|
---------------------
|
||||||
|
@ -323,7 +323,7 @@ operations:
|
|||||||
- dev-name
|
- dev-name
|
||||||
- sb-index
|
- sb-index
|
||||||
reply: &sb-get-reply
|
reply: &sb-get-reply
|
||||||
value: 11
|
value: 13
|
||||||
attributes: *sb-id-attrs
|
attributes: *sb-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
@ -350,7 +350,7 @@ operations:
|
|||||||
- sb-index
|
- sb-index
|
||||||
- sb-pool-index
|
- sb-pool-index
|
||||||
reply: &sb-pool-get-reply
|
reply: &sb-pool-get-reply
|
||||||
value: 15
|
value: 17
|
||||||
attributes: *sb-pool-id-attrs
|
attributes: *sb-pool-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
@ -378,7 +378,7 @@ operations:
|
|||||||
- sb-index
|
- sb-index
|
||||||
- sb-pool-index
|
- sb-pool-index
|
||||||
reply: &sb-port-pool-get-reply
|
reply: &sb-port-pool-get-reply
|
||||||
value: 19
|
value: 21
|
||||||
attributes: *sb-port-pool-id-attrs
|
attributes: *sb-port-pool-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
@ -407,7 +407,7 @@ operations:
|
|||||||
- sb-pool-type
|
- sb-pool-type
|
||||||
- sb-tc-index
|
- sb-tc-index
|
||||||
reply: &sb-tc-pool-bind-get-reply
|
reply: &sb-tc-pool-bind-get-reply
|
||||||
value: 23
|
value: 25
|
||||||
attributes: *sb-tc-pool-bind-id-attrs
|
attributes: *sb-tc-pool-bind-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
@ -538,7 +538,7 @@ operations:
|
|||||||
- dev-name
|
- dev-name
|
||||||
- trap-name
|
- trap-name
|
||||||
reply: &trap-get-reply
|
reply: &trap-get-reply
|
||||||
value: 61
|
value: 63
|
||||||
attributes: *trap-id-attrs
|
attributes: *trap-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
@ -564,7 +564,7 @@ operations:
|
|||||||
- dev-name
|
- dev-name
|
||||||
- trap-group-name
|
- trap-group-name
|
||||||
reply: &trap-group-get-reply
|
reply: &trap-group-get-reply
|
||||||
value: 65
|
value: 67
|
||||||
attributes: *trap-group-id-attrs
|
attributes: *trap-group-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
@ -590,7 +590,7 @@ operations:
|
|||||||
- dev-name
|
- dev-name
|
||||||
- trap-policer-id
|
- trap-policer-id
|
||||||
reply: &trap-policer-get-reply
|
reply: &trap-policer-get-reply
|
||||||
value: 69
|
value: 71
|
||||||
attributes: *trap-policer-id-attrs
|
attributes: *trap-policer-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
@ -617,7 +617,7 @@ operations:
|
|||||||
- port-index
|
- port-index
|
||||||
- rate-node-name
|
- rate-node-name
|
||||||
reply: &rate-get-reply
|
reply: &rate-get-reply
|
||||||
value: 74
|
value: 76
|
||||||
attributes: *rate-id-attrs
|
attributes: *rate-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
@ -643,7 +643,7 @@ operations:
|
|||||||
- dev-name
|
- dev-name
|
||||||
- linecard-index
|
- linecard-index
|
||||||
reply: &linecard-get-reply
|
reply: &linecard-get-reply
|
||||||
value: 78
|
value: 80
|
||||||
attributes: *linecard-id-attrs
|
attributes: *linecard-id-attrs
|
||||||
dump:
|
dump:
|
||||||
request:
|
request:
|
||||||
|
@ -162,9 +162,11 @@ How are representors identified?
|
|||||||
The representor netdevice should *not* directly refer to a PCIe device (e.g.
|
The representor netdevice should *not* directly refer to a PCIe device (e.g.
|
||||||
through ``net_dev->dev.parent`` / ``SET_NETDEV_DEV()``), either of the
|
through ``net_dev->dev.parent`` / ``SET_NETDEV_DEV()``), either of the
|
||||||
representee or of the switchdev function.
|
representee or of the switchdev function.
|
||||||
Instead, it should implement the ``ndo_get_devlink_port()`` netdevice op, which
|
Instead, the driver should use the ``SET_NETDEV_DEVLINK_PORT`` macro to
|
||||||
the kernel uses to provide the ``phys_switch_id`` and ``phys_port_name`` sysfs
|
assign a devlink port instance to the netdevice before registering the
|
||||||
nodes. (Some legacy drivers implement ``ndo_get_port_parent_id()`` and
|
netdevice; the kernel uses the devlink port to provide the ``phys_switch_id``
|
||||||
|
and ``phys_port_name`` sysfs nodes.
|
||||||
|
(Some legacy drivers implement ``ndo_get_port_parent_id()`` and
|
||||||
``ndo_get_phys_port_name()`` directly, but this is deprecated.) See
|
``ndo_get_phys_port_name()`` directly, but this is deprecated.) See
|
||||||
:ref:`Documentation/networking/devlink/devlink-port.rst <devlink_port>` for the
|
:ref:`Documentation/networking/devlink/devlink-port.rst <devlink_port>` for the
|
||||||
details of this API.
|
details of this API.
|
||||||
|
@ -25,15 +25,15 @@ Contact
|
|||||||
The Linux kernel hardware security team is separate from the regular Linux
|
The Linux kernel hardware security team is separate from the regular Linux
|
||||||
kernel security team.
|
kernel security team.
|
||||||
|
|
||||||
The team only handles the coordination of embargoed hardware security
|
The team only handles developing fixes for embargoed hardware security
|
||||||
issues. Reports of pure software security bugs in the Linux kernel are not
|
issues. Reports of pure software security bugs in the Linux kernel are not
|
||||||
handled by this team and the reporter will be guided to contact the regular
|
handled by this team and the reporter will be guided to contact the regular
|
||||||
Linux kernel security team (:ref:`Documentation/admin-guide/
|
Linux kernel security team (:ref:`Documentation/admin-guide/
|
||||||
<securitybugs>`) instead.
|
<securitybugs>`) instead.
|
||||||
|
|
||||||
The team can be contacted by email at <hardware-security@kernel.org>. This
|
The team can be contacted by email at <hardware-security@kernel.org>. This
|
||||||
is a private list of security officers who will help you to coordinate an
|
is a private list of security officers who will help you to coordinate a
|
||||||
issue according to our documented process.
|
fix according to our documented process.
|
||||||
|
|
||||||
The list is encrypted and email to the list can be sent by either PGP or
|
The list is encrypted and email to the list can be sent by either PGP or
|
||||||
S/MIME encrypted and must be signed with the reporter's PGP key or S/MIME
|
S/MIME encrypted and must be signed with the reporter's PGP key or S/MIME
|
||||||
@ -132,7 +132,7 @@ other hardware could be affected.
|
|||||||
|
|
||||||
The hardware security team will provide an incident-specific encrypted
|
The hardware security team will provide an incident-specific encrypted
|
||||||
mailing-list which will be used for initial discussion with the reporter,
|
mailing-list which will be used for initial discussion with the reporter,
|
||||||
further disclosure and coordination.
|
further disclosure, and coordination of fixes.
|
||||||
|
|
||||||
The hardware security team will provide the disclosing party a list of
|
The hardware security team will provide the disclosing party a list of
|
||||||
developers (domain experts) who should be informed initially about the
|
developers (domain experts) who should be informed initially about the
|
||||||
@ -209,13 +209,18 @@ five work days this is taken as silent acknowledgement.
|
|||||||
After acknowledgement or resolution of an objection the expert is disclosed
|
After acknowledgement or resolution of an objection the expert is disclosed
|
||||||
by the incident team and brought into the development process.
|
by the incident team and brought into the development process.
|
||||||
|
|
||||||
|
List participants may not communicate about the issue outside of the
|
||||||
|
private mailing list. List participants may not use any shared resources
|
||||||
|
(e.g. employer build farms, CI systems, etc) when working on patches.
|
||||||
|
|
||||||
|
|
||||||
Coordinated release
|
Coordinated release
|
||||||
"""""""""""""""""""
|
"""""""""""""""""""
|
||||||
|
|
||||||
The involved parties will negotiate the date and time where the embargo
|
The involved parties will negotiate the date and time where the embargo
|
||||||
ends. At that point the prepared mitigations are integrated into the
|
ends. At that point the prepared mitigations are integrated into the
|
||||||
relevant kernel trees and published.
|
relevant kernel trees and published. There is no pre-notification process:
|
||||||
|
fixes are published in public and available to everyone at the same time.
|
||||||
|
|
||||||
While we understand that hardware security issues need coordinated embargo
|
While we understand that hardware security issues need coordinated embargo
|
||||||
time, the embargo time should be constrained to the minimum time which is
|
time, the embargo time should be constrained to the minimum time which is
|
||||||
|
@ -29,7 +29,7 @@ target with the same invocation used for compilation, e.g.::
|
|||||||
|
|
||||||
To read the docs locally in your web browser, run e.g.::
|
To read the docs locally in your web browser, run e.g.::
|
||||||
|
|
||||||
xdg-open rust/doc/kernel/index.html
|
xdg-open Documentation/output/rust/rustdoc/kernel/index.html
|
||||||
|
|
||||||
To learn about how to write the documentation, please see coding-guidelines.rst.
|
To learn about how to write the documentation, please see coding-guidelines.rst.
|
||||||
|
|
||||||
|
@ -36,11 +36,11 @@ EXAMPLE
|
|||||||
In the example below, **rtla timerlat hist** is set to run for *10* minutes,
|
In the example below, **rtla timerlat hist** is set to run for *10* minutes,
|
||||||
in the cpus *0-4*, *skipping zero* only lines. Moreover, **rtla timerlat
|
in the cpus *0-4*, *skipping zero* only lines. Moreover, **rtla timerlat
|
||||||
hist** will change the priority of the *timerlat* threads to run under
|
hist** will change the priority of the *timerlat* threads to run under
|
||||||
*SCHED_DEADLINE* priority, with a *10us* runtime every *1ms* period. The
|
*SCHED_DEADLINE* priority, with a *100us* runtime every *1ms* period. The
|
||||||
*1ms* period is also passed to the *timerlat* tracer. Auto-analysis is disabled
|
*1ms* period is also passed to the *timerlat* tracer. Auto-analysis is disabled
|
||||||
to reduce overhead ::
|
to reduce overhead ::
|
||||||
|
|
||||||
[root@alien ~]# timerlat hist -d 10m -c 0-4 -P d:100us:1ms -p 1ms --no-aa
|
[root@alien ~]# timerlat hist -d 10m -c 0-4 -P d:100us:1ms -p 1000 --no-aa
|
||||||
# RTLA timerlat histogram
|
# RTLA timerlat histogram
|
||||||
# Time unit is microseconds (us)
|
# Time unit is microseconds (us)
|
||||||
# Duration: 0 00:10:00
|
# Duration: 0 00:10:00
|
||||||
|
@ -91,9 +91,9 @@ The prototype of the entry/exit callback function are as follows:
|
|||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
int entry_callback(struct fprobe *fp, unsigned long entry_ip, struct pt_regs *regs, void *entry_data);
|
int entry_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct pt_regs *regs, void *entry_data);
|
||||||
|
|
||||||
void exit_callback(struct fprobe *fp, unsigned long entry_ip, struct pt_regs *regs, void *entry_data);
|
void exit_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct pt_regs *regs, void *entry_data);
|
||||||
|
|
||||||
Note that the @entry_ip is saved at function entry and passed to exit handler.
|
Note that the @entry_ip is saved at function entry and passed to exit handler.
|
||||||
If the entry callback function returns !0, the corresponding exit callback will be cancelled.
|
If the entry callback function returns !0, the corresponding exit callback will be cancelled.
|
||||||
@ -108,6 +108,10 @@ If the entry callback function returns !0, the corresponding exit callback will
|
|||||||
Note that this may not be the actual entry address of the function but
|
Note that this may not be the actual entry address of the function but
|
||||||
the address where the ftrace is instrumented.
|
the address where the ftrace is instrumented.
|
||||||
|
|
||||||
|
@ret_ip
|
||||||
|
This is the return address that the traced function will return to,
|
||||||
|
somewhere in the caller. This can be used at both entry and exit.
|
||||||
|
|
||||||
@regs
|
@regs
|
||||||
This is the `pt_regs` data structure at the entry and exit. Note that
|
This is the `pt_regs` data structure at the entry and exit. Note that
|
||||||
the instruction pointer of @regs may be different from the @entry_ip
|
the instruction pointer of @regs may be different from the @entry_ip
|
||||||
|
@ -202,7 +202,7 @@ workqueue将自动创建与属性相匹配的后备工作者池。调节并发
|
|||||||
同的排序属性。
|
同的排序属性。
|
||||||
|
|
||||||
在目前的实现中,上述配置只保证了特定NUMA节点内的ST行为。相反,
|
在目前的实现中,上述配置只保证了特定NUMA节点内的ST行为。相反,
|
||||||
``alloc_ordered_queue()`` 应该被用来实现全系统的ST行为。
|
``alloc_ordered_workqueue()`` 应该被用来实现全系统的ST行为。
|
||||||
|
|
||||||
|
|
||||||
执行场景示例
|
执行场景示例
|
||||||
|
63
MAINTAINERS
63
MAINTAINERS
@ -378,8 +378,9 @@ F: drivers/acpi/viot.c
|
|||||||
F: include/linux/acpi_viot.h
|
F: include/linux/acpi_viot.h
|
||||||
|
|
||||||
ACPI WMI DRIVER
|
ACPI WMI DRIVER
|
||||||
|
M: Armin Wolf <W_Armin@gmx.de>
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
S: Orphan
|
S: Maintained
|
||||||
F: Documentation/driver-api/wmi.rst
|
F: Documentation/driver-api/wmi.rst
|
||||||
F: Documentation/wmi/
|
F: Documentation/wmi/
|
||||||
F: drivers/platform/x86/wmi.c
|
F: drivers/platform/x86/wmi.c
|
||||||
@ -470,7 +471,6 @@ F: drivers/hwmon/adm1029.c
|
|||||||
ADM8211 WIRELESS DRIVER
|
ADM8211 WIRELESS DRIVER
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Orphan
|
S: Orphan
|
||||||
W: https://wireless.wiki.kernel.org/
|
|
||||||
F: drivers/net/wireless/admtek/adm8211.*
|
F: drivers/net/wireless/admtek/adm8211.*
|
||||||
|
|
||||||
ADP1653 FLASH CONTROLLER DRIVER
|
ADP1653 FLASH CONTROLLER DRIVER
|
||||||
@ -1585,6 +1585,17 @@ F: arch/arm/include/asm/arch_timer.h
|
|||||||
F: arch/arm64/include/asm/arch_timer.h
|
F: arch/arm64/include/asm/arch_timer.h
|
||||||
F: drivers/clocksource/arm_arch_timer.c
|
F: drivers/clocksource/arm_arch_timer.c
|
||||||
|
|
||||||
|
ARM GENERIC INTERRUPT CONTROLLER DRIVERS
|
||||||
|
M: Marc Zyngier <maz@kernel.org>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/bindings/interrupt-controller/arm,gic*
|
||||||
|
F: arch/arm/include/asm/arch_gicv3.h
|
||||||
|
F: arch/arm64/include/asm/arch_gicv3.h
|
||||||
|
F: drivers/irqchip/irq-gic*.[ch]
|
||||||
|
F: include/linux/irqchip/arm-gic*.h
|
||||||
|
F: include/linux/irqchip/arm-vgic-info.h
|
||||||
|
|
||||||
ARM HDLCD DRM DRIVER
|
ARM HDLCD DRM DRIVER
|
||||||
M: Liviu Dudau <liviu.dudau@arm.com>
|
M: Liviu Dudau <liviu.dudau@arm.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
@ -2211,21 +2222,28 @@ F: arch/arm/boot/dts/ti/omap/omap3-igep*
|
|||||||
ARM/INTEL IXP4XX ARM ARCHITECTURE
|
ARM/INTEL IXP4XX ARM ARCHITECTURE
|
||||||
M: Linus Walleij <linusw@kernel.org>
|
M: Linus Walleij <linusw@kernel.org>
|
||||||
M: Imre Kaloz <kaloz@openwrt.org>
|
M: Imre Kaloz <kaloz@openwrt.org>
|
||||||
M: Krzysztof Halasa <khalasa@piap.pl>
|
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
|
F: Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
|
||||||
F: Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt
|
F: Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt
|
||||||
F: Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml
|
F: Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml
|
||||||
F: Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion*
|
F: Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion*
|
||||||
|
F: Documentation/devicetree/bindings/rng/intel,ixp46x-rng.yaml
|
||||||
F: Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml
|
F: Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml
|
||||||
F: arch/arm/boot/dts/intel/ixp/
|
F: arch/arm/boot/dts/intel/ixp/
|
||||||
F: arch/arm/mach-ixp4xx/
|
F: arch/arm/mach-ixp4xx/
|
||||||
F: drivers/bus/intel-ixp4xx-eb.c
|
F: drivers/bus/intel-ixp4xx-eb.c
|
||||||
|
F: drivers/char/hw_random/ixp4xx-rng.c
|
||||||
F: drivers/clocksource/timer-ixp4xx.c
|
F: drivers/clocksource/timer-ixp4xx.c
|
||||||
F: drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
|
F: drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
|
||||||
F: drivers/gpio/gpio-ixp4xx.c
|
F: drivers/gpio/gpio-ixp4xx.c
|
||||||
F: drivers/irqchip/irq-ixp4xx.c
|
F: drivers/irqchip/irq-ixp4xx.c
|
||||||
|
F: drivers/net/ethernet/xscale/ixp4xx_eth.c
|
||||||
|
F: drivers/net/wan/ixp4xx_hss.c
|
||||||
|
F: drivers/soc/ixp4xx/ixp4xx-npe.c
|
||||||
|
F: drivers/soc/ixp4xx/ixp4xx-qmgr.c
|
||||||
|
F: include/linux/soc/ixp4xx/npe.h
|
||||||
|
F: include/linux/soc/ixp4xx/qmgr.h
|
||||||
|
|
||||||
ARM/INTEL KEEMBAY ARCHITECTURE
|
ARM/INTEL KEEMBAY ARCHITECTURE
|
||||||
M: Paul J. Murphy <paul.j.murphy@intel.com>
|
M: Paul J. Murphy <paul.j.murphy@intel.com>
|
||||||
@ -2327,7 +2345,7 @@ F: drivers/rtc/rtc-mt7622.c
|
|||||||
|
|
||||||
ARM/Mediatek SoC support
|
ARM/Mediatek SoC support
|
||||||
M: Matthias Brugger <matthias.bgg@gmail.com>
|
M: Matthias Brugger <matthias.bgg@gmail.com>
|
||||||
R: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
M: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
||||||
@ -5985,8 +6003,8 @@ F: include/linux/devm-helpers.h
|
|||||||
DEVICE-MAPPER (LVM)
|
DEVICE-MAPPER (LVM)
|
||||||
M: Alasdair Kergon <agk@redhat.com>
|
M: Alasdair Kergon <agk@redhat.com>
|
||||||
M: Mike Snitzer <snitzer@kernel.org>
|
M: Mike Snitzer <snitzer@kernel.org>
|
||||||
M: dm-devel@redhat.com
|
M: dm-devel@lists.linux.dev
|
||||||
L: dm-devel@redhat.com
|
L: dm-devel@lists.linux.dev
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://sources.redhat.com/dm
|
W: http://sources.redhat.com/dm
|
||||||
Q: http://patchwork.kernel.org/project/dm-devel/list/
|
Q: http://patchwork.kernel.org/project/dm-devel/list/
|
||||||
@ -8093,7 +8111,7 @@ F: include/linux/arm_ffa.h
|
|||||||
|
|
||||||
FIRMWARE LOADER (request_firmware)
|
FIRMWARE LOADER (request_firmware)
|
||||||
M: Luis Chamberlain <mcgrof@kernel.org>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
M: Russ Weight <russell.h.weight@intel.com>
|
M: Russ Weight <russ.weight@linux.dev>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/firmware_class/
|
F: Documentation/firmware_class/
|
||||||
@ -9531,10 +9549,8 @@ F: Documentation/devicetree/bindings/iio/pressure/honeywell,mprls0025pa.yaml
|
|||||||
F: drivers/iio/pressure/mprls0025pa.c
|
F: drivers/iio/pressure/mprls0025pa.c
|
||||||
|
|
||||||
HOST AP DRIVER
|
HOST AP DRIVER
|
||||||
M: Jouni Malinen <j@w1.fi>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Obsolete
|
S: Obsolete
|
||||||
W: http://w1.fi/hostap-driver.html
|
|
||||||
F: drivers/net/wireless/intersil/hostap/
|
F: drivers/net/wireless/intersil/hostap/
|
||||||
|
|
||||||
HP BIOSCFG DRIVER
|
HP BIOSCFG DRIVER
|
||||||
@ -10622,22 +10638,6 @@ L: linux-crypto@vger.kernel.org
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
|
F: drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
|
||||||
|
|
||||||
INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
|
|
||||||
M: Krzysztof Halasa <khalasa@piap.pl>
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/net/ethernet/xscale/ixp4xx_eth.c
|
|
||||||
F: drivers/net/wan/ixp4xx_hss.c
|
|
||||||
F: drivers/soc/ixp4xx/ixp4xx-npe.c
|
|
||||||
F: drivers/soc/ixp4xx/ixp4xx-qmgr.c
|
|
||||||
F: include/linux/soc/ixp4xx/npe.h
|
|
||||||
F: include/linux/soc/ixp4xx/qmgr.h
|
|
||||||
|
|
||||||
INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
|
|
||||||
M: Deepak Saxena <dsaxena@plexity.net>
|
|
||||||
S: Maintained
|
|
||||||
F: Documentation/devicetree/bindings/rng/intel,ixp46x-rng.yaml
|
|
||||||
F: drivers/char/hw_random/ixp4xx-rng.c
|
|
||||||
|
|
||||||
INTEL KEEM BAY DRM DRIVER
|
INTEL KEEM BAY DRM DRIVER
|
||||||
M: Anitha Chrisanthus <anitha.chrisanthus@intel.com>
|
M: Anitha Chrisanthus <anitha.chrisanthus@intel.com>
|
||||||
M: Edmund Dea <edmund.j.dea@intel.com>
|
M: Edmund Dea <edmund.j.dea@intel.com>
|
||||||
@ -11063,7 +11063,7 @@ F: Documentation/devicetree/bindings/sound/irondevice,*
|
|||||||
F: sound/soc/codecs/sma*
|
F: sound/soc/codecs/sma*
|
||||||
|
|
||||||
IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY)
|
IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY)
|
||||||
M: Marc Zyngier <maz@kernel.org>
|
M: Thomas Gleixner <tglx@linutronix.de>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||||
F: Documentation/core-api/irq/irq-domain.rst
|
F: Documentation/core-api/irq/irq-domain.rst
|
||||||
@ -11082,7 +11082,6 @@ F: lib/group_cpus.c
|
|||||||
|
|
||||||
IRQCHIP DRIVERS
|
IRQCHIP DRIVERS
|
||||||
M: Thomas Gleixner <tglx@linutronix.de>
|
M: Thomas Gleixner <tglx@linutronix.de>
|
||||||
M: Marc Zyngier <maz@kernel.org>
|
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||||
@ -14947,7 +14946,7 @@ K: macsec
|
|||||||
K: \bmdo_
|
K: \bmdo_
|
||||||
|
|
||||||
NETWORKING [MPTCP]
|
NETWORKING [MPTCP]
|
||||||
M: Matthieu Baerts <matthieu.baerts@tessares.net>
|
M: Matthieu Baerts <matttbe@kernel.org>
|
||||||
M: Mat Martineau <martineau@kernel.org>
|
M: Mat Martineau <martineau@kernel.org>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: mptcp@lists.linux.dev
|
L: mptcp@lists.linux.dev
|
||||||
@ -17602,6 +17601,7 @@ M: Kalle Valo <kvalo@kernel.org>
|
|||||||
M: Jeff Johnson <quic_jjohnson@quicinc.com>
|
M: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||||
L: ath12k@lists.infradead.org
|
L: ath12k@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath12k
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
||||||
F: drivers/net/wireless/ath/ath12k/
|
F: drivers/net/wireless/ath/ath12k/
|
||||||
|
|
||||||
@ -18132,8 +18132,6 @@ REALTEK WIRELESS DRIVER (rtlwifi family)
|
|||||||
M: Ping-Ke Shih <pkshih@realtek.com>
|
M: Ping-Ke Shih <pkshih@realtek.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: https://wireless.wiki.kernel.org/
|
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
|
||||||
F: drivers/net/wireless/realtek/rtlwifi/
|
F: drivers/net/wireless/realtek/rtlwifi/
|
||||||
|
|
||||||
REALTEK WIRELESS DRIVER (rtw88)
|
REALTEK WIRELESS DRIVER (rtw88)
|
||||||
@ -18661,7 +18659,6 @@ F: drivers/media/dvb-frontends/rtl2832_sdr*
|
|||||||
RTL8180 WIRELESS DRIVER
|
RTL8180 WIRELESS DRIVER
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Orphan
|
S: Orphan
|
||||||
W: https://wireless.wiki.kernel.org/
|
|
||||||
F: drivers/net/wireless/realtek/rtl818x/rtl8180/
|
F: drivers/net/wireless/realtek/rtl818x/rtl8180/
|
||||||
|
|
||||||
RTL8187 WIRELESS DRIVER
|
RTL8187 WIRELESS DRIVER
|
||||||
@ -18669,14 +18666,12 @@ M: Hin-Tak Leung <hintak.leung@gmail.com>
|
|||||||
M: Larry Finger <Larry.Finger@lwfinger.net>
|
M: Larry Finger <Larry.Finger@lwfinger.net>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: https://wireless.wiki.kernel.org/
|
|
||||||
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
||||||
|
|
||||||
RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
|
RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
|
||||||
M: Jes Sorensen <Jes.Sorensen@gmail.com>
|
M: Jes Sorensen <Jes.Sorensen@gmail.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jes/linux.git rtl8xxxu-devel
|
|
||||||
F: drivers/net/wireless/realtek/rtl8xxxu/
|
F: drivers/net/wireless/realtek/rtl8xxxu/
|
||||||
|
|
||||||
RTRS TRANSPORT DRIVERS
|
RTRS TRANSPORT DRIVERS
|
||||||
@ -20490,6 +20485,7 @@ F: include/dt-bindings/clock/starfive?jh71*.h
|
|||||||
STARFIVE JH71X0 PINCTRL DRIVERS
|
STARFIVE JH71X0 PINCTRL DRIVERS
|
||||||
M: Emil Renner Berthing <kernel@esmil.dk>
|
M: Emil Renner Berthing <kernel@esmil.dk>
|
||||||
M: Jianlong Huang <jianlong.huang@starfivetech.com>
|
M: Jianlong Huang <jianlong.huang@starfivetech.com>
|
||||||
|
M: Hal Feng <hal.feng@starfivetech.com>
|
||||||
L: linux-gpio@vger.kernel.org
|
L: linux-gpio@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/pinctrl/starfive,jh71*.yaml
|
F: Documentation/devicetree/bindings/pinctrl/starfive,jh71*.yaml
|
||||||
@ -21658,7 +21654,6 @@ L: linux-wireless@vger.kernel.org
|
|||||||
S: Orphan
|
S: Orphan
|
||||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/wl12xx
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/wl12xx
|
||||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
|
|
||||||
F: drivers/net/wireless/ti/
|
F: drivers/net/wireless/ti/
|
||||||
|
|
||||||
TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
|
TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
|
||||||
|
4
Makefile
4
Makefile
@ -2,7 +2,7 @@
|
|||||||
VERSION = 6
|
VERSION = 6
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc4
|
EXTRAVERSION = -rc7
|
||||||
NAME = Hurr durr I'ma ninja sloth
|
NAME = Hurr durr I'ma ninja sloth
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@ -1474,7 +1474,7 @@ endif # CONFIG_MODULES
|
|||||||
# Directories & files removed with 'make clean'
|
# Directories & files removed with 'make clean'
|
||||||
CLEAN_FILES += vmlinux.symvers modules-only.symvers \
|
CLEAN_FILES += vmlinux.symvers modules-only.symvers \
|
||||||
modules.builtin modules.builtin.modinfo modules.nsdeps \
|
modules.builtin modules.builtin.modinfo modules.nsdeps \
|
||||||
compile_commands.json .thinlto-cache rust/test rust/doc \
|
compile_commands.json .thinlto-cache rust/test \
|
||||||
rust-project.json .vmlinux.objs .vmlinux.export.c
|
rust-project.json .vmlinux.objs .vmlinux.export.c
|
||||||
|
|
||||||
# Directories & files removed with 'make mrproper'
|
# Directories & files removed with 'make mrproper'
|
||||||
|
@ -1037,6 +1037,19 @@ config ARM64_ERRATUM_2645198
|
|||||||
|
|
||||||
If unsure, say Y.
|
If unsure, say Y.
|
||||||
|
|
||||||
|
config ARM64_ERRATUM_2966298
|
||||||
|
bool "Cortex-A520: 2966298: workaround for speculatively executed unprivileged load"
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
This option adds the workaround for ARM Cortex-A520 erratum 2966298.
|
||||||
|
|
||||||
|
On an affected Cortex-A520 core, a speculatively executed unprivileged
|
||||||
|
load might leak data from a privileged level via a cache side channel.
|
||||||
|
|
||||||
|
Work around this problem by executing a TLBI before returning to EL0.
|
||||||
|
|
||||||
|
If unsure, say Y.
|
||||||
|
|
||||||
config CAVIUM_ERRATUM_22375
|
config CAVIUM_ERRATUM_22375
|
||||||
bool "Cavium erratum 22375, 24313"
|
bool "Cavium erratum 22375, 24313"
|
||||||
default y
|
default y
|
||||||
|
@ -185,7 +185,7 @@
|
|||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
ranges;
|
ranges;
|
||||||
|
|
||||||
anomix_ns_gpr: syscon@44210000 {
|
aonmix_ns_gpr: syscon@44210000 {
|
||||||
compatible = "fsl,imx93-aonmix-ns-syscfg", "syscon";
|
compatible = "fsl,imx93-aonmix-ns-syscfg", "syscon";
|
||||||
reg = <0x44210000 0x1000>;
|
reg = <0x44210000 0x1000>;
|
||||||
};
|
};
|
||||||
@ -319,6 +319,7 @@
|
|||||||
assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>;
|
assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>;
|
||||||
assigned-clock-rates = <40000000>;
|
assigned-clock-rates = <40000000>;
|
||||||
fsl,clk-source = /bits/ 8 <0>;
|
fsl,clk-source = /bits/ 8 <0>;
|
||||||
|
fsl,stop-mode = <&aonmix_ns_gpr 0x14 0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -591,6 +592,7 @@
|
|||||||
assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>;
|
assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>;
|
||||||
assigned-clock-rates = <40000000>;
|
assigned-clock-rates = <40000000>;
|
||||||
fsl,clk-source = /bits/ 8 <0>;
|
fsl,clk-source = /bits/ 8 <0>;
|
||||||
|
fsl,stop-mode = <&wakeupmix_gpr 0x0c 2>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -905,7 +905,7 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
sata_phy: t-phy@1a243000 {
|
sata_phy: t-phy {
|
||||||
compatible = "mediatek,mt7622-tphy",
|
compatible = "mediatek,mt7622-tphy",
|
||||||
"mediatek,generic-tphy-v1";
|
"mediatek,generic-tphy-v1";
|
||||||
#address-cells = <2>;
|
#address-cells = <2>;
|
||||||
|
@ -434,7 +434,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pcie_phy: t-phy@11c00000 {
|
pcie_phy: t-phy {
|
||||||
compatible = "mediatek,mt7986-tphy",
|
compatible = "mediatek,mt7986-tphy",
|
||||||
"mediatek,generic-tphy-v2";
|
"mediatek,generic-tphy-v2";
|
||||||
#address-cells = <2>;
|
#address-cells = <2>;
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
memory@40000000 {
|
memory@40000000 {
|
||||||
device_type = "memory";
|
device_type = "memory";
|
||||||
reg = <0 0x40000000 0 0x80000000>;
|
reg = <0 0x40000000 0x2 0x00000000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
reserved-memory {
|
reserved-memory {
|
||||||
@ -56,13 +56,8 @@
|
|||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
ranges;
|
ranges;
|
||||||
|
|
||||||
/* 2 MiB reserved for ARM Trusted Firmware (BL31) */
|
/*
|
||||||
bl31_secmon_reserved: secmon@54600000 {
|
* 12 MiB reserved for OP-TEE (BL32)
|
||||||
no-map;
|
|
||||||
reg = <0 0x54600000 0x0 0x200000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 12 MiB reserved for OP-TEE (BL32)
|
|
||||||
* +-----------------------+ 0x43e0_0000
|
* +-----------------------+ 0x43e0_0000
|
||||||
* | SHMEM 2MiB |
|
* | SHMEM 2MiB |
|
||||||
* +-----------------------+ 0x43c0_0000
|
* +-----------------------+ 0x43c0_0000
|
||||||
@ -75,6 +70,34 @@
|
|||||||
no-map;
|
no-map;
|
||||||
reg = <0 0x43200000 0 0x00c00000>;
|
reg = <0 0x43200000 0 0x00c00000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
scp_mem: memory@50000000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0 0x50000000 0 0x2900000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
vpu_mem: memory@53000000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0 0x53000000 0 0x1400000>; /* 20 MB */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 2 MiB reserved for ARM Trusted Firmware (BL31) */
|
||||||
|
bl31_secmon_mem: memory@54600000 {
|
||||||
|
no-map;
|
||||||
|
reg = <0 0x54600000 0x0 0x200000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
snd_dma_mem: memory@60000000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0 0x60000000 0 0x1100000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
apu_mem: memory@62000000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0 0x62000000 0 0x1400000>; /* 20 MB */
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -313,6 +313,7 @@
|
|||||||
interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH 0>;
|
interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||||
cpus = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>,
|
cpus = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>,
|
||||||
<&cpu4>, <&cpu5>, <&cpu6>, <&cpu7>;
|
<&cpu4>, <&cpu5>, <&cpu6>, <&cpu7>;
|
||||||
|
status = "fail";
|
||||||
};
|
};
|
||||||
|
|
||||||
dmic_codec: dmic-codec {
|
dmic_codec: dmic-codec {
|
||||||
|
@ -3958,7 +3958,7 @@
|
|||||||
|
|
||||||
pdc: interrupt-controller@b220000 {
|
pdc: interrupt-controller@b220000 {
|
||||||
compatible = "qcom,sm8150-pdc", "qcom,pdc";
|
compatible = "qcom,sm8150-pdc", "qcom,pdc";
|
||||||
reg = <0 0x0b220000 0 0x400>;
|
reg = <0 0x0b220000 0 0x30000>;
|
||||||
qcom,pdc-ranges = <0 480 94>, <94 609 31>,
|
qcom,pdc-ranges = <0 480 94>, <94 609 31>,
|
||||||
<125 63 1>;
|
<125 63 1>;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#ifndef _ASM_ACPI_H
|
#ifndef _ASM_ACPI_H
|
||||||
#define _ASM_ACPI_H
|
#define _ASM_ACPI_H
|
||||||
|
|
||||||
|
#include <linux/cpuidle.h>
|
||||||
#include <linux/efi.h>
|
#include <linux/efi.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/psci.h>
|
#include <linux/psci.h>
|
||||||
@ -44,6 +45,24 @@
|
|||||||
|
|
||||||
#define ACPI_MADT_GICC_TRBE (offsetof(struct acpi_madt_generic_interrupt, \
|
#define ACPI_MADT_GICC_TRBE (offsetof(struct acpi_madt_generic_interrupt, \
|
||||||
trbe_interrupt) + sizeof(u16))
|
trbe_interrupt) + sizeof(u16))
|
||||||
|
/*
|
||||||
|
* Arm® Functional Fixed Hardware Specification Version 1.2.
|
||||||
|
* Table 2: Arm Architecture context loss flags
|
||||||
|
*/
|
||||||
|
#define CPUIDLE_CORE_CTXT BIT(0) /* Core context Lost */
|
||||||
|
|
||||||
|
static inline unsigned int arch_get_idle_state_flags(u32 arch_flags)
|
||||||
|
{
|
||||||
|
if (arch_flags & CPUIDLE_CORE_CTXT)
|
||||||
|
return CPUIDLE_FLAG_TIMER_STOP;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#define arch_get_idle_state_flags arch_get_idle_state_flags
|
||||||
|
|
||||||
|
#define CPUIDLE_TRACE_CTXT BIT(1) /* Trace context loss */
|
||||||
|
#define CPUIDLE_GICR_CTXT BIT(2) /* GICR */
|
||||||
|
#define CPUIDLE_GICD_CTXT BIT(3) /* GICD */
|
||||||
|
|
||||||
/* Basic configuration for ACPI */
|
/* Basic configuration for ACPI */
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
|
@ -79,6 +79,7 @@
|
|||||||
#define ARM_CPU_PART_CORTEX_A78AE 0xD42
|
#define ARM_CPU_PART_CORTEX_A78AE 0xD42
|
||||||
#define ARM_CPU_PART_CORTEX_X1 0xD44
|
#define ARM_CPU_PART_CORTEX_X1 0xD44
|
||||||
#define ARM_CPU_PART_CORTEX_A510 0xD46
|
#define ARM_CPU_PART_CORTEX_A510 0xD46
|
||||||
|
#define ARM_CPU_PART_CORTEX_A520 0xD80
|
||||||
#define ARM_CPU_PART_CORTEX_A710 0xD47
|
#define ARM_CPU_PART_CORTEX_A710 0xD47
|
||||||
#define ARM_CPU_PART_CORTEX_A715 0xD4D
|
#define ARM_CPU_PART_CORTEX_A715 0xD4D
|
||||||
#define ARM_CPU_PART_CORTEX_X2 0xD48
|
#define ARM_CPU_PART_CORTEX_X2 0xD48
|
||||||
@ -148,6 +149,7 @@
|
|||||||
#define MIDR_CORTEX_A78AE MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78AE)
|
#define MIDR_CORTEX_A78AE MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78AE)
|
||||||
#define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1)
|
#define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1)
|
||||||
#define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510)
|
#define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510)
|
||||||
|
#define MIDR_CORTEX_A520 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A520)
|
||||||
#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710)
|
#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710)
|
||||||
#define MIDR_CORTEX_A715 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A715)
|
#define MIDR_CORTEX_A715 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A715)
|
||||||
#define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2)
|
#define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2)
|
||||||
|
@ -344,14 +344,14 @@
|
|||||||
*/
|
*/
|
||||||
#define __HFGRTR_EL2_RES0 (GENMASK(63, 56) | GENMASK(53, 51))
|
#define __HFGRTR_EL2_RES0 (GENMASK(63, 56) | GENMASK(53, 51))
|
||||||
#define __HFGRTR_EL2_MASK GENMASK(49, 0)
|
#define __HFGRTR_EL2_MASK GENMASK(49, 0)
|
||||||
#define __HFGRTR_EL2_nMASK (GENMASK(55, 54) | BIT(50))
|
#define __HFGRTR_EL2_nMASK (GENMASK(58, 57) | GENMASK(55, 54) | BIT(50))
|
||||||
|
|
||||||
#define __HFGWTR_EL2_RES0 (GENMASK(63, 56) | GENMASK(53, 51) | \
|
#define __HFGWTR_EL2_RES0 (GENMASK(63, 56) | GENMASK(53, 51) | \
|
||||||
BIT(46) | BIT(42) | BIT(40) | BIT(28) | \
|
BIT(46) | BIT(42) | BIT(40) | BIT(28) | \
|
||||||
GENMASK(26, 25) | BIT(21) | BIT(18) | \
|
GENMASK(26, 25) | BIT(21) | BIT(18) | \
|
||||||
GENMASK(15, 14) | GENMASK(10, 9) | BIT(2))
|
GENMASK(15, 14) | GENMASK(10, 9) | BIT(2))
|
||||||
#define __HFGWTR_EL2_MASK GENMASK(49, 0)
|
#define __HFGWTR_EL2_MASK GENMASK(49, 0)
|
||||||
#define __HFGWTR_EL2_nMASK (GENMASK(55, 54) | BIT(50))
|
#define __HFGWTR_EL2_nMASK (GENMASK(58, 57) | GENMASK(55, 54) | BIT(50))
|
||||||
|
|
||||||
#define __HFGITR_EL2_RES0 GENMASK(63, 57)
|
#define __HFGITR_EL2_RES0 GENMASK(63, 57)
|
||||||
#define __HFGITR_EL2_MASK GENMASK(54, 0)
|
#define __HFGITR_EL2_MASK GENMASK(54, 0)
|
||||||
|
@ -730,6 +730,14 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
|||||||
.cpu_enable = cpu_clear_bf16_from_user_emulation,
|
.cpu_enable = cpu_clear_bf16_from_user_emulation,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ARM64_ERRATUM_2966298
|
||||||
|
{
|
||||||
|
.desc = "ARM erratum 2966298",
|
||||||
|
.capability = ARM64_WORKAROUND_2966298,
|
||||||
|
/* Cortex-A520 r0p0 - r0p1 */
|
||||||
|
ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A520, 0, 0, 1),
|
||||||
|
},
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_AMPERE_ERRATUM_AC03_CPU_38
|
#ifdef CONFIG_AMPERE_ERRATUM_AC03_CPU_38
|
||||||
{
|
{
|
||||||
.desc = "AmpereOne erratum AC03_CPU_38",
|
.desc = "AmpereOne erratum AC03_CPU_38",
|
||||||
|
@ -428,6 +428,10 @@ alternative_else_nop_endif
|
|||||||
ldp x28, x29, [sp, #16 * 14]
|
ldp x28, x29, [sp, #16 * 14]
|
||||||
|
|
||||||
.if \el == 0
|
.if \el == 0
|
||||||
|
alternative_if ARM64_WORKAROUND_2966298
|
||||||
|
tlbi vale1, xzr
|
||||||
|
dsb nsh
|
||||||
|
alternative_else_nop_endif
|
||||||
alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0
|
alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0
|
||||||
ldr lr, [sp, #S_LR]
|
ldr lr, [sp, #S_LR]
|
||||||
add sp, sp, #PT_REGS_SIZE // restore sp
|
add sp, sp, #PT_REGS_SIZE // restore sp
|
||||||
|
@ -55,11 +55,6 @@ static struct irq_ops arch_timer_irq_ops = {
|
|||||||
.get_input_level = kvm_arch_timer_get_input_level,
|
.get_input_level = kvm_arch_timer_get_input_level,
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool has_cntpoff(void)
|
|
||||||
{
|
|
||||||
return (has_vhe() && cpus_have_final_cap(ARM64_HAS_ECV_CNTPOFF));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int nr_timers(struct kvm_vcpu *vcpu)
|
static int nr_timers(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
if (!vcpu_has_nv(vcpu))
|
if (!vcpu_has_nv(vcpu))
|
||||||
@ -180,7 +175,7 @@ u64 kvm_phys_timer_read(void)
|
|||||||
return timecounter->cc->read(timecounter->cc);
|
return timecounter->cc->read(timecounter->cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_timer_map(struct kvm_vcpu *vcpu, struct timer_map *map)
|
void get_timer_map(struct kvm_vcpu *vcpu, struct timer_map *map)
|
||||||
{
|
{
|
||||||
if (vcpu_has_nv(vcpu)) {
|
if (vcpu_has_nv(vcpu)) {
|
||||||
if (is_hyp_ctxt(vcpu)) {
|
if (is_hyp_ctxt(vcpu)) {
|
||||||
@ -548,7 +543,6 @@ static void timer_save_state(struct arch_timer_context *ctx)
|
|||||||
timer_set_ctl(ctx, read_sysreg_el0(SYS_CNTP_CTL));
|
timer_set_ctl(ctx, read_sysreg_el0(SYS_CNTP_CTL));
|
||||||
cval = read_sysreg_el0(SYS_CNTP_CVAL);
|
cval = read_sysreg_el0(SYS_CNTP_CVAL);
|
||||||
|
|
||||||
if (!has_cntpoff())
|
|
||||||
cval -= timer_get_offset(ctx);
|
cval -= timer_get_offset(ctx);
|
||||||
|
|
||||||
timer_set_cval(ctx, cval);
|
timer_set_cval(ctx, cval);
|
||||||
@ -636,7 +630,6 @@ static void timer_restore_state(struct arch_timer_context *ctx)
|
|||||||
cval = timer_get_cval(ctx);
|
cval = timer_get_cval(ctx);
|
||||||
offset = timer_get_offset(ctx);
|
offset = timer_get_offset(ctx);
|
||||||
set_cntpoff(offset);
|
set_cntpoff(offset);
|
||||||
if (!has_cntpoff())
|
|
||||||
cval += offset;
|
cval += offset;
|
||||||
write_sysreg_el0(cval, SYS_CNTP_CVAL);
|
write_sysreg_el0(cval, SYS_CNTP_CVAL);
|
||||||
isb();
|
isb();
|
||||||
|
@ -977,6 +977,8 @@ enum fg_filter_id {
|
|||||||
|
|
||||||
static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
|
static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
|
||||||
/* HFGRTR_EL2, HFGWTR_EL2 */
|
/* HFGRTR_EL2, HFGWTR_EL2 */
|
||||||
|
SR_FGT(SYS_PIR_EL1, HFGxTR, nPIR_EL1, 0),
|
||||||
|
SR_FGT(SYS_PIRE0_EL1, HFGxTR, nPIRE0_EL1, 0),
|
||||||
SR_FGT(SYS_TPIDR2_EL0, HFGxTR, nTPIDR2_EL0, 0),
|
SR_FGT(SYS_TPIDR2_EL0, HFGxTR, nTPIDR2_EL0, 0),
|
||||||
SR_FGT(SYS_SMPRI_EL1, HFGxTR, nSMPRI_EL1, 0),
|
SR_FGT(SYS_SMPRI_EL1, HFGxTR, nSMPRI_EL1, 0),
|
||||||
SR_FGT(SYS_ACCDATA_EL1, HFGxTR, nACCDATA_EL1, 0),
|
SR_FGT(SYS_ACCDATA_EL1, HFGxTR, nACCDATA_EL1, 0),
|
||||||
|
@ -39,6 +39,26 @@ static void __activate_traps(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
___activate_traps(vcpu);
|
___activate_traps(vcpu);
|
||||||
|
|
||||||
|
if (has_cntpoff()) {
|
||||||
|
struct timer_map map;
|
||||||
|
|
||||||
|
get_timer_map(vcpu, &map);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We're entrering the guest. Reload the correct
|
||||||
|
* values from memory now that TGE is clear.
|
||||||
|
*/
|
||||||
|
if (map.direct_ptimer == vcpu_ptimer(vcpu))
|
||||||
|
val = __vcpu_sys_reg(vcpu, CNTP_CVAL_EL0);
|
||||||
|
if (map.direct_ptimer == vcpu_hptimer(vcpu))
|
||||||
|
val = __vcpu_sys_reg(vcpu, CNTHP_CVAL_EL2);
|
||||||
|
|
||||||
|
if (map.direct_ptimer) {
|
||||||
|
write_sysreg_el0(val, SYS_CNTP_CVAL);
|
||||||
|
isb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val = read_sysreg(cpacr_el1);
|
val = read_sysreg(cpacr_el1);
|
||||||
val |= CPACR_ELx_TTA;
|
val |= CPACR_ELx_TTA;
|
||||||
val &= ~(CPACR_EL1_ZEN_EL0EN | CPACR_EL1_ZEN_EL1EN |
|
val &= ~(CPACR_EL1_ZEN_EL0EN | CPACR_EL1_ZEN_EL1EN |
|
||||||
@ -77,6 +97,30 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
write_sysreg(HCR_HOST_VHE_FLAGS, hcr_el2);
|
write_sysreg(HCR_HOST_VHE_FLAGS, hcr_el2);
|
||||||
|
|
||||||
|
if (has_cntpoff()) {
|
||||||
|
struct timer_map map;
|
||||||
|
u64 val, offset;
|
||||||
|
|
||||||
|
get_timer_map(vcpu, &map);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We're exiting the guest. Save the latest CVAL value
|
||||||
|
* to memory and apply the offset now that TGE is set.
|
||||||
|
*/
|
||||||
|
val = read_sysreg_el0(SYS_CNTP_CVAL);
|
||||||
|
if (map.direct_ptimer == vcpu_ptimer(vcpu))
|
||||||
|
__vcpu_sys_reg(vcpu, CNTP_CVAL_EL0) = val;
|
||||||
|
if (map.direct_ptimer == vcpu_hptimer(vcpu))
|
||||||
|
__vcpu_sys_reg(vcpu, CNTHP_CVAL_EL2) = val;
|
||||||
|
|
||||||
|
offset = read_sysreg_s(SYS_CNTPOFF_EL2);
|
||||||
|
|
||||||
|
if (map.direct_ptimer && offset) {
|
||||||
|
write_sysreg_el0(val + offset, SYS_CNTP_CVAL);
|
||||||
|
isb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ARM errata 1165522 and 1530923 require the actual execution of the
|
* ARM errata 1165522 and 1530923 require the actual execution of the
|
||||||
* above before we can switch to the EL2/EL0 translation regime used by
|
* above before we can switch to the EL2/EL0 translation regime used by
|
||||||
|
@ -39,7 +39,7 @@ void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr)
|
|||||||
{
|
{
|
||||||
struct kvm_pmu_events *pmu = kvm_get_pmu_events();
|
struct kvm_pmu_events *pmu = kvm_get_pmu_events();
|
||||||
|
|
||||||
if (!kvm_arm_support_pmu_v3() || !pmu || !kvm_pmu_switch_needed(attr))
|
if (!kvm_arm_support_pmu_v3() || !kvm_pmu_switch_needed(attr))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!attr->exclude_host)
|
if (!attr->exclude_host)
|
||||||
@ -55,7 +55,7 @@ void kvm_clr_pmu_events(u32 clr)
|
|||||||
{
|
{
|
||||||
struct kvm_pmu_events *pmu = kvm_get_pmu_events();
|
struct kvm_pmu_events *pmu = kvm_get_pmu_events();
|
||||||
|
|
||||||
if (!kvm_arm_support_pmu_v3() || !pmu)
|
if (!kvm_arm_support_pmu_v3())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pmu->events_host &= ~clr;
|
pmu->events_host &= ~clr;
|
||||||
|
@ -2122,8 +2122,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
|||||||
{ SYS_DESC(SYS_PMMIR_EL1), trap_raz_wi },
|
{ SYS_DESC(SYS_PMMIR_EL1), trap_raz_wi },
|
||||||
|
|
||||||
{ SYS_DESC(SYS_MAIR_EL1), access_vm_reg, reset_unknown, MAIR_EL1 },
|
{ SYS_DESC(SYS_MAIR_EL1), access_vm_reg, reset_unknown, MAIR_EL1 },
|
||||||
{ SYS_DESC(SYS_PIRE0_EL1), access_vm_reg, reset_unknown, PIRE0_EL1 },
|
{ SYS_DESC(SYS_PIRE0_EL1), NULL, reset_unknown, PIRE0_EL1 },
|
||||||
{ SYS_DESC(SYS_PIR_EL1), access_vm_reg, reset_unknown, PIR_EL1 },
|
{ SYS_DESC(SYS_PIR_EL1), NULL, reset_unknown, PIR_EL1 },
|
||||||
{ SYS_DESC(SYS_AMAIR_EL1), access_vm_reg, reset_amair_el1, AMAIR_EL1 },
|
{ SYS_DESC(SYS_AMAIR_EL1), access_vm_reg, reset_amair_el1, AMAIR_EL1 },
|
||||||
|
|
||||||
{ SYS_DESC(SYS_LORSA_EL1), trap_loregion },
|
{ SYS_DESC(SYS_LORSA_EL1), trap_loregion },
|
||||||
|
@ -84,6 +84,7 @@ WORKAROUND_2077057
|
|||||||
WORKAROUND_2457168
|
WORKAROUND_2457168
|
||||||
WORKAROUND_2645198
|
WORKAROUND_2645198
|
||||||
WORKAROUND_2658417
|
WORKAROUND_2658417
|
||||||
|
WORKAROUND_2966298
|
||||||
WORKAROUND_AMPERE_AC03_CPU_38
|
WORKAROUND_AMPERE_AC03_CPU_38
|
||||||
WORKAROUND_TRBE_OVERWRITE_FILL_MODE
|
WORKAROUND_TRBE_OVERWRITE_FILL_MODE
|
||||||
WORKAROUND_TSB_FLUSH_FAILURE
|
WORKAROUND_TSB_FLUSH_FAILURE
|
||||||
|
@ -15,9 +15,4 @@ DECLARE_PER_CPU(struct ia64_cpu, cpu_devices);
|
|||||||
|
|
||||||
DECLARE_PER_CPU(int, cpu_state);
|
DECLARE_PER_CPU(int, cpu_state);
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
|
||||||
extern int arch_register_cpu(int num);
|
|
||||||
extern void arch_unregister_cpu(int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _ASM_IA64_CPU_H_ */
|
#endif /* _ASM_IA64_CPU_H_ */
|
||||||
|
@ -59,7 +59,7 @@ void __ref arch_unregister_cpu(int num)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(arch_unregister_cpu);
|
EXPORT_SYMBOL(arch_unregister_cpu);
|
||||||
#else
|
#else
|
||||||
static int __init arch_register_cpu(int num)
|
int __init arch_register_cpu(int num)
|
||||||
{
|
{
|
||||||
return register_cpu(&sysfs_cpus[num].cpu, num);
|
return register_cpu(&sysfs_cpus[num].cpu, num);
|
||||||
}
|
}
|
||||||
|
@ -52,10 +52,9 @@ static inline void __iomem *ioremap_prot(phys_addr_t offset, unsigned long size,
|
|||||||
* @offset: bus address of the memory
|
* @offset: bus address of the memory
|
||||||
* @size: size of the resource to map
|
* @size: size of the resource to map
|
||||||
*/
|
*/
|
||||||
extern pgprot_t pgprot_wc;
|
|
||||||
|
|
||||||
#define ioremap_wc(offset, size) \
|
#define ioremap_wc(offset, size) \
|
||||||
ioremap_prot((offset), (size), pgprot_val(pgprot_wc))
|
ioremap_prot((offset), (size), \
|
||||||
|
pgprot_val(wc_enabled ? PAGE_KERNEL_WUC : PAGE_KERNEL_SUC))
|
||||||
|
|
||||||
#define ioremap_cache(offset, size) \
|
#define ioremap_cache(offset, size) \
|
||||||
ioremap_prot((offset), (size), pgprot_val(PAGE_KERNEL))
|
ioremap_prot((offset), (size), pgprot_val(PAGE_KERNEL))
|
||||||
|
@ -33,4 +33,12 @@
|
|||||||
.cfi_endproc; \
|
.cfi_endproc; \
|
||||||
SYM_END(name, SYM_T_FUNC)
|
SYM_END(name, SYM_T_FUNC)
|
||||||
|
|
||||||
|
#define SYM_CODE_START(name) \
|
||||||
|
SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \
|
||||||
|
.cfi_startproc;
|
||||||
|
|
||||||
|
#define SYM_CODE_END(name) \
|
||||||
|
.cfi_endproc; \
|
||||||
|
SYM_END(name, SYM_T_NONE)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -105,13 +105,15 @@ static inline pgprot_t pgprot_noncached(pgprot_t _prot)
|
|||||||
return __pgprot(prot);
|
return __pgprot(prot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern bool wc_enabled;
|
||||||
|
|
||||||
#define pgprot_writecombine pgprot_writecombine
|
#define pgprot_writecombine pgprot_writecombine
|
||||||
|
|
||||||
static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
|
static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
|
||||||
{
|
{
|
||||||
unsigned long prot = pgprot_val(_prot);
|
unsigned long prot = pgprot_val(_prot);
|
||||||
|
|
||||||
prot = (prot & ~_CACHE_MASK) | _CACHE_WUC;
|
prot = (prot & ~_CACHE_MASK) | (wc_enabled ? _CACHE_WUC : _CACHE_SUC);
|
||||||
|
|
||||||
return __pgprot(prot);
|
return __pgprot(prot);
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
.text
|
.text
|
||||||
.cfi_sections .debug_frame
|
.cfi_sections .debug_frame
|
||||||
.align 5
|
.align 5
|
||||||
SYM_FUNC_START(handle_syscall)
|
SYM_CODE_START(handle_syscall)
|
||||||
csrrd t0, PERCPU_BASE_KS
|
csrrd t0, PERCPU_BASE_KS
|
||||||
la.pcrel t1, kernelsp
|
la.pcrel t1, kernelsp
|
||||||
add.d t1, t1, t0
|
add.d t1, t1, t0
|
||||||
@ -71,7 +71,7 @@ SYM_FUNC_START(handle_syscall)
|
|||||||
bl do_syscall
|
bl do_syscall
|
||||||
|
|
||||||
RESTORE_ALL_AND_RET
|
RESTORE_ALL_AND_RET
|
||||||
SYM_FUNC_END(handle_syscall)
|
SYM_CODE_END(handle_syscall)
|
||||||
_ASM_NOKPROBE(handle_syscall)
|
_ASM_NOKPROBE(handle_syscall)
|
||||||
|
|
||||||
SYM_CODE_START(ret_from_fork)
|
SYM_CODE_START(ret_from_fork)
|
||||||
|
@ -31,7 +31,7 @@ SYM_FUNC_START(__arch_cpu_idle)
|
|||||||
1: jr ra
|
1: jr ra
|
||||||
SYM_FUNC_END(__arch_cpu_idle)
|
SYM_FUNC_END(__arch_cpu_idle)
|
||||||
|
|
||||||
SYM_FUNC_START(handle_vint)
|
SYM_CODE_START(handle_vint)
|
||||||
BACKUP_T0T1
|
BACKUP_T0T1
|
||||||
SAVE_ALL
|
SAVE_ALL
|
||||||
la_abs t1, __arch_cpu_idle
|
la_abs t1, __arch_cpu_idle
|
||||||
@ -46,11 +46,11 @@ SYM_FUNC_START(handle_vint)
|
|||||||
la_abs t0, do_vint
|
la_abs t0, do_vint
|
||||||
jirl ra, t0, 0
|
jirl ra, t0, 0
|
||||||
RESTORE_ALL_AND_RET
|
RESTORE_ALL_AND_RET
|
||||||
SYM_FUNC_END(handle_vint)
|
SYM_CODE_END(handle_vint)
|
||||||
|
|
||||||
SYM_FUNC_START(except_vec_cex)
|
SYM_CODE_START(except_vec_cex)
|
||||||
b cache_parity_error
|
b cache_parity_error
|
||||||
SYM_FUNC_END(except_vec_cex)
|
SYM_CODE_END(except_vec_cex)
|
||||||
|
|
||||||
.macro build_prep_badv
|
.macro build_prep_badv
|
||||||
csrrd t0, LOONGARCH_CSR_BADV
|
csrrd t0, LOONGARCH_CSR_BADV
|
||||||
@ -66,7 +66,7 @@ SYM_FUNC_END(except_vec_cex)
|
|||||||
|
|
||||||
.macro BUILD_HANDLER exception handler prep
|
.macro BUILD_HANDLER exception handler prep
|
||||||
.align 5
|
.align 5
|
||||||
SYM_FUNC_START(handle_\exception)
|
SYM_CODE_START(handle_\exception)
|
||||||
666:
|
666:
|
||||||
BACKUP_T0T1
|
BACKUP_T0T1
|
||||||
SAVE_ALL
|
SAVE_ALL
|
||||||
@ -76,7 +76,7 @@ SYM_FUNC_END(except_vec_cex)
|
|||||||
jirl ra, t0, 0
|
jirl ra, t0, 0
|
||||||
668:
|
668:
|
||||||
RESTORE_ALL_AND_RET
|
RESTORE_ALL_AND_RET
|
||||||
SYM_FUNC_END(handle_\exception)
|
SYM_CODE_END(handle_\exception)
|
||||||
SYM_DATA(unwind_hint_\exception, .word 668b - 666b)
|
SYM_DATA(unwind_hint_\exception, .word 668b - 666b)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ SYM_FUNC_END(except_vec_cex)
|
|||||||
BUILD_HANDLER watch watch none
|
BUILD_HANDLER watch watch none
|
||||||
BUILD_HANDLER reserved reserved none /* others */
|
BUILD_HANDLER reserved reserved none /* others */
|
||||||
|
|
||||||
SYM_FUNC_START(handle_sys)
|
SYM_CODE_START(handle_sys)
|
||||||
la_abs t0, handle_syscall
|
la_abs t0, handle_syscall
|
||||||
jr t0
|
jr t0
|
||||||
SYM_FUNC_END(handle_sys)
|
SYM_CODE_END(handle_sys)
|
||||||
|
@ -161,19 +161,19 @@ static void __init smbios_parse(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_WRITECOMBINE
|
#ifdef CONFIG_ARCH_WRITECOMBINE
|
||||||
pgprot_t pgprot_wc = PAGE_KERNEL_WUC;
|
bool wc_enabled = true;
|
||||||
#else
|
#else
|
||||||
pgprot_t pgprot_wc = PAGE_KERNEL_SUC;
|
bool wc_enabled = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EXPORT_SYMBOL(pgprot_wc);
|
EXPORT_SYMBOL(wc_enabled);
|
||||||
|
|
||||||
static int __init setup_writecombine(char *p)
|
static int __init setup_writecombine(char *p)
|
||||||
{
|
{
|
||||||
if (!strcmp(p, "on"))
|
if (!strcmp(p, "on"))
|
||||||
pgprot_wc = PAGE_KERNEL_WUC;
|
wc_enabled = true;
|
||||||
else if (!strcmp(p, "off"))
|
else if (!strcmp(p, "off"))
|
||||||
pgprot_wc = PAGE_KERNEL_SUC;
|
wc_enabled = false;
|
||||||
else
|
else
|
||||||
pr_warn("Unknown writecombine setting \"%s\".\n", p);
|
pr_warn("Unknown writecombine setting \"%s\".\n", p);
|
||||||
|
|
||||||
|
@ -43,11 +43,11 @@ void copy_user_highpage(struct page *to, struct page *from,
|
|||||||
{
|
{
|
||||||
void *vfrom, *vto;
|
void *vfrom, *vto;
|
||||||
|
|
||||||
vto = kmap_atomic(to);
|
vfrom = kmap_local_page(from);
|
||||||
vfrom = kmap_atomic(from);
|
vto = kmap_local_page(to);
|
||||||
copy_page(vto, vfrom);
|
copy_page(vto, vfrom);
|
||||||
kunmap_atomic(vfrom);
|
kunmap_local(vfrom);
|
||||||
kunmap_atomic(vto);
|
kunmap_local(vto);
|
||||||
/* Make sure this page is cleared on other CPU's too before using it */
|
/* Make sure this page is cleared on other CPU's too before using it */
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
}
|
}
|
||||||
@ -240,6 +240,7 @@ pgd_t swapper_pg_dir[_PTRS_PER_PGD] __section(".bss..swapper_pg_dir");
|
|||||||
pgd_t invalid_pg_dir[_PTRS_PER_PGD] __page_aligned_bss;
|
pgd_t invalid_pg_dir[_PTRS_PER_PGD] __page_aligned_bss;
|
||||||
#ifndef __PAGETABLE_PUD_FOLDED
|
#ifndef __PAGETABLE_PUD_FOLDED
|
||||||
pud_t invalid_pud_table[PTRS_PER_PUD] __page_aligned_bss;
|
pud_t invalid_pud_table[PTRS_PER_PUD] __page_aligned_bss;
|
||||||
|
EXPORT_SYMBOL(invalid_pud_table);
|
||||||
#endif
|
#endif
|
||||||
#ifndef __PAGETABLE_PMD_FOLDED
|
#ifndef __PAGETABLE_PMD_FOLDED
|
||||||
pmd_t invalid_pmd_table[PTRS_PER_PMD] __page_aligned_bss;
|
pmd_t invalid_pmd_table[PTRS_PER_PMD] __page_aligned_bss;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#define PTRS_PER_PTE_BITS (PAGE_SHIFT - 3)
|
#define PTRS_PER_PTE_BITS (PAGE_SHIFT - 3)
|
||||||
|
|
||||||
.macro tlb_do_page_fault, write
|
.macro tlb_do_page_fault, write
|
||||||
SYM_FUNC_START(tlb_do_page_fault_\write)
|
SYM_CODE_START(tlb_do_page_fault_\write)
|
||||||
SAVE_ALL
|
SAVE_ALL
|
||||||
csrrd a2, LOONGARCH_CSR_BADV
|
csrrd a2, LOONGARCH_CSR_BADV
|
||||||
move a0, sp
|
move a0, sp
|
||||||
@ -25,13 +25,13 @@
|
|||||||
li.w a1, \write
|
li.w a1, \write
|
||||||
bl do_page_fault
|
bl do_page_fault
|
||||||
RESTORE_ALL_AND_RET
|
RESTORE_ALL_AND_RET
|
||||||
SYM_FUNC_END(tlb_do_page_fault_\write)
|
SYM_CODE_END(tlb_do_page_fault_\write)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
tlb_do_page_fault 0
|
tlb_do_page_fault 0
|
||||||
tlb_do_page_fault 1
|
tlb_do_page_fault 1
|
||||||
|
|
||||||
SYM_FUNC_START(handle_tlb_protect)
|
SYM_CODE_START(handle_tlb_protect)
|
||||||
BACKUP_T0T1
|
BACKUP_T0T1
|
||||||
SAVE_ALL
|
SAVE_ALL
|
||||||
move a0, sp
|
move a0, sp
|
||||||
@ -41,9 +41,9 @@ SYM_FUNC_START(handle_tlb_protect)
|
|||||||
la_abs t0, do_page_fault
|
la_abs t0, do_page_fault
|
||||||
jirl ra, t0, 0
|
jirl ra, t0, 0
|
||||||
RESTORE_ALL_AND_RET
|
RESTORE_ALL_AND_RET
|
||||||
SYM_FUNC_END(handle_tlb_protect)
|
SYM_CODE_END(handle_tlb_protect)
|
||||||
|
|
||||||
SYM_FUNC_START(handle_tlb_load)
|
SYM_CODE_START(handle_tlb_load)
|
||||||
csrwr t0, EXCEPTION_KS0
|
csrwr t0, EXCEPTION_KS0
|
||||||
csrwr t1, EXCEPTION_KS1
|
csrwr t1, EXCEPTION_KS1
|
||||||
csrwr ra, EXCEPTION_KS2
|
csrwr ra, EXCEPTION_KS2
|
||||||
@ -187,16 +187,16 @@ nopage_tlb_load:
|
|||||||
csrrd ra, EXCEPTION_KS2
|
csrrd ra, EXCEPTION_KS2
|
||||||
la_abs t0, tlb_do_page_fault_0
|
la_abs t0, tlb_do_page_fault_0
|
||||||
jr t0
|
jr t0
|
||||||
SYM_FUNC_END(handle_tlb_load)
|
SYM_CODE_END(handle_tlb_load)
|
||||||
|
|
||||||
SYM_FUNC_START(handle_tlb_load_ptw)
|
SYM_CODE_START(handle_tlb_load_ptw)
|
||||||
csrwr t0, LOONGARCH_CSR_KS0
|
csrwr t0, LOONGARCH_CSR_KS0
|
||||||
csrwr t1, LOONGARCH_CSR_KS1
|
csrwr t1, LOONGARCH_CSR_KS1
|
||||||
la_abs t0, tlb_do_page_fault_0
|
la_abs t0, tlb_do_page_fault_0
|
||||||
jr t0
|
jr t0
|
||||||
SYM_FUNC_END(handle_tlb_load_ptw)
|
SYM_CODE_END(handle_tlb_load_ptw)
|
||||||
|
|
||||||
SYM_FUNC_START(handle_tlb_store)
|
SYM_CODE_START(handle_tlb_store)
|
||||||
csrwr t0, EXCEPTION_KS0
|
csrwr t0, EXCEPTION_KS0
|
||||||
csrwr t1, EXCEPTION_KS1
|
csrwr t1, EXCEPTION_KS1
|
||||||
csrwr ra, EXCEPTION_KS2
|
csrwr ra, EXCEPTION_KS2
|
||||||
@ -343,16 +343,16 @@ nopage_tlb_store:
|
|||||||
csrrd ra, EXCEPTION_KS2
|
csrrd ra, EXCEPTION_KS2
|
||||||
la_abs t0, tlb_do_page_fault_1
|
la_abs t0, tlb_do_page_fault_1
|
||||||
jr t0
|
jr t0
|
||||||
SYM_FUNC_END(handle_tlb_store)
|
SYM_CODE_END(handle_tlb_store)
|
||||||
|
|
||||||
SYM_FUNC_START(handle_tlb_store_ptw)
|
SYM_CODE_START(handle_tlb_store_ptw)
|
||||||
csrwr t0, LOONGARCH_CSR_KS0
|
csrwr t0, LOONGARCH_CSR_KS0
|
||||||
csrwr t1, LOONGARCH_CSR_KS1
|
csrwr t1, LOONGARCH_CSR_KS1
|
||||||
la_abs t0, tlb_do_page_fault_1
|
la_abs t0, tlb_do_page_fault_1
|
||||||
jr t0
|
jr t0
|
||||||
SYM_FUNC_END(handle_tlb_store_ptw)
|
SYM_CODE_END(handle_tlb_store_ptw)
|
||||||
|
|
||||||
SYM_FUNC_START(handle_tlb_modify)
|
SYM_CODE_START(handle_tlb_modify)
|
||||||
csrwr t0, EXCEPTION_KS0
|
csrwr t0, EXCEPTION_KS0
|
||||||
csrwr t1, EXCEPTION_KS1
|
csrwr t1, EXCEPTION_KS1
|
||||||
csrwr ra, EXCEPTION_KS2
|
csrwr ra, EXCEPTION_KS2
|
||||||
@ -497,16 +497,16 @@ nopage_tlb_modify:
|
|||||||
csrrd ra, EXCEPTION_KS2
|
csrrd ra, EXCEPTION_KS2
|
||||||
la_abs t0, tlb_do_page_fault_1
|
la_abs t0, tlb_do_page_fault_1
|
||||||
jr t0
|
jr t0
|
||||||
SYM_FUNC_END(handle_tlb_modify)
|
SYM_CODE_END(handle_tlb_modify)
|
||||||
|
|
||||||
SYM_FUNC_START(handle_tlb_modify_ptw)
|
SYM_CODE_START(handle_tlb_modify_ptw)
|
||||||
csrwr t0, LOONGARCH_CSR_KS0
|
csrwr t0, LOONGARCH_CSR_KS0
|
||||||
csrwr t1, LOONGARCH_CSR_KS1
|
csrwr t1, LOONGARCH_CSR_KS1
|
||||||
la_abs t0, tlb_do_page_fault_1
|
la_abs t0, tlb_do_page_fault_1
|
||||||
jr t0
|
jr t0
|
||||||
SYM_FUNC_END(handle_tlb_modify_ptw)
|
SYM_CODE_END(handle_tlb_modify_ptw)
|
||||||
|
|
||||||
SYM_FUNC_START(handle_tlb_refill)
|
SYM_CODE_START(handle_tlb_refill)
|
||||||
csrwr t0, LOONGARCH_CSR_TLBRSAVE
|
csrwr t0, LOONGARCH_CSR_TLBRSAVE
|
||||||
csrrd t0, LOONGARCH_CSR_PGD
|
csrrd t0, LOONGARCH_CSR_PGD
|
||||||
lddir t0, t0, 3
|
lddir t0, t0, 3
|
||||||
@ -521,4 +521,4 @@ SYM_FUNC_START(handle_tlb_refill)
|
|||||||
tlbfill
|
tlbfill
|
||||||
csrrd t0, LOONGARCH_CSR_TLBRSAVE
|
csrrd t0, LOONGARCH_CSR_TLBRSAVE
|
||||||
ertn
|
ertn
|
||||||
SYM_FUNC_END(handle_tlb_refill)
|
SYM_CODE_END(handle_tlb_refill)
|
||||||
|
@ -592,7 +592,7 @@ static int kvm_mips_map_page(struct kvm_vcpu *vcpu, unsigned long gpa,
|
|||||||
gfn_t gfn = gpa >> PAGE_SHIFT;
|
gfn_t gfn = gpa >> PAGE_SHIFT;
|
||||||
int srcu_idx, err;
|
int srcu_idx, err;
|
||||||
kvm_pfn_t pfn;
|
kvm_pfn_t pfn;
|
||||||
pte_t *ptep, entry, old_pte;
|
pte_t *ptep, entry;
|
||||||
bool writeable;
|
bool writeable;
|
||||||
unsigned long prot_bits;
|
unsigned long prot_bits;
|
||||||
unsigned long mmu_seq;
|
unsigned long mmu_seq;
|
||||||
@ -664,7 +664,6 @@ retry:
|
|||||||
entry = pfn_pte(pfn, __pgprot(prot_bits));
|
entry = pfn_pte(pfn, __pgprot(prot_bits));
|
||||||
|
|
||||||
/* Write the PTE */
|
/* Write the PTE */
|
||||||
old_pte = *ptep;
|
|
||||||
set_pte(ptep, entry);
|
set_pte(ptep, entry);
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#ifndef __PARISC_LDCW_H
|
#ifndef __PARISC_LDCW_H
|
||||||
#define __PARISC_LDCW_H
|
#define __PARISC_LDCW_H
|
||||||
|
|
||||||
#ifndef CONFIG_PA20
|
|
||||||
/* Because kmalloc only guarantees 8-byte alignment for kmalloc'd data,
|
/* Because kmalloc only guarantees 8-byte alignment for kmalloc'd data,
|
||||||
and GCC only guarantees 8-byte alignment for stack locals, we can't
|
and GCC only guarantees 8-byte alignment for stack locals, we can't
|
||||||
be assured of 16-byte alignment for atomic lock data even if we
|
be assured of 16-byte alignment for atomic lock data even if we
|
||||||
@ -11,30 +10,34 @@
|
|||||||
type and dynamically select the 16-byte aligned int from the array
|
type and dynamically select the 16-byte aligned int from the array
|
||||||
for the semaphore. */
|
for the semaphore. */
|
||||||
|
|
||||||
|
/* From: "Jim Hull" <jim.hull of hp.com>
|
||||||
|
I've attached a summary of the change, but basically, for PA 2.0, as
|
||||||
|
long as the ",CO" (coherent operation) completer is implemented, then the
|
||||||
|
16-byte alignment requirement for ldcw and ldcd is relaxed, and instead
|
||||||
|
they only require "natural" alignment (4-byte for ldcw, 8-byte for
|
||||||
|
ldcd).
|
||||||
|
|
||||||
|
Although the cache control hint is accepted by all PA 2.0 processors,
|
||||||
|
it is only implemented on PA8800/PA8900 CPUs. Prior PA8X00 CPUs still
|
||||||
|
require 16-byte alignment. If the address is unaligned, the operation
|
||||||
|
of the instruction is undefined. The ldcw instruction does not generate
|
||||||
|
unaligned data reference traps so misaligned accesses are not detected.
|
||||||
|
This hid the problem for years. So, restore the 16-byte alignment dropped
|
||||||
|
by Kyle McMartin in "Remove __ldcw_align for PA-RISC 2.0 processors". */
|
||||||
|
|
||||||
#define __PA_LDCW_ALIGNMENT 16
|
#define __PA_LDCW_ALIGNMENT 16
|
||||||
#define __PA_LDCW_ALIGN_ORDER 4
|
|
||||||
#define __ldcw_align(a) ({ \
|
#define __ldcw_align(a) ({ \
|
||||||
unsigned long __ret = (unsigned long) &(a)->lock[0]; \
|
unsigned long __ret = (unsigned long) &(a)->lock[0]; \
|
||||||
__ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \
|
__ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \
|
||||||
& ~(__PA_LDCW_ALIGNMENT - 1); \
|
& ~(__PA_LDCW_ALIGNMENT - 1); \
|
||||||
(volatile unsigned int *) __ret; \
|
(volatile unsigned int *) __ret; \
|
||||||
})
|
})
|
||||||
#define __LDCW "ldcw"
|
|
||||||
|
|
||||||
#else /*CONFIG_PA20*/
|
#ifdef CONFIG_PA20
|
||||||
/* From: "Jim Hull" <jim.hull of hp.com>
|
|
||||||
I've attached a summary of the change, but basically, for PA 2.0, as
|
|
||||||
long as the ",CO" (coherent operation) completer is specified, then the
|
|
||||||
16-byte alignment requirement for ldcw and ldcd is relaxed, and instead
|
|
||||||
they only require "natural" alignment (4-byte for ldcw, 8-byte for
|
|
||||||
ldcd). */
|
|
||||||
|
|
||||||
#define __PA_LDCW_ALIGNMENT 4
|
|
||||||
#define __PA_LDCW_ALIGN_ORDER 2
|
|
||||||
#define __ldcw_align(a) (&(a)->slock)
|
|
||||||
#define __LDCW "ldcw,co"
|
#define __LDCW "ldcw,co"
|
||||||
|
#else
|
||||||
#endif /*!CONFIG_PA20*/
|
#define __LDCW "ldcw"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*.
|
/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*.
|
||||||
We don't explicitly expose that "*a" may be written as reload
|
We don't explicitly expose that "*a" may be written as reload
|
||||||
|
@ -9,15 +9,10 @@
|
|||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
#ifdef CONFIG_PA20
|
|
||||||
volatile unsigned int slock;
|
|
||||||
# define __ARCH_SPIN_LOCK_UNLOCKED { __ARCH_SPIN_LOCK_UNLOCKED_VAL }
|
|
||||||
#else
|
|
||||||
volatile unsigned int lock[4];
|
volatile unsigned int lock[4];
|
||||||
# define __ARCH_SPIN_LOCK_UNLOCKED \
|
# define __ARCH_SPIN_LOCK_UNLOCKED \
|
||||||
{ { __ARCH_SPIN_LOCK_UNLOCKED_VAL, __ARCH_SPIN_LOCK_UNLOCKED_VAL, \
|
{ { __ARCH_SPIN_LOCK_UNLOCKED_VAL, __ARCH_SPIN_LOCK_UNLOCKED_VAL, \
|
||||||
__ARCH_SPIN_LOCK_UNLOCKED_VAL, __ARCH_SPIN_LOCK_UNLOCKED_VAL } }
|
__ARCH_SPIN_LOCK_UNLOCKED_VAL, __ARCH_SPIN_LOCK_UNLOCKED_VAL } }
|
||||||
#endif
|
|
||||||
} arch_spinlock_t;
|
} arch_spinlock_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -440,7 +440,9 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)
|
|||||||
if (cpu_online(cpu))
|
if (cpu_online(cpu))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (num_online_cpus() < setup_max_cpus && smp_boot_one_cpu(cpu, tidle))
|
if (num_online_cpus() < nr_cpu_ids &&
|
||||||
|
num_online_cpus() < setup_max_cpus &&
|
||||||
|
smp_boot_one_cpu(cpu, tidle))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
return cpu_online(cpu) ? 0 : -EIO;
|
return cpu_online(cpu) ? 0 : -EIO;
|
||||||
|
@ -910,7 +910,7 @@ config ARCH_FORCE_MAX_ORDER
|
|||||||
default "6" if PPC32 && PPC_64K_PAGES
|
default "6" if PPC32 && PPC_64K_PAGES
|
||||||
range 4 10 if PPC32 && PPC_256K_PAGES
|
range 4 10 if PPC32 && PPC_256K_PAGES
|
||||||
default "4" if PPC32 && PPC_256K_PAGES
|
default "4" if PPC32 && PPC_256K_PAGES
|
||||||
range 10 10
|
range 10 12
|
||||||
default "10"
|
default "10"
|
||||||
help
|
help
|
||||||
The kernel page allocator limits the size of maximal physically
|
The kernel page allocator limits the size of maximal physically
|
||||||
|
@ -94,6 +94,13 @@ static inline pte_t pte_wrprotect(pte_t pte)
|
|||||||
|
|
||||||
#define pte_wrprotect pte_wrprotect
|
#define pte_wrprotect pte_wrprotect
|
||||||
|
|
||||||
|
static inline int pte_read(pte_t pte)
|
||||||
|
{
|
||||||
|
return (pte_val(pte) & _PAGE_RO) != _PAGE_NA;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define pte_read pte_read
|
||||||
|
|
||||||
static inline int pte_write(pte_t pte)
|
static inline int pte_write(pte_t pte)
|
||||||
{
|
{
|
||||||
return !(pte_val(pte) & _PAGE_RO);
|
return !(pte_val(pte) & _PAGE_RO);
|
||||||
|
@ -197,7 +197,7 @@ static inline int __ptep_test_and_clear_young(struct mm_struct *mm,
|
|||||||
{
|
{
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
|
|
||||||
if (pte_young(*ptep))
|
if (!pte_young(*ptep))
|
||||||
return 0;
|
return 0;
|
||||||
old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0);
|
old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0);
|
||||||
return (old & _PAGE_ACCESSED) != 0;
|
return (old & _PAGE_ACCESSED) != 0;
|
||||||
|
@ -25,7 +25,9 @@ static inline int pte_write(pte_t pte)
|
|||||||
return pte_val(pte) & _PAGE_RW;
|
return pte_val(pte) & _PAGE_RW;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef pte_read
|
||||||
static inline int pte_read(pte_t pte) { return 1; }
|
static inline int pte_read(pte_t pte) { return 1; }
|
||||||
|
#endif
|
||||||
static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
|
static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
|
||||||
static inline int pte_special(pte_t pte) { return pte_val(pte) & _PAGE_SPECIAL; }
|
static inline int pte_special(pte_t pte) { return pte_val(pte) & _PAGE_SPECIAL; }
|
||||||
static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; }
|
static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; }
|
||||||
|
@ -137,8 +137,9 @@ ret_from_syscall:
|
|||||||
lis r4,icache_44x_need_flush@ha
|
lis r4,icache_44x_need_flush@ha
|
||||||
lwz r5,icache_44x_need_flush@l(r4)
|
lwz r5,icache_44x_need_flush@l(r4)
|
||||||
cmplwi cr0,r5,0
|
cmplwi cr0,r5,0
|
||||||
bne- 2f
|
bne- .L44x_icache_flush
|
||||||
#endif /* CONFIG_PPC_47x */
|
#endif /* CONFIG_PPC_47x */
|
||||||
|
.L44x_icache_flush_return:
|
||||||
kuep_unlock
|
kuep_unlock
|
||||||
lwz r4,_LINK(r1)
|
lwz r4,_LINK(r1)
|
||||||
lwz r5,_CCR(r1)
|
lwz r5,_CCR(r1)
|
||||||
@ -172,10 +173,11 @@ syscall_exit_finish:
|
|||||||
b 1b
|
b 1b
|
||||||
|
|
||||||
#ifdef CONFIG_44x
|
#ifdef CONFIG_44x
|
||||||
2: li r7,0
|
.L44x_icache_flush:
|
||||||
|
li r7,0
|
||||||
iccci r0,r0
|
iccci r0,r0
|
||||||
stw r7,icache_44x_need_flush@l(r4)
|
stw r7,icache_44x_need_flush@l(r4)
|
||||||
b 1b
|
b .L44x_icache_flush_return
|
||||||
#endif /* CONFIG_44x */
|
#endif /* CONFIG_44x */
|
||||||
|
|
||||||
.globl ret_from_fork
|
.globl ret_from_fork
|
||||||
|
@ -395,7 +395,7 @@ interrupt_base:
|
|||||||
#ifdef CONFIG_PPC_FPU
|
#ifdef CONFIG_PPC_FPU
|
||||||
FP_UNAVAILABLE_EXCEPTION
|
FP_UNAVAILABLE_EXCEPTION
|
||||||
#else
|
#else
|
||||||
EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, unknown_exception)
|
EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, emulation_assist_interrupt)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* System Call Interrupt */
|
/* System Call Interrupt */
|
||||||
|
@ -406,6 +406,9 @@ static __always_inline bool yield_to_prev(struct qspinlock *lock, struct qnode *
|
|||||||
if ((yield_count & 1) == 0)
|
if ((yield_count & 1) == 0)
|
||||||
goto yield_prev; /* owner vcpu is running */
|
goto yield_prev; /* owner vcpu is running */
|
||||||
|
|
||||||
|
if (get_owner_cpu(READ_ONCE(lock->val)) != yield_cpu)
|
||||||
|
goto yield_prev; /* re-sample lock owner */
|
||||||
|
|
||||||
spin_end();
|
spin_end();
|
||||||
|
|
||||||
preempted = true;
|
preempted = true;
|
||||||
|
@ -1212,13 +1212,6 @@ void radix__tlb_flush(struct mmu_gather *tlb)
|
|||||||
|
|
||||||
smp_mb(); /* see radix__flush_tlb_mm */
|
smp_mb(); /* see radix__flush_tlb_mm */
|
||||||
exit_flush_lazy_tlbs(mm);
|
exit_flush_lazy_tlbs(mm);
|
||||||
_tlbiel_pid(mm->context.id, RIC_FLUSH_ALL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* It should not be possible to have coprocessors still
|
|
||||||
* attached here.
|
|
||||||
*/
|
|
||||||
if (WARN_ON_ONCE(atomic_read(&mm->context.copros) > 0))
|
|
||||||
__flush_all_mm(mm, true);
|
__flush_all_mm(mm, true);
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
@ -184,9 +184,6 @@ _GLOBAL_TOC(plpar_hcall)
|
|||||||
plpar_hcall_trace:
|
plpar_hcall_trace:
|
||||||
HCALL_INST_PRECALL(R5)
|
HCALL_INST_PRECALL(R5)
|
||||||
|
|
||||||
std r4,STK_PARAM(R4)(r1)
|
|
||||||
mr r0,r4
|
|
||||||
|
|
||||||
mr r4,r5
|
mr r4,r5
|
||||||
mr r5,r6
|
mr r5,r6
|
||||||
mr r6,r7
|
mr r6,r7
|
||||||
@ -196,7 +193,7 @@ plpar_hcall_trace:
|
|||||||
|
|
||||||
HVSC
|
HVSC
|
||||||
|
|
||||||
ld r12,STK_PARAM(R4)(r1)
|
ld r12,STACK_FRAME_MIN_SIZE+STK_PARAM(R4)(r1)
|
||||||
std r4,0(r12)
|
std r4,0(r12)
|
||||||
std r5,8(r12)
|
std r5,8(r12)
|
||||||
std r6,16(r12)
|
std r6,16(r12)
|
||||||
@ -296,9 +293,6 @@ _GLOBAL_TOC(plpar_hcall9)
|
|||||||
plpar_hcall9_trace:
|
plpar_hcall9_trace:
|
||||||
HCALL_INST_PRECALL(R5)
|
HCALL_INST_PRECALL(R5)
|
||||||
|
|
||||||
std r4,STK_PARAM(R4)(r1)
|
|
||||||
mr r0,r4
|
|
||||||
|
|
||||||
mr r4,r5
|
mr r4,r5
|
||||||
mr r5,r6
|
mr r5,r6
|
||||||
mr r6,r7
|
mr r6,r7
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
# for more details.
|
# for more details.
|
||||||
#
|
#
|
||||||
|
|
||||||
OBJCOPYFLAGS := -O binary
|
|
||||||
LDFLAGS_vmlinux := -z norelro
|
LDFLAGS_vmlinux := -z norelro
|
||||||
ifeq ($(CONFIG_RELOCATABLE),y)
|
ifeq ($(CONFIG_RELOCATABLE),y)
|
||||||
LDFLAGS_vmlinux += -shared -Bsymbolic -z notext --emit-relocs
|
LDFLAGS_vmlinux += -shared -Bsymbolic -z notext --emit-relocs
|
||||||
|
@ -1 +1,5 @@
|
|||||||
|
ifdef CONFIG_RISCV_ALTERNATIVE_EARLY
|
||||||
|
CFLAGS_errata.o := -mcmodel=medany
|
||||||
|
endif
|
||||||
|
|
||||||
obj-y += errata.o
|
obj-y += errata.o
|
||||||
|
@ -31,6 +31,27 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr)
|
|||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Let's do like x86/arm64 and ignore the compat syscalls.
|
||||||
|
*/
|
||||||
|
#define ARCH_TRACE_IGNORE_COMPAT_SYSCALLS
|
||||||
|
static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return is_compat_task();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
||||||
|
static inline bool arch_syscall_match_sym_name(const char *sym,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Since all syscall functions have __riscv_ prefix, we must skip it.
|
||||||
|
* However, as we described above, we decided to ignore compat
|
||||||
|
* syscalls, so we don't care about __riscv_compat_ prefix here.
|
||||||
|
*/
|
||||||
|
return !strcmp(sym + 8, name);
|
||||||
|
}
|
||||||
|
|
||||||
struct dyn_arch_ftrace {
|
struct dyn_arch_ftrace {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,6 +40,15 @@ void arch_remove_kprobe(struct kprobe *p);
|
|||||||
int kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr);
|
int kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr);
|
||||||
bool kprobe_breakpoint_handler(struct pt_regs *regs);
|
bool kprobe_breakpoint_handler(struct pt_regs *regs);
|
||||||
bool kprobe_single_step_handler(struct pt_regs *regs);
|
bool kprobe_single_step_handler(struct pt_regs *regs);
|
||||||
|
#else
|
||||||
|
static inline bool kprobe_breakpoint_handler(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool kprobe_single_step_handler(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#endif /* CONFIG_KPROBES */
|
#endif /* CONFIG_KPROBES */
|
||||||
#endif /* _ASM_RISCV_KPROBES_H */
|
#endif /* _ASM_RISCV_KPROBES_H */
|
||||||
|
@ -34,7 +34,18 @@ struct arch_uprobe {
|
|||||||
bool simulate;
|
bool simulate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_UPROBES
|
||||||
bool uprobe_breakpoint_handler(struct pt_regs *regs);
|
bool uprobe_breakpoint_handler(struct pt_regs *regs);
|
||||||
bool uprobe_single_step_handler(struct pt_regs *regs);
|
bool uprobe_single_step_handler(struct pt_regs *regs);
|
||||||
|
#else
|
||||||
|
static inline bool uprobe_breakpoint_handler(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool uprobe_single_step_handler(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_UPROBES */
|
||||||
#endif /* _ASM_RISCV_UPROBES_H */
|
#endif /* _ASM_RISCV_UPROBES_H */
|
||||||
|
@ -60,7 +60,7 @@ static void init_irq_stacks(void)
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_VMAP_STACK */
|
#endif /* CONFIG_VMAP_STACK */
|
||||||
|
|
||||||
#ifdef CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK
|
#ifdef CONFIG_SOFTIRQ_ON_OWN_STACK
|
||||||
void do_softirq_own_stack(void)
|
void do_softirq_own_stack(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_IRQ_STACKS
|
#ifdef CONFIG_IRQ_STACKS
|
||||||
@ -92,7 +92,7 @@ void do_softirq_own_stack(void)
|
|||||||
#endif
|
#endif
|
||||||
__do_softirq();
|
__do_softirq();
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK */
|
#endif /* CONFIG_SOFTIRQ_ON_OWN_STACK */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static void init_irq_stacks(void) {}
|
static void init_irq_stacks(void) {}
|
||||||
|
@ -173,19 +173,6 @@ static void __init init_resources(void)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
#ifdef CONFIG_KEXEC_CORE
|
|
||||||
if (crashk_res.start != crashk_res.end) {
|
|
||||||
ret = add_resource(&iomem_resource, &crashk_res);
|
|
||||||
if (ret < 0)
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (crashk_low_res.start != crashk_low_res.end) {
|
|
||||||
ret = add_resource(&iomem_resource, &crashk_low_res);
|
|
||||||
if (ret < 0)
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_CRASH_DUMP
|
#ifdef CONFIG_CRASH_DUMP
|
||||||
if (elfcorehdr_size > 0) {
|
if (elfcorehdr_size > 0) {
|
||||||
elfcorehdr_res.start = elfcorehdr_addr;
|
elfcorehdr_res.start = elfcorehdr_addr;
|
||||||
|
@ -311,13 +311,6 @@ static inline void __user *get_sigframe(struct ksignal *ksig,
|
|||||||
/* Align the stack frame. */
|
/* Align the stack frame. */
|
||||||
sp &= ~0xfUL;
|
sp &= ~0xfUL;
|
||||||
|
|
||||||
/*
|
|
||||||
* Fail if the size of the altstack is not large enough for the
|
|
||||||
* sigframe construction.
|
|
||||||
*/
|
|
||||||
if (current->sas_ss_size && sp < current->sas_ss_sp)
|
|
||||||
return (void __user __force *)-1UL;
|
|
||||||
|
|
||||||
return (void __user *)sp;
|
return (void __user *)sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
|
#include <linux/uprobes.h>
|
||||||
|
#include <asm/uprobes.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
@ -247,22 +249,28 @@ static inline unsigned long get_break_insn_length(unsigned long pc)
|
|||||||
return GET_INSN_LENGTH(insn);
|
return GET_INSN_LENGTH(insn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool probe_single_step_handler(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
bool user = user_mode(regs);
|
||||||
|
|
||||||
|
return user ? uprobe_single_step_handler(regs) : kprobe_single_step_handler(regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool probe_breakpoint_handler(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
bool user = user_mode(regs);
|
||||||
|
|
||||||
|
return user ? uprobe_breakpoint_handler(regs) : kprobe_breakpoint_handler(regs);
|
||||||
|
}
|
||||||
|
|
||||||
void handle_break(struct pt_regs *regs)
|
void handle_break(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_KPROBES
|
if (probe_single_step_handler(regs))
|
||||||
if (kprobe_single_step_handler(regs))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (kprobe_breakpoint_handler(regs))
|
if (probe_breakpoint_handler(regs))
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_UPROBES
|
|
||||||
if (uprobe_single_step_handler(regs))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (uprobe_breakpoint_handler(regs))
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
current->thread.bad_cause = regs->cause;
|
current->thread.bad_cause = regs->cause;
|
||||||
|
|
||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
|
@ -245,7 +245,7 @@ static void __build_epilogue(bool is_tail_call, struct rv_jit_context *ctx)
|
|||||||
emit_addi(RV_REG_SP, RV_REG_SP, stack_adjust, ctx);
|
emit_addi(RV_REG_SP, RV_REG_SP, stack_adjust, ctx);
|
||||||
/* Set return value. */
|
/* Set return value. */
|
||||||
if (!is_tail_call)
|
if (!is_tail_call)
|
||||||
emit_mv(RV_REG_A0, RV_REG_A5, ctx);
|
emit_addiw(RV_REG_A0, RV_REG_A5, 0, ctx);
|
||||||
emit_jalr(RV_REG_ZERO, is_tail_call ? RV_REG_T3 : RV_REG_RA,
|
emit_jalr(RV_REG_ZERO, is_tail_call ? RV_REG_T3 : RV_REG_RA,
|
||||||
is_tail_call ? (RV_FENTRY_NINSNS + 1) * 4 : 0, /* skip reserved nops and TCC init */
|
is_tail_call ? (RV_FENTRY_NINSNS + 1) * 4 : 0, /* skip reserved nops and TCC init */
|
||||||
ctx);
|
ctx);
|
||||||
@ -759,8 +759,10 @@ static int invoke_bpf_prog(struct bpf_tramp_link *l, int args_off, int retval_of
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (save_ret)
|
if (save_ret) {
|
||||||
emit_sd(RV_REG_FP, -retval_off, regmap[BPF_REG_0], ctx);
|
emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
|
||||||
|
emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx);
|
||||||
|
}
|
||||||
|
|
||||||
/* update branch with beqz */
|
/* update branch with beqz */
|
||||||
if (ctx->insns) {
|
if (ctx->insns) {
|
||||||
@ -853,7 +855,7 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
|||||||
|
|
||||||
save_ret = flags & (BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_RET_FENTRY_RET);
|
save_ret = flags & (BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_RET_FENTRY_RET);
|
||||||
if (save_ret) {
|
if (save_ret) {
|
||||||
stack_size += 8;
|
stack_size += 16; /* Save both A5 (BPF R0) and A0 */
|
||||||
retval_off = stack_size;
|
retval_off = stack_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -957,6 +959,7 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
|
emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
|
||||||
|
emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx);
|
||||||
im->ip_after_call = ctx->insns + ctx->ninsns;
|
im->ip_after_call = ctx->insns + ctx->ninsns;
|
||||||
/* 2 nops reserved for auipc+jalr pair */
|
/* 2 nops reserved for auipc+jalr pair */
|
||||||
emit(rv_nop(), ctx);
|
emit(rv_nop(), ctx);
|
||||||
@ -988,8 +991,10 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
|||||||
if (flags & BPF_TRAMP_F_RESTORE_REGS)
|
if (flags & BPF_TRAMP_F_RESTORE_REGS)
|
||||||
restore_args(nregs, args_off, ctx);
|
restore_args(nregs, args_off, ctx);
|
||||||
|
|
||||||
if (save_ret)
|
if (save_ret) {
|
||||||
emit_ld(RV_REG_A0, -retval_off, RV_REG_FP, ctx);
|
emit_ld(RV_REG_A0, -retval_off, RV_REG_FP, ctx);
|
||||||
|
emit_ld(regmap[BPF_REG_0], -(retval_off - 8), RV_REG_FP, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
emit_ld(RV_REG_S1, -sreg_off, RV_REG_FP, ctx);
|
emit_ld(RV_REG_S1, -sreg_off, RV_REG_FP, ctx);
|
||||||
|
|
||||||
@ -1515,6 +1520,7 @@ out_be:
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if (insn->src_reg != BPF_PSEUDO_CALL)
|
||||||
emit_mv(bpf_to_rv_reg(BPF_REG_0, ctx), RV_REG_A0, ctx);
|
emit_mv(bpf_to_rv_reg(BPF_REG_0, ctx), RV_REG_A0, ctx);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -57,6 +57,7 @@ static void kasan_populate_shadow(void)
|
|||||||
pmd_t pmd_z = __pmd(__pa(kasan_early_shadow_pte) | _SEGMENT_ENTRY);
|
pmd_t pmd_z = __pmd(__pa(kasan_early_shadow_pte) | _SEGMENT_ENTRY);
|
||||||
pud_t pud_z = __pud(__pa(kasan_early_shadow_pmd) | _REGION3_ENTRY);
|
pud_t pud_z = __pud(__pa(kasan_early_shadow_pmd) | _REGION3_ENTRY);
|
||||||
p4d_t p4d_z = __p4d(__pa(kasan_early_shadow_pud) | _REGION2_ENTRY);
|
p4d_t p4d_z = __p4d(__pa(kasan_early_shadow_pud) | _REGION2_ENTRY);
|
||||||
|
unsigned long memgap_start = 0;
|
||||||
unsigned long untracked_end;
|
unsigned long untracked_end;
|
||||||
unsigned long start, end;
|
unsigned long start, end;
|
||||||
int i;
|
int i;
|
||||||
@ -101,8 +102,12 @@ static void kasan_populate_shadow(void)
|
|||||||
* +- shadow end ----+---------+- shadow end ---+
|
* +- shadow end ----+---------+- shadow end ---+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for_each_physmem_usable_range(i, &start, &end)
|
for_each_physmem_usable_range(i, &start, &end) {
|
||||||
kasan_populate(start, end, POPULATE_KASAN_MAP_SHADOW);
|
kasan_populate(start, end, POPULATE_KASAN_MAP_SHADOW);
|
||||||
|
if (memgap_start && physmem_info.info_source == MEM_DETECT_DIAG260)
|
||||||
|
kasan_populate(memgap_start, start, POPULATE_KASAN_ZERO_SHADOW);
|
||||||
|
memgap_start = end;
|
||||||
|
}
|
||||||
if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) {
|
if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) {
|
||||||
untracked_end = VMALLOC_START;
|
untracked_end = VMALLOC_START;
|
||||||
/* shallowly populate kasan shadow for vmalloc and modules */
|
/* shallowly populate kasan shadow for vmalloc and modules */
|
||||||
|
@ -303,11 +303,6 @@ static inline u8 gisa_get_ipm_or_restore_iam(struct kvm_s390_gisa_interrupt *gi)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int gisa_in_alert_list(struct kvm_s390_gisa *gisa)
|
|
||||||
{
|
|
||||||
return READ_ONCE(gisa->next_alert) != (u32)virt_to_phys(gisa);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gisa_set_ipm_gisc(struct kvm_s390_gisa *gisa, u32 gisc)
|
static inline void gisa_set_ipm_gisc(struct kvm_s390_gisa *gisa, u32 gisc)
|
||||||
{
|
{
|
||||||
set_bit_inv(IPM_BIT_OFFSET + gisc, (unsigned long *) gisa);
|
set_bit_inv(IPM_BIT_OFFSET + gisc, (unsigned long *) gisa);
|
||||||
@ -3216,11 +3211,12 @@ void kvm_s390_gisa_destroy(struct kvm *kvm)
|
|||||||
|
|
||||||
if (!gi->origin)
|
if (!gi->origin)
|
||||||
return;
|
return;
|
||||||
if (gi->alert.mask)
|
WARN(gi->alert.mask != 0x00,
|
||||||
KVM_EVENT(3, "vm 0x%pK has unexpected iam 0x%02x",
|
"unexpected non zero alert.mask 0x%02x",
|
||||||
kvm, gi->alert.mask);
|
gi->alert.mask);
|
||||||
while (gisa_in_alert_list(gi->origin))
|
gi->alert.mask = 0x00;
|
||||||
cpu_relax();
|
if (gisa_set_iam(gi->origin, gi->alert.mask))
|
||||||
|
process_gib_alert_list();
|
||||||
hrtimer_cancel(&gi->timer);
|
hrtimer_cancel(&gi->timer);
|
||||||
gi->origin = NULL;
|
gi->origin = NULL;
|
||||||
VM_EVENT(kvm, 3, "gisa 0x%pK destroyed", gisa);
|
VM_EVENT(kvm, 3, "gisa 0x%pK destroyed", gisa);
|
||||||
|
@ -2066,6 +2066,7 @@ struct bpf_tramp_jit {
|
|||||||
* func_addr's original caller
|
* func_addr's original caller
|
||||||
*/
|
*/
|
||||||
int stack_size; /* Trampoline stack size */
|
int stack_size; /* Trampoline stack size */
|
||||||
|
int backchain_off; /* Offset of backchain */
|
||||||
int stack_args_off; /* Offset of stack arguments for calling
|
int stack_args_off; /* Offset of stack arguments for calling
|
||||||
* func_addr, has to be at the top
|
* func_addr, has to be at the top
|
||||||
*/
|
*/
|
||||||
@ -2086,9 +2087,10 @@ struct bpf_tramp_jit {
|
|||||||
* for __bpf_prog_enter() return value and
|
* for __bpf_prog_enter() return value and
|
||||||
* func_addr respectively
|
* func_addr respectively
|
||||||
*/
|
*/
|
||||||
int r14_off; /* Offset of saved %r14 */
|
|
||||||
int run_ctx_off; /* Offset of struct bpf_tramp_run_ctx */
|
int run_ctx_off; /* Offset of struct bpf_tramp_run_ctx */
|
||||||
int tccnt_off; /* Offset of saved tailcall counter */
|
int tccnt_off; /* Offset of saved tailcall counter */
|
||||||
|
int r14_off; /* Offset of saved %r14, has to be at the
|
||||||
|
* bottom */
|
||||||
int do_fexit; /* do_fexit: label */
|
int do_fexit; /* do_fexit: label */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2247,8 +2249,12 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
|||||||
* Calculate the stack layout.
|
* Calculate the stack layout.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Reserve STACK_FRAME_OVERHEAD bytes for the callees. */
|
/*
|
||||||
|
* Allocate STACK_FRAME_OVERHEAD bytes for the callees. As the s390x
|
||||||
|
* ABI requires, put our backchain at the end of the allocated memory.
|
||||||
|
*/
|
||||||
tjit->stack_size = STACK_FRAME_OVERHEAD;
|
tjit->stack_size = STACK_FRAME_OVERHEAD;
|
||||||
|
tjit->backchain_off = tjit->stack_size - sizeof(u64);
|
||||||
tjit->stack_args_off = alloc_stack(tjit, nr_stack_args * sizeof(u64));
|
tjit->stack_args_off = alloc_stack(tjit, nr_stack_args * sizeof(u64));
|
||||||
tjit->reg_args_off = alloc_stack(tjit, nr_reg_args * sizeof(u64));
|
tjit->reg_args_off = alloc_stack(tjit, nr_reg_args * sizeof(u64));
|
||||||
tjit->ip_off = alloc_stack(tjit, sizeof(u64));
|
tjit->ip_off = alloc_stack(tjit, sizeof(u64));
|
||||||
@ -2256,16 +2262,25 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
|||||||
tjit->bpf_args_off = alloc_stack(tjit, nr_bpf_args * sizeof(u64));
|
tjit->bpf_args_off = alloc_stack(tjit, nr_bpf_args * sizeof(u64));
|
||||||
tjit->retval_off = alloc_stack(tjit, sizeof(u64));
|
tjit->retval_off = alloc_stack(tjit, sizeof(u64));
|
||||||
tjit->r7_r8_off = alloc_stack(tjit, 2 * sizeof(u64));
|
tjit->r7_r8_off = alloc_stack(tjit, 2 * sizeof(u64));
|
||||||
tjit->r14_off = alloc_stack(tjit, sizeof(u64));
|
|
||||||
tjit->run_ctx_off = alloc_stack(tjit,
|
tjit->run_ctx_off = alloc_stack(tjit,
|
||||||
sizeof(struct bpf_tramp_run_ctx));
|
sizeof(struct bpf_tramp_run_ctx));
|
||||||
tjit->tccnt_off = alloc_stack(tjit, sizeof(u64));
|
tjit->tccnt_off = alloc_stack(tjit, sizeof(u64));
|
||||||
/* The caller has already reserved STACK_FRAME_OVERHEAD bytes. */
|
tjit->r14_off = alloc_stack(tjit, sizeof(u64) * 2);
|
||||||
tjit->stack_size -= STACK_FRAME_OVERHEAD;
|
/*
|
||||||
|
* In accordance with the s390x ABI, the caller has allocated
|
||||||
|
* STACK_FRAME_OVERHEAD bytes for us. 8 of them contain the caller's
|
||||||
|
* backchain, and the rest we can use.
|
||||||
|
*/
|
||||||
|
tjit->stack_size -= STACK_FRAME_OVERHEAD - sizeof(u64);
|
||||||
tjit->orig_stack_args_off = tjit->stack_size + STACK_FRAME_OVERHEAD;
|
tjit->orig_stack_args_off = tjit->stack_size + STACK_FRAME_OVERHEAD;
|
||||||
|
|
||||||
|
/* lgr %r1,%r15 */
|
||||||
|
EMIT4(0xb9040000, REG_1, REG_15);
|
||||||
/* aghi %r15,-stack_size */
|
/* aghi %r15,-stack_size */
|
||||||
EMIT4_IMM(0xa70b0000, REG_15, -tjit->stack_size);
|
EMIT4_IMM(0xa70b0000, REG_15, -tjit->stack_size);
|
||||||
|
/* stg %r1,backchain_off(%r15) */
|
||||||
|
EMIT6_DISP_LH(0xe3000000, 0x0024, REG_1, REG_0, REG_15,
|
||||||
|
tjit->backchain_off);
|
||||||
/* mvc tccnt_off(4,%r15),stack_size+STK_OFF_TCCNT(%r15) */
|
/* mvc tccnt_off(4,%r15),stack_size+STK_OFF_TCCNT(%r15) */
|
||||||
_EMIT6(0xd203f000 | tjit->tccnt_off,
|
_EMIT6(0xd203f000 | tjit->tccnt_off,
|
||||||
0xf000 | (tjit->stack_size + STK_OFF_TCCNT));
|
0xf000 | (tjit->stack_size + STK_OFF_TCCNT));
|
||||||
@ -2513,7 +2528,7 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image,
|
|||||||
return -E2BIG;
|
return -E2BIG;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return tjit.common.prg;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bpf_jit_supports_subprog_tailcalls(void)
|
bool bpf_jit_supports_subprog_tailcalls(void)
|
||||||
|
@ -565,6 +565,17 @@ static void s390_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long *bitmap_vzalloc(size_t bits, gfp_t flags)
|
||||||
|
{
|
||||||
|
size_t n = BITS_TO_LONGS(bits);
|
||||||
|
size_t bytes;
|
||||||
|
|
||||||
|
if (unlikely(check_mul_overflow(n, sizeof(unsigned long), &bytes)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return vzalloc(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
int zpci_dma_init_device(struct zpci_dev *zdev)
|
int zpci_dma_init_device(struct zpci_dev *zdev)
|
||||||
{
|
{
|
||||||
u8 status;
|
u8 status;
|
||||||
@ -604,13 +615,13 @@ int zpci_dma_init_device(struct zpci_dev *zdev)
|
|||||||
zdev->end_dma - zdev->start_dma + 1);
|
zdev->end_dma - zdev->start_dma + 1);
|
||||||
zdev->end_dma = zdev->start_dma + zdev->iommu_size - 1;
|
zdev->end_dma = zdev->start_dma + zdev->iommu_size - 1;
|
||||||
zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT;
|
zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT;
|
||||||
zdev->iommu_bitmap = vzalloc(zdev->iommu_pages / 8);
|
zdev->iommu_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL);
|
||||||
if (!zdev->iommu_bitmap) {
|
if (!zdev->iommu_bitmap) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto free_dma_table;
|
goto free_dma_table;
|
||||||
}
|
}
|
||||||
if (!s390_iommu_strict) {
|
if (!s390_iommu_strict) {
|
||||||
zdev->lazy_bitmap = vzalloc(zdev->iommu_pages / 8);
|
zdev->lazy_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL);
|
||||||
if (!zdev->lazy_bitmap) {
|
if (!zdev->lazy_bitmap) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto free_bitmap;
|
goto free_bitmap;
|
||||||
|
@ -103,6 +103,16 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
|
|||||||
return ES_OK;
|
return ES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum es_result vc_ioio_check(struct es_em_ctxt *ctxt, u16 port, size_t size)
|
||||||
|
{
|
||||||
|
return ES_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool fault_in_kernel_space(unsigned long address)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#undef __init
|
#undef __init
|
||||||
#define __init
|
#define __init
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
#include <asm/insn.h>
|
#include <asm/insn.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
|
||||||
#include "perf_event.h"
|
#include "perf_event.h"
|
||||||
|
|
||||||
@ -132,9 +133,9 @@ static int get_branch_type(unsigned long from, unsigned long to, int abort,
|
|||||||
* The LBR logs any address in the IP, even if the IP just
|
* The LBR logs any address in the IP, even if the IP just
|
||||||
* faulted. This means userspace can control the from address.
|
* faulted. This means userspace can control the from address.
|
||||||
* Ensure we don't blindly read any address by validating it is
|
* Ensure we don't blindly read any address by validating it is
|
||||||
* a known text address.
|
* a known text address and not a vsyscall address.
|
||||||
*/
|
*/
|
||||||
if (kernel_text_address(from)) {
|
if (kernel_text_address(from) && !in_gate_area_no_mm(from)) {
|
||||||
addr = (void *)from;
|
addr = (void *)from;
|
||||||
/*
|
/*
|
||||||
* Assume we can get the maximum possible size
|
* Assume we can get the maximum possible size
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
* Author : K. Y. Srinivasan <kys@microsoft.com>
|
* Author : K. Y. Srinivasan <kys@microsoft.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define pr_fmt(fmt) "Hyper-V: " fmt
|
||||||
|
|
||||||
#include <linux/efi.h>
|
#include <linux/efi.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/bitfield.h>
|
#include <linux/bitfield.h>
|
||||||
@ -191,7 +193,7 @@ void set_hv_tscchange_cb(void (*cb)(void))
|
|||||||
struct hv_tsc_emulation_control emu_ctrl = {.enabled = 1};
|
struct hv_tsc_emulation_control emu_ctrl = {.enabled = 1};
|
||||||
|
|
||||||
if (!hv_reenlightenment_available()) {
|
if (!hv_reenlightenment_available()) {
|
||||||
pr_warn("Hyper-V: reenlightenment support is unavailable\n");
|
pr_warn("reenlightenment support is unavailable\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,6 +396,7 @@ static void __init hv_get_partition_id(void)
|
|||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
|
||||||
static u8 __init get_vtl(void)
|
static u8 __init get_vtl(void)
|
||||||
{
|
{
|
||||||
u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
|
u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
|
||||||
@ -416,13 +419,16 @@ static u8 __init get_vtl(void)
|
|||||||
if (hv_result_success(ret)) {
|
if (hv_result_success(ret)) {
|
||||||
ret = output->as64.low & HV_X64_VTL_MASK;
|
ret = output->as64.low & HV_X64_VTL_MASK;
|
||||||
} else {
|
} else {
|
||||||
pr_err("Failed to get VTL(%lld) and set VTL to zero by default.\n", ret);
|
pr_err("Failed to get VTL(error: %lld) exiting...\n", ret);
|
||||||
ret = 0;
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
static inline u8 get_vtl(void) { return 0; }
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function is to be invoked early in the boot sequence after the
|
* This function is to be invoked early in the boot sequence after the
|
||||||
@ -564,7 +570,7 @@ skip_hypercall_pg_init:
|
|||||||
if (cpu_feature_enabled(X86_FEATURE_IBT) &&
|
if (cpu_feature_enabled(X86_FEATURE_IBT) &&
|
||||||
*(u32 *)hv_hypercall_pg != gen_endbr()) {
|
*(u32 *)hv_hypercall_pg != gen_endbr()) {
|
||||||
setup_clear_cpu_cap(X86_FEATURE_IBT);
|
setup_clear_cpu_cap(X86_FEATURE_IBT);
|
||||||
pr_warn("Hyper-V: Disabling IBT because of Hyper-V bug\n");
|
pr_warn("Disabling IBT because of Hyper-V bug\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -604,9 +610,11 @@ skip_hypercall_pg_init:
|
|||||||
hv_query_ext_cap(0);
|
hv_query_ext_cap(0);
|
||||||
|
|
||||||
/* Find the VTL */
|
/* Find the VTL */
|
||||||
if (!ms_hyperv.paravisor_present && hv_isolation_type_snp())
|
|
||||||
ms_hyperv.vtl = get_vtl();
|
ms_hyperv.vtl = get_vtl();
|
||||||
|
|
||||||
|
if (ms_hyperv.vtl > 0) /* non default VTL */
|
||||||
|
hv_vtl_early_init();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
clean_guest_os_id:
|
clean_guest_os_id:
|
||||||
|
@ -215,7 +215,7 @@ static int hv_vtl_wakeup_secondary_cpu(int apicid, unsigned long start_eip)
|
|||||||
return hv_vtl_bringup_vcpu(vp_id, start_eip);
|
return hv_vtl_bringup_vcpu(vp_id, start_eip);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init hv_vtl_early_init(void)
|
int __init hv_vtl_early_init(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* `boot_cpu_has` returns the runtime feature support,
|
* `boot_cpu_has` returns the runtime feature support,
|
||||||
@ -230,4 +230,3 @@ static int __init hv_vtl_early_init(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
early_initcall(hv_vtl_early_init);
|
|
||||||
|
@ -28,8 +28,6 @@ struct x86_cpu {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
extern int arch_register_cpu(int num);
|
|
||||||
extern void arch_unregister_cpu(int);
|
|
||||||
extern void soft_restart_cpu(void);
|
extern void soft_restart_cpu(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -157,7 +157,8 @@ static inline void fpu_update_guest_xfd(struct fpu_guest *guest_fpu, u64 xfd) {
|
|||||||
static inline void fpu_sync_guest_vmexit_xfd_state(void) { }
|
static inline void fpu_sync_guest_vmexit_xfd_state(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void fpu_copy_guest_fpstate_to_uabi(struct fpu_guest *gfpu, void *buf, unsigned int size, u32 pkru);
|
extern void fpu_copy_guest_fpstate_to_uabi(struct fpu_guest *gfpu, void *buf,
|
||||||
|
unsigned int size, u64 xfeatures, u32 pkru);
|
||||||
extern int fpu_copy_uabi_to_guest_fpstate(struct fpu_guest *gfpu, const void *buf, u64 xcr0, u32 *vpkru);
|
extern int fpu_copy_uabi_to_guest_fpstate(struct fpu_guest *gfpu, const void *buf, u64 xcr0, u32 *vpkru);
|
||||||
|
|
||||||
static inline void fpstate_set_confidential(struct fpu_guest *gfpu)
|
static inline void fpstate_set_confidential(struct fpu_guest *gfpu)
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user