Merge 5.9-rc3 into android-mainline
Linux 5.9-rc3 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic7758bc57a7d91861657388ddd015db5c5db5480
This commit is contained in:
@@ -564,8 +564,8 @@ Energy-Performance Preference (EPP) knob (if supported) or its
|
|||||||
Energy-Performance Bias (EPB) knob. It is also possible to write a positive
|
Energy-Performance Bias (EPB) knob. It is also possible to write a positive
|
||||||
integer value between 0 to 255, if the EPP feature is present. If the EPP
|
integer value between 0 to 255, if the EPP feature is present. If the EPP
|
||||||
feature is not present, writing integer value to this attribute is not
|
feature is not present, writing integer value to this attribute is not
|
||||||
supported. In this case, user can use
|
supported. In this case, user can use the
|
||||||
"/sys/devices/system/cpu/cpu*/power/energy_perf_bias" interface.
|
"/sys/devices/system/cpu/cpu*/power/energy_perf_bias" interface.
|
||||||
|
|
||||||
[Note that tasks may by migrated from one CPU to another by the scheduler's
|
[Note that tasks may by migrated from one CPU to another by the scheduler's
|
||||||
load-balancing algorithm and if different energy vs performance hints are
|
load-balancing algorithm and if different energy vs performance hints are
|
||||||
|
@@ -1,66 +0,0 @@
|
|||||||
Texas Instruments K3 Interrupt Aggregator
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
The Interrupt Aggregator (INTA) provides a centralized machine
|
|
||||||
which handles the termination of system events to that they can
|
|
||||||
be coherently processed by the host(s) in the system. A maximum
|
|
||||||
of 64 events can be mapped to a single interrupt.
|
|
||||||
|
|
||||||
|
|
||||||
Interrupt Aggregator
|
|
||||||
+-----------------------------------------+
|
|
||||||
| Intmap VINT |
|
|
||||||
| +--------------+ +------------+ |
|
|
||||||
m ------>| | vint | bit | | 0 |.....|63| vint0 |
|
|
||||||
. | +--------------+ +------------+ | +------+
|
|
||||||
. | . . | | HOST |
|
|
||||||
Globalevents ------>| . . |------>| IRQ |
|
|
||||||
. | . . | | CTRL |
|
|
||||||
. | . . | +------+
|
|
||||||
n ------>| +--------------+ +------------+ |
|
|
||||||
| | vint | bit | | 0 |.....|63| vintx |
|
|
||||||
| +--------------+ +------------+ |
|
|
||||||
| |
|
|
||||||
+-----------------------------------------+
|
|
||||||
|
|
||||||
Configuration of these Intmap registers that maps global events to vint is done
|
|
||||||
by a system controller (like the Device Memory and Security Controller on K3
|
|
||||||
AM654 SoC). Driver should request the system controller to get the range
|
|
||||||
of global events and vints assigned to the requesting host. Management
|
|
||||||
of these requested resources should be handled by driver and requests
|
|
||||||
system controller to map specific global event to vint, bit pair.
|
|
||||||
|
|
||||||
Communication between the host processor running an OS and the system
|
|
||||||
controller happens through a protocol called TI System Control Interface
|
|
||||||
(TISCI protocol). For more details refer:
|
|
||||||
Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
|
|
||||||
|
|
||||||
TISCI Interrupt Aggregator Node:
|
|
||||||
-------------------------------
|
|
||||||
- compatible: Must be "ti,sci-inta".
|
|
||||||
- reg: Should contain registers location and length.
|
|
||||||
- interrupt-controller: Identifies the node as an interrupt controller
|
|
||||||
- msi-controller: Identifies the node as an MSI controller.
|
|
||||||
- interrupt-parent: phandle of irq parent.
|
|
||||||
- ti,sci: Phandle to TI-SCI compatible System controller node.
|
|
||||||
- ti,sci-dev-id: TISCI device ID of the Interrupt Aggregator.
|
|
||||||
- ti,sci-rm-range-vint: Array of TISCI subtype ids representing vints(inta
|
|
||||||
outputs) range within this INTA, assigned to the
|
|
||||||
requesting host context.
|
|
||||||
- ti,sci-rm-range-global-event: Array of TISCI subtype ids representing the
|
|
||||||
global events range reaching this IA and are assigned
|
|
||||||
to the requesting host context.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
--------
|
|
||||||
main_udmass_inta: interrupt-controller@33d00000 {
|
|
||||||
compatible = "ti,sci-inta";
|
|
||||||
reg = <0x0 0x33d00000 0x0 0x100000>;
|
|
||||||
interrupt-controller;
|
|
||||||
msi-controller;
|
|
||||||
interrupt-parent = <&main_navss_intr>;
|
|
||||||
ti,sci = <&dmsc>;
|
|
||||||
ti,sci-dev-id = <179>;
|
|
||||||
ti,sci-rm-range-vint = <0x0>;
|
|
||||||
ti,sci-rm-range-global-event = <0x1>;
|
|
||||||
};
|
|
@@ -0,0 +1,98 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/interrupt-controller/ti,sci-inta.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Texas Instruments K3 Interrupt Aggregator
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Lokesh Vutla <lokeshvutla@ti.com>
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/arm/keystone/ti,k3-sci-common.yaml#
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The Interrupt Aggregator (INTA) provides a centralized machine
|
||||||
|
which handles the termination of system events to that they can
|
||||||
|
be coherently processed by the host(s) in the system. A maximum
|
||||||
|
of 64 events can be mapped to a single interrupt.
|
||||||
|
|
||||||
|
Interrupt Aggregator
|
||||||
|
+-----------------------------------------+
|
||||||
|
| Intmap VINT |
|
||||||
|
| +--------------+ +------------+ |
|
||||||
|
m ------>| | vint | bit | | 0 |.....|63| vint0 |
|
||||||
|
. | +--------------+ +------------+ | +------+
|
||||||
|
. | . . | | HOST |
|
||||||
|
Globalevents ------>| . . |----->| IRQ |
|
||||||
|
. | . . | | CTRL |
|
||||||
|
. | . . | +------+
|
||||||
|
n ------>| +--------------+ +------------+ |
|
||||||
|
| | vint | bit | | 0 |.....|63| vintx |
|
||||||
|
| +--------------+ +------------+ |
|
||||||
|
| |
|
||||||
|
+-----------------------------------------+
|
||||||
|
|
||||||
|
Configuration of these Intmap registers that maps global events to vint is
|
||||||
|
done by a system controller (like the Device Memory and Security Controller
|
||||||
|
on AM654 SoC). Driver should request the system controller to get the range
|
||||||
|
of global events and vints assigned to the requesting host. Management
|
||||||
|
of these requested resources should be handled by driver and requests
|
||||||
|
system controller to map specific global event to vint, bit pair.
|
||||||
|
|
||||||
|
Communication between the host processor running an OS and the system
|
||||||
|
controller happens through a protocol called TI System Control Interface
|
||||||
|
(TISCI protocol).
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: ti,sci-inta
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupt-controller: true
|
||||||
|
|
||||||
|
msi-controller: true
|
||||||
|
|
||||||
|
ti,interrupt-ranges:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32-matrix
|
||||||
|
description: |
|
||||||
|
Interrupt ranges that converts the INTA output hw irq numbers
|
||||||
|
to parents's input interrupt numbers.
|
||||||
|
items:
|
||||||
|
items:
|
||||||
|
- description: |
|
||||||
|
"output_irq" specifies the base for inta output irq
|
||||||
|
- description: |
|
||||||
|
"parent's input irq" specifies the base for parent irq
|
||||||
|
- description: |
|
||||||
|
"limit" specifies the limit for translation
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupt-controller
|
||||||
|
- msi-controller
|
||||||
|
- ti,sci
|
||||||
|
- ti,sci-dev-id
|
||||||
|
- ti,interrupt-ranges
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
bus {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
|
||||||
|
main_udmass_inta: msi-controller@33d00000 {
|
||||||
|
compatible = "ti,sci-inta";
|
||||||
|
reg = <0x0 0x33d00000 0x0 0x100000>;
|
||||||
|
interrupt-controller;
|
||||||
|
msi-controller;
|
||||||
|
interrupt-parent = <&main_navss_intr>;
|
||||||
|
ti,sci = <&dmsc>;
|
||||||
|
ti,sci-dev-id = <179>;
|
||||||
|
ti,interrupt-ranges = <0 0 256>;
|
||||||
|
};
|
||||||
|
};
|
@@ -1,82 +0,0 @@
|
|||||||
Texas Instruments K3 Interrupt Router
|
|
||||||
=====================================
|
|
||||||
|
|
||||||
The Interrupt Router (INTR) module provides a mechanism to mux M
|
|
||||||
interrupt inputs to N interrupt outputs, where all M inputs are selectable
|
|
||||||
to be driven per N output. An Interrupt Router can either handle edge triggered
|
|
||||||
or level triggered interrupts and that is fixed in hardware.
|
|
||||||
|
|
||||||
Interrupt Router
|
|
||||||
+----------------------+
|
|
||||||
| Inputs Outputs |
|
|
||||||
+-------+ | +------+ +-----+ |
|
|
||||||
| GPIO |----------->| | irq0 | | 0 | | Host IRQ
|
|
||||||
+-------+ | +------+ +-----+ | controller
|
|
||||||
| . . | +-------+
|
|
||||||
+-------+ | . . |----->| IRQ |
|
|
||||||
| INTA |----------->| . . | +-------+
|
|
||||||
+-------+ | . +-----+ |
|
|
||||||
| +------+ | N | |
|
|
||||||
| | irqM | +-----+ |
|
|
||||||
| +------+ |
|
|
||||||
| |
|
|
||||||
+----------------------+
|
|
||||||
|
|
||||||
There is one register per output (MUXCNTL_N) that controls the selection.
|
|
||||||
Configuration of these MUXCNTL_N registers is done by a system controller
|
|
||||||
(like the Device Memory and Security Controller on K3 AM654 SoC). System
|
|
||||||
controller will keep track of the used and unused registers within the Router.
|
|
||||||
Driver should request the system controller to get the range of GIC IRQs
|
|
||||||
assigned to the requesting hosts. It is the drivers responsibility to keep
|
|
||||||
track of Host IRQs.
|
|
||||||
|
|
||||||
Communication between the host processor running an OS and the system
|
|
||||||
controller happens through a protocol called TI System Control Interface
|
|
||||||
(TISCI protocol). For more details refer:
|
|
||||||
Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
|
|
||||||
|
|
||||||
TISCI Interrupt Router Node:
|
|
||||||
----------------------------
|
|
||||||
Required Properties:
|
|
||||||
- compatible: Must be "ti,sci-intr".
|
|
||||||
- ti,intr-trigger-type: Should be one of the following:
|
|
||||||
1: If intr supports edge triggered interrupts.
|
|
||||||
4: If intr supports level triggered interrupts.
|
|
||||||
- interrupt-controller: Identifies the node as an interrupt controller
|
|
||||||
- #interrupt-cells: Specifies the number of cells needed to encode an
|
|
||||||
interrupt source. The value should be 2.
|
|
||||||
First cell should contain the TISCI device ID of source
|
|
||||||
Second cell should contain the interrupt source offset
|
|
||||||
within the device.
|
|
||||||
- ti,sci: Phandle to TI-SCI compatible System controller node.
|
|
||||||
- ti,sci-dst-id: TISCI device ID of the destination IRQ controller.
|
|
||||||
- ti,sci-rm-range-girq: Array of TISCI subtype ids representing the host irqs
|
|
||||||
assigned to this interrupt router. Each subtype id
|
|
||||||
corresponds to a range of host irqs.
|
|
||||||
|
|
||||||
For more details on TISCI IRQ resource management refer:
|
|
||||||
https://downloads.ti.com/tisci/esd/latest/2_tisci_msgs/rm/rm_irq.html
|
|
||||||
|
|
||||||
Example:
|
|
||||||
--------
|
|
||||||
The following example demonstrates both interrupt router node and the consumer
|
|
||||||
node(main gpio) on the AM654 SoC:
|
|
||||||
|
|
||||||
main_intr: interrupt-controller0 {
|
|
||||||
compatible = "ti,sci-intr";
|
|
||||||
ti,intr-trigger-type = <1>;
|
|
||||||
interrupt-controller;
|
|
||||||
interrupt-parent = <&gic500>;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
ti,sci = <&dmsc>;
|
|
||||||
ti,sci-dst-id = <56>;
|
|
||||||
ti,sci-rm-range-girq = <0x1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
main_gpio0: gpio@600000 {
|
|
||||||
...
|
|
||||||
interrupt-parent = <&main_intr>;
|
|
||||||
interrupts = <57 256>, <57 257>, <57 258>,
|
|
||||||
<57 259>, <57 260>, <57 261>;
|
|
||||||
...
|
|
||||||
};
|
|
@@ -0,0 +1,102 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/interrupt-controller/ti,sci-intr.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Texas Instruments K3 Interrupt Router
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Lokesh Vutla <lokeshvutla@ti.com>
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/arm/keystone/ti,k3-sci-common.yaml#
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The Interrupt Router (INTR) module provides a mechanism to mux M
|
||||||
|
interrupt inputs to N interrupt outputs, where all M inputs are selectable
|
||||||
|
to be driven per N output. An Interrupt Router can either handle edge
|
||||||
|
triggered or level triggered interrupts and that is fixed in hardware.
|
||||||
|
|
||||||
|
Interrupt Router
|
||||||
|
+----------------------+
|
||||||
|
| Inputs Outputs |
|
||||||
|
+-------+ | +------+ +-----+ |
|
||||||
|
| GPIO |----------->| | irq0 | | 0 | | Host IRQ
|
||||||
|
+-------+ | +------+ +-----+ | controller
|
||||||
|
| . . | +-------+
|
||||||
|
+-------+ | . . |----->| IRQ |
|
||||||
|
| INTA |----------->| . . | +-------+
|
||||||
|
+-------+ | . +-----+ |
|
||||||
|
| +------+ | N | |
|
||||||
|
| | irqM | +-----+ |
|
||||||
|
| +------+ |
|
||||||
|
| |
|
||||||
|
+----------------------+
|
||||||
|
|
||||||
|
There is one register per output (MUXCNTL_N) that controls the selection.
|
||||||
|
Configuration of these MUXCNTL_N registers is done by a system controller
|
||||||
|
(like the Device Memory and Security Controller on K3 AM654 SoC). System
|
||||||
|
controller will keep track of the used and unused registers within the Router.
|
||||||
|
Driver should request the system controller to get the range of GIC IRQs
|
||||||
|
assigned to the requesting hosts. It is the drivers responsibility to keep
|
||||||
|
track of Host IRQs.
|
||||||
|
|
||||||
|
Communication between the host processor running an OS and the system
|
||||||
|
controller happens through a protocol called TI System Control Interface
|
||||||
|
(TISCI protocol).
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: ti,sci-intr
|
||||||
|
|
||||||
|
ti,intr-trigger-type:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [1, 4]
|
||||||
|
description: |
|
||||||
|
Should be one of the following.
|
||||||
|
1 = If intr supports edge triggered interrupts.
|
||||||
|
4 = If intr supports level triggered interrupts.
|
||||||
|
|
||||||
|
interrupt-controller: true
|
||||||
|
|
||||||
|
'#interrupt-cells':
|
||||||
|
const: 1
|
||||||
|
description: |
|
||||||
|
The 1st cell should contain interrupt router input hw number.
|
||||||
|
|
||||||
|
ti,interrupt-ranges:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32-matrix
|
||||||
|
description: |
|
||||||
|
Interrupt ranges that converts the INTR output hw irq numbers
|
||||||
|
to parents's input interrupt numbers.
|
||||||
|
items:
|
||||||
|
items:
|
||||||
|
- description: |
|
||||||
|
"output_irq" specifies the base for intr output irq
|
||||||
|
- description: |
|
||||||
|
"parent's input irq" specifies the base for parent irq
|
||||||
|
- description: |
|
||||||
|
"limit" specifies the limit for translation
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- ti,intr-trigger-type
|
||||||
|
- interrupt-controller
|
||||||
|
- '#interrupt-cells'
|
||||||
|
- ti,sci
|
||||||
|
- ti,sci-dev-id
|
||||||
|
- ti,interrupt-ranges
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
main_gpio_intr: interrupt-controller0 {
|
||||||
|
compatible = "ti,sci-intr";
|
||||||
|
ti,intr-trigger-type = <1>;
|
||||||
|
interrupt-controller;
|
||||||
|
interrupt-parent = <&gic500>;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
ti,sci = <&dmsc>;
|
||||||
|
ti,sci-dev-id = <131>;
|
||||||
|
ti,interrupt-ranges = <0 360 32>;
|
||||||
|
};
|
@@ -3,7 +3,7 @@ NVMe Fault Injection
|
|||||||
Linux's fault injection framework provides a systematic way to support
|
Linux's fault injection framework provides a systematic way to support
|
||||||
error injection via debugfs in the /sys/kernel/debug directory. When
|
error injection via debugfs in the /sys/kernel/debug directory. When
|
||||||
enabled, the default NVME_SC_INVALID_OPCODE with no retry will be
|
enabled, the default NVME_SC_INVALID_OPCODE with no retry will be
|
||||||
injected into the nvme_end_request. Users can change the default status
|
injected into the nvme_try_complete_req. Users can change the default status
|
||||||
code and no retry flag via the debugfs. The list of Generic Command
|
code and no retry flag via the debugfs. The list of Generic Command
|
||||||
Status can be found in include/linux/nvme.h
|
Status can be found in include/linux/nvme.h
|
||||||
|
|
||||||
|
@@ -49,16 +49,18 @@ Register preservation rules
|
|||||||
Register preservation rules match the ELF ABI calling sequence with the
|
Register preservation rules match the ELF ABI calling sequence with the
|
||||||
following differences:
|
following differences:
|
||||||
|
|
||||||
=========== ============= ========================================
|
|
||||||
--- For the sc instruction, differences with the ELF ABI ---
|
--- For the sc instruction, differences with the ELF ABI ---
|
||||||
|
=========== ============= ========================================
|
||||||
r0 Volatile (System call number.)
|
r0 Volatile (System call number.)
|
||||||
r3 Volatile (Parameter 1, and return value.)
|
r3 Volatile (Parameter 1, and return value.)
|
||||||
r4-r8 Volatile (Parameters 2-6.)
|
r4-r8 Volatile (Parameters 2-6.)
|
||||||
cr0 Volatile (cr0.SO is the return error condition.)
|
cr0 Volatile (cr0.SO is the return error condition.)
|
||||||
cr1, cr5-7 Nonvolatile
|
cr1, cr5-7 Nonvolatile
|
||||||
lr Nonvolatile
|
lr Nonvolatile
|
||||||
|
=========== ============= ========================================
|
||||||
|
|
||||||
--- For the scv 0 instruction, differences with the ELF ABI ---
|
--- For the scv 0 instruction, differences with the ELF ABI ---
|
||||||
|
=========== ============= ========================================
|
||||||
r0 Volatile (System call number.)
|
r0 Volatile (System call number.)
|
||||||
r3 Volatile (Parameter 1, and return value.)
|
r3 Volatile (Parameter 1, and return value.)
|
||||||
r4-r8 Volatile (Parameters 2-6.)
|
r4-r8 Volatile (Parameters 2-6.)
|
||||||
|
14
MAINTAINERS
14
MAINTAINERS
@@ -3205,6 +3205,7 @@ S: Maintained
|
|||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
||||||
F: block/
|
F: block/
|
||||||
F: drivers/block/
|
F: drivers/block/
|
||||||
|
F: include/linux/blk*
|
||||||
F: kernel/trace/blktrace.c
|
F: kernel/trace/blktrace.c
|
||||||
F: lib/sbitmap.c
|
F: lib/sbitmap.c
|
||||||
|
|
||||||
@@ -17129,8 +17130,8 @@ S: Maintained
|
|||||||
F: Documentation/devicetree/bindings/arm/keystone/ti,k3-sci-common.yaml
|
F: Documentation/devicetree/bindings/arm/keystone/ti,k3-sci-common.yaml
|
||||||
F: Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
|
F: Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
|
||||||
F: Documentation/devicetree/bindings/clock/ti,sci-clk.txt
|
F: Documentation/devicetree/bindings/clock/ti,sci-clk.txt
|
||||||
F: Documentation/devicetree/bindings/interrupt-controller/ti,sci-inta.txt
|
F: Documentation/devicetree/bindings/interrupt-controller/ti,sci-inta.yaml
|
||||||
F: Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.txt
|
F: Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
|
||||||
F: Documentation/devicetree/bindings/reset/ti,sci-reset.txt
|
F: Documentation/devicetree/bindings/reset/ti,sci-reset.txt
|
||||||
F: Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
|
F: Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
|
||||||
F: drivers/clk/keystone/sci-clk.c
|
F: drivers/clk/keystone/sci-clk.c
|
||||||
@@ -18887,6 +18888,15 @@ S: Maintained
|
|||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
|
||||||
F: arch/x86/platform
|
F: arch/x86/platform
|
||||||
|
|
||||||
|
X86 PLATFORM UV HPE SUPERDOME FLEX
|
||||||
|
M: Steve Wahl <steve.wahl@hpe.com>
|
||||||
|
R: Dimitri Sivanich <dimitri.sivanich@hpe.com>
|
||||||
|
R: Russ Anderson <russ.anderson@hpe.com>
|
||||||
|
S: Supported
|
||||||
|
F: arch/x86/include/asm/uv/
|
||||||
|
F: arch/x86/kernel/apic/x2apic_uv_x.c
|
||||||
|
F: arch/x86/platform/uv/
|
||||||
|
|
||||||
X86 VDSO
|
X86 VDSO
|
||||||
M: Andy Lutomirski <luto@kernel.org>
|
M: Andy Lutomirski <luto@kernel.org>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
|
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 9
|
PATCHLEVEL = 9
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc2
|
EXTRAVERSION = -rc3
|
||||||
NAME = Kleptomaniac Octopus
|
NAME = Kleptomaniac Octopus
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@@ -212,7 +212,7 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
|
|||||||
STO_ALPHA_STD_GPLOAD)
|
STO_ALPHA_STD_GPLOAD)
|
||||||
/* Omit the prologue. */
|
/* Omit the prologue. */
|
||||||
value += 8;
|
value += 8;
|
||||||
/* FALLTHRU */
|
fallthrough;
|
||||||
case R_ALPHA_BRADDR:
|
case R_ALPHA_BRADDR:
|
||||||
value -= (u64)location + 4;
|
value -= (u64)location + 4;
|
||||||
if (value & 3)
|
if (value & 3)
|
||||||
|
@@ -453,7 +453,7 @@ syscall_restart(unsigned long r0, unsigned long r19,
|
|||||||
regs->r0 = EINTR;
|
regs->r0 = EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case ERESTARTNOINTR:
|
case ERESTARTNOINTR:
|
||||||
regs->r0 = r0; /* reset v0 and a3 and replay syscall */
|
regs->r0 = r0; /* reset v0 and a3 and replay syscall */
|
||||||
regs->r19 = r19;
|
regs->r19 = r19;
|
||||||
|
@@ -883,7 +883,7 @@ do_entUnaUser(void __user * va, unsigned long opcode,
|
|||||||
|
|
||||||
case 0x26: /* sts */
|
case 0x26: /* sts */
|
||||||
fake_reg = s_reg_to_mem(alpha_read_fp_reg(reg));
|
fake_reg = s_reg_to_mem(alpha_read_fp_reg(reg));
|
||||||
/* FALLTHRU */
|
fallthrough;
|
||||||
|
|
||||||
case 0x2c: /* stl */
|
case 0x2c: /* stl */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@@ -911,7 +911,7 @@ do_entUnaUser(void __user * va, unsigned long opcode,
|
|||||||
|
|
||||||
case 0x27: /* stt */
|
case 0x27: /* stt */
|
||||||
fake_reg = alpha_read_fp_reg(reg);
|
fake_reg = alpha_read_fp_reg(reg);
|
||||||
/* FALLTHRU */
|
fallthrough;
|
||||||
|
|
||||||
case 0x2d: /* stq */
|
case 0x2d: /* stq */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
|
@@ -339,7 +339,7 @@ void __kprobes disasm_instr(unsigned long addr, struct disasm_state *state,
|
|||||||
|
|
||||||
case op_LDWX_S: /* LDWX_S c, [b, u6] */
|
case op_LDWX_S: /* LDWX_S c, [b, u6] */
|
||||||
state->x = 1;
|
state->x = 1;
|
||||||
/* intentional fall-through */
|
fallthrough;
|
||||||
|
|
||||||
case op_LDW_S: /* LDW_S c, [b, u6] */
|
case op_LDW_S: /* LDW_S c, [b, u6] */
|
||||||
state->zz = 2;
|
state->zz = 2;
|
||||||
|
@@ -321,7 +321,7 @@ static void arc_restart_syscall(struct k_sigaction *ka, struct pt_regs *regs)
|
|||||||
regs->r0 = -EINTR;
|
regs->r0 = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
|
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
/*
|
/*
|
||||||
|
@@ -572,7 +572,7 @@ static unsigned long read_pointer(const u8 **pLoc, const void *end,
|
|||||||
#else
|
#else
|
||||||
BUILD_BUG_ON(sizeof(u32) != sizeof(value));
|
BUILD_BUG_ON(sizeof(u32) != sizeof(value));
|
||||||
#endif
|
#endif
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case DW_EH_PE_native:
|
case DW_EH_PE_native:
|
||||||
if (end < (const void *)(ptr.pul + 1))
|
if (end < (const void *)(ptr.pul + 1))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -827,7 +827,7 @@ static int processCFI(const u8 *start, const u8 *end, unsigned long targetLoc,
|
|||||||
case DW_CFA_def_cfa:
|
case DW_CFA_def_cfa:
|
||||||
state->cfa.reg = get_uleb128(&ptr.p8, end);
|
state->cfa.reg = get_uleb128(&ptr.p8, end);
|
||||||
unw_debug("cfa_def_cfa: r%lu ", state->cfa.reg);
|
unw_debug("cfa_def_cfa: r%lu ", state->cfa.reg);
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case DW_CFA_def_cfa_offset:
|
case DW_CFA_def_cfa_offset:
|
||||||
state->cfa.offs = get_uleb128(&ptr.p8, end);
|
state->cfa.offs = get_uleb128(&ptr.p8, end);
|
||||||
unw_debug("cfa_def_cfa_offset: 0x%lx ",
|
unw_debug("cfa_def_cfa_offset: 0x%lx ",
|
||||||
@@ -835,7 +835,7 @@ static int processCFI(const u8 *start, const u8 *end, unsigned long targetLoc,
|
|||||||
break;
|
break;
|
||||||
case DW_CFA_def_cfa_sf:
|
case DW_CFA_def_cfa_sf:
|
||||||
state->cfa.reg = get_uleb128(&ptr.p8, end);
|
state->cfa.reg = get_uleb128(&ptr.p8, end);
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case DW_CFA_def_cfa_offset_sf:
|
case DW_CFA_def_cfa_offset_sf:
|
||||||
state->cfa.offs = get_sleb128(&ptr.p8, end)
|
state->cfa.offs = get_sleb128(&ptr.p8, end)
|
||||||
* state->dataAlign;
|
* state->dataAlign;
|
||||||
|
@@ -547,7 +547,7 @@ static int arch_build_bp_info(struct perf_event *bp,
|
|||||||
if ((hw->ctrl.type != ARM_BREAKPOINT_EXECUTE)
|
if ((hw->ctrl.type != ARM_BREAKPOINT_EXECUTE)
|
||||||
&& max_watchpoint_len >= 8)
|
&& max_watchpoint_len >= 8)
|
||||||
break;
|
break;
|
||||||
/* Else, fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@@ -612,12 +612,12 @@ int hw_breakpoint_arch_parse(struct perf_event *bp,
|
|||||||
/* Allow halfword watchpoints and breakpoints. */
|
/* Allow halfword watchpoints and breakpoints. */
|
||||||
if (hw->ctrl.len == ARM_BREAKPOINT_LEN_2)
|
if (hw->ctrl.len == ARM_BREAKPOINT_LEN_2)
|
||||||
break;
|
break;
|
||||||
/* Else, fall through */
|
fallthrough;
|
||||||
case 3:
|
case 3:
|
||||||
/* Allow single byte watchpoint. */
|
/* Allow single byte watchpoint. */
|
||||||
if (hw->ctrl.len == ARM_BREAKPOINT_LEN_1)
|
if (hw->ctrl.len == ARM_BREAKPOINT_LEN_1)
|
||||||
break;
|
break;
|
||||||
/* Else, fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -884,7 +884,7 @@ static int hw_breakpoint_pending(unsigned long addr, unsigned int fsr,
|
|||||||
break;
|
break;
|
||||||
case ARM_ENTRY_ASYNC_WATCHPOINT:
|
case ARM_ENTRY_ASYNC_WATCHPOINT:
|
||||||
WARN(1, "Asynchronous watchpoint exception taken. Debugging results may be unreliable\n");
|
WARN(1, "Asynchronous watchpoint exception taken. Debugging results may be unreliable\n");
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case ARM_ENTRY_SYNC_WATCHPOINT:
|
case ARM_ENTRY_SYNC_WATCHPOINT:
|
||||||
watchpoint_handler(addr, fsr, regs);
|
watchpoint_handler(addr, fsr, regs);
|
||||||
break;
|
break;
|
||||||
@@ -933,7 +933,7 @@ static bool core_has_os_save_restore(void)
|
|||||||
ARM_DBG_READ(c1, c1, 4, oslsr);
|
ARM_DBG_READ(c1, c1, 4, oslsr);
|
||||||
if (oslsr & ARM_OSLSR_OSLM0)
|
if (oslsr & ARM_OSLSR_OSLM0)
|
||||||
return true;
|
return true;
|
||||||
/* Else, fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -596,7 +596,7 @@ static int do_signal(struct pt_regs *regs, int syscall)
|
|||||||
switch (retval) {
|
switch (retval) {
|
||||||
case -ERESTART_RESTARTBLOCK:
|
case -ERESTART_RESTARTBLOCK:
|
||||||
restart -= 2;
|
restart -= 2;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case -ERESTARTNOHAND:
|
case -ERESTARTNOHAND:
|
||||||
case -ERESTARTSYS:
|
case -ERESTARTSYS:
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
|
@@ -49,7 +49,7 @@ static int crunch_do(struct notifier_block *self, unsigned long cmd, void *t)
|
|||||||
* FALLTHROUGH: Ensure we don't try to overwrite our newly
|
* FALLTHROUGH: Ensure we don't try to overwrite our newly
|
||||||
* initialised state information on the first fault.
|
* initialised state information on the first fault.
|
||||||
*/
|
*/
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
|
|
||||||
case THREAD_NOTIFY_EXIT:
|
case THREAD_NOTIFY_EXIT:
|
||||||
crunch_task_release(thread);
|
crunch_task_release(thread);
|
||||||
|
@@ -123,19 +123,19 @@ void mmp2_pm_enter_lowpower_mode(int state)
|
|||||||
case POWER_MODE_SYS_SLEEP:
|
case POWER_MODE_SYS_SLEEP:
|
||||||
apcr |= MPMU_PCR_PJ_SLPEN; /* set the SLPEN bit */
|
apcr |= MPMU_PCR_PJ_SLPEN; /* set the SLPEN bit */
|
||||||
apcr |= MPMU_PCR_PJ_VCTCXOSD; /* set VCTCXOSD */
|
apcr |= MPMU_PCR_PJ_VCTCXOSD; /* set VCTCXOSD */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_CHIP_SLEEP:
|
case POWER_MODE_CHIP_SLEEP:
|
||||||
apcr |= MPMU_PCR_PJ_SLPEN;
|
apcr |= MPMU_PCR_PJ_SLPEN;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_APPS_SLEEP:
|
case POWER_MODE_APPS_SLEEP:
|
||||||
apcr |= MPMU_PCR_PJ_APBSD; /* set APBSD */
|
apcr |= MPMU_PCR_PJ_APBSD; /* set APBSD */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_APPS_IDLE:
|
case POWER_MODE_APPS_IDLE:
|
||||||
apcr |= MPMU_PCR_PJ_AXISD; /* set AXISDD bit */
|
apcr |= MPMU_PCR_PJ_AXISD; /* set AXISDD bit */
|
||||||
apcr |= MPMU_PCR_PJ_DDRCORSD; /* set DDRCORSD bit */
|
apcr |= MPMU_PCR_PJ_DDRCORSD; /* set DDRCORSD bit */
|
||||||
idle_cfg |= APMU_PJ_IDLE_CFG_PJ_PWRDWN; /* PJ power down */
|
idle_cfg |= APMU_PJ_IDLE_CFG_PJ_PWRDWN; /* PJ power down */
|
||||||
apcr |= MPMU_PCR_PJ_SPSD;
|
apcr |= MPMU_PCR_PJ_SPSD;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_CORE_EXTIDLE:
|
case POWER_MODE_CORE_EXTIDLE:
|
||||||
idle_cfg |= APMU_PJ_IDLE_CFG_PJ_IDLE; /* set the IDLE bit */
|
idle_cfg |= APMU_PJ_IDLE_CFG_PJ_IDLE; /* set the IDLE bit */
|
||||||
idle_cfg &= ~APMU_PJ_IDLE_CFG_ISO_MODE_CNTRL_MASK;
|
idle_cfg &= ~APMU_PJ_IDLE_CFG_ISO_MODE_CNTRL_MASK;
|
||||||
|
@@ -145,23 +145,23 @@ void pxa910_pm_enter_lowpower_mode(int state)
|
|||||||
case POWER_MODE_UDR:
|
case POWER_MODE_UDR:
|
||||||
/* only shutdown APB in UDR */
|
/* only shutdown APB in UDR */
|
||||||
apcr |= MPMU_APCR_STBYEN | MPMU_APCR_APBSD;
|
apcr |= MPMU_APCR_STBYEN | MPMU_APCR_APBSD;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_SYS_SLEEP:
|
case POWER_MODE_SYS_SLEEP:
|
||||||
apcr |= MPMU_APCR_SLPEN; /* set the SLPEN bit */
|
apcr |= MPMU_APCR_SLPEN; /* set the SLPEN bit */
|
||||||
apcr |= MPMU_APCR_VCTCXOSD; /* set VCTCXOSD */
|
apcr |= MPMU_APCR_VCTCXOSD; /* set VCTCXOSD */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_APPS_SLEEP:
|
case POWER_MODE_APPS_SLEEP:
|
||||||
apcr |= MPMU_APCR_DDRCORSD; /* set DDRCORSD */
|
apcr |= MPMU_APCR_DDRCORSD; /* set DDRCORSD */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_APPS_IDLE:
|
case POWER_MODE_APPS_IDLE:
|
||||||
apcr |= MPMU_APCR_AXISD; /* set AXISDD bit */
|
apcr |= MPMU_APCR_AXISD; /* set AXISDD bit */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_CORE_EXTIDLE:
|
case POWER_MODE_CORE_EXTIDLE:
|
||||||
idle_cfg |= APMU_MOH_IDLE_CFG_MOH_IDLE;
|
idle_cfg |= APMU_MOH_IDLE_CFG_MOH_IDLE;
|
||||||
idle_cfg |= APMU_MOH_IDLE_CFG_MOH_PWRDWN;
|
idle_cfg |= APMU_MOH_IDLE_CFG_MOH_PWRDWN;
|
||||||
idle_cfg |= APMU_MOH_IDLE_CFG_MOH_PWR_SW(3)
|
idle_cfg |= APMU_MOH_IDLE_CFG_MOH_PWR_SW(3)
|
||||||
| APMU_MOH_IDLE_CFG_MOH_L2_PWR_SW(3);
|
| APMU_MOH_IDLE_CFG_MOH_L2_PWR_SW(3);
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case POWER_MODE_CORE_INTIDLE:
|
case POWER_MODE_CORE_INTIDLE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -396,7 +396,6 @@ void __init omap3xxx_check_revision(void)
|
|||||||
cpu_rev = "3.1";
|
cpu_rev = "3.1";
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
default:
|
||||||
/* Use the latest known revision as default */
|
/* Use the latest known revision as default */
|
||||||
omap_revision = OMAP3430_REV_ES3_1_2;
|
omap_revision = OMAP3430_REV_ES3_1_2;
|
||||||
@@ -416,7 +415,6 @@ void __init omap3xxx_check_revision(void)
|
|||||||
cpu_rev = "1.0";
|
cpu_rev = "1.0";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
default:
|
||||||
omap_revision = AM35XX_REV_ES1_1;
|
omap_revision = AM35XX_REV_ES1_1;
|
||||||
cpu_rev = "1.1";
|
cpu_rev = "1.1";
|
||||||
@@ -435,7 +433,6 @@ void __init omap3xxx_check_revision(void)
|
|||||||
cpu_rev = "1.1";
|
cpu_rev = "1.1";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
default:
|
||||||
omap_revision = OMAP3630_REV_ES1_2;
|
omap_revision = OMAP3630_REV_ES1_2;
|
||||||
cpu_rev = "1.2";
|
cpu_rev = "1.2";
|
||||||
@@ -456,7 +453,6 @@ void __init omap3xxx_check_revision(void)
|
|||||||
cpu_rev = "2.0";
|
cpu_rev = "2.0";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
default:
|
||||||
omap_revision = TI8168_REV_ES2_1;
|
omap_revision = TI8168_REV_ES2_1;
|
||||||
cpu_rev = "2.1";
|
cpu_rev = "2.1";
|
||||||
@@ -473,7 +469,6 @@ void __init omap3xxx_check_revision(void)
|
|||||||
cpu_rev = "2.0";
|
cpu_rev = "2.0";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
default:
|
||||||
omap_revision = AM335X_REV_ES2_1;
|
omap_revision = AM335X_REV_ES2_1;
|
||||||
cpu_rev = "2.1";
|
cpu_rev = "2.1";
|
||||||
@@ -491,7 +486,6 @@ void __init omap3xxx_check_revision(void)
|
|||||||
cpu_rev = "1.1";
|
cpu_rev = "1.1";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
default:
|
||||||
omap_revision = AM437X_REV_ES1_2;
|
omap_revision = AM437X_REV_ES1_2;
|
||||||
cpu_rev = "1.2";
|
cpu_rev = "1.2";
|
||||||
@@ -502,7 +496,6 @@ void __init omap3xxx_check_revision(void)
|
|||||||
case 0xb968:
|
case 0xb968:
|
||||||
switch (rev) {
|
switch (rev) {
|
||||||
case 0:
|
case 0:
|
||||||
/* FALLTHROUGH */
|
|
||||||
case 1:
|
case 1:
|
||||||
omap_revision = TI8148_REV_ES1_0;
|
omap_revision = TI8148_REV_ES1_0;
|
||||||
cpu_rev = "1.0";
|
cpu_rev = "1.0";
|
||||||
@@ -512,7 +505,6 @@ void __init omap3xxx_check_revision(void)
|
|||||||
cpu_rev = "2.0";
|
cpu_rev = "2.0";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
default:
|
||||||
omap_revision = TI8148_REV_ES2_1;
|
omap_revision = TI8148_REV_ES2_1;
|
||||||
cpu_rev = "2.1";
|
cpu_rev = "2.1";
|
||||||
|
@@ -240,7 +240,7 @@ static int _omap_device_notifier_call(struct notifier_block *nb,
|
|||||||
if (pdev->dev.of_node)
|
if (pdev->dev.of_node)
|
||||||
omap_device_build_from_dt(pdev);
|
omap_device_build_from_dt(pdev);
|
||||||
omap_auxdata_legacy_init(dev);
|
omap_auxdata_legacy_init(dev);
|
||||||
/* fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
od = to_omap_device(pdev);
|
od = to_omap_device(pdev);
|
||||||
if (od)
|
if (od)
|
||||||
|
@@ -298,11 +298,7 @@ static void omap3_pm_idle(void)
|
|||||||
if (omap_irq_pending())
|
if (omap_irq_pending())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
trace_cpu_idle_rcuidle(1, smp_processor_id());
|
|
||||||
|
|
||||||
omap_sram_idle();
|
omap_sram_idle();
|
||||||
|
|
||||||
trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SUSPEND
|
#ifdef CONFIG_SUSPEND
|
||||||
|
@@ -624,7 +624,7 @@ static void __init dns323_init(void)
|
|||||||
dns323ab_leds[0].active_low = 1;
|
dns323ab_leds[0].active_low = 1;
|
||||||
gpio_request(DNS323_GPIO_LED_POWER1, "Power Led Enable");
|
gpio_request(DNS323_GPIO_LED_POWER1, "Power Led Enable");
|
||||||
gpio_direction_output(DNS323_GPIO_LED_POWER1, 0);
|
gpio_direction_output(DNS323_GPIO_LED_POWER1, 0);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case DNS323_REV_B1:
|
case DNS323_REV_B1:
|
||||||
i2c_register_board_info(0, dns323ab_i2c_devices,
|
i2c_register_board_info(0, dns323ab_i2c_devices,
|
||||||
ARRAY_SIZE(dns323ab_i2c_devices));
|
ARRAY_SIZE(dns323ab_i2c_devices));
|
||||||
|
@@ -46,7 +46,7 @@ static int __init parse_tag_acorn(const struct tag *tag)
|
|||||||
switch (tag->u.acorn.vram_pages) {
|
switch (tag->u.acorn.vram_pages) {
|
||||||
case 512:
|
case 512:
|
||||||
vram_size += PAGE_SIZE * 256;
|
vram_size += PAGE_SIZE * 256;
|
||||||
/* Fall through - ??? */
|
fallthrough; /* ??? */
|
||||||
case 256:
|
case 256:
|
||||||
vram_size += PAGE_SIZE * 256;
|
vram_size += PAGE_SIZE * 256;
|
||||||
default:
|
default:
|
||||||
|
@@ -70,7 +70,7 @@ static void __init tegra_cpu_reset_handler_enable(void)
|
|||||||
switch (err) {
|
switch (err) {
|
||||||
case -ENOSYS:
|
case -ENOSYS:
|
||||||
tegra_cpu_reset_handler_set(reset_address);
|
tegra_cpu_reset_handler_set(reset_address);
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case 0:
|
case 0:
|
||||||
is_enabled = true;
|
is_enabled = true;
|
||||||
break;
|
break;
|
||||||
|
@@ -694,7 +694,7 @@ thumb2arm(u16 tinstr)
|
|||||||
return subset[(L<<1) | ((tinstr & (1<<8)) >> 8)] |
|
return subset[(L<<1) | ((tinstr & (1<<8)) >> 8)] |
|
||||||
(tinstr & 255); /* register_list */
|
(tinstr & 255); /* register_list */
|
||||||
}
|
}
|
||||||
/* Else, fall through - for illegal instruction case */
|
fallthrough; /* for illegal instruction case */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return BAD_INSTR;
|
return BAD_INSTR;
|
||||||
@@ -750,7 +750,7 @@ do_alignment_t32_to_handler(u32 *pinstr, struct pt_regs *regs,
|
|||||||
case 0xe8e0:
|
case 0xe8e0:
|
||||||
case 0xe9e0:
|
case 0xe9e0:
|
||||||
poffset->un = (tinst2 & 0xff) << 2;
|
poffset->un = (tinst2 & 0xff) << 2;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
|
|
||||||
case 0xe940:
|
case 0xe940:
|
||||||
case 0xe9c0:
|
case 0xe9c0:
|
||||||
|
@@ -71,7 +71,7 @@ static void cpu_v7_spectre_init(void)
|
|||||||
/* Other ARM CPUs require no workaround */
|
/* Other ARM CPUs require no workaround */
|
||||||
if (read_cpuid_implementor() == ARM_CPU_IMP_ARM)
|
if (read_cpuid_implementor() == ARM_CPU_IMP_ARM)
|
||||||
break;
|
break;
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
/* Cortex A57/A72 require firmware workaround */
|
/* Cortex A57/A72 require firmware workaround */
|
||||||
case ARM_CPU_PART_CORTEX_A57:
|
case ARM_CPU_PART_CORTEX_A57:
|
||||||
case ARM_CPU_PART_CORTEX_A72: {
|
case ARM_CPU_PART_CORTEX_A72: {
|
||||||
|
@@ -309,14 +309,14 @@ void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)
|
|||||||
* not supported by current hardware on OMAP1
|
* not supported by current hardware on OMAP1
|
||||||
* w |= (0x03 << 7);
|
* w |= (0x03 << 7);
|
||||||
*/
|
*/
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case OMAP_DMA_DATA_BURST_16:
|
case OMAP_DMA_DATA_BURST_16:
|
||||||
if (dma_omap2plus()) {
|
if (dma_omap2plus()) {
|
||||||
burst = 0x3;
|
burst = 0x3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* OMAP1 don't support burst 16 */
|
/* OMAP1 don't support burst 16 */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
@@ -393,7 +393,7 @@ void omap_set_dma_dest_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* OMAP1 don't support burst 16 */
|
/* OMAP1 don't support burst 16 */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "Invalid DMA burst mode\n");
|
printk(KERN_ERR "Invalid DMA burst mode\n");
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -307,7 +307,7 @@ static bool __kprobes decode_regs(probes_opcode_t *pinsn, u32 regs, bool modify)
|
|||||||
case REG_TYPE_NOPCWB:
|
case REG_TYPE_NOPCWB:
|
||||||
if (!is_writeback(insn))
|
if (!is_writeback(insn))
|
||||||
break; /* No writeback, so any register is OK */
|
break; /* No writeback, so any register is OK */
|
||||||
/* fall through... */
|
fallthrough;
|
||||||
case REG_TYPE_NOPC:
|
case REG_TYPE_NOPC:
|
||||||
case REG_TYPE_NOPCX:
|
case REG_TYPE_NOPCX:
|
||||||
/* Reject PC (R15) */
|
/* Reject PC (R15) */
|
||||||
|
@@ -280,7 +280,7 @@ void __kprobes kprobe_handler(struct pt_regs *regs)
|
|||||||
/* A nested probe was hit in FIQ, it is a BUG */
|
/* A nested probe was hit in FIQ, it is a BUG */
|
||||||
pr_warn("Unrecoverable kprobe detected.\n");
|
pr_warn("Unrecoverable kprobe detected.\n");
|
||||||
dump_kprobe(p);
|
dump_kprobe(p);
|
||||||
/* fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
/* impossible cases */
|
/* impossible cases */
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -82,8 +82,8 @@ endif
|
|||||||
# compiler to generate them and consequently to break the single image contract
|
# compiler to generate them and consequently to break the single image contract
|
||||||
# we pass it only to the assembler. This option is utilized only in case of non
|
# we pass it only to the assembler. This option is utilized only in case of non
|
||||||
# integrated assemblers.
|
# integrated assemblers.
|
||||||
ifneq ($(CONFIG_AS_HAS_ARMV8_4), y)
|
ifeq ($(CONFIG_AS_HAS_PAC), y)
|
||||||
branch-prot-flags-$(CONFIG_AS_HAS_PAC) += -Wa,-march=armv8.3-a
|
asm-arch := armv8.3-a
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -91,7 +91,12 @@ KBUILD_CFLAGS += $(branch-prot-flags-y)
|
|||||||
|
|
||||||
ifeq ($(CONFIG_AS_HAS_ARMV8_4), y)
|
ifeq ($(CONFIG_AS_HAS_ARMV8_4), y)
|
||||||
# make sure to pass the newest target architecture to -march.
|
# make sure to pass the newest target architecture to -march.
|
||||||
KBUILD_CFLAGS += -Wa,-march=armv8.4-a
|
asm-arch := armv8.4-a
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef asm-arch
|
||||||
|
KBUILD_CFLAGS += -Wa,-march=$(asm-arch) \
|
||||||
|
-DARM64_ASM_ARCH='"$(asm-arch)"'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_SHADOW_CALL_STACK), y)
|
ifeq ($(CONFIG_SHADOW_CALL_STACK), y)
|
||||||
@@ -165,7 +170,8 @@ zinstall install:
|
|||||||
PHONY += vdso_install
|
PHONY += vdso_install
|
||||||
vdso_install:
|
vdso_install:
|
||||||
$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso $@
|
$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso $@
|
||||||
$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso32 $@
|
$(if $(CONFIG_COMPAT_VDSO), \
|
||||||
|
$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso32 $@)
|
||||||
|
|
||||||
# We use MRPROPER_FILES and CLEAN_FILES now
|
# We use MRPROPER_FILES and CLEAN_FILES now
|
||||||
archclean:
|
archclean:
|
||||||
|
@@ -417,10 +417,10 @@
|
|||||||
ti,intr-trigger-type = <1>;
|
ti,intr-trigger-type = <1>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
interrupt-parent = <&gic500>;
|
interrupt-parent = <&gic500>;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <1>;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dst-id = <56>;
|
ti,sci-dev-id = <100>;
|
||||||
ti,sci-rm-range-girq = <0x1>;
|
ti,interrupt-ranges = <0 392 32>;
|
||||||
};
|
};
|
||||||
|
|
||||||
main_navss {
|
main_navss {
|
||||||
@@ -438,10 +438,11 @@
|
|||||||
ti,intr-trigger-type = <4>;
|
ti,intr-trigger-type = <4>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
interrupt-parent = <&gic500>;
|
interrupt-parent = <&gic500>;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <1>;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dst-id = <56>;
|
ti,sci-dev-id = <182>;
|
||||||
ti,sci-rm-range-girq = <0x0>, <0x2>;
|
ti,interrupt-ranges = <0 64 64>,
|
||||||
|
<64 448 64>;
|
||||||
};
|
};
|
||||||
|
|
||||||
inta_main_udmass: interrupt-controller@33d00000 {
|
inta_main_udmass: interrupt-controller@33d00000 {
|
||||||
@@ -452,8 +453,7 @@
|
|||||||
msi-controller;
|
msi-controller;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dev-id = <179>;
|
ti,sci-dev-id = <179>;
|
||||||
ti,sci-rm-range-vint = <0x0>;
|
ti,interrupt-ranges = <0 0 256>;
|
||||||
ti,sci-rm-range-global-event = <0x1>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
secure_proxy_main: mailbox@32c00000 {
|
secure_proxy_main: mailbox@32c00000 {
|
||||||
@@ -589,7 +589,7 @@
|
|||||||
<0x0 0x33000000 0x0 0x40000>;
|
<0x0 0x33000000 0x0 0x40000>;
|
||||||
reg-names = "rt", "fifos", "proxy_gcfg", "proxy_target";
|
reg-names = "rt", "fifos", "proxy_gcfg", "proxy_target";
|
||||||
ti,num-rings = <818>;
|
ti,num-rings = <818>;
|
||||||
ti,sci-rm-range-gp-rings = <0x2>; /* GP ring range */
|
ti,sci-rm-range-gp-rings = <0x1>; /* GP ring range */
|
||||||
ti,dma-ring-reset-quirk;
|
ti,dma-ring-reset-quirk;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dev-id = <187>;
|
ti,sci-dev-id = <187>;
|
||||||
@@ -609,11 +609,11 @@
|
|||||||
ti,sci-dev-id = <188>;
|
ti,sci-dev-id = <188>;
|
||||||
ti,ringacc = <&ringacc>;
|
ti,ringacc = <&ringacc>;
|
||||||
|
|
||||||
ti,sci-rm-range-tchan = <0x1>, /* TX_HCHAN */
|
ti,sci-rm-range-tchan = <0xf>, /* TX_HCHAN */
|
||||||
<0x2>; /* TX_CHAN */
|
<0xd>; /* TX_CHAN */
|
||||||
ti,sci-rm-range-rchan = <0x4>, /* RX_HCHAN */
|
ti,sci-rm-range-rchan = <0xb>, /* RX_HCHAN */
|
||||||
<0x5>; /* RX_CHAN */
|
<0xa>; /* RX_CHAN */
|
||||||
ti,sci-rm-range-rflow = <0x6>; /* GP RFLOW */
|
ti,sci-rm-range-rflow = <0x0>; /* GP RFLOW */
|
||||||
};
|
};
|
||||||
|
|
||||||
cpts@310d0000 {
|
cpts@310d0000 {
|
||||||
@@ -622,7 +622,7 @@
|
|||||||
reg-names = "cpts";
|
reg-names = "cpts";
|
||||||
clocks = <&main_cpts_mux>;
|
clocks = <&main_cpts_mux>;
|
||||||
clock-names = "cpts";
|
clock-names = "cpts";
|
||||||
interrupts-extended = <&intr_main_navss 163 0>;
|
interrupts-extended = <&intr_main_navss 391>;
|
||||||
interrupt-names = "cpts";
|
interrupt-names = "cpts";
|
||||||
ti,cpts-periodic-outputs = <6>;
|
ti,cpts-periodic-outputs = <6>;
|
||||||
ti,cpts-ext-ts-inputs = <8>;
|
ti,cpts-ext-ts-inputs = <8>;
|
||||||
@@ -645,8 +645,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&intr_main_gpio>;
|
interrupt-parent = <&intr_main_gpio>;
|
||||||
interrupts = <57 256>, <57 257>, <57 258>, <57 259>, <57 260>,
|
interrupts = <192>, <193>, <194>, <195>, <196>, <197>;
|
||||||
<57 261>;
|
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <96>;
|
ti,ngpio = <96>;
|
||||||
@@ -661,8 +660,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&intr_main_gpio>;
|
interrupt-parent = <&intr_main_gpio>;
|
||||||
interrupts = <58 256>, <58 257>, <58 258>, <58 259>, <58 260>,
|
interrupts = <200>, <201>, <202>, <203>, <204>, <205>;
|
||||||
<58 261>;
|
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <90>;
|
ti,ngpio = <90>;
|
||||||
|
@@ -134,7 +134,7 @@
|
|||||||
<0x0 0x2a500000 0x0 0x40000>;
|
<0x0 0x2a500000 0x0 0x40000>;
|
||||||
reg-names = "rt", "fifos", "proxy_gcfg", "proxy_target";
|
reg-names = "rt", "fifos", "proxy_gcfg", "proxy_target";
|
||||||
ti,num-rings = <286>;
|
ti,num-rings = <286>;
|
||||||
ti,sci-rm-range-gp-rings = <0x2>; /* GP ring range */
|
ti,sci-rm-range-gp-rings = <0x1>; /* GP ring range */
|
||||||
ti,dma-ring-reset-quirk;
|
ti,dma-ring-reset-quirk;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dev-id = <195>;
|
ti,sci-dev-id = <195>;
|
||||||
@@ -154,11 +154,11 @@
|
|||||||
ti,sci-dev-id = <194>;
|
ti,sci-dev-id = <194>;
|
||||||
ti,ringacc = <&mcu_ringacc>;
|
ti,ringacc = <&mcu_ringacc>;
|
||||||
|
|
||||||
ti,sci-rm-range-tchan = <0x1>, /* TX_HCHAN */
|
ti,sci-rm-range-tchan = <0xf>, /* TX_HCHAN */
|
||||||
<0x2>; /* TX_CHAN */
|
<0xd>; /* TX_CHAN */
|
||||||
ti,sci-rm-range-rchan = <0x3>, /* RX_HCHAN */
|
ti,sci-rm-range-rchan = <0xb>, /* RX_HCHAN */
|
||||||
<0x4>; /* RX_CHAN */
|
<0xa>; /* RX_CHAN */
|
||||||
ti,sci-rm-range-rflow = <0x5>; /* GP RFLOW */
|
ti,sci-rm-range-rflow = <0x0>; /* GP RFLOW */
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -74,10 +74,10 @@
|
|||||||
ti,intr-trigger-type = <1>;
|
ti,intr-trigger-type = <1>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
interrupt-parent = <&gic500>;
|
interrupt-parent = <&gic500>;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <1>;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dst-id = <56>;
|
ti,sci-dev-id = <156>;
|
||||||
ti,sci-rm-range-girq = <0x4>;
|
ti,interrupt-ranges = <0 712 16>;
|
||||||
};
|
};
|
||||||
|
|
||||||
wkup_gpio0: wkup_gpio0@42110000 {
|
wkup_gpio0: wkup_gpio0@42110000 {
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&intr_wkup_gpio>;
|
interrupt-parent = <&intr_wkup_gpio>;
|
||||||
interrupts = <59 128>, <59 129>, <59 130>, <59 131>;
|
interrupts = <60>, <61>, <62>, <63>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <56>;
|
ti,ngpio = <56>;
|
||||||
|
@@ -384,7 +384,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&mailbox0_cluster0 {
|
&mailbox0_cluster0 {
|
||||||
interrupts = <164 0>;
|
interrupts = <436>;
|
||||||
|
|
||||||
mbox_mcu_r5fss0_core0: mbox-mcu-r5fss0-core0 {
|
mbox_mcu_r5fss0_core0: mbox-mcu-r5fss0-core0 {
|
||||||
ti,mbox-tx = <1 0 0>;
|
ti,mbox-tx = <1 0 0>;
|
||||||
@@ -393,7 +393,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&mailbox0_cluster1 {
|
&mailbox0_cluster1 {
|
||||||
interrupts = <165 0>;
|
interrupts = <432>;
|
||||||
|
|
||||||
mbox_mcu_r5fss0_core1: mbox-mcu-r5fss0-core1 {
|
mbox_mcu_r5fss0_core1: mbox-mcu-r5fss0-core1 {
|
||||||
ti,mbox-tx = <1 0 0>;
|
ti,mbox-tx = <1 0 0>;
|
||||||
|
@@ -287,7 +287,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&mailbox0_cluster0 {
|
&mailbox0_cluster0 {
|
||||||
interrupts = <214 0>;
|
interrupts = <436>;
|
||||||
|
|
||||||
mbox_mcu_r5fss0_core0: mbox-mcu-r5fss0-core0 {
|
mbox_mcu_r5fss0_core0: mbox-mcu-r5fss0-core0 {
|
||||||
ti,mbox-rx = <0 0 0>;
|
ti,mbox-rx = <0 0 0>;
|
||||||
@@ -301,7 +301,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&mailbox0_cluster1 {
|
&mailbox0_cluster1 {
|
||||||
interrupts = <215 0>;
|
interrupts = <432>;
|
||||||
|
|
||||||
mbox_main_r5fss0_core0: mbox-main-r5fss0-core0 {
|
mbox_main_r5fss0_core0: mbox-main-r5fss0-core0 {
|
||||||
ti,mbox-rx = <0 0 0>;
|
ti,mbox-rx = <0 0 0>;
|
||||||
@@ -315,7 +315,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&mailbox0_cluster2 {
|
&mailbox0_cluster2 {
|
||||||
interrupts = <216 0>;
|
interrupts = <428>;
|
||||||
|
|
||||||
mbox_main_r5fss1_core0: mbox-main-r5fss1-core0 {
|
mbox_main_r5fss1_core0: mbox-main-r5fss1-core0 {
|
||||||
ti,mbox-rx = <0 0 0>;
|
ti,mbox-rx = <0 0 0>;
|
||||||
@@ -329,7 +329,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&mailbox0_cluster3 {
|
&mailbox0_cluster3 {
|
||||||
interrupts = <217 0>;
|
interrupts = <424>;
|
||||||
|
|
||||||
mbox_c66_0: mbox-c66-0 {
|
mbox_c66_0: mbox-c66-0 {
|
||||||
ti,mbox-rx = <0 0 0>;
|
ti,mbox-rx = <0 0 0>;
|
||||||
@@ -343,7 +343,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&mailbox0_cluster4 {
|
&mailbox0_cluster4 {
|
||||||
interrupts = <218 0>;
|
interrupts = <420>;
|
||||||
|
|
||||||
mbox_c71_0: mbox-c71-0 {
|
mbox_c71_0: mbox-c71-0 {
|
||||||
ti,mbox-rx = <0 0 0>;
|
ti,mbox-rx = <0 0 0>;
|
||||||
|
@@ -80,10 +80,10 @@
|
|||||||
ti,intr-trigger-type = <1>;
|
ti,intr-trigger-type = <1>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
interrupt-parent = <&gic500>;
|
interrupt-parent = <&gic500>;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <1>;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dst-id = <14>;
|
ti,sci-dev-id = <131>;
|
||||||
ti,sci-rm-range-girq = <0x1>;
|
ti,interrupt-ranges = <8 392 56>;
|
||||||
};
|
};
|
||||||
|
|
||||||
main_navss {
|
main_navss {
|
||||||
@@ -101,10 +101,12 @@
|
|||||||
ti,intr-trigger-type = <4>;
|
ti,intr-trigger-type = <4>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
interrupt-parent = <&gic500>;
|
interrupt-parent = <&gic500>;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <1>;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dst-id = <14>;
|
ti,sci-dev-id = <213>;
|
||||||
ti,sci-rm-range-girq = <0>, <2>;
|
ti,interrupt-ranges = <0 64 64>,
|
||||||
|
<64 448 64>,
|
||||||
|
<128 672 64>;
|
||||||
};
|
};
|
||||||
|
|
||||||
main_udmass_inta: interrupt-controller@33d00000 {
|
main_udmass_inta: interrupt-controller@33d00000 {
|
||||||
@@ -115,8 +117,7 @@
|
|||||||
msi-controller;
|
msi-controller;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dev-id = <209>;
|
ti,sci-dev-id = <209>;
|
||||||
ti,sci-rm-range-vint = <0xa>;
|
ti,interrupt-ranges = <0 0 256>;
|
||||||
ti,sci-rm-range-global-event = <0xd>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
secure_proxy_main: mailbox@32c00000 {
|
secure_proxy_main: mailbox@32c00000 {
|
||||||
@@ -296,7 +297,7 @@
|
|||||||
reg-names = "cpts";
|
reg-names = "cpts";
|
||||||
clocks = <&k3_clks 201 1>;
|
clocks = <&k3_clks 201 1>;
|
||||||
clock-names = "cpts";
|
clock-names = "cpts";
|
||||||
interrupts-extended = <&main_navss_intr 201 0>;
|
interrupts-extended = <&main_navss_intr 391>;
|
||||||
interrupt-names = "cpts";
|
interrupt-names = "cpts";
|
||||||
ti,cpts-periodic-outputs = <6>;
|
ti,cpts-periodic-outputs = <6>;
|
||||||
ti,cpts-ext-ts-inputs = <8>;
|
ti,cpts-ext-ts-inputs = <8>;
|
||||||
@@ -688,8 +689,8 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&main_gpio_intr>;
|
interrupt-parent = <&main_gpio_intr>;
|
||||||
interrupts = <105 0>, <105 1>, <105 2>, <105 3>,
|
interrupts = <256>, <257>, <258>, <259>,
|
||||||
<105 4>, <105 5>, <105 6>, <105 7>;
|
<260>, <261>, <262>, <263>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <128>;
|
ti,ngpio = <128>;
|
||||||
@@ -705,7 +706,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&main_gpio_intr>;
|
interrupt-parent = <&main_gpio_intr>;
|
||||||
interrupts = <106 0>, <106 1>, <106 2>;
|
interrupts = <288>, <289>, <290>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <36>;
|
ti,ngpio = <36>;
|
||||||
@@ -721,8 +722,8 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&main_gpio_intr>;
|
interrupt-parent = <&main_gpio_intr>;
|
||||||
interrupts = <107 0>, <107 1>, <107 2>, <107 3>,
|
interrupts = <264>, <265>, <266>, <267>,
|
||||||
<107 4>, <107 5>, <107 6>, <107 7>;
|
<268>, <269>, <270>, <271>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <128>;
|
ti,ngpio = <128>;
|
||||||
@@ -738,7 +739,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&main_gpio_intr>;
|
interrupt-parent = <&main_gpio_intr>;
|
||||||
interrupts = <108 0>, <108 1>, <108 2>;
|
interrupts = <292>, <293>, <294>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <36>;
|
ti,ngpio = <36>;
|
||||||
@@ -754,8 +755,8 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&main_gpio_intr>;
|
interrupt-parent = <&main_gpio_intr>;
|
||||||
interrupts = <109 0>, <109 1>, <109 2>, <109 3>,
|
interrupts = <272>, <273>, <274>, <275>,
|
||||||
<109 4>, <109 5>, <109 6>, <109 7>;
|
<276>, <277>, <278>, <279>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <128>;
|
ti,ngpio = <128>;
|
||||||
@@ -771,7 +772,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&main_gpio_intr>;
|
interrupt-parent = <&main_gpio_intr>;
|
||||||
interrupts = <110 0>, <110 1>, <110 2>;
|
interrupts = <296>, <297>, <298>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <36>;
|
ti,ngpio = <36>;
|
||||||
@@ -787,8 +788,8 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&main_gpio_intr>;
|
interrupt-parent = <&main_gpio_intr>;
|
||||||
interrupts = <111 0>, <111 1>, <111 2>, <111 3>,
|
interrupts = <280>, <281>, <282>, <283>,
|
||||||
<111 4>, <111 5>, <111 6>, <111 7>;
|
<284>, <285>, <286>, <287>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <128>;
|
ti,ngpio = <128>;
|
||||||
@@ -804,7 +805,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&main_gpio_intr>;
|
interrupt-parent = <&main_gpio_intr>;
|
||||||
interrupts = <112 0>, <112 1>, <112 2>;
|
interrupts = <300>, <301>, <302>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <36>;
|
ti,ngpio = <36>;
|
||||||
|
@@ -101,10 +101,10 @@
|
|||||||
ti,intr-trigger-type = <1>;
|
ti,intr-trigger-type = <1>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
interrupt-parent = <&gic500>;
|
interrupt-parent = <&gic500>;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <1>;
|
||||||
ti,sci = <&dmsc>;
|
ti,sci = <&dmsc>;
|
||||||
ti,sci-dst-id = <14>;
|
ti,sci-dev-id = <137>;
|
||||||
ti,sci-rm-range-girq = <0x5>;
|
ti,interrupt-ranges = <16 960 16>;
|
||||||
};
|
};
|
||||||
|
|
||||||
wkup_gpio0: gpio@42110000 {
|
wkup_gpio0: gpio@42110000 {
|
||||||
@@ -113,8 +113,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&wkup_gpio_intr>;
|
interrupt-parent = <&wkup_gpio_intr>;
|
||||||
interrupts = <113 0>, <113 1>, <113 2>,
|
interrupts = <103>, <104>, <105>, <106>, <107>, <108>;
|
||||||
<113 3>, <113 4>, <113 5>;
|
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <84>;
|
ti,ngpio = <84>;
|
||||||
@@ -130,8 +129,7 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
interrupt-parent = <&wkup_gpio_intr>;
|
interrupt-parent = <&wkup_gpio_intr>;
|
||||||
interrupts = <114 0>, <114 1>, <114 2>,
|
interrupts = <112>, <113>, <114>, <115>, <116>, <117>;
|
||||||
<114 3>, <114 4>, <114 5>;
|
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
ti,ngpio = <84>;
|
ti,ngpio = <84>;
|
||||||
|
@@ -2,6 +2,12 @@
|
|||||||
#ifndef __ASM_COMPILER_H
|
#ifndef __ASM_COMPILER_H
|
||||||
#define __ASM_COMPILER_H
|
#define __ASM_COMPILER_H
|
||||||
|
|
||||||
|
#ifdef ARM64_ASM_ARCH
|
||||||
|
#define ARM64_ASM_PREAMBLE ".arch " ARM64_ASM_ARCH "\n"
|
||||||
|
#else
|
||||||
|
#define ARM64_ASM_PREAMBLE
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The EL0/EL1 pointer bits used by a pointer authentication code.
|
* The EL0/EL1 pointer bits used by a pointer authentication code.
|
||||||
* This is dependent on TBI0/TBI1 being enabled, or bits 63:56 would also apply.
|
* This is dependent on TBI0/TBI1 being enabled, or bits 63:56 would also apply.
|
||||||
|
@@ -95,6 +95,11 @@ static inline int arch_irqs_disabled_flags(unsigned long flags)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int arch_irqs_disabled(void)
|
||||||
|
{
|
||||||
|
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned long arch_local_irq_save(void)
|
static inline unsigned long arch_local_irq_save(void)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@@ -71,11 +71,12 @@
|
|||||||
* IMO: Override CPSR.I and enable signaling with VI
|
* IMO: Override CPSR.I and enable signaling with VI
|
||||||
* FMO: Override CPSR.F and enable signaling with VF
|
* FMO: Override CPSR.F and enable signaling with VF
|
||||||
* SWIO: Turn set/way invalidates into set/way clean+invalidate
|
* SWIO: Turn set/way invalidates into set/way clean+invalidate
|
||||||
|
* PTW: Take a stage2 fault if a stage1 walk steps in device memory
|
||||||
*/
|
*/
|
||||||
#define HCR_GUEST_FLAGS (HCR_TSC | HCR_TSW | HCR_TWE | HCR_TWI | HCR_VM | \
|
#define HCR_GUEST_FLAGS (HCR_TSC | HCR_TSW | HCR_TWE | HCR_TWI | HCR_VM | \
|
||||||
HCR_BSU_IS | HCR_FB | HCR_TAC | \
|
HCR_BSU_IS | HCR_FB | HCR_TAC | \
|
||||||
HCR_AMO | HCR_SWIO | HCR_TIDCP | HCR_RW | HCR_TLOR | \
|
HCR_AMO | HCR_SWIO | HCR_TIDCP | HCR_RW | HCR_TLOR | \
|
||||||
HCR_FMO | HCR_IMO)
|
HCR_FMO | HCR_IMO | HCR_PTW )
|
||||||
#define HCR_VIRT_EXCP_MASK (HCR_VSE | HCR_VI | HCR_VF)
|
#define HCR_VIRT_EXCP_MASK (HCR_VSE | HCR_VI | HCR_VF)
|
||||||
#define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK)
|
#define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK)
|
||||||
#define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)
|
#define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)
|
||||||
|
@@ -169,6 +169,34 @@ extern char __smccc_workaround_1_smc[__SMCCC_WORKAROUND_1_SMC_SZ];
|
|||||||
*__hyp_this_cpu_ptr(sym); \
|
*__hyp_this_cpu_ptr(sym); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define __KVM_EXTABLE(from, to) \
|
||||||
|
" .pushsection __kvm_ex_table, \"a\"\n" \
|
||||||
|
" .align 3\n" \
|
||||||
|
" .long (" #from " - .), (" #to " - .)\n" \
|
||||||
|
" .popsection\n"
|
||||||
|
|
||||||
|
|
||||||
|
#define __kvm_at(at_op, addr) \
|
||||||
|
( { \
|
||||||
|
int __kvm_at_err = 0; \
|
||||||
|
u64 spsr, elr; \
|
||||||
|
asm volatile( \
|
||||||
|
" mrs %1, spsr_el2\n" \
|
||||||
|
" mrs %2, elr_el2\n" \
|
||||||
|
"1: at "at_op", %3\n" \
|
||||||
|
" isb\n" \
|
||||||
|
" b 9f\n" \
|
||||||
|
"2: msr spsr_el2, %1\n" \
|
||||||
|
" msr elr_el2, %2\n" \
|
||||||
|
" mov %w0, %4\n" \
|
||||||
|
"9:\n" \
|
||||||
|
__KVM_EXTABLE(1b, 2b) \
|
||||||
|
: "+r" (__kvm_at_err), "=&r" (spsr), "=&r" (elr) \
|
||||||
|
: "r" (addr), "i" (-EFAULT)); \
|
||||||
|
__kvm_at_err; \
|
||||||
|
} )
|
||||||
|
|
||||||
|
|
||||||
#else /* __ASSEMBLY__ */
|
#else /* __ASSEMBLY__ */
|
||||||
|
|
||||||
.macro hyp_adr_this_cpu reg, sym, tmp
|
.macro hyp_adr_this_cpu reg, sym, tmp
|
||||||
@@ -193,6 +221,21 @@ extern char __smccc_workaround_1_smc[__SMCCC_WORKAROUND_1_SMC_SZ];
|
|||||||
ldr \vcpu, [\ctxt, #HOST_CONTEXT_VCPU]
|
ldr \vcpu, [\ctxt, #HOST_CONTEXT_VCPU]
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
/*
|
||||||
|
* KVM extable for unexpected exceptions.
|
||||||
|
* In the same format _asm_extable, but output to a different section so that
|
||||||
|
* it can be mapped to EL2. The KVM version is not sorted. The caller must
|
||||||
|
* ensure:
|
||||||
|
* x18 has the hypervisor value to allow any Shadow-Call-Stack instrumented
|
||||||
|
* code to write to it, and that SPSR_EL2 and ELR_EL2 are restored by the fixup.
|
||||||
|
*/
|
||||||
|
.macro _kvm_extable, from, to
|
||||||
|
.pushsection __kvm_ex_table, "a"
|
||||||
|
.align 3
|
||||||
|
.long (\from - .), (\to - .)
|
||||||
|
.popsection
|
||||||
|
.endm
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ARM_KVM_ASM_H__ */
|
#endif /* __ARM_KVM_ASM_H__ */
|
||||||
|
@@ -28,14 +28,16 @@
|
|||||||
* not. The macros handles invoking the asm with or without the
|
* not. The macros handles invoking the asm with or without the
|
||||||
* register argument as appropriate.
|
* register argument as appropriate.
|
||||||
*/
|
*/
|
||||||
#define __TLBI_0(op, arg) asm ("tlbi " #op "\n" \
|
#define __TLBI_0(op, arg) asm (ARM64_ASM_PREAMBLE \
|
||||||
|
"tlbi " #op "\n" \
|
||||||
ALTERNATIVE("nop\n nop", \
|
ALTERNATIVE("nop\n nop", \
|
||||||
"dsb ish\n tlbi " #op, \
|
"dsb ish\n tlbi " #op, \
|
||||||
ARM64_WORKAROUND_REPEAT_TLBI, \
|
ARM64_WORKAROUND_REPEAT_TLBI, \
|
||||||
CONFIG_ARM64_WORKAROUND_REPEAT_TLBI) \
|
CONFIG_ARM64_WORKAROUND_REPEAT_TLBI) \
|
||||||
: : )
|
: : )
|
||||||
|
|
||||||
#define __TLBI_1(op, arg) asm ("tlbi " #op ", %0\n" \
|
#define __TLBI_1(op, arg) asm (ARM64_ASM_PREAMBLE \
|
||||||
|
"tlbi " #op ", %0\n" \
|
||||||
ALTERNATIVE("nop\n nop", \
|
ALTERNATIVE("nop\n nop", \
|
||||||
"dsb ish\n tlbi " #op ", %0", \
|
"dsb ish\n tlbi " #op ", %0", \
|
||||||
ARM64_WORKAROUND_REPEAT_TLBI, \
|
ARM64_WORKAROUND_REPEAT_TLBI, \
|
||||||
|
@@ -322,7 +322,7 @@ void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
|
|||||||
*/
|
*/
|
||||||
if (memblock_is_map_memory(phys))
|
if (memblock_is_map_memory(phys))
|
||||||
return (void __iomem *)__phys_to_virt(phys);
|
return (void __iomem *)__phys_to_virt(phys);
|
||||||
/* fall through */
|
fallthrough;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (region->attribute & EFI_MEMORY_WB)
|
if (region->attribute & EFI_MEMORY_WB)
|
||||||
|
@@ -686,7 +686,7 @@ static s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new,
|
|||||||
case FTR_HIGHER_OR_ZERO_SAFE:
|
case FTR_HIGHER_OR_ZERO_SAFE:
|
||||||
if (!cur || !new)
|
if (!cur || !new)
|
||||||
break;
|
break;
|
||||||
/* Fallthrough */
|
fallthrough;
|
||||||
case FTR_HIGHER_SAFE:
|
case FTR_HIGHER_SAFE:
|
||||||
ret = new > cur ? new : cur;
|
ret = new > cur ? new : cur;
|
||||||
break;
|
break;
|
||||||
|
@@ -327,7 +327,6 @@ static void cpuinfo_detect_icache_policy(struct cpuinfo_arm64 *info)
|
|||||||
set_bit(ICACHEF_VPIPT, &__icache_flags);
|
set_bit(ICACHEF_VPIPT, &__icache_flags);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Fallthrough */
|
|
||||||
case ICACHE_POLICY_VIPT:
|
case ICACHE_POLICY_VIPT:
|
||||||
/* Assume aliasing */
|
/* Assume aliasing */
|
||||||
set_bit(ICACHEF_ALIASING, &__icache_flags);
|
set_bit(ICACHEF_ALIASING, &__icache_flags);
|
||||||
|
@@ -257,7 +257,7 @@ static int hw_breakpoint_control(struct perf_event *bp,
|
|||||||
* level.
|
* level.
|
||||||
*/
|
*/
|
||||||
enable_debug_monitors(dbg_el);
|
enable_debug_monitors(dbg_el);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case HW_BREAKPOINT_RESTORE:
|
case HW_BREAKPOINT_RESTORE:
|
||||||
/* Setup the address register. */
|
/* Setup the address register. */
|
||||||
write_wb_reg(val_reg, i, info->address);
|
write_wb_reg(val_reg, i, info->address);
|
||||||
@@ -541,13 +541,13 @@ int hw_breakpoint_arch_parse(struct perf_event *bp,
|
|||||||
if (hw->ctrl.len == ARM_BREAKPOINT_LEN_2)
|
if (hw->ctrl.len == ARM_BREAKPOINT_LEN_2)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Fallthrough */
|
fallthrough;
|
||||||
case 3:
|
case 3:
|
||||||
/* Allow single byte watchpoint. */
|
/* Allow single byte watchpoint. */
|
||||||
if (hw->ctrl.len == ARM_BREAKPOINT_LEN_1)
|
if (hw->ctrl.len == ARM_BREAKPOINT_LEN_1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Fallthrough */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@@ -103,6 +103,10 @@ KVM_NVHE_ALIAS(vgic_v3_cpuif_trap);
|
|||||||
KVM_NVHE_ALIAS(gic_pmr_sync);
|
KVM_NVHE_ALIAS(gic_pmr_sync);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* EL2 exception handling */
|
||||||
|
KVM_NVHE_ALIAS(__start___kvm_ex_table);
|
||||||
|
KVM_NVHE_ALIAS(__stop___kvm_ex_table);
|
||||||
|
|
||||||
#endif /* CONFIG_KVM */
|
#endif /* CONFIG_KVM */
|
||||||
|
|
||||||
#endif /* __ARM64_KERNEL_IMAGE_VARS_H */
|
#endif /* __ARM64_KERNEL_IMAGE_VARS_H */
|
||||||
|
@@ -315,21 +315,21 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
|||||||
/* MOVW instruction relocations. */
|
/* MOVW instruction relocations. */
|
||||||
case R_AARCH64_MOVW_UABS_G0_NC:
|
case R_AARCH64_MOVW_UABS_G0_NC:
|
||||||
overflow_check = false;
|
overflow_check = false;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case R_AARCH64_MOVW_UABS_G0:
|
case R_AARCH64_MOVW_UABS_G0:
|
||||||
ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 0,
|
ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 0,
|
||||||
AARCH64_INSN_IMM_MOVKZ);
|
AARCH64_INSN_IMM_MOVKZ);
|
||||||
break;
|
break;
|
||||||
case R_AARCH64_MOVW_UABS_G1_NC:
|
case R_AARCH64_MOVW_UABS_G1_NC:
|
||||||
overflow_check = false;
|
overflow_check = false;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case R_AARCH64_MOVW_UABS_G1:
|
case R_AARCH64_MOVW_UABS_G1:
|
||||||
ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 16,
|
ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 16,
|
||||||
AARCH64_INSN_IMM_MOVKZ);
|
AARCH64_INSN_IMM_MOVKZ);
|
||||||
break;
|
break;
|
||||||
case R_AARCH64_MOVW_UABS_G2_NC:
|
case R_AARCH64_MOVW_UABS_G2_NC:
|
||||||
overflow_check = false;
|
overflow_check = false;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case R_AARCH64_MOVW_UABS_G2:
|
case R_AARCH64_MOVW_UABS_G2:
|
||||||
ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 32,
|
ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 32,
|
||||||
AARCH64_INSN_IMM_MOVKZ);
|
AARCH64_INSN_IMM_MOVKZ);
|
||||||
@@ -397,7 +397,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
|||||||
break;
|
break;
|
||||||
case R_AARCH64_ADR_PREL_PG_HI21_NC:
|
case R_AARCH64_ADR_PREL_PG_HI21_NC:
|
||||||
overflow_check = false;
|
overflow_check = false;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case R_AARCH64_ADR_PREL_PG_HI21:
|
case R_AARCH64_ADR_PREL_PG_HI21:
|
||||||
ovf = reloc_insn_adrp(me, sechdrs, loc, val);
|
ovf = reloc_insn_adrp(me, sechdrs, loc, val);
|
||||||
if (ovf && ovf != -ERANGE)
|
if (ovf && ovf != -ERANGE)
|
||||||
|
@@ -123,10 +123,8 @@ void arch_cpu_idle(void)
|
|||||||
* This should do all the clock switching and wait for interrupt
|
* This should do all the clock switching and wait for interrupt
|
||||||
* tricks
|
* tricks
|
||||||
*/
|
*/
|
||||||
trace_cpu_idle_rcuidle(1, smp_processor_id());
|
|
||||||
cpu_do_idle();
|
cpu_do_idle();
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
@@ -151,7 +151,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pr_crit("CPU%u: may not have shut down cleanly\n", cpu);
|
pr_crit("CPU%u: may not have shut down cleanly\n", cpu);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case CPU_STUCK_IN_KERNEL:
|
case CPU_STUCK_IN_KERNEL:
|
||||||
pr_crit("CPU%u: is stuck in kernel\n", cpu);
|
pr_crit("CPU%u: is stuck in kernel\n", cpu);
|
||||||
if (status & CPU_STUCK_REASON_52_BIT_VA)
|
if (status & CPU_STUCK_REASON_52_BIT_VA)
|
||||||
|
@@ -20,6 +20,13 @@ ENTRY(_text)
|
|||||||
|
|
||||||
jiffies = jiffies_64;
|
jiffies = jiffies_64;
|
||||||
|
|
||||||
|
|
||||||
|
#define HYPERVISOR_EXTABLE \
|
||||||
|
. = ALIGN(SZ_8); \
|
||||||
|
__start___kvm_ex_table = .; \
|
||||||
|
*(__kvm_ex_table) \
|
||||||
|
__stop___kvm_ex_table = .;
|
||||||
|
|
||||||
#define HYPERVISOR_TEXT \
|
#define HYPERVISOR_TEXT \
|
||||||
/* \
|
/* \
|
||||||
* Align to 4 KB so that \
|
* Align to 4 KB so that \
|
||||||
@@ -35,6 +42,7 @@ jiffies = jiffies_64;
|
|||||||
__hyp_idmap_text_end = .; \
|
__hyp_idmap_text_end = .; \
|
||||||
__hyp_text_start = .; \
|
__hyp_text_start = .; \
|
||||||
*(.hyp.text) \
|
*(.hyp.text) \
|
||||||
|
HYPERVISOR_EXTABLE \
|
||||||
__hyp_text_end = .;
|
__hyp_text_end = .;
|
||||||
|
|
||||||
#define IDMAP_TEXT \
|
#define IDMAP_TEXT \
|
||||||
|
@@ -128,7 +128,7 @@ static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu)
|
|||||||
switch (ESR_ELx_EC(esr)) {
|
switch (ESR_ELx_EC(esr)) {
|
||||||
case ESR_ELx_EC_WATCHPT_LOW:
|
case ESR_ELx_EC_WATCHPT_LOW:
|
||||||
run->debug.arch.far = vcpu->arch.fault.far_el2;
|
run->debug.arch.far = vcpu->arch.fault.far_el2;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case ESR_ELx_EC_SOFTSTP_LOW:
|
case ESR_ELx_EC_SOFTSTP_LOW:
|
||||||
case ESR_ELx_EC_BREAKPT_LOW:
|
case ESR_ELx_EC_BREAKPT_LOW:
|
||||||
case ESR_ELx_EC_BKPT32:
|
case ESR_ELx_EC_BKPT32:
|
||||||
|
@@ -196,20 +196,23 @@ alternative_endif
|
|||||||
// This is our single instruction exception window. A pending
|
// This is our single instruction exception window. A pending
|
||||||
// SError is guaranteed to occur at the earliest when we unmask
|
// SError is guaranteed to occur at the earliest when we unmask
|
||||||
// it, and at the latest just after the ISB.
|
// it, and at the latest just after the ISB.
|
||||||
.global abort_guest_exit_start
|
|
||||||
abort_guest_exit_start:
|
abort_guest_exit_start:
|
||||||
|
|
||||||
isb
|
isb
|
||||||
|
|
||||||
.global abort_guest_exit_end
|
|
||||||
abort_guest_exit_end:
|
abort_guest_exit_end:
|
||||||
|
|
||||||
msr daifset, #4 // Mask aborts
|
msr daifset, #4 // Mask aborts
|
||||||
|
ret
|
||||||
|
|
||||||
// If the exception took place, restore the EL1 exception
|
_kvm_extable abort_guest_exit_start, 9997f
|
||||||
// context so that we can report some information.
|
_kvm_extable abort_guest_exit_end, 9997f
|
||||||
// Merge the exception code with the SError pending bit.
|
9997:
|
||||||
tbz x0, #ARM_EXIT_WITH_SERROR_BIT, 1f
|
msr daifset, #4 // Mask aborts
|
||||||
|
mov x0, #(1 << ARM_EXIT_WITH_SERROR_BIT)
|
||||||
|
|
||||||
|
// restore the EL1 exception context so that we can report some
|
||||||
|
// information. Merge the exception code with the SError pending bit.
|
||||||
msr elr_el2, x2
|
msr elr_el2, x2
|
||||||
msr esr_el2, x3
|
msr esr_el2, x3
|
||||||
msr spsr_el2, x4
|
msr spsr_el2, x4
|
||||||
|
@@ -15,6 +15,30 @@
|
|||||||
#include <asm/kvm_mmu.h>
|
#include <asm/kvm_mmu.h>
|
||||||
#include <asm/mmu.h>
|
#include <asm/mmu.h>
|
||||||
|
|
||||||
|
.macro save_caller_saved_regs_vect
|
||||||
|
/* x0 and x1 were saved in the vector entry */
|
||||||
|
stp x2, x3, [sp, #-16]!
|
||||||
|
stp x4, x5, [sp, #-16]!
|
||||||
|
stp x6, x7, [sp, #-16]!
|
||||||
|
stp x8, x9, [sp, #-16]!
|
||||||
|
stp x10, x11, [sp, #-16]!
|
||||||
|
stp x12, x13, [sp, #-16]!
|
||||||
|
stp x14, x15, [sp, #-16]!
|
||||||
|
stp x16, x17, [sp, #-16]!
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro restore_caller_saved_regs_vect
|
||||||
|
ldp x16, x17, [sp], #16
|
||||||
|
ldp x14, x15, [sp], #16
|
||||||
|
ldp x12, x13, [sp], #16
|
||||||
|
ldp x10, x11, [sp], #16
|
||||||
|
ldp x8, x9, [sp], #16
|
||||||
|
ldp x6, x7, [sp], #16
|
||||||
|
ldp x4, x5, [sp], #16
|
||||||
|
ldp x2, x3, [sp], #16
|
||||||
|
ldp x0, x1, [sp], #16
|
||||||
|
.endm
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
.macro do_el2_call
|
.macro do_el2_call
|
||||||
@@ -143,13 +167,19 @@ el1_error:
|
|||||||
b __guest_exit
|
b __guest_exit
|
||||||
|
|
||||||
el2_sync:
|
el2_sync:
|
||||||
/* Check for illegal exception return, otherwise panic */
|
/* Check for illegal exception return */
|
||||||
mrs x0, spsr_el2
|
mrs x0, spsr_el2
|
||||||
|
tbnz x0, #20, 1f
|
||||||
|
|
||||||
/* if this was something else, then panic! */
|
save_caller_saved_regs_vect
|
||||||
tst x0, #PSR_IL_BIT
|
stp x29, x30, [sp, #-16]!
|
||||||
b.eq __hyp_panic
|
bl kvm_unexpected_el2_exception
|
||||||
|
ldp x29, x30, [sp], #16
|
||||||
|
restore_caller_saved_regs_vect
|
||||||
|
|
||||||
|
eret
|
||||||
|
|
||||||
|
1:
|
||||||
/* Let's attempt a recovery from the illegal exception return */
|
/* Let's attempt a recovery from the illegal exception return */
|
||||||
get_vcpu_ptr x1, x0
|
get_vcpu_ptr x1, x0
|
||||||
mov x0, #ARM_EXCEPTION_IL
|
mov x0, #ARM_EXCEPTION_IL
|
||||||
@@ -157,27 +187,14 @@ el2_sync:
|
|||||||
|
|
||||||
|
|
||||||
el2_error:
|
el2_error:
|
||||||
ldp x0, x1, [sp], #16
|
save_caller_saved_regs_vect
|
||||||
|
stp x29, x30, [sp, #-16]!
|
||||||
|
|
||||||
|
bl kvm_unexpected_el2_exception
|
||||||
|
|
||||||
|
ldp x29, x30, [sp], #16
|
||||||
|
restore_caller_saved_regs_vect
|
||||||
|
|
||||||
/*
|
|
||||||
* Only two possibilities:
|
|
||||||
* 1) Either we come from the exit path, having just unmasked
|
|
||||||
* PSTATE.A: change the return code to an EL2 fault, and
|
|
||||||
* carry on, as we're already in a sane state to handle it.
|
|
||||||
* 2) Or we come from anywhere else, and that's a bug: we panic.
|
|
||||||
*
|
|
||||||
* For (1), x0 contains the original return code and x1 doesn't
|
|
||||||
* contain anything meaningful at that stage. We can reuse them
|
|
||||||
* as temp registers.
|
|
||||||
* For (2), who cares?
|
|
||||||
*/
|
|
||||||
mrs x0, elr_el2
|
|
||||||
adr x1, abort_guest_exit_start
|
|
||||||
cmp x0, x1
|
|
||||||
adr x1, abort_guest_exit_end
|
|
||||||
ccmp x0, x1, #4, ne
|
|
||||||
b.ne __hyp_panic
|
|
||||||
mov x0, #(1 << ARM_EXIT_WITH_SERROR_BIT)
|
|
||||||
eret
|
eret
|
||||||
sb
|
sb
|
||||||
|
|
||||||
|
@@ -21,70 +21,70 @@
|
|||||||
#define save_debug(ptr,reg,nr) \
|
#define save_debug(ptr,reg,nr) \
|
||||||
switch (nr) { \
|
switch (nr) { \
|
||||||
case 15: ptr[15] = read_debug(reg, 15); \
|
case 15: ptr[15] = read_debug(reg, 15); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 14: ptr[14] = read_debug(reg, 14); \
|
case 14: ptr[14] = read_debug(reg, 14); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 13: ptr[13] = read_debug(reg, 13); \
|
case 13: ptr[13] = read_debug(reg, 13); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 12: ptr[12] = read_debug(reg, 12); \
|
case 12: ptr[12] = read_debug(reg, 12); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 11: ptr[11] = read_debug(reg, 11); \
|
case 11: ptr[11] = read_debug(reg, 11); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 10: ptr[10] = read_debug(reg, 10); \
|
case 10: ptr[10] = read_debug(reg, 10); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 9: ptr[9] = read_debug(reg, 9); \
|
case 9: ptr[9] = read_debug(reg, 9); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 8: ptr[8] = read_debug(reg, 8); \
|
case 8: ptr[8] = read_debug(reg, 8); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 7: ptr[7] = read_debug(reg, 7); \
|
case 7: ptr[7] = read_debug(reg, 7); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 6: ptr[6] = read_debug(reg, 6); \
|
case 6: ptr[6] = read_debug(reg, 6); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 5: ptr[5] = read_debug(reg, 5); \
|
case 5: ptr[5] = read_debug(reg, 5); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 4: ptr[4] = read_debug(reg, 4); \
|
case 4: ptr[4] = read_debug(reg, 4); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 3: ptr[3] = read_debug(reg, 3); \
|
case 3: ptr[3] = read_debug(reg, 3); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 2: ptr[2] = read_debug(reg, 2); \
|
case 2: ptr[2] = read_debug(reg, 2); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 1: ptr[1] = read_debug(reg, 1); \
|
case 1: ptr[1] = read_debug(reg, 1); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
default: ptr[0] = read_debug(reg, 0); \
|
default: ptr[0] = read_debug(reg, 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define restore_debug(ptr,reg,nr) \
|
#define restore_debug(ptr,reg,nr) \
|
||||||
switch (nr) { \
|
switch (nr) { \
|
||||||
case 15: write_debug(ptr[15], reg, 15); \
|
case 15: write_debug(ptr[15], reg, 15); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 14: write_debug(ptr[14], reg, 14); \
|
case 14: write_debug(ptr[14], reg, 14); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 13: write_debug(ptr[13], reg, 13); \
|
case 13: write_debug(ptr[13], reg, 13); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 12: write_debug(ptr[12], reg, 12); \
|
case 12: write_debug(ptr[12], reg, 12); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 11: write_debug(ptr[11], reg, 11); \
|
case 11: write_debug(ptr[11], reg, 11); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 10: write_debug(ptr[10], reg, 10); \
|
case 10: write_debug(ptr[10], reg, 10); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 9: write_debug(ptr[9], reg, 9); \
|
case 9: write_debug(ptr[9], reg, 9); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 8: write_debug(ptr[8], reg, 8); \
|
case 8: write_debug(ptr[8], reg, 8); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 7: write_debug(ptr[7], reg, 7); \
|
case 7: write_debug(ptr[7], reg, 7); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 6: write_debug(ptr[6], reg, 6); \
|
case 6: write_debug(ptr[6], reg, 6); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 5: write_debug(ptr[5], reg, 5); \
|
case 5: write_debug(ptr[5], reg, 5); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 4: write_debug(ptr[4], reg, 4); \
|
case 4: write_debug(ptr[4], reg, 4); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 3: write_debug(ptr[3], reg, 3); \
|
case 3: write_debug(ptr[3], reg, 3); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 2: write_debug(ptr[2], reg, 2); \
|
case 2: write_debug(ptr[2], reg, 2); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
case 1: write_debug(ptr[1], reg, 1); \
|
case 1: write_debug(ptr[1], reg, 1); \
|
||||||
/* Fall through */ \
|
fallthrough; \
|
||||||
default: write_debug(ptr[0], reg, 0); \
|
default: write_debug(ptr[0], reg, 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include <asm/barrier.h>
|
#include <asm/barrier.h>
|
||||||
#include <asm/cpufeature.h>
|
#include <asm/cpufeature.h>
|
||||||
|
#include <asm/extable.h>
|
||||||
#include <asm/kprobes.h>
|
#include <asm/kprobes.h>
|
||||||
#include <asm/kvm_asm.h>
|
#include <asm/kvm_asm.h>
|
||||||
#include <asm/kvm_emulate.h>
|
#include <asm/kvm_emulate.h>
|
||||||
@@ -29,6 +30,9 @@
|
|||||||
|
|
||||||
extern const char __hyp_panic_string[];
|
extern const char __hyp_panic_string[];
|
||||||
|
|
||||||
|
extern struct exception_table_entry __start___kvm_ex_table;
|
||||||
|
extern struct exception_table_entry __stop___kvm_ex_table;
|
||||||
|
|
||||||
/* Check whether the FP regs were dirtied while in the host-side run loop: */
|
/* Check whether the FP regs were dirtied while in the host-side run loop: */
|
||||||
static inline bool update_fp_enabled(struct kvm_vcpu *vcpu)
|
static inline bool update_fp_enabled(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
@@ -142,10 +146,10 @@ static inline bool __translate_far_to_hpfar(u64 far, u64 *hpfar)
|
|||||||
* saved the guest context yet, and we may return early...
|
* saved the guest context yet, and we may return early...
|
||||||
*/
|
*/
|
||||||
par = read_sysreg(par_el1);
|
par = read_sysreg(par_el1);
|
||||||
asm volatile("at s1e1r, %0" : : "r" (far));
|
if (!__kvm_at("s1e1r", far))
|
||||||
isb();
|
tmp = read_sysreg(par_el1);
|
||||||
|
else
|
||||||
tmp = read_sysreg(par_el1);
|
tmp = SYS_PAR_EL1_F; /* back to the guest */
|
||||||
write_sysreg(par, par_el1);
|
write_sysreg(par, par_el1);
|
||||||
|
|
||||||
if (unlikely(tmp & SYS_PAR_EL1_F))
|
if (unlikely(tmp & SYS_PAR_EL1_F))
|
||||||
@@ -508,4 +512,31 @@ static inline void __set_host_arch_workaround_state(struct kvm_vcpu *vcpu)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void __kvm_unexpected_el2_exception(void)
|
||||||
|
{
|
||||||
|
unsigned long addr, fixup;
|
||||||
|
struct kvm_cpu_context *host_ctxt;
|
||||||
|
struct exception_table_entry *entry, *end;
|
||||||
|
unsigned long elr_el2 = read_sysreg(elr_el2);
|
||||||
|
|
||||||
|
entry = hyp_symbol_addr(__start___kvm_ex_table);
|
||||||
|
end = hyp_symbol_addr(__stop___kvm_ex_table);
|
||||||
|
host_ctxt = &__hyp_this_cpu_ptr(kvm_host_data)->host_ctxt;
|
||||||
|
|
||||||
|
while (entry < end) {
|
||||||
|
addr = (unsigned long)&entry->insn + entry->insn;
|
||||||
|
fixup = (unsigned long)&entry->fixup + entry->fixup;
|
||||||
|
|
||||||
|
if (addr != elr_el2) {
|
||||||
|
entry++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
write_sysreg(fixup, elr_el2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hyp_panic(host_ctxt);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __ARM64_KVM_HYP_SWITCH_H__ */
|
#endif /* __ARM64_KVM_HYP_SWITCH_H__ */
|
||||||
|
@@ -270,3 +270,8 @@ void __noreturn hyp_panic(struct kvm_cpu_context *host_ctxt)
|
|||||||
read_sysreg(hpfar_el2), par, vcpu);
|
read_sysreg(hpfar_el2), par, vcpu);
|
||||||
unreachable();
|
unreachable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asmlinkage void kvm_unexpected_el2_exception(void)
|
||||||
|
{
|
||||||
|
return __kvm_unexpected_el2_exception();
|
||||||
|
}
|
||||||
|
@@ -340,10 +340,10 @@ void __vgic_v3_save_aprs(struct vgic_v3_cpu_if *cpu_if)
|
|||||||
case 7:
|
case 7:
|
||||||
cpu_if->vgic_ap0r[3] = __vgic_v3_read_ap0rn(3);
|
cpu_if->vgic_ap0r[3] = __vgic_v3_read_ap0rn(3);
|
||||||
cpu_if->vgic_ap0r[2] = __vgic_v3_read_ap0rn(2);
|
cpu_if->vgic_ap0r[2] = __vgic_v3_read_ap0rn(2);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case 6:
|
case 6:
|
||||||
cpu_if->vgic_ap0r[1] = __vgic_v3_read_ap0rn(1);
|
cpu_if->vgic_ap0r[1] = __vgic_v3_read_ap0rn(1);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
cpu_if->vgic_ap0r[0] = __vgic_v3_read_ap0rn(0);
|
cpu_if->vgic_ap0r[0] = __vgic_v3_read_ap0rn(0);
|
||||||
}
|
}
|
||||||
@@ -352,10 +352,10 @@ void __vgic_v3_save_aprs(struct vgic_v3_cpu_if *cpu_if)
|
|||||||
case 7:
|
case 7:
|
||||||
cpu_if->vgic_ap1r[3] = __vgic_v3_read_ap1rn(3);
|
cpu_if->vgic_ap1r[3] = __vgic_v3_read_ap1rn(3);
|
||||||
cpu_if->vgic_ap1r[2] = __vgic_v3_read_ap1rn(2);
|
cpu_if->vgic_ap1r[2] = __vgic_v3_read_ap1rn(2);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case 6:
|
case 6:
|
||||||
cpu_if->vgic_ap1r[1] = __vgic_v3_read_ap1rn(1);
|
cpu_if->vgic_ap1r[1] = __vgic_v3_read_ap1rn(1);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
cpu_if->vgic_ap1r[0] = __vgic_v3_read_ap1rn(0);
|
cpu_if->vgic_ap1r[0] = __vgic_v3_read_ap1rn(0);
|
||||||
}
|
}
|
||||||
@@ -373,10 +373,10 @@ void __vgic_v3_restore_aprs(struct vgic_v3_cpu_if *cpu_if)
|
|||||||
case 7:
|
case 7:
|
||||||
__vgic_v3_write_ap0rn(cpu_if->vgic_ap0r[3], 3);
|
__vgic_v3_write_ap0rn(cpu_if->vgic_ap0r[3], 3);
|
||||||
__vgic_v3_write_ap0rn(cpu_if->vgic_ap0r[2], 2);
|
__vgic_v3_write_ap0rn(cpu_if->vgic_ap0r[2], 2);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case 6:
|
case 6:
|
||||||
__vgic_v3_write_ap0rn(cpu_if->vgic_ap0r[1], 1);
|
__vgic_v3_write_ap0rn(cpu_if->vgic_ap0r[1], 1);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
__vgic_v3_write_ap0rn(cpu_if->vgic_ap0r[0], 0);
|
__vgic_v3_write_ap0rn(cpu_if->vgic_ap0r[0], 0);
|
||||||
}
|
}
|
||||||
@@ -385,10 +385,10 @@ void __vgic_v3_restore_aprs(struct vgic_v3_cpu_if *cpu_if)
|
|||||||
case 7:
|
case 7:
|
||||||
__vgic_v3_write_ap1rn(cpu_if->vgic_ap1r[3], 3);
|
__vgic_v3_write_ap1rn(cpu_if->vgic_ap1r[3], 3);
|
||||||
__vgic_v3_write_ap1rn(cpu_if->vgic_ap1r[2], 2);
|
__vgic_v3_write_ap1rn(cpu_if->vgic_ap1r[2], 2);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case 6:
|
case 6:
|
||||||
__vgic_v3_write_ap1rn(cpu_if->vgic_ap1r[1], 1);
|
__vgic_v3_write_ap1rn(cpu_if->vgic_ap1r[1], 1);
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
__vgic_v3_write_ap1rn(cpu_if->vgic_ap1r[0], 0);
|
__vgic_v3_write_ap1rn(cpu_if->vgic_ap1r[0], 0);
|
||||||
}
|
}
|
||||||
|
@@ -217,3 +217,8 @@ void __noreturn hyp_panic(struct kvm_cpu_context *host_ctxt)
|
|||||||
__hyp_call_panic(spsr, elr, par, host_ctxt);
|
__hyp_call_panic(spsr, elr, par, host_ctxt);
|
||||||
unreachable();
|
unreachable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asmlinkage void kvm_unexpected_el2_exception(void)
|
||||||
|
{
|
||||||
|
return __kvm_unexpected_el2_exception();
|
||||||
|
}
|
||||||
|
@@ -45,7 +45,7 @@ static u32 get_cpu_asid_bits(void)
|
|||||||
default:
|
default:
|
||||||
pr_warn("CPU%d: Unknown ASID size (%d); assuming 8-bit\n",
|
pr_warn("CPU%d: Unknown ASID size (%d); assuming 8-bit\n",
|
||||||
smp_processor_id(), fld);
|
smp_processor_id(), fld);
|
||||||
/* Fallthrough */
|
fallthrough;
|
||||||
case 0:
|
case 0:
|
||||||
asid = 8;
|
asid = 8;
|
||||||
break;
|
break;
|
||||||
|
@@ -220,7 +220,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
|
|||||||
regs->a4 = -EINTR;
|
regs->a4 = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
do_restart:
|
do_restart:
|
||||||
regs->a4 = regs->orig_a4;
|
regs->a4 = regs->orig_a4;
|
||||||
@@ -252,7 +252,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
regs->a4 = regs->orig_a4;
|
regs->a4 = regs->orig_a4;
|
||||||
regs->pc -= 4;
|
regs->pc -= 4;
|
||||||
|
@@ -194,7 +194,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
|||||||
regs->a0 = -EINTR;
|
regs->a0 = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
regs->a0 = regs->orig_a0;
|
regs->a0 = regs->orig_a0;
|
||||||
regs->pc -= TRAP0_SIZE;
|
regs->pc -= TRAP0_SIZE;
|
||||||
|
@@ -227,7 +227,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka)
|
|||||||
regs->er0 = -EINTR;
|
regs->er0 = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
do_restart:
|
do_restart:
|
||||||
regs->er0 = regs->orig_er0;
|
regs->er0 = regs->orig_er0;
|
||||||
|
@@ -120,7 +120,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
|
|||||||
}
|
}
|
||||||
case R_HEXAGON_HI16:
|
case R_HEXAGON_HI16:
|
||||||
value = (value>>16) & 0xffff;
|
value = (value>>16) & 0xffff;
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case R_HEXAGON_LO16:
|
case R_HEXAGON_LO16:
|
||||||
*location &= ~0x00c03fff;
|
*location &= ~0x00c03fff;
|
||||||
*location |= value & 0x3fff;
|
*location |= value & 0x3fff;
|
||||||
|
@@ -155,7 +155,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
|||||||
regs->r00 = -EINTR;
|
regs->r00 = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
regs->r06 = regs->syscall_nr;
|
regs->r06 = regs->syscall_nr;
|
||||||
pt_set_elr(regs, pt_elr(regs) - 4);
|
pt_set_elr(regs, pt_elr(regs) - 4);
|
||||||
|
@@ -163,7 +163,7 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
|
|||||||
case DIE_INIT_MONARCH_LEAVE:
|
case DIE_INIT_MONARCH_LEAVE:
|
||||||
if (!kdump_freeze_monarch)
|
if (!kdump_freeze_monarch)
|
||||||
break;
|
break;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case DIE_INIT_SLAVE_LEAVE:
|
case DIE_INIT_SLAVE_LEAVE:
|
||||||
case DIE_INIT_MONARCH_ENTER:
|
case DIE_INIT_MONARCH_ENTER:
|
||||||
case DIE_MCA_RENDZVOUS_LEAVE:
|
case DIE_MCA_RENDZVOUS_LEAVE:
|
||||||
|
@@ -654,7 +654,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
|
|||||||
}
|
}
|
||||||
} else if (!is_internal(mod, val))
|
} else if (!is_internal(mod, val))
|
||||||
val = get_plt(mod, location, val, &ok);
|
val = get_plt(mod, location, val, &ok);
|
||||||
/* FALL THROUGH */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
val -= bundle(location);
|
val -= bundle(location);
|
||||||
break;
|
break;
|
||||||
|
@@ -3472,7 +3472,7 @@ pfm_restart(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
|
|||||||
break;
|
break;
|
||||||
case PFM_CTX_LOADED:
|
case PFM_CTX_LOADED:
|
||||||
if (CTX_HAS_SMPL(ctx) && fmt->fmt_restart_active) break;
|
if (CTX_HAS_SMPL(ctx) && fmt->fmt_restart_active) break;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case PFM_CTX_UNLOADED:
|
case PFM_CTX_UNLOADED:
|
||||||
case PFM_CTX_ZOMBIE:
|
case PFM_CTX_ZOMBIE:
|
||||||
DPRINT(("invalid state=%d\n", state));
|
DPRINT(("invalid state=%d\n", state));
|
||||||
|
@@ -374,7 +374,7 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
|
|||||||
/* note: scr->pt.r10 is already -1 */
|
/* note: scr->pt.r10 is already -1 */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*FALLTHRU*/
|
fallthrough;
|
||||||
case ERESTARTNOINTR:
|
case ERESTARTNOINTR:
|
||||||
ia64_decrement_ip(&scr->pt);
|
ia64_decrement_ip(&scr->pt);
|
||||||
restart = 0; /* don't restart twice if handle_signal() fails... */
|
restart = 0; /* don't restart twice if handle_signal() fails... */
|
||||||
|
@@ -1431,7 +1431,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
|
|||||||
if (u.insn.x)
|
if (u.insn.x)
|
||||||
/* oops, really a semaphore op (cmpxchg, etc) */
|
/* oops, really a semaphore op (cmpxchg, etc) */
|
||||||
goto failure;
|
goto failure;
|
||||||
/*FALLTHRU*/
|
fallthrough;
|
||||||
case LDS_IMM_OP:
|
case LDS_IMM_OP:
|
||||||
case LDSA_IMM_OP:
|
case LDSA_IMM_OP:
|
||||||
case LDFS_OP:
|
case LDFS_OP:
|
||||||
@@ -1459,7 +1459,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
|
|||||||
if (u.insn.x)
|
if (u.insn.x)
|
||||||
/* oops, really a semaphore op (cmpxchg, etc) */
|
/* oops, really a semaphore op (cmpxchg, etc) */
|
||||||
goto failure;
|
goto failure;
|
||||||
/*FALLTHRU*/
|
fallthrough;
|
||||||
case LD_IMM_OP:
|
case LD_IMM_OP:
|
||||||
case LDA_IMM_OP:
|
case LDA_IMM_OP:
|
||||||
case LDBIAS_IMM_OP:
|
case LDBIAS_IMM_OP:
|
||||||
@@ -1475,7 +1475,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
|
|||||||
if (u.insn.x)
|
if (u.insn.x)
|
||||||
/* oops, really a semaphore op (cmpxchg, etc) */
|
/* oops, really a semaphore op (cmpxchg, etc) */
|
||||||
goto failure;
|
goto failure;
|
||||||
/*FALLTHRU*/
|
fallthrough;
|
||||||
case ST_IMM_OP:
|
case ST_IMM_OP:
|
||||||
case STREL_IMM_OP:
|
case STREL_IMM_OP:
|
||||||
ret = emulate_store_int(ifa, u.insn, regs);
|
ret = emulate_store_int(ifa, u.insn, regs);
|
||||||
|
@@ -324,7 +324,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case UNW_NAT_NONE:
|
case UNW_NAT_NONE:
|
||||||
dummy_nat = 0;
|
dummy_nat = 0;
|
||||||
nat_addr = &dummy_nat;
|
nat_addr = &dummy_nat;
|
||||||
|
@@ -207,7 +207,7 @@ repeat:
|
|||||||
self_test_last_rcv = jiffies;
|
self_test_last_rcv = jiffies;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* FALL THROUGH */
|
fallthrough;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break_flag = scancode & BREAK_MASK;
|
break_flag = scancode & BREAK_MASK;
|
||||||
|
@@ -1067,7 +1067,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
|
|||||||
regs->d0 = -EINTR;
|
regs->d0 = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
do_restart:
|
do_restart:
|
||||||
regs->d0 = regs->orig_d0;
|
regs->d0 = regs->orig_d0;
|
||||||
|
@@ -1018,7 +1018,7 @@ int __init mac_platform_init(void)
|
|||||||
*/
|
*/
|
||||||
platform_device_register_simple("mac_scsi", 1,
|
platform_device_register_simple("mac_scsi", 1,
|
||||||
mac_scsi_duo_rsrc, ARRAY_SIZE(mac_scsi_duo_rsrc));
|
mac_scsi_duo_rsrc, ARRAY_SIZE(mac_scsi_duo_rsrc));
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case MAC_SCSI_OLD:
|
case MAC_SCSI_OLD:
|
||||||
/* Addresses from Developer Notes for Duo System,
|
/* Addresses from Developer Notes for Duo System,
|
||||||
* PowerBook 180 & 160, 140 & 170, Macintosh IIsi
|
* PowerBook 180 & 160, 140 & 170, Macintosh IIsi
|
||||||
|
@@ -370,7 +370,7 @@ void via_nubus_irq_startup(int irq)
|
|||||||
/* Allow NuBus slots 9 through F. */
|
/* Allow NuBus slots 9 through F. */
|
||||||
via2[vDirA] &= 0x80 | ~(1 << irq_idx);
|
via2[vDirA] &= 0x80 | ~(1 << irq_idx);
|
||||||
}
|
}
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case MAC_VIA_IICI:
|
case MAC_VIA_IICI:
|
||||||
via_irq_enable(irq);
|
via_irq_enable(irq);
|
||||||
break;
|
break;
|
||||||
|
@@ -118,7 +118,7 @@ good_area:
|
|||||||
pr_debug("do_page_fault: good_area\n");
|
pr_debug("do_page_fault: good_area\n");
|
||||||
switch (error_code & 3) {
|
switch (error_code & 3) {
|
||||||
default: /* 3: write, present */
|
default: /* 3: write, present */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case 2: /* write, not present */
|
case 2: /* write, not present */
|
||||||
if (!(vma->vm_flags & VM_WRITE))
|
if (!(vma->vm_flags & VM_WRITE))
|
||||||
goto acc_err;
|
goto acc_err;
|
||||||
|
@@ -249,7 +249,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
|
|||||||
regs->r3 = -EINTR;
|
regs->r3 = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
do_restart:
|
do_restart:
|
||||||
/* offset of 4 bytes to re-execute trap (brki) instruction */
|
/* offset of 4 bytes to re-execute trap (brki) instruction */
|
||||||
|
@@ -137,6 +137,11 @@ static inline int arch_irqs_disabled_flags(unsigned long flags)
|
|||||||
return !(flags & 1);
|
return !(flags & 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int arch_irqs_disabled(void)
|
||||||
|
{
|
||||||
|
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* #ifndef __ASSEMBLY__ */
|
#endif /* #ifndef __ASSEMBLY__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -28,38 +28,38 @@
|
|||||||
BUILD_BUG_ON(!__builtin_constant_p(times)); \
|
BUILD_BUG_ON(!__builtin_constant_p(times)); \
|
||||||
\
|
\
|
||||||
switch (times) { \
|
switch (times) { \
|
||||||
case 32: fn(__VA_ARGS__); /* fall through */ \
|
case 32: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 31: fn(__VA_ARGS__); /* fall through */ \
|
case 31: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 30: fn(__VA_ARGS__); /* fall through */ \
|
case 30: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 29: fn(__VA_ARGS__); /* fall through */ \
|
case 29: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 28: fn(__VA_ARGS__); /* fall through */ \
|
case 28: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 27: fn(__VA_ARGS__); /* fall through */ \
|
case 27: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 26: fn(__VA_ARGS__); /* fall through */ \
|
case 26: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 25: fn(__VA_ARGS__); /* fall through */ \
|
case 25: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 24: fn(__VA_ARGS__); /* fall through */ \
|
case 24: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 23: fn(__VA_ARGS__); /* fall through */ \
|
case 23: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 22: fn(__VA_ARGS__); /* fall through */ \
|
case 22: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 21: fn(__VA_ARGS__); /* fall through */ \
|
case 21: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 20: fn(__VA_ARGS__); /* fall through */ \
|
case 20: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 19: fn(__VA_ARGS__); /* fall through */ \
|
case 19: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 18: fn(__VA_ARGS__); /* fall through */ \
|
case 18: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 17: fn(__VA_ARGS__); /* fall through */ \
|
case 17: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 16: fn(__VA_ARGS__); /* fall through */ \
|
case 16: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 15: fn(__VA_ARGS__); /* fall through */ \
|
case 15: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 14: fn(__VA_ARGS__); /* fall through */ \
|
case 14: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 13: fn(__VA_ARGS__); /* fall through */ \
|
case 13: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 12: fn(__VA_ARGS__); /* fall through */ \
|
case 12: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 11: fn(__VA_ARGS__); /* fall through */ \
|
case 11: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 10: fn(__VA_ARGS__); /* fall through */ \
|
case 10: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 9: fn(__VA_ARGS__); /* fall through */ \
|
case 9: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 8: fn(__VA_ARGS__); /* fall through */ \
|
case 8: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 7: fn(__VA_ARGS__); /* fall through */ \
|
case 7: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 6: fn(__VA_ARGS__); /* fall through */ \
|
case 6: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 5: fn(__VA_ARGS__); /* fall through */ \
|
case 5: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 4: fn(__VA_ARGS__); /* fall through */ \
|
case 4: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 3: fn(__VA_ARGS__); /* fall through */ \
|
case 3: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 2: fn(__VA_ARGS__); /* fall through */ \
|
case 2: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 1: fn(__VA_ARGS__); /* fall through */ \
|
case 1: fn(__VA_ARGS__); fallthrough; \
|
||||||
case 0: break; \
|
case 0: break; \
|
||||||
\
|
\
|
||||||
default: \
|
default: \
|
||||||
|
@@ -34,3 +34,8 @@ static inline int arch_irqs_disabled_flags(unsigned long flags)
|
|||||||
{
|
{
|
||||||
return !flags;
|
return !flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int arch_irqs_disabled(void)
|
||||||
|
{
|
||||||
|
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||||
|
}
|
||||||
|
@@ -45,7 +45,7 @@ void save_fpu(struct task_struct *tsk)
|
|||||||
: /* no output */
|
: /* no output */
|
||||||
: "r" (&tsk->thread.fpu)
|
: "r" (&tsk->thread.fpu)
|
||||||
: "memory");
|
: "memory");
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case SP32_DP16_reg:
|
case SP32_DP16_reg:
|
||||||
asm volatile ("fsdi $fd15, [%0+0x78]\n\t"
|
asm volatile ("fsdi $fd15, [%0+0x78]\n\t"
|
||||||
"fsdi $fd14, [%0+0x70]\n\t"
|
"fsdi $fd14, [%0+0x70]\n\t"
|
||||||
@@ -58,7 +58,7 @@ void save_fpu(struct task_struct *tsk)
|
|||||||
: /* no output */
|
: /* no output */
|
||||||
: "r" (&tsk->thread.fpu)
|
: "r" (&tsk->thread.fpu)
|
||||||
: "memory");
|
: "memory");
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case SP16_DP8_reg:
|
case SP16_DP8_reg:
|
||||||
asm volatile ("fsdi $fd7, [%0+0x38]\n\t"
|
asm volatile ("fsdi $fd7, [%0+0x38]\n\t"
|
||||||
"fsdi $fd6, [%0+0x30]\n\t"
|
"fsdi $fd6, [%0+0x30]\n\t"
|
||||||
@@ -67,7 +67,7 @@ void save_fpu(struct task_struct *tsk)
|
|||||||
: /* no output */
|
: /* no output */
|
||||||
: "r" (&tsk->thread.fpu)
|
: "r" (&tsk->thread.fpu)
|
||||||
: "memory");
|
: "memory");
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case SP8_DP4_reg:
|
case SP8_DP4_reg:
|
||||||
asm volatile ("fsdi $fd3, [%1+0x18]\n\t"
|
asm volatile ("fsdi $fd3, [%1+0x18]\n\t"
|
||||||
"fsdi $fd2, [%1+0x10]\n\t"
|
"fsdi $fd2, [%1+0x10]\n\t"
|
||||||
@@ -108,7 +108,7 @@ void load_fpu(const struct fpu_struct *fpregs)
|
|||||||
"fldi $fd16, [%0+0x80]\n\t"
|
"fldi $fd16, [%0+0x80]\n\t"
|
||||||
: /* no output */
|
: /* no output */
|
||||||
: "r" (fpregs));
|
: "r" (fpregs));
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case SP32_DP16_reg:
|
case SP32_DP16_reg:
|
||||||
asm volatile ("fldi $fd15, [%0+0x78]\n\t"
|
asm volatile ("fldi $fd15, [%0+0x78]\n\t"
|
||||||
"fldi $fd14, [%0+0x70]\n\t"
|
"fldi $fd14, [%0+0x70]\n\t"
|
||||||
@@ -120,7 +120,7 @@ void load_fpu(const struct fpu_struct *fpregs)
|
|||||||
"fldi $fd8, [%0+0x40]\n\t"
|
"fldi $fd8, [%0+0x40]\n\t"
|
||||||
: /* no output */
|
: /* no output */
|
||||||
: "r" (fpregs));
|
: "r" (fpregs));
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case SP16_DP8_reg:
|
case SP16_DP8_reg:
|
||||||
asm volatile ("fldi $fd7, [%0+0x38]\n\t"
|
asm volatile ("fldi $fd7, [%0+0x38]\n\t"
|
||||||
"fldi $fd6, [%0+0x30]\n\t"
|
"fldi $fd6, [%0+0x30]\n\t"
|
||||||
@@ -128,7 +128,7 @@ void load_fpu(const struct fpu_struct *fpregs)
|
|||||||
"fldi $fd4, [%0+0x20]\n\t"
|
"fldi $fd4, [%0+0x20]\n\t"
|
||||||
: /* no output */
|
: /* no output */
|
||||||
: "r" (fpregs));
|
: "r" (fpregs));
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case SP8_DP4_reg:
|
case SP8_DP4_reg:
|
||||||
asm volatile ("fldi $fd3, [%1+0x18]\n\t"
|
asm volatile ("fldi $fd3, [%1+0x18]\n\t"
|
||||||
"fldi $fd2, [%1+0x10]\n\t"
|
"fldi $fd2, [%1+0x10]\n\t"
|
||||||
|
@@ -316,7 +316,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
|||||||
regs->uregs[0] = -EINTR;
|
regs->uregs[0] = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Else, fall through */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
regs->uregs[0] = regs->orig_r0;
|
regs->uregs[0] = regs->orig_r0;
|
||||||
regs->ipc -= 4;
|
regs->ipc -= 4;
|
||||||
@@ -361,7 +361,7 @@ static void do_signal(struct pt_regs *regs)
|
|||||||
switch (regs->uregs[0]) {
|
switch (regs->uregs[0]) {
|
||||||
case -ERESTART_RESTARTBLOCK:
|
case -ERESTART_RESTARTBLOCK:
|
||||||
regs->uregs[15] = __NR_restart_syscall;
|
regs->uregs[15] = __NR_restart_syscall;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case -ERESTARTNOHAND:
|
case -ERESTARTNOHAND:
|
||||||
case -ERESTARTSYS:
|
case -ERESTARTSYS:
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
|
@@ -244,7 +244,7 @@ int do_signal(struct pt_regs *regs, int syscall)
|
|||||||
switch (retval) {
|
switch (retval) {
|
||||||
case -ERESTART_RESTARTBLOCK:
|
case -ERESTART_RESTARTBLOCK:
|
||||||
restart = -2;
|
restart = -2;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case -ERESTARTNOHAND:
|
case -ERESTARTNOHAND:
|
||||||
case -ERESTARTSYS:
|
case -ERESTARTSYS:
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
|
@@ -502,7 +502,7 @@ syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
|
|||||||
regs->gr[28] = -EINTR;
|
regs->gr[28] = -EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
fallthrough;
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
check_syscallno_in_delay_branch(regs);
|
check_syscallno_in_delay_branch(regs);
|
||||||
break;
|
break;
|
||||||
|
@@ -437,7 +437,6 @@ void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long o
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* Fall through */
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -644,12 +643,12 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
|
|||||||
|
|
||||||
case 15:
|
case 15:
|
||||||
/* Data TLB miss fault/Data page fault */
|
/* Data TLB miss fault/Data page fault */
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case 16:
|
case 16:
|
||||||
/* Non-access instruction TLB miss fault */
|
/* Non-access instruction TLB miss fault */
|
||||||
/* The instruction TLB entry needed for the target address of the FIC
|
/* The instruction TLB entry needed for the target address of the FIC
|
||||||
is absent, and hardware can't find it, so we get to cleanup */
|
is absent, and hardware can't find it, so we get to cleanup */
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case 17:
|
case 17:
|
||||||
/* Non-access data TLB miss fault/Non-access data page fault */
|
/* Non-access data TLB miss fault/Non-access data page fault */
|
||||||
/* FIXME:
|
/* FIXME:
|
||||||
@@ -673,7 +672,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
|
|||||||
handle_unaligned(regs);
|
handle_unaligned(regs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* Fall Through */
|
fallthrough;
|
||||||
case 26:
|
case 26:
|
||||||
/* PCXL: Data memory access rights trap */
|
/* PCXL: Data memory access rights trap */
|
||||||
fault_address = regs->ior;
|
fault_address = regs->ior;
|
||||||
@@ -683,7 +682,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
|
|||||||
case 19:
|
case 19:
|
||||||
/* Data memory break trap */
|
/* Data memory break trap */
|
||||||
regs->gr[0] |= PSW_X; /* So we can single-step over the trap */
|
regs->gr[0] |= PSW_X; /* So we can single-step over the trap */
|
||||||
/* fall thru */
|
fallthrough;
|
||||||
case 21:
|
case 21:
|
||||||
/* Page reference trap */
|
/* Page reference trap */
|
||||||
handle_gdb_break(regs, TRAP_HWBKPT);
|
handle_gdb_break(regs, TRAP_HWBKPT);
|
||||||
@@ -730,7 +729,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
mmap_read_unlock(current->mm);
|
mmap_read_unlock(current->mm);
|
||||||
}
|
}
|
||||||
/* Fall Through */
|
fallthrough;
|
||||||
case 27:
|
case 27:
|
||||||
/* Data memory protection ID trap */
|
/* Data memory protection ID trap */
|
||||||
if (code == 27 && !user_mode(regs) &&
|
if (code == 27 && !user_mode(regs) &&
|
||||||
|
@@ -67,7 +67,7 @@ parisc_acctyp(unsigned long code, unsigned int inst)
|
|||||||
case 0x30000000: /* coproc2 */
|
case 0x30000000: /* coproc2 */
|
||||||
if (bit22set(inst))
|
if (bit22set(inst))
|
||||||
return VM_WRITE;
|
return VM_WRITE;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
|
|
||||||
case 0x0: /* indexed/memory management */
|
case 0x0: /* indexed/memory management */
|
||||||
if (bit22set(inst)) {
|
if (bit22set(inst)) {
|
||||||
@@ -370,7 +370,7 @@ bad_area:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* probably address is outside of mapped file */
|
/* probably address is outside of mapped file */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case 17: /* NA data TLB miss / page fault */
|
case 17: /* NA data TLB miss / page fault */
|
||||||
case 18: /* Unaligned access - PCXS only */
|
case 18: /* Unaligned access - PCXS only */
|
||||||
signo = SIGBUS;
|
signo = SIGBUS;
|
||||||
|
@@ -860,6 +860,18 @@ config PPC_SUBPAGE_PROT
|
|||||||
|
|
||||||
If unsure, say N here.
|
If unsure, say N here.
|
||||||
|
|
||||||
|
config PPC_PROT_SAO_LPAR
|
||||||
|
bool "Support PROT_SAO mappings in LPARs"
|
||||||
|
depends on PPC_BOOK3S_64
|
||||||
|
help
|
||||||
|
This option adds support for PROT_SAO mappings from userspace
|
||||||
|
inside LPARs on supported CPUs.
|
||||||
|
|
||||||
|
This may cause issues when performing guest migration from
|
||||||
|
a CPU that supports SAO to one that does not.
|
||||||
|
|
||||||
|
If unsure, say N here.
|
||||||
|
|
||||||
config PPC_COPRO_BASE
|
config PPC_COPRO_BASE
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
@@ -20,13 +20,9 @@
|
|||||||
#define _PAGE_RW (_PAGE_READ | _PAGE_WRITE)
|
#define _PAGE_RW (_PAGE_READ | _PAGE_WRITE)
|
||||||
#define _PAGE_RWX (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC)
|
#define _PAGE_RWX (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC)
|
||||||
#define _PAGE_PRIVILEGED 0x00008 /* kernel access only */
|
#define _PAGE_PRIVILEGED 0x00008 /* kernel access only */
|
||||||
|
#define _PAGE_SAO 0x00010 /* Strong access order */
|
||||||
#define _PAGE_CACHE_CTL 0x00030 /* Bits for the folowing cache modes */
|
|
||||||
/* No bits set is normal cacheable memory */
|
|
||||||
/* 0x00010 unused, is SAO bit on radix POWER9 */
|
|
||||||
#define _PAGE_NON_IDEMPOTENT 0x00020 /* non idempotent memory */
|
#define _PAGE_NON_IDEMPOTENT 0x00020 /* non idempotent memory */
|
||||||
#define _PAGE_TOLERANT 0x00030 /* tolerant memory, cache inhibited */
|
#define _PAGE_TOLERANT 0x00030 /* tolerant memory, cache inhibited */
|
||||||
|
|
||||||
#define _PAGE_DIRTY 0x00080 /* C: page changed */
|
#define _PAGE_DIRTY 0x00080 /* C: page changed */
|
||||||
#define _PAGE_ACCESSED 0x00100 /* R: page referenced */
|
#define _PAGE_ACCESSED 0x00100 /* R: page referenced */
|
||||||
/*
|
/*
|
||||||
@@ -828,6 +824,8 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|||||||
return hash__set_pte_at(mm, addr, ptep, pte, percpu);
|
return hash__set_pte_at(mm, addr, ptep, pte, percpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define _PAGE_CACHE_CTL (_PAGE_SAO | _PAGE_NON_IDEMPOTENT | _PAGE_TOLERANT)
|
||||||
|
|
||||||
#define pgprot_noncached pgprot_noncached
|
#define pgprot_noncached pgprot_noncached
|
||||||
static inline pgprot_t pgprot_noncached(pgprot_t prot)
|
static inline pgprot_t pgprot_noncached(pgprot_t prot)
|
||||||
{
|
{
|
||||||
|
@@ -196,7 +196,7 @@ static inline void cpu_feature_keys_init(void) { }
|
|||||||
#define CPU_FTR_SPURR LONG_ASM_CONST(0x0000000001000000)
|
#define CPU_FTR_SPURR LONG_ASM_CONST(0x0000000001000000)
|
||||||
#define CPU_FTR_DSCR LONG_ASM_CONST(0x0000000002000000)
|
#define CPU_FTR_DSCR LONG_ASM_CONST(0x0000000002000000)
|
||||||
#define CPU_FTR_VSX LONG_ASM_CONST(0x0000000004000000)
|
#define CPU_FTR_VSX LONG_ASM_CONST(0x0000000004000000)
|
||||||
// Free LONG_ASM_CONST(0x0000000008000000)
|
#define CPU_FTR_SAO LONG_ASM_CONST(0x0000000008000000)
|
||||||
#define CPU_FTR_CP_USE_DCBTZ LONG_ASM_CONST(0x0000000010000000)
|
#define CPU_FTR_CP_USE_DCBTZ LONG_ASM_CONST(0x0000000010000000)
|
||||||
#define CPU_FTR_UNALIGNED_LD_STD LONG_ASM_CONST(0x0000000020000000)
|
#define CPU_FTR_UNALIGNED_LD_STD LONG_ASM_CONST(0x0000000020000000)
|
||||||
#define CPU_FTR_ASYM_SMT LONG_ASM_CONST(0x0000000040000000)
|
#define CPU_FTR_ASYM_SMT LONG_ASM_CONST(0x0000000040000000)
|
||||||
@@ -441,7 +441,7 @@ static inline void cpu_feature_keys_init(void) { }
|
|||||||
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||||
CPU_FTR_COHERENT_ICACHE | \
|
CPU_FTR_COHERENT_ICACHE | \
|
||||||
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
||||||
CPU_FTR_DSCR | CPU_FTR_ASYM_SMT | \
|
CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \
|
||||||
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
||||||
CPU_FTR_CFAR | CPU_FTR_HVMODE | \
|
CPU_FTR_CFAR | CPU_FTR_HVMODE | \
|
||||||
CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR | CPU_FTR_DABRX )
|
CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR | CPU_FTR_DABRX )
|
||||||
@@ -450,7 +450,7 @@ static inline void cpu_feature_keys_init(void) { }
|
|||||||
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||||
CPU_FTR_COHERENT_ICACHE | \
|
CPU_FTR_COHERENT_ICACHE | \
|
||||||
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
||||||
CPU_FTR_DSCR | \
|
CPU_FTR_DSCR | CPU_FTR_SAO | \
|
||||||
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
||||||
CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
|
CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
|
||||||
CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \
|
CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \
|
||||||
@@ -461,7 +461,7 @@ static inline void cpu_feature_keys_init(void) { }
|
|||||||
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||||
CPU_FTR_COHERENT_ICACHE | \
|
CPU_FTR_COHERENT_ICACHE | \
|
||||||
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
||||||
CPU_FTR_DSCR | \
|
CPU_FTR_DSCR | CPU_FTR_SAO | \
|
||||||
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
||||||
CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
|
CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
|
||||||
CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_ARCH_207S | \
|
CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_ARCH_207S | \
|
||||||
@@ -479,7 +479,7 @@ static inline void cpu_feature_keys_init(void) { }
|
|||||||
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||||
CPU_FTR_COHERENT_ICACHE | \
|
CPU_FTR_COHERENT_ICACHE | \
|
||||||
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
||||||
CPU_FTR_DSCR | \
|
CPU_FTR_DSCR | CPU_FTR_SAO | \
|
||||||
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
||||||
CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
|
CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
|
||||||
CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_ARCH_207S | \
|
CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_ARCH_207S | \
|
||||||
|
@@ -200,17 +200,14 @@ static inline bool arch_irqs_disabled(void)
|
|||||||
#define powerpc_local_irq_pmu_save(flags) \
|
#define powerpc_local_irq_pmu_save(flags) \
|
||||||
do { \
|
do { \
|
||||||
raw_local_irq_pmu_save(flags); \
|
raw_local_irq_pmu_save(flags); \
|
||||||
trace_hardirqs_off(); \
|
if (!raw_irqs_disabled_flags(flags)) \
|
||||||
|
trace_hardirqs_off(); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define powerpc_local_irq_pmu_restore(flags) \
|
#define powerpc_local_irq_pmu_restore(flags) \
|
||||||
do { \
|
do { \
|
||||||
if (raw_irqs_disabled_flags(flags)) { \
|
if (!raw_irqs_disabled_flags(flags)) \
|
||||||
raw_local_irq_pmu_restore(flags); \
|
|
||||||
trace_hardirqs_off(); \
|
|
||||||
} else { \
|
|
||||||
trace_hardirqs_on(); \
|
trace_hardirqs_on(); \
|
||||||
raw_local_irq_pmu_restore(flags); \
|
raw_local_irq_pmu_restore(flags); \
|
||||||
} \
|
|
||||||
} while(0)
|
} while(0)
|
||||||
#else
|
#else
|
||||||
#define powerpc_local_irq_pmu_save(flags) \
|
#define powerpc_local_irq_pmu_save(flags) \
|
||||||
|
@@ -13,20 +13,43 @@
|
|||||||
#include <linux/pkeys.h>
|
#include <linux/pkeys.h>
|
||||||
#include <asm/cpu_has_feature.h>
|
#include <asm/cpu_has_feature.h>
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_MEM_KEYS
|
|
||||||
static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
||||||
unsigned long pkey)
|
unsigned long pkey)
|
||||||
{
|
{
|
||||||
return pkey_to_vmflag_bits(pkey);
|
#ifdef CONFIG_PPC_MEM_KEYS
|
||||||
|
return (((prot & PROT_SAO) ? VM_SAO : 0) | pkey_to_vmflag_bits(pkey));
|
||||||
|
#else
|
||||||
|
return ((prot & PROT_SAO) ? VM_SAO : 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
|
#define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
|
||||||
|
|
||||||
static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags)
|
static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags)
|
||||||
{
|
{
|
||||||
return __pgprot(vmflag_to_pte_pkey_bits(vm_flags));
|
#ifdef CONFIG_PPC_MEM_KEYS
|
||||||
|
return (vm_flags & VM_SAO) ?
|
||||||
|
__pgprot(_PAGE_SAO | vmflag_to_pte_pkey_bits(vm_flags)) :
|
||||||
|
__pgprot(0 | vmflag_to_pte_pkey_bits(vm_flags));
|
||||||
|
#else
|
||||||
|
return (vm_flags & VM_SAO) ? __pgprot(_PAGE_SAO) : __pgprot(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#define arch_vm_get_page_prot(vm_flags) arch_vm_get_page_prot(vm_flags)
|
#define arch_vm_get_page_prot(vm_flags) arch_vm_get_page_prot(vm_flags)
|
||||||
#endif
|
|
||||||
|
static inline bool arch_validate_prot(unsigned long prot, unsigned long addr)
|
||||||
|
{
|
||||||
|
if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_SAO))
|
||||||
|
return false;
|
||||||
|
if (prot & PROT_SAO) {
|
||||||
|
if (!cpu_has_feature(CPU_FTR_SAO))
|
||||||
|
return false;
|
||||||
|
if (firmware_has_feature(FW_FEATURE_LPAR) &&
|
||||||
|
!IS_ENABLED(CONFIG_PPC_PROT_SAO_LPAR))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#define arch_validate_prot arch_validate_prot
|
||||||
|
|
||||||
#endif /* CONFIG_PPC64 */
|
#endif /* CONFIG_PPC64 */
|
||||||
#endif /* _ASM_POWERPC_MMAN_H */
|
#endif /* _ASM_POWERPC_MMAN_H */
|
||||||
|
@@ -82,6 +82,8 @@
|
|||||||
*/
|
*/
|
||||||
#include <asm/nohash/pte-book3e.h>
|
#include <asm/nohash/pte-book3e.h>
|
||||||
|
|
||||||
|
#define _PAGE_SAO 0
|
||||||
|
|
||||||
#define PTE_RPN_MASK (~((1UL << PTE_RPN_SHIFT) - 1))
|
#define PTE_RPN_MASK (~((1UL << PTE_RPN_SHIFT) - 1))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
#include <asm-generic/mman-common.h>
|
#include <asm-generic/mman-common.h>
|
||||||
|
|
||||||
|
|
||||||
#define PROT_SAO 0x10 /* Unsupported since v5.9 */
|
#define PROT_SAO 0x10 /* Strong Access Ordering */
|
||||||
|
|
||||||
#define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */
|
#define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */
|
||||||
#define MAP_NORESERVE 0x40 /* don't reserve swap pages */
|
#define MAP_NORESERVE 0x40 /* don't reserve swap pages */
|
||||||
|
@@ -653,7 +653,7 @@ static struct dt_cpu_feature_match __initdata
|
|||||||
{"processor-control-facility-v3", feat_enable_dbell, CPU_FTR_DBELL},
|
{"processor-control-facility-v3", feat_enable_dbell, CPU_FTR_DBELL},
|
||||||
{"processor-utilization-of-resources-register", feat_enable_purr, 0},
|
{"processor-utilization-of-resources-register", feat_enable_purr, 0},
|
||||||
{"no-execute", feat_enable, 0},
|
{"no-execute", feat_enable, 0},
|
||||||
/* strong-access-ordering is unused */
|
{"strong-access-ordering", feat_enable, CPU_FTR_SAO},
|
||||||
{"cache-inhibited-large-page", feat_enable_large_ci, 0},
|
{"cache-inhibited-large-page", feat_enable_large_ci, 0},
|
||||||
{"coprocessor-icswx", feat_enable, 0},
|
{"coprocessor-icswx", feat_enable, 0},
|
||||||
{"hypervisor-virtualization-interrupt", feat_enable_hvi, 0},
|
{"hypervisor-virtualization-interrupt", feat_enable_hvi, 0},
|
||||||
|
@@ -113,6 +113,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_TM)
|
|||||||
ld r11,exception_marker@toc(r2)
|
ld r11,exception_marker@toc(r2)
|
||||||
std r11,-16(r10) /* "regshere" marker */
|
std r11,-16(r10) /* "regshere" marker */
|
||||||
|
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
HMT_MEDIUM
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RECONCILE_IRQ_STATE without calling trace_hardirqs_off(), which
|
* RECONCILE_IRQ_STATE without calling trace_hardirqs_off(), which
|
||||||
* would clobber syscall parameters. Also we always enter with IRQs
|
* would clobber syscall parameters. Also we always enter with IRQs
|
||||||
|
@@ -548,7 +548,7 @@ void notrace restore_math(struct pt_regs *regs)
|
|||||||
* are live for the user thread).
|
* are live for the user thread).
|
||||||
*/
|
*/
|
||||||
if ((!(msr & MSR_FP)) && should_restore_fp())
|
if ((!(msr & MSR_FP)) && should_restore_fp())
|
||||||
new_msr |= MSR_FP | current->thread.fpexc_mode;
|
new_msr |= MSR_FP;
|
||||||
|
|
||||||
if ((!(msr & MSR_VEC)) && should_restore_altivec())
|
if ((!(msr & MSR_VEC)) && should_restore_altivec())
|
||||||
new_msr |= MSR_VEC;
|
new_msr |= MSR_VEC;
|
||||||
@@ -559,11 +559,17 @@ void notrace restore_math(struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (new_msr) {
|
if (new_msr) {
|
||||||
|
unsigned long fpexc_mode = 0;
|
||||||
|
|
||||||
msr_check_and_set(new_msr);
|
msr_check_and_set(new_msr);
|
||||||
|
|
||||||
if (new_msr & MSR_FP)
|
if (new_msr & MSR_FP) {
|
||||||
do_restore_fp();
|
do_restore_fp();
|
||||||
|
|
||||||
|
// This also covers VSX, because VSX implies FP
|
||||||
|
fpexc_mode = current->thread.fpexc_mode;
|
||||||
|
}
|
||||||
|
|
||||||
if (new_msr & MSR_VEC)
|
if (new_msr & MSR_VEC)
|
||||||
do_restore_altivec();
|
do_restore_altivec();
|
||||||
|
|
||||||
@@ -572,7 +578,7 @@ void notrace restore_math(struct pt_regs *regs)
|
|||||||
|
|
||||||
msr_check_and_clear(new_msr);
|
msr_check_and_clear(new_msr);
|
||||||
|
|
||||||
regs->msr |= new_msr;
|
regs->msr |= new_msr | fpexc_mode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -232,6 +232,8 @@ unsigned long htab_convert_pte_flags(unsigned long pteflags)
|
|||||||
rflags |= HPTE_R_I;
|
rflags |= HPTE_R_I;
|
||||||
else if ((pteflags & _PAGE_CACHE_CTL) == _PAGE_NON_IDEMPOTENT)
|
else if ((pteflags & _PAGE_CACHE_CTL) == _PAGE_NON_IDEMPOTENT)
|
||||||
rflags |= (HPTE_R_I | HPTE_R_G);
|
rflags |= (HPTE_R_I | HPTE_R_G);
|
||||||
|
else if ((pteflags & _PAGE_CACHE_CTL) == _PAGE_SAO)
|
||||||
|
rflags |= (HPTE_R_W | HPTE_R_I | HPTE_R_M);
|
||||||
else
|
else
|
||||||
/*
|
/*
|
||||||
* Add memory coherence if cache inhibited is not set
|
* Add memory coherence if cache inhibited is not set
|
||||||
|
@@ -475,7 +475,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
|||||||
case BPF_JMP | BPF_JSET | BPF_K:
|
case BPF_JMP | BPF_JSET | BPF_K:
|
||||||
case BPF_JMP | BPF_JSET | BPF_X:
|
case BPF_JMP | BPF_JSET | BPF_X:
|
||||||
true_cond = COND_NE;
|
true_cond = COND_NE;
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
cond_branch:
|
cond_branch:
|
||||||
/* same targets, can avoid doing the test :) */
|
/* same targets, can avoid doing the test :) */
|
||||||
if (filter[i].jt == filter[i].jf) {
|
if (filter[i].jt == filter[i].jf) {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user