mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
irqchip updates for Linux 5.16
- A large cross-arch rework to move irq_enter()/irq_exit() into the arch code, and removing it from the generic irq code. Thanks to Mark Rutland for the huge effort! - A few irqchip drivers are made modular (broadcom, meson), because that's apparently a thing... - A new driver for the Microchip External Interrupt Controller - The irq_cpu_offline()/irq_cpu_online() API is now deprecated and can only be selected on the Cavium Octeon platform. Once this platform is removed, the API will be removed at the same time. - A sprinkle of devm_* helper, as people seem to love that. - The usual spattering of small fixes and minor improvements. -----BEGIN PGP SIGNATURE----- iQJDBAABCgAtFiEEn9UcU+C1Yxj9lZw9I9DQutE9ekMFAmF7rnYPHG1hekBrZXJu ZWwub3JnAAoJECPQ0LrRPXpDudEP/i3WmAcXQYKJpRz075M8S6PZ8BXeTKUe7WMK rrslOkxDqyQ2SVqMLII1xkyOWafC7BnRjexm/ASwrBsc6GyQha7B2YsKy1m/NEwy ZcnXCCIg71LpDrUyxbscFxB6s5OvUN0yv+a+WnEAmOXpD1x3S8x5tHmRUfsRGksR zOhKaYPLqgCiw3VHRuhEKFUA+CMjXxHhw3lJv6gPh6TRjdXQuJouau2dBzr7tQEd h9Jq2OatWXiwPr00hQDDILbdH4+fQYKJqsaaLNX0Pxexg2slRWHwrgA2o/w0tTVW 99HOc9hN04QoLkDfyQis40L1YC7VOIr5OAqzUehdYELT8UsrZS288Rr6099n4M/Y x8Nzcg4eA+jVUz1VMEBA9qR45fKjEMcTAXyNAAYLsov/obSgGH/PSOYaunG2xvYq iiJBM/g506PTw2MRROqrH5oKiER3tTD65f5NM0mJONr3xEm9XT74m0JIodgVZ4QX 0LMJytgetg0b+yZcFY25GhJ+2mGoYwB2eiZBVjE3FyLSs0epcuzogaKRi5axK4sN rvlAtgNZiOg7tzRqiPIQKSzO3dCyJjR86t5fd1cRBl/WPmywvA2Lkcgd09V2oyJe FEp1QllpgYw0a5+aIS+bdOUK63FLnLdEMas7WgSAAxA4/jjgP1p+SbytOD81psL0 4r02YN2A =/NLR -----END PGP SIGNATURE----- Merge tag 'irqchip-5.16' into irq/core Merge irqchip updates for Linux 5.16 from Marc Zyngier: - A large cross-arch rework to move irq_enter()/irq_exit() into the arch code, and removing it from the generic irq code. Thanks to Mark Rutland for the huge effort! - A few irqchip drivers are made modular (broadcom, meson), because that's apparently a thing... - A new driver for the Microchip External Interrupt Controller - The irq_cpu_offline()/irq_cpu_online() API is now deprecated and can only be selected on the Cavium Octeon platform. Once this platform is removed, the API will be removed at the same time. - A sprinkle of devm_* helper, as people seem to love that. - The usual spattering of small fixes and minor improvements. * tag 'irqchip-5.16': (912 commits) h8300: Fix linux/irqchip.h include mess dt-bindings: irqchip: renesas-irqc: Document r8a774e1 bindings MIPS: irq: Avoid an unused-variable error genirq: Hide irq_cpu_{on,off}line() behind a deprecated option irqchip/mips-gic: Get rid of the reliance on irq_cpu_online() MIPS: loongson64: Drop call to irq_cpu_offline() irq: remove handle_domain_{irq,nmi}() irq: remove CONFIG_HANDLE_DOMAIN_IRQ_IRQENTRY irq: riscv: perform irqentry in entry code irq: openrisc: perform irqentry in entry code irq: csky: perform irqentry in entry code irq: arm64: perform irqentry in entry code irq: arm: perform irqentry in entry code irq: add a (temporary) CONFIG_HANDLE_DOMAIN_IRQ_IRQENTRY irq: nds32: avoid CONFIG_HANDLE_DOMAIN_IRQ irq: arc: avoid CONFIG_HANDLE_DOMAIN_IRQ irq: add generic_handle_arch_irq() irq: unexport handle_irq_desc() irq: simplify handle_domain_{irq,nmi}() irq: mips: simplify do_domain_IRQ() ... Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lore.kernel.org/r/20211029083332.3680101-1-maz@kernel.org
This commit is contained in:
commit
2258a6fc33
@ -259,7 +259,7 @@ Configuring the kernel
|
|||||||
Compiling the kernel
|
Compiling the kernel
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
- Make sure you have at least gcc 4.9 available.
|
- Make sure you have at least gcc 5.1 available.
|
||||||
For more information, refer to :ref:`Documentation/process/changes.rst <changes>`.
|
For more information, refer to :ref:`Documentation/process/changes.rst <changes>`.
|
||||||
|
|
||||||
Please note that you can still run a.out user programs with this kernel.
|
Please note that you can still run a.out user programs with this kernel.
|
||||||
|
@ -67,9 +67,6 @@ variety of methods:
|
|||||||
deprecated
|
deprecated
|
||||||
- generic_handle_domain_irq() handles an interrupt described by a
|
- generic_handle_domain_irq() handles an interrupt described by a
|
||||||
domain and a hwirq number
|
domain and a hwirq number
|
||||||
- handle_domain_irq() does the same thing for root interrupt
|
|
||||||
controllers and deals with the set_irq_reg()/irq_enter() sequences
|
|
||||||
that most architecture requires
|
|
||||||
|
|
||||||
Note that irq domain lookups must happen in contexts that are
|
Note that irq domain lookups must happen in contexts that are
|
||||||
compatible with a RCU read-side critical section.
|
compatible with a RCU read-side critical section.
|
||||||
@ -175,9 +172,10 @@ for IRQ numbers that are passed to struct device registrations. In that
|
|||||||
case the Linux IRQ numbers cannot be dynamically assigned and the legacy
|
case the Linux IRQ numbers cannot be dynamically assigned and the legacy
|
||||||
mapping should be used.
|
mapping should be used.
|
||||||
|
|
||||||
As the name implies, the *_legacy() functions are deprecated and only
|
As the name implies, the \*_legacy() functions are deprecated and only
|
||||||
exist to ease the support of ancient platforms. No new users should be
|
exist to ease the support of ancient platforms. No new users should be
|
||||||
added.
|
added. Same goes for the \*_simple() functions when their use results
|
||||||
|
in the legacy behaviour.
|
||||||
|
|
||||||
The legacy map assumes a contiguous range of IRQ numbers has already
|
The legacy map assumes a contiguous range of IRQ numbers has already
|
||||||
been allocated for the controller and that the IRQ number can be
|
been allocated for the controller and that the IRQ number can be
|
||||||
|
@ -54,7 +54,7 @@ properties:
|
|||||||
- const: toradex,apalis_t30
|
- const: toradex,apalis_t30
|
||||||
- const: nvidia,tegra30
|
- const: nvidia,tegra30
|
||||||
- items:
|
- items:
|
||||||
- const: toradex,apalis_t30-eval-v1.1
|
- const: toradex,apalis_t30-v1.1-eval
|
||||||
- const: toradex,apalis_t30-eval
|
- const: toradex,apalis_t30-eval
|
||||||
- const: toradex,apalis_t30-v1.1
|
- const: toradex,apalis_t30-v1.1
|
||||||
- const: toradex,apalis_t30
|
- const: toradex,apalis_t30
|
||||||
|
@ -9,7 +9,7 @@ function block.
|
|||||||
|
|
||||||
All DISP device tree nodes must be siblings to the central MMSYS_CONFIG node.
|
All DISP device tree nodes must be siblings to the central MMSYS_CONFIG node.
|
||||||
For a description of the MMSYS_CONFIG binding, see
|
For a description of the MMSYS_CONFIG binding, see
|
||||||
Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.txt.
|
Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml.
|
||||||
|
|
||||||
DISP function blocks
|
DISP function blocks
|
||||||
====================
|
====================
|
||||||
|
@ -31,11 +31,11 @@ properties:
|
|||||||
|
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 3
|
maxItems: 7
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 3
|
maxItems: 7
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
@ -72,6 +72,32 @@ allOf:
|
|||||||
contains:
|
contains:
|
||||||
enum:
|
enum:
|
||||||
- qcom,sdm660-a2noc
|
- qcom,sdm660-a2noc
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Bus Clock.
|
||||||
|
- description: Bus A Clock.
|
||||||
|
- description: IPA Clock.
|
||||||
|
- description: UFS AXI Clock.
|
||||||
|
- description: Aggregate2 UFS AXI Clock.
|
||||||
|
- description: Aggregate2 USB3 AXI Clock.
|
||||||
|
- description: Config NoC USB2 AXI Clock.
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: bus
|
||||||
|
- const: bus_a
|
||||||
|
- const: ipa
|
||||||
|
- const: ufs_axi
|
||||||
|
- const: aggre2_ufs_axi
|
||||||
|
- const: aggre2_usb3_axi
|
||||||
|
- const: cfg_noc_usb2_axi
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
- qcom,sdm660-bimc
|
- qcom,sdm660-bimc
|
||||||
- qcom,sdm660-cnoc
|
- qcom,sdm660-cnoc
|
||||||
- qcom,sdm660-gnoc
|
- qcom,sdm660-gnoc
|
||||||
@ -91,6 +117,7 @@ examples:
|
|||||||
- |
|
- |
|
||||||
#include <dt-bindings/clock/qcom,rpmcc.h>
|
#include <dt-bindings/clock/qcom,rpmcc.h>
|
||||||
#include <dt-bindings/clock/qcom,mmcc-sdm660.h>
|
#include <dt-bindings/clock/qcom,mmcc-sdm660.h>
|
||||||
|
#include <dt-bindings/clock/qcom,gcc-sdm660.h>
|
||||||
|
|
||||||
bimc: interconnect@1008000 {
|
bimc: interconnect@1008000 {
|
||||||
compatible = "qcom,sdm660-bimc";
|
compatible = "qcom,sdm660-bimc";
|
||||||
@ -123,9 +150,20 @@ examples:
|
|||||||
compatible = "qcom,sdm660-a2noc";
|
compatible = "qcom,sdm660-a2noc";
|
||||||
reg = <0x01704000 0xc100>;
|
reg = <0x01704000 0xc100>;
|
||||||
#interconnect-cells = <1>;
|
#interconnect-cells = <1>;
|
||||||
clock-names = "bus", "bus_a";
|
clock-names = "bus",
|
||||||
|
"bus_a",
|
||||||
|
"ipa",
|
||||||
|
"ufs_axi",
|
||||||
|
"aggre2_ufs_axi",
|
||||||
|
"aggre2_usb3_axi",
|
||||||
|
"cfg_noc_usb2_axi";
|
||||||
clocks = <&rpmcc RPM_SMD_AGGR2_NOC_CLK>,
|
clocks = <&rpmcc RPM_SMD_AGGR2_NOC_CLK>,
|
||||||
<&rpmcc RPM_SMD_AGGR2_NOC_A_CLK>;
|
<&rpmcc RPM_SMD_AGGR2_NOC_A_CLK>,
|
||||||
|
<&rpmcc RPM_SMD_IPA_CLK>,
|
||||||
|
<&gcc GCC_UFS_AXI_CLK>,
|
||||||
|
<&gcc GCC_AGGRE2_UFS_AXI_CLK>,
|
||||||
|
<&gcc GCC_AGGRE2_USB3_AXI_CLK>,
|
||||||
|
<&gcc GCC_CFG_NOC_USB2_AXI_CLK>;
|
||||||
};
|
};
|
||||||
|
|
||||||
mnoc: interconnect@1745000 {
|
mnoc: interconnect@1745000 {
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/interrupt-controller/microchip,eic.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Microchip External Interrupt Controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
This interrupt controller is found in Microchip SoCs (SAMA7G5) and provides
|
||||||
|
support for handling up to 2 external interrupt lines.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- microchip,sama7g5-eic
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupt-controller: true
|
||||||
|
|
||||||
|
'#interrupt-cells':
|
||||||
|
const: 2
|
||||||
|
description:
|
||||||
|
The first cell is the input IRQ number (between 0 and 1), the second cell
|
||||||
|
is the trigger type as defined in interrupt.txt present in this directory.
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
description: |
|
||||||
|
Contains the GIC SPI IRQs mapped to the external interrupt lines. They
|
||||||
|
should be specified sequentially from output 0 to output 1.
|
||||||
|
minItems: 2
|
||||||
|
maxItems: 2
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
const: pclk
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupt-controller
|
||||||
|
- '#interrupt-cells'
|
||||||
|
- interrupts
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/at91.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
eic: interrupt-controller@e1628000 {
|
||||||
|
compatible = "microchip,sama7g5-eic";
|
||||||
|
reg = <0xe1628000 0x100>;
|
||||||
|
interrupt-parent = <&gic>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
interrupts = <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&pmc PMC_TYPE_PERIPHERAL 37>;
|
||||||
|
clock-names = "pclk";
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -27,6 +27,7 @@ properties:
|
|||||||
- renesas,intc-ex-r8a774a1 # RZ/G2M
|
- renesas,intc-ex-r8a774a1 # RZ/G2M
|
||||||
- renesas,intc-ex-r8a774b1 # RZ/G2N
|
- renesas,intc-ex-r8a774b1 # RZ/G2N
|
||||||
- renesas,intc-ex-r8a774c0 # RZ/G2E
|
- renesas,intc-ex-r8a774c0 # RZ/G2E
|
||||||
|
- renesas,intc-ex-r8a774e1 # RZ/G2H
|
||||||
- renesas,intc-ex-r8a7795 # R-Car H3
|
- renesas,intc-ex-r8a7795 # R-Car H3
|
||||||
- renesas,intc-ex-r8a7796 # R-Car M3-W
|
- renesas,intc-ex-r8a7796 # R-Car M3-W
|
||||||
- renesas,intc-ex-r8a77961 # R-Car M3-W+
|
- renesas,intc-ex-r8a77961 # R-Car M3-W+
|
||||||
|
@ -19,7 +19,9 @@ properties:
|
|||||||
- const: allwinner,sun8i-v3s-emac
|
- const: allwinner,sun8i-v3s-emac
|
||||||
- const: allwinner,sun50i-a64-emac
|
- const: allwinner,sun50i-a64-emac
|
||||||
- items:
|
- items:
|
||||||
- const: allwinner,sun50i-h6-emac
|
- enum:
|
||||||
|
- allwinner,sun20i-d1-emac
|
||||||
|
- allwinner,sun50i-h6-emac
|
||||||
- const: allwinner,sun50i-a64-emac
|
- const: allwinner,sun50i-a64-emac
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/ufs/samsung,exynos-ufs.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Samsung SoC series UFS host controller Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Alim Akhtar <alim.akhtar@samsung.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Each Samsung UFS host controller instance should have its own node.
|
||||||
|
This binding define Samsung specific binding other then what is used
|
||||||
|
in the common ufshcd bindings
|
||||||
|
[1] Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt
|
||||||
|
|
||||||
|
properties:
|
||||||
|
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- samsung,exynos7-ufs
|
||||||
|
|
||||||
|
reg:
|
||||||
|
items:
|
||||||
|
- description: HCI register
|
||||||
|
- description: vendor specific register
|
||||||
|
- description: unipro register
|
||||||
|
- description: UFS protector register
|
||||||
|
|
||||||
|
reg-names:
|
||||||
|
items:
|
||||||
|
- const: hci
|
||||||
|
- const: vs_hci
|
||||||
|
- const: unipro
|
||||||
|
- const: ufsp
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: ufs link core clock
|
||||||
|
- description: unipro main clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: core_clk
|
||||||
|
- const: sclk_unipro_main
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
phys:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
phy-names:
|
||||||
|
const: ufs-phy
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- phys
|
||||||
|
- phy-names
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/clock/exynos7-clk.h>
|
||||||
|
|
||||||
|
ufs: ufs@15570000 {
|
||||||
|
compatible = "samsung,exynos7-ufs";
|
||||||
|
reg = <0x15570000 0x100>,
|
||||||
|
<0x15570100 0x100>,
|
||||||
|
<0x15571000 0x200>,
|
||||||
|
<0x15572000 0x300>;
|
||||||
|
reg-names = "hci", "vs_hci", "unipro", "ufsp";
|
||||||
|
interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&clock_fsys1 ACLK_UFS20_LINK>,
|
||||||
|
<&clock_fsys1 SCLK_UFSUNIPRO20_USER>;
|
||||||
|
clock-names = "core_clk", "sclk_unipro_main";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&ufs_rst_n &ufs_refclk_out>;
|
||||||
|
phys = <&ufs_phy>;
|
||||||
|
phy-names = "ufs-phy";
|
||||||
|
};
|
||||||
|
...
|
@ -132,20 +132,3 @@ On Family 17h and Family 18h CPUs, additional temperature sensors may report
|
|||||||
Core Complex Die (CCD) temperatures. Up to 8 such temperatures are reported
|
Core Complex Die (CCD) temperatures. Up to 8 such temperatures are reported
|
||||||
as temp{3..10}_input, labeled Tccd{1..8}. Actual support depends on the CPU
|
as temp{3..10}_input, labeled Tccd{1..8}. Actual support depends on the CPU
|
||||||
variant.
|
variant.
|
||||||
|
|
||||||
Various Family 17h and 18h CPUs report voltage and current telemetry
|
|
||||||
information. The following attributes may be reported.
|
|
||||||
|
|
||||||
Attribute Label Description
|
|
||||||
=============== ======= ================
|
|
||||||
in0_input Vcore Core voltage
|
|
||||||
in1_input Vsoc SoC voltage
|
|
||||||
curr1_input Icore Core current
|
|
||||||
curr2_input Isoc SoC current
|
|
||||||
=============== ======= ================
|
|
||||||
|
|
||||||
Current values are raw (unscaled) as reported by the CPU. Core current is
|
|
||||||
reported as multiples of 1A / LSB. SoC is reported as multiples of 0.25A
|
|
||||||
/ LSB. The real current is board specific. Reported currents should be seen
|
|
||||||
as rough guidance, and should be scaled using sensors3.conf as appropriate
|
|
||||||
for a given board.
|
|
||||||
|
@ -851,7 +851,7 @@ NOTES:
|
|||||||
- 0x88A8 traffic will not be received unless VLAN stripping is disabled with
|
- 0x88A8 traffic will not be received unless VLAN stripping is disabled with
|
||||||
the following command::
|
the following command::
|
||||||
|
|
||||||
# ethool -K <ethX> rxvlan off
|
# ethtool -K <ethX> rxvlan off
|
||||||
|
|
||||||
- 0x88A8/0x8100 double VLANs cannot be used with 0x8100 or 0x8100/0x8100 VLANS
|
- 0x88A8/0x8100 double VLANs cannot be used with 0x8100 or 0x8100/0x8100 VLANS
|
||||||
configured on the same port. 0x88a8/0x8100 traffic will not be received if
|
configured on the same port. 0x88a8/0x8100 traffic will not be received if
|
||||||
|
@ -296,7 +296,7 @@ not available.
|
|||||||
Device Tree bindings and board design
|
Device Tree bindings and board design
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
This section references ``Documentation/devicetree/bindings/net/dsa/sja1105.txt``
|
This section references ``Documentation/devicetree/bindings/net/dsa/nxp,sja1105.yaml``
|
||||||
and aims to showcase some potential switch caveats.
|
and aims to showcase some potential switch caveats.
|
||||||
|
|
||||||
RMII PHY role and out-of-band signaling
|
RMII PHY role and out-of-band signaling
|
||||||
|
@ -29,7 +29,7 @@ you probably needn't concern yourself with pcmciautils.
|
|||||||
====================== =============== ========================================
|
====================== =============== ========================================
|
||||||
Program Minimal version Command to check the version
|
Program Minimal version Command to check the version
|
||||||
====================== =============== ========================================
|
====================== =============== ========================================
|
||||||
GNU C 4.9 gcc --version
|
GNU C 5.1 gcc --version
|
||||||
Clang/LLVM (optional) 10.0.1 clang --version
|
Clang/LLVM (optional) 10.0.1 clang --version
|
||||||
GNU make 3.81 make --version
|
GNU make 3.81 make --version
|
||||||
binutils 2.23 ld -v
|
binutils 2.23 ld -v
|
||||||
|
@ -223,7 +223,7 @@ Linux内核5.x版本 <http://kernel.org/>
|
|||||||
编译内核
|
编译内核
|
||||||
---------
|
---------
|
||||||
|
|
||||||
- 确保您至少有gcc 4.9可用。
|
- 确保您至少有gcc 5.1可用。
|
||||||
有关更多信息,请参阅 :ref:`Documentation/process/changes.rst <changes>` 。
|
有关更多信息,请参阅 :ref:`Documentation/process/changes.rst <changes>` 。
|
||||||
|
|
||||||
请注意,您仍然可以使用此内核运行a.out用户程序。
|
请注意,您仍然可以使用此内核运行a.out用户程序。
|
||||||
|
@ -226,7 +226,7 @@ Linux內核5.x版本 <http://kernel.org/>
|
|||||||
編譯內核
|
編譯內核
|
||||||
---------
|
---------
|
||||||
|
|
||||||
- 確保您至少有gcc 4.9可用。
|
- 確保您至少有gcc 5.1可用。
|
||||||
有關更多信息,請參閱 :ref:`Documentation/process/changes.rst <changes>` 。
|
有關更多信息,請參閱 :ref:`Documentation/process/changes.rst <changes>` 。
|
||||||
|
|
||||||
請注意,您仍然可以使用此內核運行a.out用戶程序。
|
請注意,您仍然可以使用此內核運行a.out用戶程序。
|
||||||
|
74
MAINTAINERS
74
MAINTAINERS
@ -414,7 +414,8 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
|
|||||||
F: drivers/acpi/pmic/
|
F: drivers/acpi/pmic/
|
||||||
|
|
||||||
ACPI THERMAL DRIVER
|
ACPI THERMAL DRIVER
|
||||||
M: Zhang Rui <rui.zhang@intel.com>
|
M: Rafael J. Wysocki <rafael@kernel.org>
|
||||||
|
R: Zhang Rui <rui.zhang@intel.com>
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://01.org/linux-acpi
|
W: https://01.org/linux-acpi
|
||||||
@ -810,7 +811,7 @@ F: Documentation/devicetree/bindings/dma/altr,msgdma.yaml
|
|||||||
F: drivers/dma/altera-msgdma.c
|
F: drivers/dma/altera-msgdma.c
|
||||||
|
|
||||||
ALTERA PIO DRIVER
|
ALTERA PIO DRIVER
|
||||||
M: Joyce Ooi <joyce.ooi@intel.com>
|
M: Mun Yew Tham <mun.yew.tham@intel.com>
|
||||||
L: linux-gpio@vger.kernel.org
|
L: linux-gpio@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/gpio/gpio-altera.c
|
F: drivers/gpio/gpio-altera.c
|
||||||
@ -977,12 +978,12 @@ L: platform-driver-x86@vger.kernel.org
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/platform/x86/amd-pmc.*
|
F: drivers/platform/x86/amd-pmc.*
|
||||||
|
|
||||||
AMD POWERPLAY
|
AMD POWERPLAY AND SWSMU
|
||||||
M: Evan Quan <evan.quan@amd.com>
|
M: Evan Quan <evan.quan@amd.com>
|
||||||
L: amd-gfx@lists.freedesktop.org
|
L: amd-gfx@lists.freedesktop.org
|
||||||
S: Supported
|
S: Supported
|
||||||
T: git https://gitlab.freedesktop.org/agd5f/linux.git
|
T: git https://gitlab.freedesktop.org/agd5f/linux.git
|
||||||
F: drivers/gpu/drm/amd/pm/powerplay/
|
F: drivers/gpu/drm/amd/pm/
|
||||||
|
|
||||||
AMD PTDMA DRIVER
|
AMD PTDMA DRIVER
|
||||||
M: Sanjay R Mehta <sanju.mehta@amd.com>
|
M: Sanjay R Mehta <sanju.mehta@amd.com>
|
||||||
@ -1550,7 +1551,7 @@ ARM PRIMECELL VIC PL190/PL192 DRIVER
|
|||||||
M: Linus Walleij <linus.walleij@linaro.org>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/interrupt-controller/arm,vic.txt
|
F: Documentation/devicetree/bindings/interrupt-controller/arm,vic.yaml
|
||||||
F: drivers/irqchip/irq-vic.c
|
F: drivers/irqchip/irq-vic.c
|
||||||
|
|
||||||
ARM SMC WATCHDOG DRIVER
|
ARM SMC WATCHDOG DRIVER
|
||||||
@ -2804,9 +2805,8 @@ F: arch/arm/mach-pxa/include/mach/vpac270.h
|
|||||||
F: arch/arm/mach-pxa/vpac270.c
|
F: arch/arm/mach-pxa/vpac270.c
|
||||||
|
|
||||||
ARM/VT8500 ARM ARCHITECTURE
|
ARM/VT8500 ARM ARCHITECTURE
|
||||||
M: Tony Prisk <linux@prisktech.co.nz>
|
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Orphan
|
||||||
F: Documentation/devicetree/bindings/i2c/i2c-wmt.txt
|
F: Documentation/devicetree/bindings/i2c/i2c-wmt.txt
|
||||||
F: arch/arm/mach-vt8500/
|
F: arch/arm/mach-vt8500/
|
||||||
F: drivers/clocksource/timer-vt8500.c
|
F: drivers/clocksource/timer-vt8500.c
|
||||||
@ -2962,7 +2962,7 @@ F: crypto/async_tx/
|
|||||||
F: include/linux/async_tx.h
|
F: include/linux/async_tx.h
|
||||||
|
|
||||||
AT24 EEPROM DRIVER
|
AT24 EEPROM DRIVER
|
||||||
M: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
M: Bartosz Golaszewski <brgl@bgdev.pl>
|
||||||
L: linux-i2c@vger.kernel.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
|
||||||
@ -3385,9 +3385,11 @@ F: Documentation/networking/filter.rst
|
|||||||
F: Documentation/userspace-api/ebpf/
|
F: Documentation/userspace-api/ebpf/
|
||||||
F: arch/*/net/*
|
F: arch/*/net/*
|
||||||
F: include/linux/bpf*
|
F: include/linux/bpf*
|
||||||
|
F: include/linux/btf*
|
||||||
F: include/linux/filter.h
|
F: include/linux/filter.h
|
||||||
F: include/trace/events/xdp.h
|
F: include/trace/events/xdp.h
|
||||||
F: include/uapi/linux/bpf*
|
F: include/uapi/linux/bpf*
|
||||||
|
F: include/uapi/linux/btf*
|
||||||
F: include/uapi/linux/filter.h
|
F: include/uapi/linux/filter.h
|
||||||
F: kernel/bpf/
|
F: kernel/bpf/
|
||||||
F: kernel/trace/bpf_trace.c
|
F: kernel/trace/bpf_trace.c
|
||||||
@ -3821,7 +3823,6 @@ F: drivers/scsi/mpi3mr/
|
|||||||
|
|
||||||
BROADCOM NETXTREME-E ROCE DRIVER
|
BROADCOM NETXTREME-E ROCE DRIVER
|
||||||
M: Selvin Xavier <selvin.xavier@broadcom.com>
|
M: Selvin Xavier <selvin.xavier@broadcom.com>
|
||||||
M: Naresh Kumar PBS <nareshkumar.pbs@broadcom.com>
|
|
||||||
L: linux-rdma@vger.kernel.org
|
L: linux-rdma@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.broadcom.com
|
W: http://www.broadcom.com
|
||||||
@ -4656,7 +4657,7 @@ W: http://linux-cifs.samba.org/
|
|||||||
T: git git://git.samba.org/sfrench/cifs-2.6.git
|
T: git git://git.samba.org/sfrench/cifs-2.6.git
|
||||||
F: Documentation/admin-guide/cifs/
|
F: Documentation/admin-guide/cifs/
|
||||||
F: fs/cifs/
|
F: fs/cifs/
|
||||||
F: fs/cifs_common/
|
F: fs/smbfs_common/
|
||||||
|
|
||||||
COMPACTPCI HOTPLUG CORE
|
COMPACTPCI HOTPLUG CORE
|
||||||
M: Scott Murray <scott@spiteful.org>
|
M: Scott Murray <scott@spiteful.org>
|
||||||
@ -7986,7 +7987,7 @@ F: include/linux/gpio/regmap.h
|
|||||||
|
|
||||||
GPIO SUBSYSTEM
|
GPIO SUBSYSTEM
|
||||||
M: Linus Walleij <linus.walleij@linaro.org>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
M: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
M: Bartosz Golaszewski <brgl@bgdev.pl>
|
||||||
L: linux-gpio@vger.kernel.org
|
L: linux-gpio@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
|
||||||
@ -10194,8 +10195,8 @@ M: Hyunchul Lee <hyc.lee@gmail.com>
|
|||||||
L: linux-cifs@vger.kernel.org
|
L: linux-cifs@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.samba.org/ksmbd.git
|
T: git git://git.samba.org/ksmbd.git
|
||||||
F: fs/cifs_common/
|
|
||||||
F: fs/ksmbd/
|
F: fs/ksmbd/
|
||||||
|
F: fs/smbfs_common/
|
||||||
|
|
||||||
KERNEL UNIT TESTING FRAMEWORK (KUnit)
|
KERNEL UNIT TESTING FRAMEWORK (KUnit)
|
||||||
M: Brendan Higgins <brendanhiggins@google.com>
|
M: Brendan Higgins <brendanhiggins@google.com>
|
||||||
@ -11367,7 +11368,7 @@ F: Documentation/devicetree/bindings/iio/proximity/maxbotix,mb1232.yaml
|
|||||||
F: drivers/iio/proximity/mb1232.c
|
F: drivers/iio/proximity/mb1232.c
|
||||||
|
|
||||||
MAXIM MAX77650 PMIC MFD DRIVER
|
MAXIM MAX77650 PMIC MFD DRIVER
|
||||||
M: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
M: Bartosz Golaszewski <brgl@bgdev.pl>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/*/*max77650.yaml
|
F: Documentation/devicetree/bindings/*/*max77650.yaml
|
||||||
@ -12253,6 +12254,12 @@ L: linux-crypto@vger.kernel.org
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/crypto/atmel-ecc.*
|
F: drivers/crypto/atmel-ecc.*
|
||||||
|
|
||||||
|
MICROCHIP EIC DRIVER
|
||||||
|
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
S: Supported
|
||||||
|
F: drivers/irqchip/irq-mchp-eic.c
|
||||||
|
|
||||||
MICROCHIP I2C DRIVER
|
MICROCHIP I2C DRIVER
|
||||||
M: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
|
M: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
|
||||||
L: linux-i2c@vger.kernel.org
|
L: linux-i2c@vger.kernel.org
|
||||||
@ -13255,9 +13262,9 @@ F: Documentation/scsi/NinjaSCSI.rst
|
|||||||
F: drivers/scsi/nsp32*
|
F: drivers/scsi/nsp32*
|
||||||
|
|
||||||
NIOS2 ARCHITECTURE
|
NIOS2 ARCHITECTURE
|
||||||
M: Ley Foon Tan <ley.foon.tan@intel.com>
|
M: Dinh Nguyen <dinguyen@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lftan/nios2.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git
|
||||||
F: arch/nios2/
|
F: arch/nios2/
|
||||||
|
|
||||||
NITRO ENCLAVES (NE)
|
NITRO ENCLAVES (NE)
|
||||||
@ -14342,7 +14349,8 @@ F: Documentation/devicetree/bindings/pci/intel,ixp4xx-pci.yaml
|
|||||||
F: drivers/pci/controller/pci-ixp4xx.c
|
F: drivers/pci/controller/pci-ixp4xx.c
|
||||||
|
|
||||||
PCI DRIVER FOR INTEL VOLUME MANAGEMENT DEVICE (VMD)
|
PCI DRIVER FOR INTEL VOLUME MANAGEMENT DEVICE (VMD)
|
||||||
M: Jonathan Derrick <jonathan.derrick@intel.com>
|
M: Nirmal Patel <nirmal.patel@linux.intel.com>
|
||||||
|
R: Jonathan Derrick <jonathan.derrick@linux.dev>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/pci/controller/vmd.c
|
F: drivers/pci/controller/vmd.c
|
||||||
@ -16650,13 +16658,6 @@ M: Lubomir Rintel <lkundrak@v3.sk>
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/char/pcmcia/scr24x_cs.c
|
F: drivers/char/pcmcia/scr24x_cs.c
|
||||||
|
|
||||||
SCSI CDROM DRIVER
|
|
||||||
M: Jens Axboe <axboe@kernel.dk>
|
|
||||||
L: linux-scsi@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
W: http://www.kernel.dk
|
|
||||||
F: drivers/scsi/sr*
|
|
||||||
|
|
||||||
SCSI RDMA PROTOCOL (SRP) INITIATOR
|
SCSI RDMA PROTOCOL (SRP) INITIATOR
|
||||||
M: Bart Van Assche <bvanassche@acm.org>
|
M: Bart Van Assche <bvanassche@acm.org>
|
||||||
L: linux-rdma@vger.kernel.org
|
L: linux-rdma@vger.kernel.org
|
||||||
@ -16955,7 +16956,6 @@ F: drivers/misc/sgi-xp/
|
|||||||
|
|
||||||
SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
|
SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
|
||||||
M: Karsten Graul <kgraul@linux.ibm.com>
|
M: Karsten Graul <kgraul@linux.ibm.com>
|
||||||
M: Guvenc Gulce <guvenc@linux.ibm.com>
|
|
||||||
L: linux-s390@vger.kernel.org
|
L: linux-s390@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||||
@ -17891,7 +17891,8 @@ M: Olivier Moysan <olivier.moysan@foss.st.com>
|
|||||||
M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
|
M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
|
||||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/iio/adc/st,stm32-*.yaml
|
F: Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml
|
||||||
|
F: Documentation/devicetree/bindings/sound/st,stm32-*.yaml
|
||||||
F: sound/soc/stm/
|
F: sound/soc/stm/
|
||||||
|
|
||||||
STM32 TIMER/LPTIMER DRIVERS
|
STM32 TIMER/LPTIMER DRIVERS
|
||||||
@ -17968,10 +17969,11 @@ F: Documentation/admin-guide/svga.rst
|
|||||||
F: arch/x86/boot/video*
|
F: arch/x86/boot/video*
|
||||||
|
|
||||||
SWIOTLB SUBSYSTEM
|
SWIOTLB SUBSYSTEM
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Christoph Hellwig <hch@infradead.org>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
S: Supported
|
S: Supported
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb.git
|
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||||
|
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
||||||
F: arch/*/kernel/pci-swiotlb.c
|
F: arch/*/kernel/pci-swiotlb.c
|
||||||
F: include/linux/swiotlb.h
|
F: include/linux/swiotlb.h
|
||||||
F: kernel/dma/swiotlb.c
|
F: kernel/dma/swiotlb.c
|
||||||
@ -18554,13 +18556,14 @@ T: git git://linuxtv.org/media_tree.git
|
|||||||
F: drivers/media/radio/radio-raremono.c
|
F: drivers/media/radio/radio-raremono.c
|
||||||
|
|
||||||
THERMAL
|
THERMAL
|
||||||
M: Zhang Rui <rui.zhang@intel.com>
|
M: Rafael J. Wysocki <rafael@kernel.org>
|
||||||
M: Daniel Lezcano <daniel.lezcano@linaro.org>
|
M: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||||
R: Amit Kucheria <amitk@kernel.org>
|
R: Amit Kucheria <amitk@kernel.org>
|
||||||
|
R: Zhang Rui <rui.zhang@intel.com>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
Q: https://patchwork.kernel.org/project/linux-pm/list/
|
Q: https://patchwork.kernel.org/project/linux-pm/list/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal
|
||||||
F: Documentation/devicetree/bindings/thermal/
|
F: Documentation/devicetree/bindings/thermal/
|
||||||
F: drivers/thermal/
|
F: drivers/thermal/
|
||||||
F: include/linux/cpu_cooling.h
|
F: include/linux/cpu_cooling.h
|
||||||
@ -18689,7 +18692,7 @@ F: include/linux/clk/ti.h
|
|||||||
|
|
||||||
TI DAVINCI MACHINE SUPPORT
|
TI DAVINCI MACHINE SUPPORT
|
||||||
M: Sekhar Nori <nsekhar@ti.com>
|
M: Sekhar Nori <nsekhar@ti.com>
|
||||||
R: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
R: Bartosz Golaszewski <brgl@bgdev.pl>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci.git
|
||||||
@ -19288,13 +19291,12 @@ S: Maintained
|
|||||||
F: drivers/usb/misc/chaoskey.c
|
F: drivers/usb/misc/chaoskey.c
|
||||||
|
|
||||||
USB CYPRESS C67X00 DRIVER
|
USB CYPRESS C67X00 DRIVER
|
||||||
M: Peter Korsgaard <jacmet@sunsite.dk>
|
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Orphan
|
||||||
F: drivers/usb/c67x00/
|
F: drivers/usb/c67x00/
|
||||||
|
|
||||||
USB DAVICOM DM9601 DRIVER
|
USB DAVICOM DM9601 DRIVER
|
||||||
M: Peter Korsgaard <jacmet@sunsite.dk>
|
M: Peter Korsgaard <peter@korsgaard.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://www.linux-usb.org/usbnet
|
W: http://www.linux-usb.org/usbnet
|
||||||
@ -20474,7 +20476,6 @@ F: samples/bpf/xdpsock*
|
|||||||
F: tools/lib/bpf/xsk*
|
F: tools/lib/bpf/xsk*
|
||||||
|
|
||||||
XEN BLOCK SUBSYSTEM
|
XEN BLOCK SUBSYSTEM
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
|
||||||
M: Roger Pau Monné <roger.pau@citrix.com>
|
M: Roger Pau Monné <roger.pau@citrix.com>
|
||||||
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
@ -20522,7 +20523,7 @@ S: Supported
|
|||||||
F: drivers/net/xen-netback/*
|
F: drivers/net/xen-netback/*
|
||||||
|
|
||||||
XEN PCI SUBSYSTEM
|
XEN PCI SUBSYSTEM
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Juergen Gross <jgross@suse.com>
|
||||||
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/pci/*xen*
|
F: arch/x86/pci/*xen*
|
||||||
@ -20545,7 +20546,8 @@ S: Supported
|
|||||||
F: sound/xen/*
|
F: sound/xen/*
|
||||||
|
|
||||||
XEN SWIOTLB SUBSYSTEM
|
XEN SWIOTLB SUBSYSTEM
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Juergen Gross <jgross@suse.com>
|
||||||
|
M: Stefano Stabellini <sstabellini@kernel.org>
|
||||||
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
8
Makefile
8
Makefile
@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 15
|
PATCHLEVEL = 15
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc4
|
||||||
NAME = Opossums on Parade
|
NAME = Opossums on Parade
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@ -849,12 +849,6 @@ endif
|
|||||||
|
|
||||||
DEBUG_CFLAGS :=
|
DEBUG_CFLAGS :=
|
||||||
|
|
||||||
# Workaround for GCC versions < 5.0
|
|
||||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61801
|
|
||||||
ifdef CONFIG_CC_IS_GCC
|
|
||||||
DEBUG_CFLAGS += $(call cc-ifversion, -lt, 0500, $(call cc-option, -fno-var-tracking-assignments))
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef CONFIG_DEBUG_INFO
|
ifdef CONFIG_DEBUG_INFO
|
||||||
|
|
||||||
ifdef CONFIG_DEBUG_INFO_SPLIT
|
ifdef CONFIG_DEBUG_INFO_SPLIT
|
||||||
|
@ -20,7 +20,7 @@ config ALPHA
|
|||||||
select NEED_SG_DMA_LENGTH
|
select NEED_SG_DMA_LENGTH
|
||||||
select VIRT_TO_BUS
|
select VIRT_TO_BUS
|
||||||
select GENERIC_IRQ_PROBE
|
select GENERIC_IRQ_PROBE
|
||||||
select GENERIC_PCI_IOMAP if PCI
|
select GENERIC_PCI_IOMAP
|
||||||
select AUTO_IRQ_AFFINITY if SMP
|
select AUTO_IRQ_AFFINITY if SMP
|
||||||
select GENERIC_IRQ_SHOW
|
select GENERIC_IRQ_SHOW
|
||||||
select ARCH_WANT_IPC_PARSE_VERSION
|
select ARCH_WANT_IPC_PARSE_VERSION
|
||||||
@ -199,7 +199,6 @@ config ALPHA_EIGER
|
|||||||
|
|
||||||
config ALPHA_JENSEN
|
config ALPHA_JENSEN
|
||||||
bool "Jensen"
|
bool "Jensen"
|
||||||
depends on BROKEN
|
|
||||||
select HAVE_EISA
|
select HAVE_EISA
|
||||||
help
|
help
|
||||||
DEC PC 150 AXP (aka Jensen): This is a very old Digital system - one
|
DEC PC 150 AXP (aka Jensen): This is a very old Digital system - one
|
||||||
|
@ -16,3 +16,4 @@ extern void __divlu(void);
|
|||||||
extern void __remlu(void);
|
extern void __remlu(void);
|
||||||
extern void __divqu(void);
|
extern void __divqu(void);
|
||||||
extern void __remqu(void);
|
extern void __remqu(void);
|
||||||
|
extern unsigned long __udiv_qrnnd(unsigned long *, unsigned long, unsigned long , unsigned long);
|
||||||
|
@ -60,7 +60,7 @@ extern inline void set_hae(unsigned long new_hae)
|
|||||||
* Change virtual addresses to physical addresses and vv.
|
* Change virtual addresses to physical addresses and vv.
|
||||||
*/
|
*/
|
||||||
#ifdef USE_48_BIT_KSEG
|
#ifdef USE_48_BIT_KSEG
|
||||||
static inline unsigned long virt_to_phys(void *address)
|
static inline unsigned long virt_to_phys(volatile void *address)
|
||||||
{
|
{
|
||||||
return (unsigned long)address - IDENT_ADDR;
|
return (unsigned long)address - IDENT_ADDR;
|
||||||
}
|
}
|
||||||
@ -70,7 +70,7 @@ static inline void * phys_to_virt(unsigned long address)
|
|||||||
return (void *) (address + IDENT_ADDR);
|
return (void *) (address + IDENT_ADDR);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline unsigned long virt_to_phys(void *address)
|
static inline unsigned long virt_to_phys(volatile void *address)
|
||||||
{
|
{
|
||||||
unsigned long phys = (unsigned long)address;
|
unsigned long phys = (unsigned long)address;
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ static inline void * phys_to_virt(unsigned long address)
|
|||||||
extern unsigned long __direct_map_base;
|
extern unsigned long __direct_map_base;
|
||||||
extern unsigned long __direct_map_size;
|
extern unsigned long __direct_map_size;
|
||||||
|
|
||||||
static inline unsigned long __deprecated virt_to_bus(void *address)
|
static inline unsigned long __deprecated virt_to_bus(volatile void *address)
|
||||||
{
|
{
|
||||||
unsigned long phys = virt_to_phys(address);
|
unsigned long phys = virt_to_phys(address);
|
||||||
unsigned long bus = phys + __direct_map_base;
|
unsigned long bus = phys + __direct_map_base;
|
||||||
|
@ -111,18 +111,18 @@ __EXTERN_INLINE void jensen_set_hae(unsigned long addr)
|
|||||||
* convinced that I need one of the newer machines.
|
* convinced that I need one of the newer machines.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static inline unsigned int jensen_local_inb(unsigned long addr)
|
__EXTERN_INLINE unsigned int jensen_local_inb(unsigned long addr)
|
||||||
{
|
{
|
||||||
return 0xff & *(vuip)((addr << 9) + EISA_VL82C106);
|
return 0xff & *(vuip)((addr << 9) + EISA_VL82C106);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void jensen_local_outb(u8 b, unsigned long addr)
|
__EXTERN_INLINE void jensen_local_outb(u8 b, unsigned long addr)
|
||||||
{
|
{
|
||||||
*(vuip)((addr << 9) + EISA_VL82C106) = b;
|
*(vuip)((addr << 9) + EISA_VL82C106) = b;
|
||||||
mb();
|
mb();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int jensen_bus_inb(unsigned long addr)
|
__EXTERN_INLINE unsigned int jensen_bus_inb(unsigned long addr)
|
||||||
{
|
{
|
||||||
long result;
|
long result;
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ static inline unsigned int jensen_bus_inb(unsigned long addr)
|
|||||||
return __kernel_extbl(result, addr & 3);
|
return __kernel_extbl(result, addr & 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void jensen_bus_outb(u8 b, unsigned long addr)
|
__EXTERN_INLINE void jensen_bus_outb(u8 b, unsigned long addr)
|
||||||
{
|
{
|
||||||
jensen_set_hae(0);
|
jensen_set_hae(0);
|
||||||
*(vuip)((addr << 7) + EISA_IO + 0x00) = b * 0x01010101;
|
*(vuip)((addr << 7) + EISA_IO + 0x00) = b * 0x01010101;
|
||||||
|
43
arch/alpha/include/asm/setup.h
Normal file
43
arch/alpha/include/asm/setup.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
#ifndef __ALPHA_SETUP_H
|
||||||
|
#define __ALPHA_SETUP_H
|
||||||
|
|
||||||
|
#include <uapi/asm/setup.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We leave one page for the initial stack page, and one page for
|
||||||
|
* the initial process structure. Also, the console eats 3 MB for
|
||||||
|
* the initial bootloader (one of which we can reclaim later).
|
||||||
|
*/
|
||||||
|
#define BOOT_PCB 0x20000000
|
||||||
|
#define BOOT_ADDR 0x20000000
|
||||||
|
/* Remove when official MILO sources have ELF support: */
|
||||||
|
#define BOOT_SIZE (16*1024)
|
||||||
|
|
||||||
|
#ifdef CONFIG_ALPHA_LEGACY_START_ADDRESS
|
||||||
|
#define KERNEL_START_PHYS 0x300000 /* Old bootloaders hardcoded this. */
|
||||||
|
#else
|
||||||
|
#define KERNEL_START_PHYS 0x1000000 /* required: Wildfire/Titan/Marvel */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define KERNEL_START (PAGE_OFFSET+KERNEL_START_PHYS)
|
||||||
|
#define SWAPPER_PGD KERNEL_START
|
||||||
|
#define INIT_STACK (PAGE_OFFSET+KERNEL_START_PHYS+0x02000)
|
||||||
|
#define EMPTY_PGT (PAGE_OFFSET+KERNEL_START_PHYS+0x04000)
|
||||||
|
#define EMPTY_PGE (PAGE_OFFSET+KERNEL_START_PHYS+0x08000)
|
||||||
|
#define ZERO_PGE (PAGE_OFFSET+KERNEL_START_PHYS+0x0A000)
|
||||||
|
|
||||||
|
#define START_ADDR (PAGE_OFFSET+KERNEL_START_PHYS+0x10000)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is setup by the secondary bootstrap loader. Because
|
||||||
|
* the zero page is zeroed out as soon as the vm system is
|
||||||
|
* initialized, we need to copy things out into a more permanent
|
||||||
|
* place.
|
||||||
|
*/
|
||||||
|
#define PARAM ZERO_PGE
|
||||||
|
#define COMMAND_LINE ((char *)(absolute_pointer(PARAM + 0x0000)))
|
||||||
|
#define INITRD_START (*(unsigned long *) (PARAM+0x100))
|
||||||
|
#define INITRD_SIZE (*(unsigned long *) (PARAM+0x108))
|
||||||
|
|
||||||
|
#endif
|
@ -1,43 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||||
#ifndef __ALPHA_SETUP_H
|
#ifndef _UAPI__ALPHA_SETUP_H
|
||||||
#define __ALPHA_SETUP_H
|
#define _UAPI__ALPHA_SETUP_H
|
||||||
|
|
||||||
#define COMMAND_LINE_SIZE 256
|
#define COMMAND_LINE_SIZE 256
|
||||||
|
|
||||||
/*
|
#endif /* _UAPI__ALPHA_SETUP_H */
|
||||||
* We leave one page for the initial stack page, and one page for
|
|
||||||
* the initial process structure. Also, the console eats 3 MB for
|
|
||||||
* the initial bootloader (one of which we can reclaim later).
|
|
||||||
*/
|
|
||||||
#define BOOT_PCB 0x20000000
|
|
||||||
#define BOOT_ADDR 0x20000000
|
|
||||||
/* Remove when official MILO sources have ELF support: */
|
|
||||||
#define BOOT_SIZE (16*1024)
|
|
||||||
|
|
||||||
#ifdef CONFIG_ALPHA_LEGACY_START_ADDRESS
|
|
||||||
#define KERNEL_START_PHYS 0x300000 /* Old bootloaders hardcoded this. */
|
|
||||||
#else
|
|
||||||
#define KERNEL_START_PHYS 0x1000000 /* required: Wildfire/Titan/Marvel */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define KERNEL_START (PAGE_OFFSET+KERNEL_START_PHYS)
|
|
||||||
#define SWAPPER_PGD KERNEL_START
|
|
||||||
#define INIT_STACK (PAGE_OFFSET+KERNEL_START_PHYS+0x02000)
|
|
||||||
#define EMPTY_PGT (PAGE_OFFSET+KERNEL_START_PHYS+0x04000)
|
|
||||||
#define EMPTY_PGE (PAGE_OFFSET+KERNEL_START_PHYS+0x08000)
|
|
||||||
#define ZERO_PGE (PAGE_OFFSET+KERNEL_START_PHYS+0x0A000)
|
|
||||||
|
|
||||||
#define START_ADDR (PAGE_OFFSET+KERNEL_START_PHYS+0x10000)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is setup by the secondary bootstrap loader. Because
|
|
||||||
* the zero page is zeroed out as soon as the vm system is
|
|
||||||
* initialized, we need to copy things out into a more permanent
|
|
||||||
* place.
|
|
||||||
*/
|
|
||||||
#define PARAM ZERO_PGE
|
|
||||||
#define COMMAND_LINE ((char*)(PARAM + 0x0000))
|
|
||||||
#define INITRD_START (*(unsigned long *) (PARAM+0x100))
|
|
||||||
#define INITRD_SIZE (*(unsigned long *) (PARAM+0x108))
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -7,6 +7,11 @@
|
|||||||
*
|
*
|
||||||
* Code supporting the Jensen.
|
* Code supporting the Jensen.
|
||||||
*/
|
*/
|
||||||
|
#define __EXTERN_INLINE
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/jensen.h>
|
||||||
|
#undef __EXTERN_INLINE
|
||||||
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
@ -17,11 +22,6 @@
|
|||||||
|
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
#define __EXTERN_INLINE inline
|
|
||||||
#include <asm/io.h>
|
|
||||||
#include <asm/jensen.h>
|
|
||||||
#undef __EXTERN_INLINE
|
|
||||||
|
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
|
@ -14,6 +14,7 @@ ev6-$(CONFIG_ALPHA_EV6) := ev6-
|
|||||||
ev67-$(CONFIG_ALPHA_EV67) := ev67-
|
ev67-$(CONFIG_ALPHA_EV67) := ev67-
|
||||||
|
|
||||||
lib-y = __divqu.o __remqu.o __divlu.o __remlu.o \
|
lib-y = __divqu.o __remqu.o __divlu.o __remlu.o \
|
||||||
|
udiv-qrnnd.o \
|
||||||
udelay.o \
|
udelay.o \
|
||||||
$(ev6-y)memset.o \
|
$(ev6-y)memset.o \
|
||||||
$(ev6-y)memcpy.o \
|
$(ev6-y)memcpy.o \
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
# along with GCC; see the file COPYING. If not, write to the
|
# along with GCC; see the file COPYING. If not, write to the
|
||||||
# Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
# MA 02111-1307, USA.
|
# MA 02111-1307, USA.
|
||||||
|
#include <asm/export.h>
|
||||||
|
|
||||||
.set noreorder
|
.set noreorder
|
||||||
.set noat
|
.set noat
|
||||||
@ -161,3 +162,4 @@ $Odd:
|
|||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
|
||||||
.end __udiv_qrnnd
|
.end __udiv_qrnnd
|
||||||
|
EXPORT_SYMBOL(__udiv_qrnnd)
|
@ -7,4 +7,4 @@ ccflags-y := -w
|
|||||||
|
|
||||||
obj-$(CONFIG_MATHEMU) += math-emu.o
|
obj-$(CONFIG_MATHEMU) += math-emu.o
|
||||||
|
|
||||||
math-emu-objs := math.o qrnnd.o
|
math-emu-objs := math.o
|
||||||
|
@ -403,5 +403,3 @@ alpha_fp_emul_imprecise (struct pt_regs *regs, unsigned long write_mask)
|
|||||||
egress:
|
egress:
|
||||||
return si_code;
|
return si_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(__udiv_qrnnd);
|
|
||||||
|
@ -40,7 +40,6 @@ config ARC
|
|||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
select HAVE_MOD_ARCH_SPECIFIC
|
select HAVE_MOD_ARCH_SPECIFIC
|
||||||
select HAVE_PERF_EVENTS
|
select HAVE_PERF_EVENTS
|
||||||
select HANDLE_DOMAIN_IRQ
|
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
select OF
|
select OF
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <asm/mach_desc.h>
|
#include <asm/mach_desc.h>
|
||||||
|
|
||||||
|
#include <asm/irq_regs.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -39,5 +41,11 @@ void __init init_IRQ(void)
|
|||||||
*/
|
*/
|
||||||
void arch_do_IRQ(unsigned int hwirq, struct pt_regs *regs)
|
void arch_do_IRQ(unsigned int hwirq, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
handle_domain_irq(NULL, hwirq, regs);
|
struct pt_regs *old_regs;
|
||||||
|
|
||||||
|
irq_enter();
|
||||||
|
old_regs = set_irq_regs(regs);
|
||||||
|
generic_handle_domain_irq(NULL, hwirq);
|
||||||
|
set_irq_regs(old_regs);
|
||||||
|
irq_exit();
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,6 @@ config ARM
|
|||||||
select GENERIC_PCI_IOMAP
|
select GENERIC_PCI_IOMAP
|
||||||
select GENERIC_SCHED_CLOCK
|
select GENERIC_SCHED_CLOCK
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select HANDLE_DOMAIN_IRQ
|
|
||||||
select HARDIRQS_SW_RESEND
|
select HARDIRQS_SW_RESEND
|
||||||
select HAVE_ARCH_AUDITSYSCALL if AEABI && !OABI_COMPAT
|
select HAVE_ARCH_AUDITSYSCALL if AEABI && !OABI_COMPAT
|
||||||
select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6
|
select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6
|
||||||
|
@ -38,14 +38,11 @@
|
|||||||
*/
|
*/
|
||||||
.macro irq_handler
|
.macro irq_handler
|
||||||
#ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
|
#ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
|
||||||
ldr r1, =handle_arch_irq
|
|
||||||
mov r0, sp
|
mov r0, sp
|
||||||
badr lr, 9997f
|
bl generic_handle_arch_irq
|
||||||
ldr pc, [r1]
|
|
||||||
#else
|
#else
|
||||||
arch_irq_handler_default
|
arch_irq_handler_default
|
||||||
#endif
|
#endif
|
||||||
9997:
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro pabt_helper
|
.macro pabt_helper
|
||||||
|
@ -63,11 +63,8 @@ int arch_show_interrupts(struct seq_file *p, int prec)
|
|||||||
*/
|
*/
|
||||||
void handle_IRQ(unsigned int irq, struct pt_regs *regs)
|
void handle_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
|
||||||
struct irq_desc *desc;
|
struct irq_desc *desc;
|
||||||
|
|
||||||
irq_enter();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some hardware gives randomly wrong interrupts. Rather
|
* Some hardware gives randomly wrong interrupts. Rather
|
||||||
* than crashing, do something sensible.
|
* than crashing, do something sensible.
|
||||||
@ -81,9 +78,6 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs)
|
|||||||
handle_irq_desc(desc);
|
handle_irq_desc(desc);
|
||||||
else
|
else
|
||||||
ack_bad_irq(irq);
|
ack_bad_irq(irq);
|
||||||
|
|
||||||
irq_exit();
|
|
||||||
set_irq_regs(old_regs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -92,7 +86,15 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs)
|
|||||||
asmlinkage void __exception_irq_entry
|
asmlinkage void __exception_irq_entry
|
||||||
asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
struct pt_regs *old_regs;
|
||||||
|
|
||||||
|
irq_enter();
|
||||||
|
old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
handle_IRQ(irq, regs);
|
handle_IRQ(irq, regs);
|
||||||
|
|
||||||
|
set_irq_regs(old_regs);
|
||||||
|
irq_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init init_IRQ(void)
|
void __init init_IRQ(void)
|
||||||
|
@ -628,7 +628,6 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
|
|||||||
uprobe_notify_resume(regs);
|
uprobe_notify_resume(regs);
|
||||||
} else {
|
} else {
|
||||||
tracehook_notify_resume(regs);
|
tracehook_notify_resume(regs);
|
||||||
rseq_handle_notify_resume(NULL, regs);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
@ -161,7 +161,6 @@ config ARCH_BCM2835
|
|||||||
select ARM_TIMER_SP804
|
select ARM_TIMER_SP804
|
||||||
select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7
|
select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7
|
||||||
select BCM2835_TIMER
|
select BCM2835_TIMER
|
||||||
select BRCMSTB_L2_IRQ
|
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
select PINCTRL_BCM2835
|
select PINCTRL_BCM2835
|
||||||
select MFD_CORE
|
select MFD_CORE
|
||||||
@ -209,9 +208,6 @@ config ARCH_BRCMSTB
|
|||||||
select ARM_GIC
|
select ARM_GIC
|
||||||
select ARM_ERRATA_798181 if SMP
|
select ARM_ERRATA_798181 if SMP
|
||||||
select HAVE_ARM_ARCH_TIMER
|
select HAVE_ARM_ARCH_TIMER
|
||||||
select BCM7038_L1_IRQ
|
|
||||||
select BRCMSTB_L2_IRQ
|
|
||||||
select BCM7120_L2_IRQ
|
|
||||||
select ZONE_DMA if ARM_LPAE
|
select ZONE_DMA if ARM_LPAE
|
||||||
select SOC_BRCMSTB
|
select SOC_BRCMSTB
|
||||||
select SOC_BUS
|
select SOC_BUS
|
||||||
|
@ -154,7 +154,7 @@ static void __exception_irq_entry avic_handle_irq(struct pt_regs *regs)
|
|||||||
if (nivector == 0xffff)
|
if (nivector == 0xffff)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
handle_domain_irq(domain, nivector, regs);
|
generic_handle_domain_irq(domain, nivector);
|
||||||
} while (1);
|
} while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ static void __exception_irq_entry tzic_handle_irq(struct pt_regs *regs)
|
|||||||
while (stat) {
|
while (stat) {
|
||||||
handled = 1;
|
handled = 1;
|
||||||
irqofs = fls(stat) - 1;
|
irqofs = fls(stat) - 1;
|
||||||
handle_domain_irq(domain, irqofs + i * 32, regs);
|
generic_handle_domain_irq(domain, irqofs + i * 32);
|
||||||
stat &= ~(1 << irqofs);
|
stat &= ~(1 << irqofs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ asmlinkage void __exception_irq_entry omap1_handle_irq(struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
irq:
|
irq:
|
||||||
if (irqnr)
|
if (irqnr)
|
||||||
handle_domain_irq(domain, irqnr, regs);
|
generic_handle_domain_irq(domain, irqnr);
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
} while (irqnr);
|
} while (irqnr);
|
||||||
|
@ -354,7 +354,7 @@ static inline int s3c24xx_handle_intc(struct s3c_irq_intc *intc,
|
|||||||
if (!(pnd & (1 << offset)))
|
if (!(pnd & (1 << offset)))
|
||||||
offset = __ffs(pnd);
|
offset = __ffs(pnd);
|
||||||
|
|
||||||
handle_domain_irq(intc->domain, intc_offset + offset, regs);
|
generic_handle_domain_irq(intc->domain, intc_offset + offset);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ config ARM64
|
|||||||
select ARCH_SUPPORTS_LTO_CLANG_THIN
|
select ARCH_SUPPORTS_LTO_CLANG_THIN
|
||||||
select ARCH_SUPPORTS_CFI_CLANG
|
select ARCH_SUPPORTS_CFI_CLANG
|
||||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||||
select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 && (GCC_VERSION >= 50000 || CC_IS_CLANG)
|
select ARCH_SUPPORTS_INT128 if CC_HAS_INT128
|
||||||
select ARCH_SUPPORTS_NUMA_BALANCING
|
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||||
select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT
|
select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT
|
||||||
select ARCH_WANT_DEFAULT_BPF_JIT
|
select ARCH_WANT_DEFAULT_BPF_JIT
|
||||||
@ -133,7 +133,6 @@ config ARM64
|
|||||||
select GENERIC_TIME_VSYSCALL
|
select GENERIC_TIME_VSYSCALL
|
||||||
select GENERIC_GETTIMEOFDAY
|
select GENERIC_GETTIMEOFDAY
|
||||||
select GENERIC_VDSO_TIME_NS
|
select GENERIC_VDSO_TIME_NS
|
||||||
select HANDLE_DOMAIN_IRQ
|
|
||||||
select HARDIRQS_SW_RESEND
|
select HARDIRQS_SW_RESEND
|
||||||
select HAVE_MOVE_PMD
|
select HAVE_MOVE_PMD
|
||||||
select HAVE_MOVE_PUD
|
select HAVE_MOVE_PUD
|
||||||
|
@ -44,7 +44,6 @@ config ARCH_BCM2835
|
|||||||
select ARM_AMBA
|
select ARM_AMBA
|
||||||
select ARM_GIC
|
select ARM_GIC
|
||||||
select ARM_TIMER_SP804
|
select ARM_TIMER_SP804
|
||||||
select BRCMSTB_L2_IRQ
|
|
||||||
help
|
help
|
||||||
This enables support for the Broadcom BCM2837 and BCM2711 SoC.
|
This enables support for the Broadcom BCM2837 and BCM2711 SoC.
|
||||||
These SoCs are used in the Raspberry Pi 3 and 4 devices.
|
These SoCs are used in the Raspberry Pi 3 and 4 devices.
|
||||||
@ -82,8 +81,6 @@ config ARCH_BITMAIN
|
|||||||
config ARCH_BRCMSTB
|
config ARCH_BRCMSTB
|
||||||
bool "Broadcom Set-Top-Box SoCs"
|
bool "Broadcom Set-Top-Box SoCs"
|
||||||
select ARCH_HAS_RESET_CONTROLLER
|
select ARCH_HAS_RESET_CONTROLLER
|
||||||
select BCM7038_L1_IRQ
|
|
||||||
select BRCMSTB_L2_IRQ
|
|
||||||
select GENERIC_IRQ_CHIP
|
select GENERIC_IRQ_CHIP
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
help
|
help
|
||||||
@ -167,7 +164,6 @@ config ARCH_MEDIATEK
|
|||||||
config ARCH_MESON
|
config ARCH_MESON
|
||||||
bool "Amlogic Platforms"
|
bool "Amlogic Platforms"
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
select MESON_IRQ_GPIO
|
|
||||||
help
|
help
|
||||||
This enables support for the arm64 based Amlogic SoCs
|
This enables support for the arm64 based Amlogic SoCs
|
||||||
such as the s905, S905X/D, S912, A113X/D or S905X/D2
|
such as the s905, S905X/D, S912, A113X/D or S905X/D2
|
||||||
|
@ -487,7 +487,6 @@
|
|||||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
phys = <&qusb_phy_0>, <&usb0_ssphy>;
|
phys = <&qusb_phy_0>, <&usb0_ssphy>;
|
||||||
phy-names = "usb2-phy", "usb3-phy";
|
phy-names = "usb2-phy", "usb3-phy";
|
||||||
tx-fifo-resize;
|
|
||||||
snps,is-utmi-l1-suspend;
|
snps,is-utmi-l1-suspend;
|
||||||
snps,hird-threshold = /bits/ 8 <0x0>;
|
snps,hird-threshold = /bits/ 8 <0x0>;
|
||||||
snps,dis_u2_susphy_quirk;
|
snps,dis_u2_susphy_quirk;
|
||||||
@ -528,7 +527,6 @@
|
|||||||
interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
phys = <&qusb_phy_1>, <&usb1_ssphy>;
|
phys = <&qusb_phy_1>, <&usb1_ssphy>;
|
||||||
phy-names = "usb2-phy", "usb3-phy";
|
phy-names = "usb2-phy", "usb3-phy";
|
||||||
tx-fifo-resize;
|
|
||||||
snps,is-utmi-l1-suspend;
|
snps,is-utmi-l1-suspend;
|
||||||
snps,hird-threshold = /bits/ 8 <0x0>;
|
snps,hird-threshold = /bits/ 8 <0x0>;
|
||||||
snps,dis_u2_susphy_quirk;
|
snps,dis_u2_susphy_quirk;
|
||||||
|
@ -50,9 +50,6 @@ pgprot_t __acpi_get_mem_attribute(phys_addr_t addr);
|
|||||||
void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size);
|
void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size);
|
||||||
#define acpi_os_ioremap acpi_os_ioremap
|
#define acpi_os_ioremap acpi_os_ioremap
|
||||||
|
|
||||||
void __iomem *acpi_os_memmap(acpi_physical_address phys, acpi_size size);
|
|
||||||
#define acpi_os_memmap acpi_os_memmap
|
|
||||||
|
|
||||||
typedef u64 phys_cpuid_t;
|
typedef u64 phys_cpuid_t;
|
||||||
#define PHYS_CPUID_INVALID INVALID_HWID
|
#define PHYS_CPUID_INVALID INVALID_HWID
|
||||||
|
|
||||||
|
@ -525,6 +525,11 @@ alternative_endif
|
|||||||
#define EXPORT_SYMBOL_NOKASAN(name) EXPORT_SYMBOL(name)
|
#define EXPORT_SYMBOL_NOKASAN(name) EXPORT_SYMBOL(name)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_KASAN_HW_TAGS
|
||||||
|
#define EXPORT_SYMBOL_NOHWKASAN(name)
|
||||||
|
#else
|
||||||
|
#define EXPORT_SYMBOL_NOHWKASAN(name) EXPORT_SYMBOL_NOKASAN(name)
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* Emit a 64-bit absolute little endian symbol reference in a way that
|
* Emit a 64-bit absolute little endian symbol reference in a way that
|
||||||
* ensures that it will be resolved at build time, even when building a
|
* ensures that it will be resolved at build time, even when building a
|
||||||
|
@ -99,11 +99,17 @@ void mte_check_tfsr_el1(void);
|
|||||||
|
|
||||||
static inline void mte_check_tfsr_entry(void)
|
static inline void mte_check_tfsr_entry(void)
|
||||||
{
|
{
|
||||||
|
if (!system_supports_mte())
|
||||||
|
return;
|
||||||
|
|
||||||
mte_check_tfsr_el1();
|
mte_check_tfsr_el1();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void mte_check_tfsr_exit(void)
|
static inline void mte_check_tfsr_exit(void)
|
||||||
{
|
{
|
||||||
|
if (!system_supports_mte())
|
||||||
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The asynchronous faults are sync'ed automatically with
|
* The asynchronous faults are sync'ed automatically with
|
||||||
* TFSR_EL1 on kernel entry but for exit an explicit dsb()
|
* TFSR_EL1 on kernel entry but for exit an explicit dsb()
|
||||||
|
@ -12,11 +12,13 @@ extern char *strrchr(const char *, int c);
|
|||||||
#define __HAVE_ARCH_STRCHR
|
#define __HAVE_ARCH_STRCHR
|
||||||
extern char *strchr(const char *, int c);
|
extern char *strchr(const char *, int c);
|
||||||
|
|
||||||
|
#ifndef CONFIG_KASAN_HW_TAGS
|
||||||
#define __HAVE_ARCH_STRCMP
|
#define __HAVE_ARCH_STRCMP
|
||||||
extern int strcmp(const char *, const char *);
|
extern int strcmp(const char *, const char *);
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRNCMP
|
#define __HAVE_ARCH_STRNCMP
|
||||||
extern int strncmp(const char *, const char *, __kernel_size_t);
|
extern int strncmp(const char *, const char *, __kernel_size_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRLEN
|
#define __HAVE_ARCH_STRLEN
|
||||||
extern __kernel_size_t strlen(const char *);
|
extern __kernel_size_t strlen(const char *);
|
||||||
|
@ -273,8 +273,7 @@ pgprot_t __acpi_get_mem_attribute(phys_addr_t addr)
|
|||||||
return __pgprot(PROT_DEVICE_nGnRnE);
|
return __pgprot(PROT_DEVICE_nGnRnE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __iomem *__acpi_os_ioremap(acpi_physical_address phys,
|
void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
|
||||||
acpi_size size, bool memory)
|
|
||||||
{
|
{
|
||||||
efi_memory_desc_t *md, *region = NULL;
|
efi_memory_desc_t *md, *region = NULL;
|
||||||
pgprot_t prot;
|
pgprot_t prot;
|
||||||
@ -300,11 +299,9 @@ static void __iomem *__acpi_os_ioremap(acpi_physical_address phys,
|
|||||||
* It is fine for AML to remap regions that are not represented in the
|
* It is fine for AML to remap regions that are not represented in the
|
||||||
* EFI memory map at all, as it only describes normal memory, and MMIO
|
* EFI memory map at all, as it only describes normal memory, and MMIO
|
||||||
* regions that require a virtual mapping to make them accessible to
|
* regions that require a virtual mapping to make them accessible to
|
||||||
* the EFI runtime services. Determine the region default
|
* the EFI runtime services.
|
||||||
* attributes by checking the requested memory semantics.
|
|
||||||
*/
|
*/
|
||||||
prot = memory ? __pgprot(PROT_NORMAL_NC) :
|
prot = __pgprot(PROT_DEVICE_nGnRnE);
|
||||||
__pgprot(PROT_DEVICE_nGnRnE);
|
|
||||||
if (region) {
|
if (region) {
|
||||||
switch (region->type) {
|
switch (region->type) {
|
||||||
case EFI_LOADER_CODE:
|
case EFI_LOADER_CODE:
|
||||||
@ -364,16 +361,6 @@ static void __iomem *__acpi_os_ioremap(acpi_physical_address phys,
|
|||||||
return __ioremap(phys, size, prot);
|
return __ioremap(phys, size, prot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
|
|
||||||
{
|
|
||||||
return __acpi_os_ioremap(phys, size, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __iomem *acpi_os_memmap(acpi_physical_address phys, acpi_size size)
|
|
||||||
{
|
|
||||||
return __acpi_os_ioremap(phys, size, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Claim Synchronous External Aborts as a firmware first notification.
|
* Claim Synchronous External Aborts as a firmware first notification.
|
||||||
*
|
*
|
||||||
|
@ -1526,9 +1526,13 @@ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry,
|
|||||||
/*
|
/*
|
||||||
* For reasons that aren't entirely clear, enabling KPTI on Cavium
|
* For reasons that aren't entirely clear, enabling KPTI on Cavium
|
||||||
* ThunderX leads to apparent I-cache corruption of kernel text, which
|
* ThunderX leads to apparent I-cache corruption of kernel text, which
|
||||||
* ends as well as you might imagine. Don't even try.
|
* ends as well as you might imagine. Don't even try. We cannot rely
|
||||||
|
* on the cpus_have_*cap() helpers here to detect the CPU erratum
|
||||||
|
* because cpucap detection order may change. However, since we know
|
||||||
|
* affected CPUs are always in a homogeneous configuration, it is
|
||||||
|
* safe to rely on this_cpu_has_cap() here.
|
||||||
*/
|
*/
|
||||||
if (cpus_have_const_cap(ARM64_WORKAROUND_CAVIUM_27456)) {
|
if (this_cpu_has_cap(ARM64_WORKAROUND_CAVIUM_27456)) {
|
||||||
str = "ARM64_WORKAROUND_CAVIUM_27456";
|
str = "ARM64_WORKAROUND_CAVIUM_27456";
|
||||||
__kpti_forced = -1;
|
__kpti_forced = -1;
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include <asm/daifflags.h>
|
#include <asm/daifflags.h>
|
||||||
#include <asm/esr.h>
|
#include <asm/esr.h>
|
||||||
#include <asm/exception.h>
|
#include <asm/exception.h>
|
||||||
|
#include <asm/irq_regs.h>
|
||||||
#include <asm/kprobes.h>
|
#include <asm/kprobes.h>
|
||||||
#include <asm/mmu.h>
|
#include <asm/mmu.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
@ -219,22 +220,6 @@ static void noinstr arm64_exit_el1_dbg(struct pt_regs *regs)
|
|||||||
lockdep_hardirqs_on(CALLER_ADDR0);
|
lockdep_hardirqs_on(CALLER_ADDR0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
|
|
||||||
arm64_enter_nmi(regs);
|
|
||||||
else
|
|
||||||
enter_from_kernel_mode(regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
|
|
||||||
arm64_exit_nmi(regs);
|
|
||||||
else
|
|
||||||
exit_to_kernel_mode(regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __sched arm64_preempt_schedule_irq(void)
|
static void __sched arm64_preempt_schedule_irq(void)
|
||||||
{
|
{
|
||||||
lockdep_assert_irqs_disabled();
|
lockdep_assert_irqs_disabled();
|
||||||
@ -263,10 +248,14 @@ static void __sched arm64_preempt_schedule_irq(void)
|
|||||||
static void do_interrupt_handler(struct pt_regs *regs,
|
static void do_interrupt_handler(struct pt_regs *regs,
|
||||||
void (*handler)(struct pt_regs *))
|
void (*handler)(struct pt_regs *))
|
||||||
{
|
{
|
||||||
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
if (on_thread_stack())
|
if (on_thread_stack())
|
||||||
call_on_irq_stack(regs, handler);
|
call_on_irq_stack(regs, handler);
|
||||||
else
|
else
|
||||||
handler(regs);
|
handler(regs);
|
||||||
|
|
||||||
|
set_irq_regs(old_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void (*handle_arch_irq)(struct pt_regs *);
|
extern void (*handle_arch_irq)(struct pt_regs *);
|
||||||
@ -432,13 +421,22 @@ asmlinkage void noinstr el1h_64_sync_handler(struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void noinstr el1_interrupt(struct pt_regs *regs,
|
static __always_inline void __el1_pnmi(struct pt_regs *regs,
|
||||||
void (*handler)(struct pt_regs *))
|
void (*handler)(struct pt_regs *))
|
||||||
{
|
{
|
||||||
write_sysreg(DAIF_PROCCTX_NOIRQ, daif);
|
arm64_enter_nmi(regs);
|
||||||
|
|
||||||
enter_el1_irq_or_nmi(regs);
|
|
||||||
do_interrupt_handler(regs, handler);
|
do_interrupt_handler(regs, handler);
|
||||||
|
arm64_exit_nmi(regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __always_inline void __el1_irq(struct pt_regs *regs,
|
||||||
|
void (*handler)(struct pt_regs *))
|
||||||
|
{
|
||||||
|
enter_from_kernel_mode(regs);
|
||||||
|
|
||||||
|
irq_enter_rcu();
|
||||||
|
do_interrupt_handler(regs, handler);
|
||||||
|
irq_exit_rcu();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: thread_info::preempt_count includes both thread_info::count
|
* Note: thread_info::preempt_count includes both thread_info::count
|
||||||
@ -449,7 +447,17 @@ static void noinstr el1_interrupt(struct pt_regs *regs,
|
|||||||
READ_ONCE(current_thread_info()->preempt_count) == 0)
|
READ_ONCE(current_thread_info()->preempt_count) == 0)
|
||||||
arm64_preempt_schedule_irq();
|
arm64_preempt_schedule_irq();
|
||||||
|
|
||||||
exit_el1_irq_or_nmi(regs);
|
exit_to_kernel_mode(regs);
|
||||||
|
}
|
||||||
|
static void noinstr el1_interrupt(struct pt_regs *regs,
|
||||||
|
void (*handler)(struct pt_regs *))
|
||||||
|
{
|
||||||
|
write_sysreg(DAIF_PROCCTX_NOIRQ, daif);
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
|
||||||
|
__el1_pnmi(regs, handler);
|
||||||
|
else
|
||||||
|
__el1_irq(regs, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs)
|
asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs)
|
||||||
@ -667,7 +675,9 @@ static void noinstr el0_interrupt(struct pt_regs *regs,
|
|||||||
if (regs->pc & BIT(55))
|
if (regs->pc & BIT(55))
|
||||||
arm64_apply_bp_hardening();
|
arm64_apply_bp_hardening();
|
||||||
|
|
||||||
|
irq_enter_rcu();
|
||||||
do_interrupt_handler(regs, handler);
|
do_interrupt_handler(regs, handler);
|
||||||
|
irq_exit_rcu();
|
||||||
|
|
||||||
exit_to_user_mode(regs);
|
exit_to_user_mode(regs);
|
||||||
}
|
}
|
||||||
|
@ -513,7 +513,7 @@ size_t sve_state_size(struct task_struct const *task)
|
|||||||
void sve_alloc(struct task_struct *task)
|
void sve_alloc(struct task_struct *task)
|
||||||
{
|
{
|
||||||
if (task->thread.sve_state) {
|
if (task->thread.sve_state) {
|
||||||
memset(task->thread.sve_state, 0, sve_state_size(current));
|
memset(task->thread.sve_state, 0, sve_state_size(task));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,12 +142,7 @@ void mte_enable_kernel_async(void)
|
|||||||
#ifdef CONFIG_KASAN_HW_TAGS
|
#ifdef CONFIG_KASAN_HW_TAGS
|
||||||
void mte_check_tfsr_el1(void)
|
void mte_check_tfsr_el1(void)
|
||||||
{
|
{
|
||||||
u64 tfsr_el1;
|
u64 tfsr_el1 = read_sysreg_s(SYS_TFSR_EL1);
|
||||||
|
|
||||||
if (!system_supports_mte())
|
|
||||||
return;
|
|
||||||
|
|
||||||
tfsr_el1 = read_sysreg_s(SYS_TFSR_EL1);
|
|
||||||
|
|
||||||
if (unlikely(tfsr_el1 & SYS_TFSR_EL1_TF1)) {
|
if (unlikely(tfsr_el1 & SYS_TFSR_EL1_TF1)) {
|
||||||
/*
|
/*
|
||||||
@ -199,6 +194,9 @@ void mte_thread_init_user(void)
|
|||||||
|
|
||||||
void mte_thread_switch(struct task_struct *next)
|
void mte_thread_switch(struct task_struct *next)
|
||||||
{
|
{
|
||||||
|
if (!system_supports_mte())
|
||||||
|
return;
|
||||||
|
|
||||||
mte_update_sctlr_user(next);
|
mte_update_sctlr_user(next);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
#include <linux/mman.h>
|
#include <linux/mman.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/nospec.h>
|
#include <linux/nospec.h>
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/sysctl.h>
|
#include <linux/sysctl.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
@ -58,7 +57,7 @@
|
|||||||
|
|
||||||
#if defined(CONFIG_STACKPROTECTOR) && !defined(CONFIG_STACKPROTECTOR_PER_TASK)
|
#if defined(CONFIG_STACKPROTECTOR) && !defined(CONFIG_STACKPROTECTOR_PER_TASK)
|
||||||
#include <linux/stackprotector.h>
|
#include <linux/stackprotector.h>
|
||||||
unsigned long __stack_chk_guard __read_mostly;
|
unsigned long __stack_chk_guard __ro_after_init;
|
||||||
EXPORT_SYMBOL(__stack_chk_guard);
|
EXPORT_SYMBOL(__stack_chk_guard);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -940,10 +940,8 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_flags)
|
|||||||
if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
|
if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
|
||||||
do_signal(regs);
|
do_signal(regs);
|
||||||
|
|
||||||
if (thread_flags & _TIF_NOTIFY_RESUME) {
|
if (thread_flags & _TIF_NOTIFY_RESUME)
|
||||||
tracehook_notify_resume(regs);
|
tracehook_notify_resume(regs);
|
||||||
rseq_handle_notify_resume(NULL, regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (thread_flags & _TIF_FOREIGN_FPSTATE)
|
if (thread_flags & _TIF_FOREIGN_FPSTATE)
|
||||||
fpsimd_restore_current_state();
|
fpsimd_restore_current_state();
|
||||||
|
@ -54,7 +54,7 @@ $(obj)/kvm_nvhe.tmp.o: $(obj)/hyp.lds $(addprefix $(obj)/,$(hyp-obj)) FORCE
|
|||||||
# runtime. Because the hypervisor is part of the kernel binary, relocations
|
# runtime. Because the hypervisor is part of the kernel binary, relocations
|
||||||
# produce a kernel VA. We enumerate relocations targeting hyp at build time
|
# produce a kernel VA. We enumerate relocations targeting hyp at build time
|
||||||
# and convert the kernel VAs at those positions to hyp VAs.
|
# and convert the kernel VAs at those positions to hyp VAs.
|
||||||
$(obj)/hyp-reloc.S: $(obj)/kvm_nvhe.tmp.o $(obj)/gen-hyprel
|
$(obj)/hyp-reloc.S: $(obj)/kvm_nvhe.tmp.o $(obj)/gen-hyprel FORCE
|
||||||
$(call if_changed,hyprel)
|
$(call if_changed,hyprel)
|
||||||
|
|
||||||
# 5) Compile hyp-reloc.S and link it into the existing partially linked object.
|
# 5) Compile hyp-reloc.S and link it into the existing partially linked object.
|
||||||
|
@ -50,9 +50,6 @@ static struct perf_guest_info_callbacks kvm_guest_cbs = {
|
|||||||
|
|
||||||
int kvm_perf_init(void)
|
int kvm_perf_init(void)
|
||||||
{
|
{
|
||||||
if (kvm_pmu_probe_pmuver() != ID_AA64DFR0_PMUVER_IMP_DEF && !is_protected_kvm_enabled())
|
|
||||||
static_branch_enable(&kvm_arm_pmu_available);
|
|
||||||
|
|
||||||
return perf_register_guest_info_callbacks(&kvm_guest_cbs);
|
return perf_register_guest_info_callbacks(&kvm_guest_cbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -740,7 +740,14 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data,
|
|||||||
kvm_pmu_create_perf_event(vcpu, select_idx);
|
kvm_pmu_create_perf_event(vcpu, select_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_pmu_probe_pmuver(void)
|
void kvm_host_pmu_init(struct arm_pmu *pmu)
|
||||||
|
{
|
||||||
|
if (pmu->pmuver != 0 && pmu->pmuver != ID_AA64DFR0_PMUVER_IMP_DEF &&
|
||||||
|
!kvm_arm_support_pmu_v3() && !is_protected_kvm_enabled())
|
||||||
|
static_branch_enable(&kvm_arm_pmu_available);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kvm_pmu_probe_pmuver(void)
|
||||||
{
|
{
|
||||||
struct perf_event_attr attr = { };
|
struct perf_event_attr attr = { };
|
||||||
struct perf_event *event;
|
struct perf_event *event;
|
||||||
|
@ -173,4 +173,4 @@ L(done):
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
SYM_FUNC_END_PI(strcmp)
|
SYM_FUNC_END_PI(strcmp)
|
||||||
EXPORT_SYMBOL_NOKASAN(strcmp)
|
EXPORT_SYMBOL_NOHWKASAN(strcmp)
|
||||||
|
@ -258,4 +258,4 @@ L(ret0):
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
SYM_FUNC_END_PI(strncmp)
|
SYM_FUNC_END_PI(strncmp)
|
||||||
EXPORT_SYMBOL_NOKASAN(strncmp)
|
EXPORT_SYMBOL_NOHWKASAN(strncmp)
|
||||||
|
@ -17,7 +17,6 @@ config CSKY
|
|||||||
select CSKY_APB_INTC
|
select CSKY_APB_INTC
|
||||||
select DMA_DIRECT_REMAP
|
select DMA_DIRECT_REMAP
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
select HANDLE_DOMAIN_IRQ
|
|
||||||
select DW_APB_TIMER_OF
|
select DW_APB_TIMER_OF
|
||||||
select GENERIC_IOREMAP
|
select GENERIC_IOREMAP
|
||||||
select GENERIC_LIB_ASHLDI3
|
select GENERIC_LIB_ASHLDI3
|
||||||
|
@ -249,7 +249,7 @@ ENTRY(csky_irq)
|
|||||||
|
|
||||||
|
|
||||||
mov a0, sp
|
mov a0, sp
|
||||||
jbsr csky_do_IRQ
|
jbsr generic_handle_arch_irq
|
||||||
|
|
||||||
jmpi ret_from_exception
|
jmpi ret_from_exception
|
||||||
|
|
||||||
|
@ -15,8 +15,3 @@ void __init init_IRQ(void)
|
|||||||
setup_smp_ipi();
|
setup_smp_ipi();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void __irq_entry csky_do_IRQ(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
handle_arch_irq(regs);
|
|
||||||
}
|
|
||||||
|
@ -260,8 +260,6 @@ asmlinkage void do_notify_resume(struct pt_regs *regs,
|
|||||||
if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
|
if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
|
||||||
do_signal(regs);
|
do_signal(regs);
|
||||||
|
|
||||||
if (thread_info_flags & _TIF_NOTIFY_RESUME) {
|
if (thread_info_flags & _TIF_NOTIFY_RESUME)
|
||||||
tracehook_notify_resume(regs);
|
tracehook_notify_resume(regs);
|
||||||
rseq_handle_notify_resume(NULL, regs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
#ifndef _H8300_IRQ_H_
|
#ifndef _H8300_IRQ_H_
|
||||||
#define _H8300_IRQ_H_
|
#define _H8300_IRQ_H_
|
||||||
|
|
||||||
#include <linux/irqchip.h>
|
|
||||||
|
|
||||||
#if defined(CONFIG_CPU_H8300H)
|
#if defined(CONFIG_CPU_H8300H)
|
||||||
#define NR_IRQS 64
|
#define NR_IRQS 64
|
||||||
#define IRQ_CHIP h8300h_irq_chip
|
#define IRQ_CHIP h8300h_irq_chip
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
#include <linux/irqchip.h>
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <asm/entry.h>
|
#include <asm/entry.h>
|
||||||
@ -25,7 +24,6 @@
|
|||||||
.globl system_call
|
.globl system_call
|
||||||
.globl resume
|
.globl resume
|
||||||
.globl ret_from_exception
|
.globl ret_from_exception
|
||||||
.globl ret_from_signal
|
|
||||||
.globl sys_call_table
|
.globl sys_call_table
|
||||||
.globl bad_interrupt
|
.globl bad_interrupt
|
||||||
.globl inthandler1
|
.globl inthandler1
|
||||||
@ -59,8 +57,6 @@ do_trace:
|
|||||||
subql #4,%sp /* dummy return address */
|
subql #4,%sp /* dummy return address */
|
||||||
SAVE_SWITCH_STACK
|
SAVE_SWITCH_STACK
|
||||||
jbsr syscall_trace_leave
|
jbsr syscall_trace_leave
|
||||||
|
|
||||||
ret_from_signal:
|
|
||||||
RESTORE_SWITCH_STACK
|
RESTORE_SWITCH_STACK
|
||||||
addql #4,%sp
|
addql #4,%sp
|
||||||
jra ret_from_exception
|
jra ret_from_exception
|
||||||
|
@ -29,7 +29,6 @@ config M68K
|
|||||||
select NO_DMA if !MMU && !COLDFIRE
|
select NO_DMA if !MMU && !COLDFIRE
|
||||||
select OLD_SIGACTION
|
select OLD_SIGACTION
|
||||||
select OLD_SIGSUSPEND3
|
select OLD_SIGSUSPEND3
|
||||||
select SET_FS
|
|
||||||
select UACCESS_MEMCPY if !MMU
|
select UACCESS_MEMCPY if !MMU
|
||||||
select VIRT_TO_BUS
|
select VIRT_TO_BUS
|
||||||
select ZONE_DMA
|
select ZONE_DMA
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <asm/entry.h>
|
#include <asm/entry.h>
|
||||||
|
|
||||||
@ -51,7 +50,6 @@ sw_usp:
|
|||||||
.globl system_call
|
.globl system_call
|
||||||
.globl resume
|
.globl resume
|
||||||
.globl ret_from_exception
|
.globl ret_from_exception
|
||||||
.globl ret_from_signal
|
|
||||||
.globl sys_call_table
|
.globl sys_call_table
|
||||||
.globl inthandler
|
.globl inthandler
|
||||||
|
|
||||||
@ -98,8 +96,6 @@ ENTRY(system_call)
|
|||||||
subql #4,%sp /* dummy return address */
|
subql #4,%sp /* dummy return address */
|
||||||
SAVE_SWITCH_STACK
|
SAVE_SWITCH_STACK
|
||||||
jbsr syscall_trace_leave
|
jbsr syscall_trace_leave
|
||||||
|
|
||||||
ret_from_signal:
|
|
||||||
RESTORE_SWITCH_STACK
|
RESTORE_SWITCH_STACK
|
||||||
addql #4,%sp
|
addql #4,%sp
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#define __ASM_M68K_PROCESSOR_H
|
#define __ASM_M68K_PROCESSOR_H
|
||||||
|
|
||||||
#include <linux/thread_info.h>
|
#include <linux/thread_info.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/fpu.h>
|
#include <asm/fpu.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
@ -75,11 +74,37 @@ static inline void wrusp(unsigned long usp)
|
|||||||
#define TASK_UNMAPPED_BASE 0
|
#define TASK_UNMAPPED_BASE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Address spaces (or Function Codes in Motorola lingo) */
|
||||||
|
#define USER_DATA 1
|
||||||
|
#define USER_PROGRAM 2
|
||||||
|
#define SUPER_DATA 5
|
||||||
|
#define SUPER_PROGRAM 6
|
||||||
|
#define CPU_SPACE 7
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_HAS_ADDRESS_SPACES
|
||||||
|
/*
|
||||||
|
* Set the SFC/DFC registers for special MM operations. For most normal
|
||||||
|
* operation these remain set to USER_DATA for the uaccess routines.
|
||||||
|
*/
|
||||||
|
static inline void set_fc(unsigned long val)
|
||||||
|
{
|
||||||
|
WARN_ON_ONCE(in_interrupt());
|
||||||
|
|
||||||
|
__asm__ __volatile__ ("movec %0,%/sfc\n\t"
|
||||||
|
"movec %0,%/dfc\n\t"
|
||||||
|
: /* no outputs */ : "r" (val) : "memory");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void set_fc(unsigned long val)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_CPU_HAS_ADDRESS_SPACES */
|
||||||
|
|
||||||
struct thread_struct {
|
struct thread_struct {
|
||||||
unsigned long ksp; /* kernel stack pointer */
|
unsigned long ksp; /* kernel stack pointer */
|
||||||
unsigned long usp; /* user stack pointer */
|
unsigned long usp; /* user stack pointer */
|
||||||
unsigned short sr; /* saved status register */
|
unsigned short sr; /* saved status register */
|
||||||
unsigned short fs; /* saved fs (sfc, dfc) */
|
unsigned short fc; /* saved fc (sfc, dfc) */
|
||||||
unsigned long crp[2]; /* cpu root pointer */
|
unsigned long crp[2]; /* cpu root pointer */
|
||||||
unsigned long esp0; /* points to SR of stack frame */
|
unsigned long esp0; /* points to SR of stack frame */
|
||||||
unsigned long faddr; /* info about last fault */
|
unsigned long faddr; /* info about last fault */
|
||||||
@ -92,7 +117,7 @@ struct thread_struct {
|
|||||||
#define INIT_THREAD { \
|
#define INIT_THREAD { \
|
||||||
.ksp = sizeof(init_stack) + (unsigned long) init_stack, \
|
.ksp = sizeof(init_stack) + (unsigned long) init_stack, \
|
||||||
.sr = PS_S, \
|
.sr = PS_S, \
|
||||||
.fs = __KERNEL_DS, \
|
.fc = USER_DATA, \
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -17,21 +17,21 @@
|
|||||||
* two accesses to memory, which may be undesirable for some devices.
|
* two accesses to memory, which may be undesirable for some devices.
|
||||||
*/
|
*/
|
||||||
#define in_8(addr) \
|
#define in_8(addr) \
|
||||||
({ u8 __v = (*(__force volatile u8 *) (addr)); __v; })
|
({ u8 __v = (*(__force volatile u8 *) (unsigned long)(addr)); __v; })
|
||||||
#define in_be16(addr) \
|
#define in_be16(addr) \
|
||||||
({ u16 __v = (*(__force volatile u16 *) (addr)); __v; })
|
({ u16 __v = (*(__force volatile u16 *) (unsigned long)(addr)); __v; })
|
||||||
#define in_be32(addr) \
|
#define in_be32(addr) \
|
||||||
({ u32 __v = (*(__force volatile u32 *) (addr)); __v; })
|
({ u32 __v = (*(__force volatile u32 *) (unsigned long)(addr)); __v; })
|
||||||
#define in_le16(addr) \
|
#define in_le16(addr) \
|
||||||
({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (addr)); __v; })
|
({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (unsigned long)(addr)); __v; })
|
||||||
#define in_le32(addr) \
|
#define in_le32(addr) \
|
||||||
({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (addr)); __v; })
|
({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (unsigned long)(addr)); __v; })
|
||||||
|
|
||||||
#define out_8(addr,b) (void)((*(__force volatile u8 *) (addr)) = (b))
|
#define out_8(addr,b) (void)((*(__force volatile u8 *) (unsigned long)(addr)) = (b))
|
||||||
#define out_be16(addr,w) (void)((*(__force volatile u16 *) (addr)) = (w))
|
#define out_be16(addr,w) (void)((*(__force volatile u16 *) (unsigned long)(addr)) = (w))
|
||||||
#define out_be32(addr,l) (void)((*(__force volatile u32 *) (addr)) = (l))
|
#define out_be32(addr,l) (void)((*(__force volatile u32 *) (unsigned long)(addr)) = (l))
|
||||||
#define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w))
|
#define out_le16(addr,w) (void)((*(__force volatile __le16 *) (unsigned long)(addr)) = cpu_to_le16(w))
|
||||||
#define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l))
|
#define out_le32(addr,l) (void)((*(__force volatile __le32 *) (unsigned long)(addr)) = cpu_to_le32(l))
|
||||||
|
|
||||||
#define raw_inb in_8
|
#define raw_inb in_8
|
||||||
#define raw_inw in_be16
|
#define raw_inw in_be16
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
#ifndef _M68K_SEGMENT_H
|
|
||||||
#define _M68K_SEGMENT_H
|
|
||||||
|
|
||||||
/* define constants */
|
|
||||||
/* Address spaces (FC0-FC2) */
|
|
||||||
#define USER_DATA (1)
|
|
||||||
#ifndef __USER_DS
|
|
||||||
#define __USER_DS (USER_DATA)
|
|
||||||
#endif
|
|
||||||
#define USER_PROGRAM (2)
|
|
||||||
#define SUPER_DATA (5)
|
|
||||||
#ifndef __KERNEL_DS
|
|
||||||
#define __KERNEL_DS (SUPER_DATA)
|
|
||||||
#endif
|
|
||||||
#define SUPER_PROGRAM (6)
|
|
||||||
#define CPU_SPACE (7)
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned long seg;
|
|
||||||
} mm_segment_t;
|
|
||||||
|
|
||||||
#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
|
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_HAS_ADDRESS_SPACES
|
|
||||||
/*
|
|
||||||
* Get/set the SFC/DFC registers for MOVES instructions
|
|
||||||
*/
|
|
||||||
#define USER_DS MAKE_MM_SEG(__USER_DS)
|
|
||||||
#define KERNEL_DS MAKE_MM_SEG(__KERNEL_DS)
|
|
||||||
|
|
||||||
static inline mm_segment_t get_fs(void)
|
|
||||||
{
|
|
||||||
mm_segment_t _v;
|
|
||||||
__asm__ ("movec %/dfc,%0":"=r" (_v.seg):);
|
|
||||||
return _v;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void set_fs(mm_segment_t val)
|
|
||||||
{
|
|
||||||
__asm__ __volatile__ ("movec %0,%/sfc\n\t"
|
|
||||||
"movec %0,%/dfc\n\t"
|
|
||||||
: /* no outputs */ : "r" (val.seg) : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define USER_DS MAKE_MM_SEG(TASK_SIZE)
|
|
||||||
#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
|
|
||||||
#define get_fs() (current_thread_info()->addr_limit)
|
|
||||||
#define set_fs(x) (current_thread_info()->addr_limit = (x))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define uaccess_kernel() (get_fs().seg == KERNEL_DS.seg)
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
|
||||||
|
|
||||||
#endif /* _M68K_SEGMENT_H */
|
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On machines with 4k pages we default to an 8k thread size, though we
|
* On machines with 4k pages we default to an 8k thread size, though we
|
||||||
@ -27,7 +26,6 @@
|
|||||||
struct thread_info {
|
struct thread_info {
|
||||||
struct task_struct *task; /* main task structure */
|
struct task_struct *task; /* main task structure */
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
mm_segment_t addr_limit; /* thread address space */
|
|
||||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||||
__u32 cpu; /* should always be 0 on m68k */
|
__u32 cpu; /* should always be 0 on m68k */
|
||||||
unsigned long tp_value; /* thread pointer */
|
unsigned long tp_value; /* thread pointer */
|
||||||
@ -37,7 +35,6 @@ struct thread_info {
|
|||||||
#define INIT_THREAD_INFO(tsk) \
|
#define INIT_THREAD_INFO(tsk) \
|
||||||
{ \
|
{ \
|
||||||
.task = &tsk, \
|
.task = &tsk, \
|
||||||
.addr_limit = KERNEL_DS, \
|
|
||||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,13 +13,12 @@ static inline void flush_tlb_kernel_page(void *addr)
|
|||||||
if (CPU_IS_COLDFIRE) {
|
if (CPU_IS_COLDFIRE) {
|
||||||
mmu_write(MMUOR, MMUOR_CNL);
|
mmu_write(MMUOR, MMUOR_CNL);
|
||||||
} else if (CPU_IS_040_OR_060) {
|
} else if (CPU_IS_040_OR_060) {
|
||||||
mm_segment_t old_fs = get_fs();
|
set_fc(SUPER_DATA);
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
__asm__ __volatile__(".chip 68040\n\t"
|
__asm__ __volatile__(".chip 68040\n\t"
|
||||||
"pflush (%0)\n\t"
|
"pflush (%0)\n\t"
|
||||||
".chip 68k"
|
".chip 68k"
|
||||||
: : "a" (addr));
|
: : "a" (addr));
|
||||||
set_fs(old_fs);
|
set_fc(USER_DATA);
|
||||||
} else if (CPU_IS_020_OR_030)
|
} else if (CPU_IS_020_OR_030)
|
||||||
__asm__ __volatile__("pflush #4,#4,(%0)" : : "a" (addr));
|
__asm__ __volatile__("pflush #4,#4,(%0)" : : "a" (addr));
|
||||||
}
|
}
|
||||||
@ -84,12 +83,8 @@ static inline void flush_tlb_mm(struct mm_struct *mm)
|
|||||||
|
|
||||||
static inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
|
static inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
|
||||||
{
|
{
|
||||||
if (vma->vm_mm == current->active_mm) {
|
if (vma->vm_mm == current->active_mm)
|
||||||
mm_segment_t old_fs = force_uaccess_begin();
|
|
||||||
|
|
||||||
__flush_tlb_one(addr);
|
__flush_tlb_one(addr);
|
||||||
force_uaccess_end(old_fs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void flush_tlb_range(struct vm_area_struct *vma,
|
static inline void flush_tlb_range(struct vm_area_struct *vma,
|
||||||
|
@ -267,6 +267,10 @@ struct frame {
|
|||||||
} un;
|
} un;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_M68040
|
||||||
|
asmlinkage void berr_040cleanup(struct frame *fp);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* _M68K_TRAPS_H */
|
#endif /* _M68K_TRAPS_H */
|
||||||
|
@ -9,13 +9,16 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/extable.h>
|
#include <asm/extable.h>
|
||||||
|
|
||||||
/* We let the MMU do all checking */
|
/* We let the MMU do all checking */
|
||||||
static inline int access_ok(const void __user *addr,
|
static inline int access_ok(const void __user *addr,
|
||||||
unsigned long size)
|
unsigned long size)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* XXX: for !CONFIG_CPU_HAS_ADDRESS_SPACES this really needs to check
|
||||||
|
* for TASK_SIZE!
|
||||||
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,12 +38,9 @@ static inline int access_ok(const void __user *addr,
|
|||||||
#define MOVES "move"
|
#define MOVES "move"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int __put_user_bad(void);
|
#define __put_user_asm(inst, res, x, ptr, bwl, reg, err) \
|
||||||
extern int __get_user_bad(void);
|
|
||||||
|
|
||||||
#define __put_user_asm(res, x, ptr, bwl, reg, err) \
|
|
||||||
asm volatile ("\n" \
|
asm volatile ("\n" \
|
||||||
"1: "MOVES"."#bwl" %2,%1\n" \
|
"1: "inst"."#bwl" %2,%1\n" \
|
||||||
"2:\n" \
|
"2:\n" \
|
||||||
" .section .fixup,\"ax\"\n" \
|
" .section .fixup,\"ax\"\n" \
|
||||||
" .even\n" \
|
" .even\n" \
|
||||||
@ -56,6 +56,31 @@ asm volatile ("\n" \
|
|||||||
: "+d" (res), "=m" (*(ptr)) \
|
: "+d" (res), "=m" (*(ptr)) \
|
||||||
: #reg (x), "i" (err))
|
: #reg (x), "i" (err))
|
||||||
|
|
||||||
|
#define __put_user_asm8(inst, res, x, ptr) \
|
||||||
|
do { \
|
||||||
|
const void *__pu_ptr = (const void __force *)(ptr); \
|
||||||
|
\
|
||||||
|
asm volatile ("\n" \
|
||||||
|
"1: "inst".l %2,(%1)+\n" \
|
||||||
|
"2: "inst".l %R2,(%1)\n" \
|
||||||
|
"3:\n" \
|
||||||
|
" .section .fixup,\"ax\"\n" \
|
||||||
|
" .even\n" \
|
||||||
|
"10: movel %3,%0\n" \
|
||||||
|
" jra 3b\n" \
|
||||||
|
" .previous\n" \
|
||||||
|
"\n" \
|
||||||
|
" .section __ex_table,\"a\"\n" \
|
||||||
|
" .align 4\n" \
|
||||||
|
" .long 1b,10b\n" \
|
||||||
|
" .long 2b,10b\n" \
|
||||||
|
" .long 3b,10b\n" \
|
||||||
|
" .previous" \
|
||||||
|
: "+d" (res), "+a" (__pu_ptr) \
|
||||||
|
: "r" (x), "i" (-EFAULT) \
|
||||||
|
: "memory"); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These are the main single-value transfer routines. They automatically
|
* These are the main single-value transfer routines. They automatically
|
||||||
* use the right size if we just have the right pointer type.
|
* use the right size if we just have the right pointer type.
|
||||||
@ -68,51 +93,29 @@ asm volatile ("\n" \
|
|||||||
__chk_user_ptr(ptr); \
|
__chk_user_ptr(ptr); \
|
||||||
switch (sizeof (*(ptr))) { \
|
switch (sizeof (*(ptr))) { \
|
||||||
case 1: \
|
case 1: \
|
||||||
__put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \
|
__put_user_asm(MOVES, __pu_err, __pu_val, ptr, b, d, -EFAULT); \
|
||||||
break; \
|
break; \
|
||||||
case 2: \
|
case 2: \
|
||||||
__put_user_asm(__pu_err, __pu_val, ptr, w, r, -EFAULT); \
|
__put_user_asm(MOVES, __pu_err, __pu_val, ptr, w, r, -EFAULT); \
|
||||||
break; \
|
break; \
|
||||||
case 4: \
|
case 4: \
|
||||||
__put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \
|
__put_user_asm(MOVES, __pu_err, __pu_val, ptr, l, r, -EFAULT); \
|
||||||
break; \
|
break; \
|
||||||
case 8: \
|
case 8: \
|
||||||
{ \
|
__put_user_asm8(MOVES, __pu_err, __pu_val, ptr); \
|
||||||
const void __user *__pu_ptr = (ptr); \
|
|
||||||
asm volatile ("\n" \
|
|
||||||
"1: "MOVES".l %2,(%1)+\n" \
|
|
||||||
"2: "MOVES".l %R2,(%1)\n" \
|
|
||||||
"3:\n" \
|
|
||||||
" .section .fixup,\"ax\"\n" \
|
|
||||||
" .even\n" \
|
|
||||||
"10: movel %3,%0\n" \
|
|
||||||
" jra 3b\n" \
|
|
||||||
" .previous\n" \
|
|
||||||
"\n" \
|
|
||||||
" .section __ex_table,\"a\"\n" \
|
|
||||||
" .align 4\n" \
|
|
||||||
" .long 1b,10b\n" \
|
|
||||||
" .long 2b,10b\n" \
|
|
||||||
" .long 3b,10b\n" \
|
|
||||||
" .previous" \
|
|
||||||
: "+d" (__pu_err), "+a" (__pu_ptr) \
|
|
||||||
: "r" (__pu_val), "i" (-EFAULT) \
|
|
||||||
: "memory"); \
|
|
||||||
break; \
|
break; \
|
||||||
} \
|
|
||||||
default: \
|
default: \
|
||||||
__pu_err = __put_user_bad(); \
|
BUILD_BUG(); \
|
||||||
break; \
|
|
||||||
} \
|
} \
|
||||||
__pu_err; \
|
__pu_err; \
|
||||||
})
|
})
|
||||||
#define put_user(x, ptr) __put_user(x, ptr)
|
#define put_user(x, ptr) __put_user(x, ptr)
|
||||||
|
|
||||||
|
|
||||||
#define __get_user_asm(res, x, ptr, type, bwl, reg, err) ({ \
|
#define __get_user_asm(inst, res, x, ptr, type, bwl, reg, err) ({ \
|
||||||
type __gu_val; \
|
type __gu_val; \
|
||||||
asm volatile ("\n" \
|
asm volatile ("\n" \
|
||||||
"1: "MOVES"."#bwl" %2,%1\n" \
|
"1: "inst"."#bwl" %2,%1\n" \
|
||||||
"2:\n" \
|
"2:\n" \
|
||||||
" .section .fixup,\"ax\"\n" \
|
" .section .fixup,\"ax\"\n" \
|
||||||
" .even\n" \
|
" .even\n" \
|
||||||
@ -130,53 +133,57 @@ asm volatile ("\n" \
|
|||||||
(x) = (__force typeof(*(ptr)))(__force unsigned long)__gu_val; \
|
(x) = (__force typeof(*(ptr)))(__force unsigned long)__gu_val; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define __get_user_asm8(inst, res, x, ptr) \
|
||||||
|
do { \
|
||||||
|
const void *__gu_ptr = (const void __force *)(ptr); \
|
||||||
|
union { \
|
||||||
|
u64 l; \
|
||||||
|
__typeof__(*(ptr)) t; \
|
||||||
|
} __gu_val; \
|
||||||
|
\
|
||||||
|
asm volatile ("\n" \
|
||||||
|
"1: "inst".l (%2)+,%1\n" \
|
||||||
|
"2: "inst".l (%2),%R1\n" \
|
||||||
|
"3:\n" \
|
||||||
|
" .section .fixup,\"ax\"\n" \
|
||||||
|
" .even\n" \
|
||||||
|
"10: move.l %3,%0\n" \
|
||||||
|
" sub.l %1,%1\n" \
|
||||||
|
" sub.l %R1,%R1\n" \
|
||||||
|
" jra 3b\n" \
|
||||||
|
" .previous\n" \
|
||||||
|
"\n" \
|
||||||
|
" .section __ex_table,\"a\"\n" \
|
||||||
|
" .align 4\n" \
|
||||||
|
" .long 1b,10b\n" \
|
||||||
|
" .long 2b,10b\n" \
|
||||||
|
" .previous" \
|
||||||
|
: "+d" (res), "=&r" (__gu_val.l), \
|
||||||
|
"+a" (__gu_ptr) \
|
||||||
|
: "i" (-EFAULT) \
|
||||||
|
: "memory"); \
|
||||||
|
(x) = __gu_val.t; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define __get_user(x, ptr) \
|
#define __get_user(x, ptr) \
|
||||||
({ \
|
({ \
|
||||||
int __gu_err = 0; \
|
int __gu_err = 0; \
|
||||||
__chk_user_ptr(ptr); \
|
__chk_user_ptr(ptr); \
|
||||||
switch (sizeof(*(ptr))) { \
|
switch (sizeof(*(ptr))) { \
|
||||||
case 1: \
|
case 1: \
|
||||||
__get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \
|
__get_user_asm(MOVES, __gu_err, x, ptr, u8, b, d, -EFAULT); \
|
||||||
break; \
|
break; \
|
||||||
case 2: \
|
case 2: \
|
||||||
__get_user_asm(__gu_err, x, ptr, u16, w, r, -EFAULT); \
|
__get_user_asm(MOVES, __gu_err, x, ptr, u16, w, r, -EFAULT); \
|
||||||
break; \
|
break; \
|
||||||
case 4: \
|
case 4: \
|
||||||
__get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \
|
__get_user_asm(MOVES, __gu_err, x, ptr, u32, l, r, -EFAULT); \
|
||||||
break; \
|
break; \
|
||||||
case 8: { \
|
case 8: \
|
||||||
const void __user *__gu_ptr = (ptr); \
|
__get_user_asm8(MOVES, __gu_err, x, ptr); \
|
||||||
union { \
|
|
||||||
u64 l; \
|
|
||||||
__typeof__(*(ptr)) t; \
|
|
||||||
} __gu_val; \
|
|
||||||
asm volatile ("\n" \
|
|
||||||
"1: "MOVES".l (%2)+,%1\n" \
|
|
||||||
"2: "MOVES".l (%2),%R1\n" \
|
|
||||||
"3:\n" \
|
|
||||||
" .section .fixup,\"ax\"\n" \
|
|
||||||
" .even\n" \
|
|
||||||
"10: move.l %3,%0\n" \
|
|
||||||
" sub.l %1,%1\n" \
|
|
||||||
" sub.l %R1,%R1\n" \
|
|
||||||
" jra 3b\n" \
|
|
||||||
" .previous\n" \
|
|
||||||
"\n" \
|
|
||||||
" .section __ex_table,\"a\"\n" \
|
|
||||||
" .align 4\n" \
|
|
||||||
" .long 1b,10b\n" \
|
|
||||||
" .long 2b,10b\n" \
|
|
||||||
" .previous" \
|
|
||||||
: "+d" (__gu_err), "=&r" (__gu_val.l), \
|
|
||||||
"+a" (__gu_ptr) \
|
|
||||||
: "i" (-EFAULT) \
|
|
||||||
: "memory"); \
|
|
||||||
(x) = __gu_val.t; \
|
|
||||||
break; \
|
break; \
|
||||||
} \
|
|
||||||
default: \
|
default: \
|
||||||
__gu_err = __get_user_bad(); \
|
BUILD_BUG(); \
|
||||||
break; \
|
|
||||||
} \
|
} \
|
||||||
__gu_err; \
|
__gu_err; \
|
||||||
})
|
})
|
||||||
@ -322,16 +329,19 @@ __constant_copy_to_user(void __user *to, const void *from, unsigned long n)
|
|||||||
|
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case 1:
|
case 1:
|
||||||
__put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1);
|
__put_user_asm(MOVES, res, *(u8 *)from, (u8 __user *)to,
|
||||||
|
b, d, 1);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
__put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, r, 2);
|
__put_user_asm(MOVES, res, *(u16 *)from, (u16 __user *)to,
|
||||||
|
w, r, 2);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
__constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,);
|
__constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
__put_user_asm(res, *(u32 *)from, (u32 __user *)to, l, r, 4);
|
__put_user_asm(MOVES, res, *(u32 *)from, (u32 __user *)to,
|
||||||
|
l, r, 4);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
__constant_copy_to_user_asm(res, to, from, tmp, 5, l, b,);
|
__constant_copy_to_user_asm(res, to, from, tmp, 5, l, b,);
|
||||||
@ -380,8 +390,65 @@ raw_copy_to_user(void __user *to, const void *from, unsigned long n)
|
|||||||
#define INLINE_COPY_FROM_USER
|
#define INLINE_COPY_FROM_USER
|
||||||
#define INLINE_COPY_TO_USER
|
#define INLINE_COPY_TO_USER
|
||||||
|
|
||||||
#define user_addr_max() \
|
#define HAVE_GET_KERNEL_NOFAULT
|
||||||
(uaccess_kernel() ? ~0UL : TASK_SIZE)
|
|
||||||
|
#define __get_kernel_nofault(dst, src, type, err_label) \
|
||||||
|
do { \
|
||||||
|
type *__gk_dst = (type *)(dst); \
|
||||||
|
type *__gk_src = (type *)(src); \
|
||||||
|
int __gk_err = 0; \
|
||||||
|
\
|
||||||
|
switch (sizeof(type)) { \
|
||||||
|
case 1: \
|
||||||
|
__get_user_asm("move", __gk_err, *__gk_dst, __gk_src, \
|
||||||
|
u8, b, d, -EFAULT); \
|
||||||
|
break; \
|
||||||
|
case 2: \
|
||||||
|
__get_user_asm("move", __gk_err, *__gk_dst, __gk_src, \
|
||||||
|
u16, w, r, -EFAULT); \
|
||||||
|
break; \
|
||||||
|
case 4: \
|
||||||
|
__get_user_asm("move", __gk_err, *__gk_dst, __gk_src, \
|
||||||
|
u32, l, r, -EFAULT); \
|
||||||
|
break; \
|
||||||
|
case 8: \
|
||||||
|
__get_user_asm8("move", __gk_err, *__gk_dst, __gk_src); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
BUILD_BUG(); \
|
||||||
|
} \
|
||||||
|
if (unlikely(__gk_err)) \
|
||||||
|
goto err_label; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define __put_kernel_nofault(dst, src, type, err_label) \
|
||||||
|
do { \
|
||||||
|
type __pk_src = *(type *)(src); \
|
||||||
|
type *__pk_dst = (type *)(dst); \
|
||||||
|
int __pk_err = 0; \
|
||||||
|
\
|
||||||
|
switch (sizeof(type)) { \
|
||||||
|
case 1: \
|
||||||
|
__put_user_asm("move", __pk_err, __pk_src, __pk_dst, \
|
||||||
|
b, d, -EFAULT); \
|
||||||
|
break; \
|
||||||
|
case 2: \
|
||||||
|
__put_user_asm("move", __pk_err, __pk_src, __pk_dst, \
|
||||||
|
w, r, -EFAULT); \
|
||||||
|
break; \
|
||||||
|
case 4: \
|
||||||
|
__put_user_asm("move", __pk_err, __pk_src, __pk_dst, \
|
||||||
|
l, r, -EFAULT); \
|
||||||
|
break; \
|
||||||
|
case 8: \
|
||||||
|
__put_user_asm8("move", __pk_err, __pk_src, __pk_dst); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
BUILD_BUG(); \
|
||||||
|
} \
|
||||||
|
if (unlikely(__pk_err)) \
|
||||||
|
goto err_label; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
extern long strncpy_from_user(char *dst, const char __user *src, long count);
|
extern long strncpy_from_user(char *dst, const char __user *src, long count);
|
||||||
extern __must_check long strnlen_user(const char __user *str, long n);
|
extern __must_check long strnlen_user(const char __user *str, long n);
|
||||||
|
@ -31,7 +31,7 @@ int main(void)
|
|||||||
DEFINE(THREAD_KSP, offsetof(struct thread_struct, ksp));
|
DEFINE(THREAD_KSP, offsetof(struct thread_struct, ksp));
|
||||||
DEFINE(THREAD_USP, offsetof(struct thread_struct, usp));
|
DEFINE(THREAD_USP, offsetof(struct thread_struct, usp));
|
||||||
DEFINE(THREAD_SR, offsetof(struct thread_struct, sr));
|
DEFINE(THREAD_SR, offsetof(struct thread_struct, sr));
|
||||||
DEFINE(THREAD_FS, offsetof(struct thread_struct, fs));
|
DEFINE(THREAD_FC, offsetof(struct thread_struct, fc));
|
||||||
DEFINE(THREAD_CRP, offsetof(struct thread_struct, crp));
|
DEFINE(THREAD_CRP, offsetof(struct thread_struct, crp));
|
||||||
DEFINE(THREAD_ESP0, offsetof(struct thread_struct, esp0));
|
DEFINE(THREAD_ESP0, offsetof(struct thread_struct, esp0));
|
||||||
DEFINE(THREAD_FPREG, offsetof(struct thread_struct, fp));
|
DEFINE(THREAD_FPREG, offsetof(struct thread_struct, fp));
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
@ -78,20 +77,38 @@ ENTRY(__sys_clone3)
|
|||||||
|
|
||||||
ENTRY(sys_sigreturn)
|
ENTRY(sys_sigreturn)
|
||||||
SAVE_SWITCH_STACK
|
SAVE_SWITCH_STACK
|
||||||
movel %sp,%sp@- | switch_stack pointer
|
movel %sp,%a1 | switch_stack pointer
|
||||||
pea %sp@(SWITCH_STACK_SIZE+4) | pt_regs pointer
|
lea %sp@(SWITCH_STACK_SIZE),%a0 | pt_regs pointer
|
||||||
|
lea %sp@(-84),%sp | leave a gap
|
||||||
|
movel %a1,%sp@-
|
||||||
|
movel %a0,%sp@-
|
||||||
jbsr do_sigreturn
|
jbsr do_sigreturn
|
||||||
addql #8,%sp
|
jra 1f | shared with rt_sigreturn()
|
||||||
RESTORE_SWITCH_STACK
|
|
||||||
rts
|
|
||||||
|
|
||||||
ENTRY(sys_rt_sigreturn)
|
ENTRY(sys_rt_sigreturn)
|
||||||
SAVE_SWITCH_STACK
|
SAVE_SWITCH_STACK
|
||||||
movel %sp,%sp@- | switch_stack pointer
|
movel %sp,%a1 | switch_stack pointer
|
||||||
pea %sp@(SWITCH_STACK_SIZE+4) | pt_regs pointer
|
lea %sp@(SWITCH_STACK_SIZE),%a0 | pt_regs pointer
|
||||||
|
lea %sp@(-84),%sp | leave a gap
|
||||||
|
movel %a1,%sp@-
|
||||||
|
movel %a0,%sp@-
|
||||||
|
| stack contents:
|
||||||
|
| [original pt_regs address] [original switch_stack address]
|
||||||
|
| [gap] [switch_stack] [pt_regs] [exception frame]
|
||||||
jbsr do_rt_sigreturn
|
jbsr do_rt_sigreturn
|
||||||
addql #8,%sp
|
|
||||||
|
1:
|
||||||
|
| stack contents now:
|
||||||
|
| [original pt_regs address] [original switch_stack address]
|
||||||
|
| [unused part of the gap] [moved switch_stack] [moved pt_regs]
|
||||||
|
| [replacement exception frame]
|
||||||
|
| return value of do_{rt_,}sigreturn() points to moved switch_stack.
|
||||||
|
|
||||||
|
movel %d0,%sp | discard the leftover junk
|
||||||
RESTORE_SWITCH_STACK
|
RESTORE_SWITCH_STACK
|
||||||
|
| stack contents now is just [syscall return address] [pt_regs] [frame]
|
||||||
|
| return pt_regs.d0
|
||||||
|
movel %sp@(PT_OFF_D0+4),%d0
|
||||||
rts
|
rts
|
||||||
|
|
||||||
ENTRY(buserr)
|
ENTRY(buserr)
|
||||||
@ -182,25 +199,6 @@ do_trace_exit:
|
|||||||
addql #4,%sp
|
addql #4,%sp
|
||||||
jra .Lret_from_exception
|
jra .Lret_from_exception
|
||||||
|
|
||||||
ENTRY(ret_from_signal)
|
|
||||||
movel %curptr@(TASK_STACK),%a1
|
|
||||||
tstb %a1@(TINFO_FLAGS+2)
|
|
||||||
jge 1f
|
|
||||||
jbsr syscall_trace
|
|
||||||
1: RESTORE_SWITCH_STACK
|
|
||||||
addql #4,%sp
|
|
||||||
/* on 68040 complete pending writebacks if any */
|
|
||||||
#ifdef CONFIG_M68040
|
|
||||||
bfextu %sp@(PT_OFF_FORMATVEC){#0,#4},%d0
|
|
||||||
subql #7,%d0 | bus error frame ?
|
|
||||||
jbne 1f
|
|
||||||
movel %sp,%sp@-
|
|
||||||
jbsr berr_040cleanup
|
|
||||||
addql #4,%sp
|
|
||||||
1:
|
|
||||||
#endif
|
|
||||||
jra .Lret_from_exception
|
|
||||||
|
|
||||||
ENTRY(system_call)
|
ENTRY(system_call)
|
||||||
SAVE_ALL_SYS
|
SAVE_ALL_SYS
|
||||||
|
|
||||||
@ -338,7 +336,7 @@ resume:
|
|||||||
|
|
||||||
/* save fs (sfc,%dfc) (may be pointing to kernel memory) */
|
/* save fs (sfc,%dfc) (may be pointing to kernel memory) */
|
||||||
movec %sfc,%d0
|
movec %sfc,%d0
|
||||||
movew %d0,%a0@(TASK_THREAD+THREAD_FS)
|
movew %d0,%a0@(TASK_THREAD+THREAD_FC)
|
||||||
|
|
||||||
/* save usp */
|
/* save usp */
|
||||||
/* it is better to use a movel here instead of a movew 8*) */
|
/* it is better to use a movel here instead of a movew 8*) */
|
||||||
@ -424,7 +422,7 @@ resume:
|
|||||||
movel %a0,%usp
|
movel %a0,%usp
|
||||||
|
|
||||||
/* restore fs (sfc,%dfc) */
|
/* restore fs (sfc,%dfc) */
|
||||||
movew %a1@(TASK_THREAD+THREAD_FS),%a0
|
movew %a1@(TASK_THREAD+THREAD_FC),%a0
|
||||||
movec %a0,%sfc
|
movec %a0,%sfc
|
||||||
movec %a0,%dfc
|
movec %a0,%dfc
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ void show_regs(struct pt_regs * regs)
|
|||||||
|
|
||||||
void flush_thread(void)
|
void flush_thread(void)
|
||||||
{
|
{
|
||||||
current->thread.fs = __USER_DS;
|
current->thread.fc = USER_DATA;
|
||||||
#ifdef CONFIG_FPU
|
#ifdef CONFIG_FPU
|
||||||
if (!FPU_IS_EMU) {
|
if (!FPU_IS_EMU) {
|
||||||
unsigned long zero = 0;
|
unsigned long zero = 0;
|
||||||
@ -155,7 +155,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
|
|||||||
* Must save the current SFC/DFC value, NOT the value when
|
* Must save the current SFC/DFC value, NOT the value when
|
||||||
* the parent was last descheduled - RGH 10-08-96
|
* the parent was last descheduled - RGH 10-08-96
|
||||||
*/
|
*/
|
||||||
p->thread.fs = get_fs().seg;
|
p->thread.fc = USER_DATA;
|
||||||
|
|
||||||
if (unlikely(p->flags & (PF_KTHREAD | PF_IO_WORKER))) {
|
if (unlikely(p->flags & (PF_KTHREAD | PF_IO_WORKER))) {
|
||||||
/* kernel thread */
|
/* kernel thread */
|
||||||
|
@ -447,7 +447,7 @@ static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
|
|||||||
|
|
||||||
if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
|
if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
|
||||||
fpu_version = sc->sc_fpstate[0];
|
fpu_version = sc->sc_fpstate[0];
|
||||||
if (CPU_IS_020_OR_030 &&
|
if (CPU_IS_020_OR_030 && !regs->stkadj &&
|
||||||
regs->vector >= (VEC_FPBRUC * 4) &&
|
regs->vector >= (VEC_FPBRUC * 4) &&
|
||||||
regs->vector <= (VEC_FPNAN * 4)) {
|
regs->vector <= (VEC_FPNAN * 4)) {
|
||||||
/* Clear pending exception in 68882 idle frame */
|
/* Clear pending exception in 68882 idle frame */
|
||||||
@ -510,7 +510,7 @@ static inline int rt_save_fpu_state(struct ucontext __user *uc, struct pt_regs *
|
|||||||
if (!(CPU_IS_060 || CPU_IS_COLDFIRE))
|
if (!(CPU_IS_060 || CPU_IS_COLDFIRE))
|
||||||
context_size = fpstate[1];
|
context_size = fpstate[1];
|
||||||
fpu_version = fpstate[0];
|
fpu_version = fpstate[0];
|
||||||
if (CPU_IS_020_OR_030 &&
|
if (CPU_IS_020_OR_030 && !regs->stkadj &&
|
||||||
regs->vector >= (VEC_FPBRUC * 4) &&
|
regs->vector >= (VEC_FPBRUC * 4) &&
|
||||||
regs->vector <= (VEC_FPNAN * 4)) {
|
regs->vector <= (VEC_FPNAN * 4)) {
|
||||||
/* Clear pending exception in 68882 idle frame */
|
/* Clear pending exception in 68882 idle frame */
|
||||||
@ -641,56 +641,35 @@ static inline void siginfo_build_tests(void)
|
|||||||
static int mangle_kernel_stack(struct pt_regs *regs, int formatvec,
|
static int mangle_kernel_stack(struct pt_regs *regs, int formatvec,
|
||||||
void __user *fp)
|
void __user *fp)
|
||||||
{
|
{
|
||||||
int fsize = frame_extra_sizes(formatvec >> 12);
|
int extra = frame_extra_sizes(formatvec >> 12);
|
||||||
if (fsize < 0) {
|
char buf[sizeof_field(struct frame, un)];
|
||||||
|
|
||||||
|
if (extra < 0) {
|
||||||
/*
|
/*
|
||||||
* user process trying to return with weird frame format
|
* user process trying to return with weird frame format
|
||||||
*/
|
*/
|
||||||
pr_debug("user process returning with weird frame format\n");
|
pr_debug("user process returning with weird frame format\n");
|
||||||
return 1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!fsize) {
|
if (extra && copy_from_user(buf, fp, extra))
|
||||||
regs->format = formatvec >> 12;
|
return -1;
|
||||||
regs->vector = formatvec & 0xfff;
|
regs->format = formatvec >> 12;
|
||||||
} else {
|
regs->vector = formatvec & 0xfff;
|
||||||
struct switch_stack *sw = (struct switch_stack *)regs - 1;
|
if (extra) {
|
||||||
/* yes, twice as much as max(sizeof(frame.un.fmt<x>)) */
|
void *p = (struct switch_stack *)regs - 1;
|
||||||
unsigned long buf[sizeof_field(struct frame, un) / 2];
|
struct frame *new = (void *)regs - extra;
|
||||||
|
int size = sizeof(struct pt_regs)+sizeof(struct switch_stack);
|
||||||
|
|
||||||
/* that'll make sure that expansion won't crap over data */
|
memmove(p - extra, p, size);
|
||||||
if (copy_from_user(buf + fsize / 4, fp, fsize))
|
memcpy(p - extra + size, buf, extra);
|
||||||
return 1;
|
current->thread.esp0 = (unsigned long)&new->ptregs;
|
||||||
|
#ifdef CONFIG_M68040
|
||||||
/* point of no return */
|
/* on 68040 complete pending writebacks if any */
|
||||||
regs->format = formatvec >> 12;
|
if (new->ptregs.format == 7) // bus error frame
|
||||||
regs->vector = formatvec & 0xfff;
|
berr_040cleanup(new);
|
||||||
#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack))
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
#ifdef CONFIG_COLDFIRE
|
|
||||||
" movel %0,%/sp\n\t"
|
|
||||||
" bra ret_from_signal\n"
|
|
||||||
#else
|
|
||||||
" movel %0,%/a0\n\t"
|
|
||||||
" subl %1,%/a0\n\t" /* make room on stack */
|
|
||||||
" movel %/a0,%/sp\n\t" /* set stack pointer */
|
|
||||||
/* move switch_stack and pt_regs */
|
|
||||||
"1: movel %0@+,%/a0@+\n\t"
|
|
||||||
" dbra %2,1b\n\t"
|
|
||||||
" lea %/sp@(%c3),%/a0\n\t" /* add offset of fmt */
|
|
||||||
" lsrl #2,%1\n\t"
|
|
||||||
" subql #1,%1\n\t"
|
|
||||||
/* copy to the gap we'd made */
|
|
||||||
"2: movel %4@+,%/a0@+\n\t"
|
|
||||||
" dbra %1,2b\n\t"
|
|
||||||
" bral ret_from_signal\n"
|
|
||||||
#endif
|
#endif
|
||||||
: /* no outputs, it doesn't ever return */
|
|
||||||
: "a" (sw), "d" (fsize), "d" (frame_offset/4-1),
|
|
||||||
"n" (frame_offset), "a" (buf + fsize/4)
|
|
||||||
: "a0");
|
|
||||||
#undef frame_offset
|
|
||||||
}
|
}
|
||||||
return 0;
|
return extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
@ -698,7 +677,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u
|
|||||||
{
|
{
|
||||||
int formatvec;
|
int formatvec;
|
||||||
struct sigcontext context;
|
struct sigcontext context;
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
siginfo_build_tests();
|
siginfo_build_tests();
|
||||||
|
|
||||||
@ -707,7 +685,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u
|
|||||||
|
|
||||||
/* get previous context */
|
/* get previous context */
|
||||||
if (copy_from_user(&context, usc, sizeof(context)))
|
if (copy_from_user(&context, usc, sizeof(context)))
|
||||||
goto badframe;
|
return -1;
|
||||||
|
|
||||||
/* restore passed registers */
|
/* restore passed registers */
|
||||||
regs->d0 = context.sc_d0;
|
regs->d0 = context.sc_d0;
|
||||||
@ -720,15 +698,10 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u
|
|||||||
wrusp(context.sc_usp);
|
wrusp(context.sc_usp);
|
||||||
formatvec = context.sc_formatvec;
|
formatvec = context.sc_formatvec;
|
||||||
|
|
||||||
err = restore_fpu_state(&context);
|
if (restore_fpu_state(&context))
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (err || mangle_kernel_stack(regs, formatvec, fp))
|
return mangle_kernel_stack(regs, formatvec, fp);
|
||||||
goto badframe;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
badframe:
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
@ -745,7 +718,7 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
|
|||||||
|
|
||||||
err = __get_user(temp, &uc->uc_mcontext.version);
|
err = __get_user(temp, &uc->uc_mcontext.version);
|
||||||
if (temp != MCONTEXT_VERSION)
|
if (temp != MCONTEXT_VERSION)
|
||||||
goto badframe;
|
return -1;
|
||||||
/* restore passed registers */
|
/* restore passed registers */
|
||||||
err |= __get_user(regs->d0, &gregs[0]);
|
err |= __get_user(regs->d0, &gregs[0]);
|
||||||
err |= __get_user(regs->d1, &gregs[1]);
|
err |= __get_user(regs->d1, &gregs[1]);
|
||||||
@ -774,22 +747,17 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
|
|||||||
err |= restore_altstack(&uc->uc_stack);
|
err |= restore_altstack(&uc->uc_stack);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
goto badframe;
|
return -1;
|
||||||
|
|
||||||
if (mangle_kernel_stack(regs, temp, &uc->uc_extra))
|
return mangle_kernel_stack(regs, temp, &uc->uc_extra);
|
||||||
goto badframe;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
badframe:
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage int do_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
|
asmlinkage void *do_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
|
||||||
{
|
{
|
||||||
unsigned long usp = rdusp();
|
unsigned long usp = rdusp();
|
||||||
struct sigframe __user *frame = (struct sigframe __user *)(usp - 4);
|
struct sigframe __user *frame = (struct sigframe __user *)(usp - 4);
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
|
int size;
|
||||||
|
|
||||||
if (!access_ok(frame, sizeof(*frame)))
|
if (!access_ok(frame, sizeof(*frame)))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
@ -801,20 +769,22 @@ asmlinkage int do_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
|
|||||||
|
|
||||||
set_current_blocked(&set);
|
set_current_blocked(&set);
|
||||||
|
|
||||||
if (restore_sigcontext(regs, &frame->sc, frame + 1))
|
size = restore_sigcontext(regs, &frame->sc, frame + 1);
|
||||||
|
if (size < 0)
|
||||||
goto badframe;
|
goto badframe;
|
||||||
return regs->d0;
|
return (void *)sw - size;
|
||||||
|
|
||||||
badframe:
|
badframe:
|
||||||
force_sig(SIGSEGV);
|
force_sig(SIGSEGV);
|
||||||
return 0;
|
return sw;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage int do_rt_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
|
asmlinkage void *do_rt_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
|
||||||
{
|
{
|
||||||
unsigned long usp = rdusp();
|
unsigned long usp = rdusp();
|
||||||
struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4);
|
struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4);
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
|
int size;
|
||||||
|
|
||||||
if (!access_ok(frame, sizeof(*frame)))
|
if (!access_ok(frame, sizeof(*frame)))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
@ -823,27 +793,34 @@ asmlinkage int do_rt_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
|
|||||||
|
|
||||||
set_current_blocked(&set);
|
set_current_blocked(&set);
|
||||||
|
|
||||||
if (rt_restore_ucontext(regs, sw, &frame->uc))
|
size = rt_restore_ucontext(regs, sw, &frame->uc);
|
||||||
|
if (size < 0)
|
||||||
goto badframe;
|
goto badframe;
|
||||||
return regs->d0;
|
return (void *)sw - size;
|
||||||
|
|
||||||
badframe:
|
badframe:
|
||||||
force_sig(SIGSEGV);
|
force_sig(SIGSEGV);
|
||||||
return 0;
|
return sw;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct pt_regs *rte_regs(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return (void *)regs + regs->stkadj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
|
static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
|
||||||
unsigned long mask)
|
unsigned long mask)
|
||||||
{
|
{
|
||||||
|
struct pt_regs *tregs = rte_regs(regs);
|
||||||
sc->sc_mask = mask;
|
sc->sc_mask = mask;
|
||||||
sc->sc_usp = rdusp();
|
sc->sc_usp = rdusp();
|
||||||
sc->sc_d0 = regs->d0;
|
sc->sc_d0 = regs->d0;
|
||||||
sc->sc_d1 = regs->d1;
|
sc->sc_d1 = regs->d1;
|
||||||
sc->sc_a0 = regs->a0;
|
sc->sc_a0 = regs->a0;
|
||||||
sc->sc_a1 = regs->a1;
|
sc->sc_a1 = regs->a1;
|
||||||
sc->sc_sr = regs->sr;
|
sc->sc_sr = tregs->sr;
|
||||||
sc->sc_pc = regs->pc;
|
sc->sc_pc = tregs->pc;
|
||||||
sc->sc_formatvec = regs->format << 12 | regs->vector;
|
sc->sc_formatvec = tregs->format << 12 | tregs->vector;
|
||||||
save_a5_state(sc, regs);
|
save_a5_state(sc, regs);
|
||||||
save_fpu_state(sc, regs);
|
save_fpu_state(sc, regs);
|
||||||
}
|
}
|
||||||
@ -851,6 +828,7 @@ static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
|
|||||||
static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
|
static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct switch_stack *sw = (struct switch_stack *)regs - 1;
|
struct switch_stack *sw = (struct switch_stack *)regs - 1;
|
||||||
|
struct pt_regs *tregs = rte_regs(regs);
|
||||||
greg_t __user *gregs = uc->uc_mcontext.gregs;
|
greg_t __user *gregs = uc->uc_mcontext.gregs;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
@ -871,9 +849,9 @@ static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *
|
|||||||
err |= __put_user(sw->a5, &gregs[13]);
|
err |= __put_user(sw->a5, &gregs[13]);
|
||||||
err |= __put_user(sw->a6, &gregs[14]);
|
err |= __put_user(sw->a6, &gregs[14]);
|
||||||
err |= __put_user(rdusp(), &gregs[15]);
|
err |= __put_user(rdusp(), &gregs[15]);
|
||||||
err |= __put_user(regs->pc, &gregs[16]);
|
err |= __put_user(tregs->pc, &gregs[16]);
|
||||||
err |= __put_user(regs->sr, &gregs[17]);
|
err |= __put_user(tregs->sr, &gregs[17]);
|
||||||
err |= __put_user((regs->format << 12) | regs->vector, &uc->uc_formatvec);
|
err |= __put_user((tregs->format << 12) | tregs->vector, &uc->uc_formatvec);
|
||||||
err |= rt_save_fpu_state(uc, regs);
|
err |= rt_save_fpu_state(uc, regs);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -890,13 +868,14 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
|||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct sigframe __user *frame;
|
struct sigframe __user *frame;
|
||||||
int fsize = frame_extra_sizes(regs->format);
|
struct pt_regs *tregs = rte_regs(regs);
|
||||||
|
int fsize = frame_extra_sizes(tregs->format);
|
||||||
struct sigcontext context;
|
struct sigcontext context;
|
||||||
int err = 0, sig = ksig->sig;
|
int err = 0, sig = ksig->sig;
|
||||||
|
|
||||||
if (fsize < 0) {
|
if (fsize < 0) {
|
||||||
pr_debug("setup_frame: Unknown frame format %#x\n",
|
pr_debug("setup_frame: Unknown frame format %#x\n",
|
||||||
regs->format);
|
tregs->format);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -907,7 +886,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
|||||||
|
|
||||||
err |= __put_user(sig, &frame->sig);
|
err |= __put_user(sig, &frame->sig);
|
||||||
|
|
||||||
err |= __put_user(regs->vector, &frame->code);
|
err |= __put_user(tregs->vector, &frame->code);
|
||||||
err |= __put_user(&frame->sc, &frame->psc);
|
err |= __put_user(&frame->sc, &frame->psc);
|
||||||
|
|
||||||
if (_NSIG_WORDS > 1)
|
if (_NSIG_WORDS > 1)
|
||||||
@ -933,34 +912,28 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
|||||||
|
|
||||||
push_cache ((unsigned long) &frame->retcode);
|
push_cache ((unsigned long) &frame->retcode);
|
||||||
|
|
||||||
/*
|
|
||||||
* Set up registers for signal handler. All the state we are about
|
|
||||||
* to destroy is successfully copied to sigframe.
|
|
||||||
*/
|
|
||||||
wrusp ((unsigned long) frame);
|
|
||||||
regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
|
|
||||||
adjustformat(regs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is subtle; if we build more than one sigframe, all but the
|
* This is subtle; if we build more than one sigframe, all but the
|
||||||
* first one will see frame format 0 and have fsize == 0, so we won't
|
* first one will see frame format 0 and have fsize == 0, so we won't
|
||||||
* screw stkadj.
|
* screw stkadj.
|
||||||
*/
|
*/
|
||||||
if (fsize)
|
if (fsize) {
|
||||||
regs->stkadj = fsize;
|
regs->stkadj = fsize;
|
||||||
|
tregs = rte_regs(regs);
|
||||||
/* Prepare to skip over the extra stuff in the exception frame. */
|
|
||||||
if (regs->stkadj) {
|
|
||||||
struct pt_regs *tregs =
|
|
||||||
(struct pt_regs *)((ulong)regs + regs->stkadj);
|
|
||||||
pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
|
pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
|
||||||
/* This must be copied with decreasing addresses to
|
|
||||||
handle overlaps. */
|
|
||||||
tregs->vector = 0;
|
tregs->vector = 0;
|
||||||
tregs->format = 0;
|
tregs->format = 0;
|
||||||
tregs->pc = regs->pc;
|
|
||||||
tregs->sr = regs->sr;
|
tregs->sr = regs->sr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up registers for signal handler. All the state we are about
|
||||||
|
* to destroy is successfully copied to sigframe.
|
||||||
|
*/
|
||||||
|
wrusp ((unsigned long) frame);
|
||||||
|
tregs->pc = (unsigned long) ksig->ka.sa.sa_handler;
|
||||||
|
adjustformat(regs);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -968,7 +941,8 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
|
|||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct rt_sigframe __user *frame;
|
struct rt_sigframe __user *frame;
|
||||||
int fsize = frame_extra_sizes(regs->format);
|
struct pt_regs *tregs = rte_regs(regs);
|
||||||
|
int fsize = frame_extra_sizes(tregs->format);
|
||||||
int err = 0, sig = ksig->sig;
|
int err = 0, sig = ksig->sig;
|
||||||
|
|
||||||
if (fsize < 0) {
|
if (fsize < 0) {
|
||||||
@ -1018,34 +992,27 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
|
|||||||
|
|
||||||
push_cache ((unsigned long) &frame->retcode);
|
push_cache ((unsigned long) &frame->retcode);
|
||||||
|
|
||||||
/*
|
|
||||||
* Set up registers for signal handler. All the state we are about
|
|
||||||
* to destroy is successfully copied to sigframe.
|
|
||||||
*/
|
|
||||||
wrusp ((unsigned long) frame);
|
|
||||||
regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
|
|
||||||
adjustformat(regs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is subtle; if we build more than one sigframe, all but the
|
* This is subtle; if we build more than one sigframe, all but the
|
||||||
* first one will see frame format 0 and have fsize == 0, so we won't
|
* first one will see frame format 0 and have fsize == 0, so we won't
|
||||||
* screw stkadj.
|
* screw stkadj.
|
||||||
*/
|
*/
|
||||||
if (fsize)
|
if (fsize) {
|
||||||
regs->stkadj = fsize;
|
regs->stkadj = fsize;
|
||||||
|
tregs = rte_regs(regs);
|
||||||
/* Prepare to skip over the extra stuff in the exception frame. */
|
|
||||||
if (regs->stkadj) {
|
|
||||||
struct pt_regs *tregs =
|
|
||||||
(struct pt_regs *)((ulong)regs + regs->stkadj);
|
|
||||||
pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
|
pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
|
||||||
/* This must be copied with decreasing addresses to
|
|
||||||
handle overlaps. */
|
|
||||||
tregs->vector = 0;
|
tregs->vector = 0;
|
||||||
tregs->format = 0;
|
tregs->format = 0;
|
||||||
tregs->pc = regs->pc;
|
|
||||||
tregs->sr = regs->sr;
|
tregs->sr = regs->sr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up registers for signal handler. All the state we are about
|
||||||
|
* to destroy is successfully copied to sigframe.
|
||||||
|
*/
|
||||||
|
wrusp ((unsigned long) frame);
|
||||||
|
tregs->pc = (unsigned long) ksig->ka.sa.sa_handler;
|
||||||
|
adjustformat(regs);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,9 +181,8 @@ static inline void access_error060 (struct frame *fp)
|
|||||||
static inline unsigned long probe040(int iswrite, unsigned long addr, int wbs)
|
static inline unsigned long probe040(int iswrite, unsigned long addr, int wbs)
|
||||||
{
|
{
|
||||||
unsigned long mmusr;
|
unsigned long mmusr;
|
||||||
mm_segment_t old_fs = get_fs();
|
|
||||||
|
|
||||||
set_fs(MAKE_MM_SEG(wbs));
|
set_fc(wbs);
|
||||||
|
|
||||||
if (iswrite)
|
if (iswrite)
|
||||||
asm volatile (".chip 68040; ptestw (%0); .chip 68k" : : "a" (addr));
|
asm volatile (".chip 68040; ptestw (%0); .chip 68k" : : "a" (addr));
|
||||||
@ -192,7 +191,7 @@ static inline unsigned long probe040(int iswrite, unsigned long addr, int wbs)
|
|||||||
|
|
||||||
asm volatile (".chip 68040; movec %%mmusr,%0; .chip 68k" : "=r" (mmusr));
|
asm volatile (".chip 68040; movec %%mmusr,%0; .chip 68k" : "=r" (mmusr));
|
||||||
|
|
||||||
set_fs(old_fs);
|
set_fc(USER_DATA);
|
||||||
|
|
||||||
return mmusr;
|
return mmusr;
|
||||||
}
|
}
|
||||||
@ -201,10 +200,8 @@ static inline int do_040writeback1(unsigned short wbs, unsigned long wba,
|
|||||||
unsigned long wbd)
|
unsigned long wbd)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
mm_segment_t old_fs = get_fs();
|
|
||||||
|
|
||||||
/* set_fs can not be moved, otherwise put_user() may oops */
|
set_fc(wbs);
|
||||||
set_fs(MAKE_MM_SEG(wbs));
|
|
||||||
|
|
||||||
switch (wbs & WBSIZ_040) {
|
switch (wbs & WBSIZ_040) {
|
||||||
case BA_SIZE_BYTE:
|
case BA_SIZE_BYTE:
|
||||||
@ -218,9 +215,7 @@ static inline int do_040writeback1(unsigned short wbs, unsigned long wba,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set_fs can not be moved, otherwise put_user() may oops */
|
set_fc(USER_DATA);
|
||||||
set_fs(old_fs);
|
|
||||||
|
|
||||||
|
|
||||||
pr_debug("do_040writeback1, res=%d\n", res);
|
pr_debug("do_040writeback1, res=%d\n", res);
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/macintosh.h>
|
#include <asm/macintosh.h>
|
||||||
#include <asm/mac_via.h>
|
#include <asm/mac_via.h>
|
||||||
|
@ -49,24 +49,7 @@ static unsigned long virt_to_phys_slow(unsigned long vaddr)
|
|||||||
if (mmusr & MMU_R_040)
|
if (mmusr & MMU_R_040)
|
||||||
return (mmusr & PAGE_MASK) | (vaddr & ~PAGE_MASK);
|
return (mmusr & PAGE_MASK) | (vaddr & ~PAGE_MASK);
|
||||||
} else {
|
} else {
|
||||||
unsigned short mmusr;
|
WARN_ON_ONCE(!CPU_IS_040_OR_060);
|
||||||
unsigned long *descaddr;
|
|
||||||
|
|
||||||
asm volatile ("ptestr %3,%2@,#7,%0\n\t"
|
|
||||||
"pmove %%psr,%1"
|
|
||||||
: "=a&" (descaddr), "=m" (mmusr)
|
|
||||||
: "a" (vaddr), "d" (get_fs().seg));
|
|
||||||
if (mmusr & (MMU_I|MMU_B|MMU_L))
|
|
||||||
return 0;
|
|
||||||
descaddr = phys_to_virt((unsigned long)descaddr);
|
|
||||||
switch (mmusr & MMU_NUM) {
|
|
||||||
case 1:
|
|
||||||
return (*descaddr & 0xfe000000) | (vaddr & 0x01ffffff);
|
|
||||||
case 2:
|
|
||||||
return (*descaddr & 0xfffc0000) | (vaddr & 0x0003ffff);
|
|
||||||
case 3:
|
|
||||||
return (*descaddr & PAGE_MASK) | (vaddr & ~PAGE_MASK);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -107,11 +90,9 @@ void flush_icache_user_range(unsigned long address, unsigned long endaddr)
|
|||||||
|
|
||||||
void flush_icache_range(unsigned long address, unsigned long endaddr)
|
void flush_icache_range(unsigned long address, unsigned long endaddr)
|
||||||
{
|
{
|
||||||
mm_segment_t old_fs = get_fs();
|
set_fc(SUPER_DATA);
|
||||||
|
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
flush_icache_user_range(address, endaddr);
|
flush_icache_user_range(address, endaddr);
|
||||||
set_fs(old_fs);
|
set_fc(USER_DATA);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(flush_icache_range);
|
EXPORT_SYMBOL(flush_icache_range);
|
||||||
|
|
||||||
|
@ -72,12 +72,6 @@ void __init paging_init(void)
|
|||||||
if (!empty_zero_page)
|
if (!empty_zero_page)
|
||||||
panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
|
panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
|
||||||
__func__, PAGE_SIZE, PAGE_SIZE);
|
__func__, PAGE_SIZE, PAGE_SIZE);
|
||||||
|
|
||||||
/*
|
|
||||||
* Set up SFC/DFC registers (user data space).
|
|
||||||
*/
|
|
||||||
set_fs (USER_DS);
|
|
||||||
|
|
||||||
max_zone_pfn[ZONE_DMA] = end_mem >> PAGE_SHIFT;
|
max_zone_pfn[ZONE_DMA] = end_mem >> PAGE_SHIFT;
|
||||||
free_area_init(max_zone_pfn);
|
free_area_init(max_zone_pfn);
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
|
@ -467,7 +467,7 @@ void __init paging_init(void)
|
|||||||
/*
|
/*
|
||||||
* Set up SFC/DFC registers
|
* Set up SFC/DFC registers
|
||||||
*/
|
*/
|
||||||
set_fs(KERNEL_DS);
|
set_fc(USER_DATA);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printk ("before free_area_init\n");
|
printk ("before free_area_init\n");
|
||||||
|
@ -171,7 +171,6 @@ static int bcd2int (unsigned char b)
|
|||||||
|
|
||||||
int mvme147_hwclk(int op, struct rtc_time *t)
|
int mvme147_hwclk(int op, struct rtc_time *t)
|
||||||
{
|
{
|
||||||
#warning check me!
|
|
||||||
if (!op) {
|
if (!op) {
|
||||||
m147_rtc->ctrl = RTC_READ;
|
m147_rtc->ctrl = RTC_READ;
|
||||||
t->tm_year = bcd2int (m147_rtc->bcd_year);
|
t->tm_year = bcd2int (m147_rtc->bcd_year);
|
||||||
@ -183,6 +182,9 @@ int mvme147_hwclk(int op, struct rtc_time *t)
|
|||||||
m147_rtc->ctrl = 0;
|
m147_rtc->ctrl = 0;
|
||||||
if (t->tm_year < 70)
|
if (t->tm_year < 70)
|
||||||
t->tm_year += 100;
|
t->tm_year += 100;
|
||||||
|
} else {
|
||||||
|
/* FIXME Setting the time is not yet supported */
|
||||||
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -436,7 +436,6 @@ int bcd2int (unsigned char b)
|
|||||||
|
|
||||||
int mvme16x_hwclk(int op, struct rtc_time *t)
|
int mvme16x_hwclk(int op, struct rtc_time *t)
|
||||||
{
|
{
|
||||||
#warning check me!
|
|
||||||
if (!op) {
|
if (!op) {
|
||||||
rtc->ctrl = RTC_READ;
|
rtc->ctrl = RTC_READ;
|
||||||
t->tm_year = bcd2int (rtc->bcd_year);
|
t->tm_year = bcd2int (rtc->bcd_year);
|
||||||
@ -448,6 +447,9 @@ int mvme16x_hwclk(int op, struct rtc_time *t)
|
|||||||
rtc->ctrl = 0;
|
rtc->ctrl = 0;
|
||||||
if (t->tm_year < 70)
|
if (t->tm_year < 70)
|
||||||
t->tm_year += 100;
|
t->tm_year += 100;
|
||||||
|
} else {
|
||||||
|
/* FIXME Setting the time is not yet supported */
|
||||||
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include <asm/intersil.h>
|
#include <asm/intersil.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/sun3ints.h>
|
#include <asm/sun3ints.h>
|
||||||
|
|
||||||
char sun3_reserved_pmeg[SUN3_PMEGS_NUM];
|
char sun3_reserved_pmeg[SUN3_PMEGS_NUM];
|
||||||
@ -89,7 +88,7 @@ void __init sun3_init(void)
|
|||||||
sun3_reserved_pmeg[249] = 1;
|
sun3_reserved_pmeg[249] = 1;
|
||||||
sun3_reserved_pmeg[252] = 1;
|
sun3_reserved_pmeg[252] = 1;
|
||||||
sun3_reserved_pmeg[253] = 1;
|
sun3_reserved_pmeg[253] = 1;
|
||||||
set_fs(KERNEL_DS);
|
set_fc(USER_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Without this, Bad Things happen when something calls arch_reset. */
|
/* Without this, Bad Things happen when something calls arch_reset. */
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/sun3mmu.h>
|
#include <asm/sun3mmu.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/oplib.h>
|
#include <asm/oplib.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/dvma.h>
|
#include <asm/dvma.h>
|
||||||
@ -191,14 +190,13 @@ void __init mmu_emu_init(unsigned long bootmem_end)
|
|||||||
for(seg = 0; seg < PAGE_OFFSET; seg += SUN3_PMEG_SIZE)
|
for(seg = 0; seg < PAGE_OFFSET; seg += SUN3_PMEG_SIZE)
|
||||||
sun3_put_segmap(seg, SUN3_INVALID_PMEG);
|
sun3_put_segmap(seg, SUN3_INVALID_PMEG);
|
||||||
|
|
||||||
set_fs(MAKE_MM_SEG(3));
|
set_fc(3);
|
||||||
for(seg = 0; seg < 0x10000000; seg += SUN3_PMEG_SIZE) {
|
for(seg = 0; seg < 0x10000000; seg += SUN3_PMEG_SIZE) {
|
||||||
i = sun3_get_segmap(seg);
|
i = sun3_get_segmap(seg);
|
||||||
for(j = 1; j < CONTEXTS_NUM; j++)
|
for(j = 1; j < CONTEXTS_NUM; j++)
|
||||||
(*(romvec->pv_setctxt))(j, (void *)seg, i);
|
(*(romvec->pv_setctxt))(j, (void *)seg, i);
|
||||||
}
|
}
|
||||||
set_fs(KERNEL_DS);
|
set_fc(USER_DATA);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* erase the mappings for a dead context. Uses the pg_dir for hints
|
/* erase the mappings for a dead context. Uses the pg_dir for hints
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/intersil.h>
|
#include <asm/intersil.h>
|
||||||
#include <asm/oplib.h>
|
#include <asm/oplib.h>
|
||||||
#include <asm/sun3ints.h>
|
#include <asm/sun3ints.h>
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
#include <asm/sun3xprom.h>
|
#include <asm/sun3xprom.h>
|
||||||
#include <asm/idprom.h>
|
#include <asm/idprom.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/sun3ints.h>
|
#include <asm/sun3ints.h>
|
||||||
#include <asm/openprom.h>
|
#include <asm/openprom.h>
|
||||||
#include <asm/machines.h>
|
#include <asm/machines.h>
|
||||||
|
@ -47,7 +47,6 @@ config MIPS
|
|||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select GENERIC_TIME_VSYSCALL
|
select GENERIC_TIME_VSYSCALL
|
||||||
select GUP_GET_PTE_LOW_HIGH if CPU_MIPS32 && PHYS_ADDR_T_64BIT
|
select GUP_GET_PTE_LOW_HIGH if CPU_MIPS32 && PHYS_ADDR_T_64BIT
|
||||||
select HANDLE_DOMAIN_IRQ
|
|
||||||
select HAVE_ARCH_COMPILER_H
|
select HAVE_ARCH_COMPILER_H
|
||||||
select HAVE_ARCH_JUMP_LABEL
|
select HAVE_ARCH_JUMP_LABEL
|
||||||
select HAVE_ARCH_KGDB if MIPS_FP_SUPPORT
|
select HAVE_ARCH_KGDB if MIPS_FP_SUPPORT
|
||||||
@ -1782,6 +1781,7 @@ config CPU_BMIPS
|
|||||||
select CPU_HAS_PREFETCH
|
select CPU_HAS_PREFETCH
|
||||||
select CPU_SUPPORTS_CPUFREQ
|
select CPU_SUPPORTS_CPUFREQ
|
||||||
select MIPS_EXTERNAL_TIMER
|
select MIPS_EXTERNAL_TIMER
|
||||||
|
select GENERIC_IRQ_MIGRATION if HOTPLUG_CPU
|
||||||
help
|
help
|
||||||
Support for BMIPS32/3300/4350/4380 and BMIPS5000 processors.
|
Support for BMIPS32/3300/4350/4380 and BMIPS5000 processors.
|
||||||
|
|
||||||
|
@ -2609,7 +2609,10 @@ static void octeon_irq_ciu3_ip2(void)
|
|||||||
else
|
else
|
||||||
hw = intsn;
|
hw = intsn;
|
||||||
|
|
||||||
ret = handle_domain_irq(domain, hw, NULL);
|
irq_enter();
|
||||||
|
ret = generic_handle_domain_irq(domain, hw);
|
||||||
|
irq_exit();
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
union cvmx_ciu3_iscx_w1c isc_w1c;
|
union cvmx_ciu3_iscx_w1c isc_w1c;
|
||||||
u64 isc_w1c_addr = ciu3_addr + CIU3_ISC_W1C(intsn);
|
u64 isc_w1c_addr = ciu3_addr + CIU3_ISC_W1C(intsn);
|
||||||
|
@ -111,15 +111,9 @@ void __irq_entry do_IRQ(unsigned int irq)
|
|||||||
#ifdef CONFIG_IRQ_DOMAIN
|
#ifdef CONFIG_IRQ_DOMAIN
|
||||||
void __irq_entry do_domain_IRQ(struct irq_domain *domain, unsigned int hwirq)
|
void __irq_entry do_domain_IRQ(struct irq_domain *domain, unsigned int hwirq)
|
||||||
{
|
{
|
||||||
struct irq_desc *desc;
|
|
||||||
|
|
||||||
irq_enter();
|
irq_enter();
|
||||||
check_stack_overflow();
|
check_stack_overflow();
|
||||||
|
generic_handle_domain_irq(domain, hwirq);
|
||||||
desc = irq_resolve_mapping(domain, hwirq);
|
|
||||||
if (likely(desc))
|
|
||||||
handle_irq_desc(desc);
|
|
||||||
|
|
||||||
irq_exit();
|
irq_exit();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -906,10 +906,8 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused,
|
|||||||
if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
|
if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
|
||||||
do_signal(regs);
|
do_signal(regs);
|
||||||
|
|
||||||
if (thread_info_flags & _TIF_NOTIFY_RESUME) {
|
if (thread_info_flags & _TIF_NOTIFY_RESUME)
|
||||||
tracehook_notify_resume(regs);
|
tracehook_notify_resume(regs);
|
||||||
rseq_handle_notify_resume(NULL, regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
user_enter();
|
user_enter();
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
@ -373,7 +374,7 @@ static int bmips_cpu_disable(void)
|
|||||||
|
|
||||||
set_cpu_online(cpu, false);
|
set_cpu_online(cpu, false);
|
||||||
calculate_cpu_foreign_map();
|
calculate_cpu_foreign_map();
|
||||||
irq_cpu_offline();
|
irq_migrate_all_off_this_cpu();
|
||||||
clear_c0_status(IE_IRQ5);
|
clear_c0_status(IE_IRQ5);
|
||||||
|
|
||||||
local_flush_tlb_all();
|
local_flush_tlb_all();
|
||||||
|
@ -550,7 +550,6 @@ static int loongson3_cpu_disable(void)
|
|||||||
set_cpu_online(cpu, false);
|
set_cpu_online(cpu, false);
|
||||||
calculate_cpu_foreign_map();
|
calculate_cpu_foreign_map();
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
irq_cpu_offline();
|
|
||||||
clear_c0_status(ST0_IM);
|
clear_c0_status(ST0_IM);
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
local_flush_tlb_all();
|
local_flush_tlb_all();
|
||||||
|
@ -662,6 +662,11 @@ static void build_epilogue(struct jit_ctx *ctx)
|
|||||||
((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative : func) : \
|
((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative : func) : \
|
||||||
func##_positive)
|
func##_positive)
|
||||||
|
|
||||||
|
static bool is_bad_offset(int b_off)
|
||||||
|
{
|
||||||
|
return b_off > 0x1ffff || b_off < -0x20000;
|
||||||
|
}
|
||||||
|
|
||||||
static int build_body(struct jit_ctx *ctx)
|
static int build_body(struct jit_ctx *ctx)
|
||||||
{
|
{
|
||||||
const struct bpf_prog *prog = ctx->skf;
|
const struct bpf_prog *prog = ctx->skf;
|
||||||
@ -728,7 +733,10 @@ load_common:
|
|||||||
/* Load return register on DS for failures */
|
/* Load return register on DS for failures */
|
||||||
emit_reg_move(r_ret, r_zero, ctx);
|
emit_reg_move(r_ret, r_zero, ctx);
|
||||||
/* Return with error */
|
/* Return with error */
|
||||||
emit_b(b_imm(prog->len, ctx), ctx);
|
b_off = b_imm(prog->len, ctx);
|
||||||
|
if (is_bad_offset(b_off))
|
||||||
|
return -E2BIG;
|
||||||
|
emit_b(b_off, ctx);
|
||||||
emit_nop(ctx);
|
emit_nop(ctx);
|
||||||
break;
|
break;
|
||||||
case BPF_LD | BPF_W | BPF_IND:
|
case BPF_LD | BPF_W | BPF_IND:
|
||||||
@ -775,8 +783,10 @@ load_ind:
|
|||||||
emit_jalr(MIPS_R_RA, r_s0, ctx);
|
emit_jalr(MIPS_R_RA, r_s0, ctx);
|
||||||
emit_reg_move(MIPS_R_A0, r_skb, ctx); /* delay slot */
|
emit_reg_move(MIPS_R_A0, r_skb, ctx); /* delay slot */
|
||||||
/* Check the error value */
|
/* Check the error value */
|
||||||
emit_bcond(MIPS_COND_NE, r_ret, 0,
|
b_off = b_imm(prog->len, ctx);
|
||||||
b_imm(prog->len, ctx), ctx);
|
if (is_bad_offset(b_off))
|
||||||
|
return -E2BIG;
|
||||||
|
emit_bcond(MIPS_COND_NE, r_ret, 0, b_off, ctx);
|
||||||
emit_reg_move(r_ret, r_zero, ctx);
|
emit_reg_move(r_ret, r_zero, ctx);
|
||||||
/* We are good */
|
/* We are good */
|
||||||
/* X <- P[1:K] & 0xf */
|
/* X <- P[1:K] & 0xf */
|
||||||
@ -855,8 +865,10 @@ load_ind:
|
|||||||
/* A /= X */
|
/* A /= X */
|
||||||
ctx->flags |= SEEN_X | SEEN_A;
|
ctx->flags |= SEEN_X | SEEN_A;
|
||||||
/* Check if r_X is zero */
|
/* Check if r_X is zero */
|
||||||
emit_bcond(MIPS_COND_EQ, r_X, r_zero,
|
b_off = b_imm(prog->len, ctx);
|
||||||
b_imm(prog->len, ctx), ctx);
|
if (is_bad_offset(b_off))
|
||||||
|
return -E2BIG;
|
||||||
|
emit_bcond(MIPS_COND_EQ, r_X, r_zero, b_off, ctx);
|
||||||
emit_load_imm(r_ret, 0, ctx); /* delay slot */
|
emit_load_imm(r_ret, 0, ctx); /* delay slot */
|
||||||
emit_div(r_A, r_X, ctx);
|
emit_div(r_A, r_X, ctx);
|
||||||
break;
|
break;
|
||||||
@ -864,8 +876,10 @@ load_ind:
|
|||||||
/* A %= X */
|
/* A %= X */
|
||||||
ctx->flags |= SEEN_X | SEEN_A;
|
ctx->flags |= SEEN_X | SEEN_A;
|
||||||
/* Check if r_X is zero */
|
/* Check if r_X is zero */
|
||||||
emit_bcond(MIPS_COND_EQ, r_X, r_zero,
|
b_off = b_imm(prog->len, ctx);
|
||||||
b_imm(prog->len, ctx), ctx);
|
if (is_bad_offset(b_off))
|
||||||
|
return -E2BIG;
|
||||||
|
emit_bcond(MIPS_COND_EQ, r_X, r_zero, b_off, ctx);
|
||||||
emit_load_imm(r_ret, 0, ctx); /* delay slot */
|
emit_load_imm(r_ret, 0, ctx); /* delay slot */
|
||||||
emit_mod(r_A, r_X, ctx);
|
emit_mod(r_A, r_X, ctx);
|
||||||
break;
|
break;
|
||||||
@ -926,7 +940,10 @@ load_ind:
|
|||||||
break;
|
break;
|
||||||
case BPF_JMP | BPF_JA:
|
case BPF_JMP | BPF_JA:
|
||||||
/* pc += K */
|
/* pc += K */
|
||||||
emit_b(b_imm(i + k + 1, ctx), ctx);
|
b_off = b_imm(i + k + 1, ctx);
|
||||||
|
if (is_bad_offset(b_off))
|
||||||
|
return -E2BIG;
|
||||||
|
emit_b(b_off, ctx);
|
||||||
emit_nop(ctx);
|
emit_nop(ctx);
|
||||||
break;
|
break;
|
||||||
case BPF_JMP | BPF_JEQ | BPF_K:
|
case BPF_JMP | BPF_JEQ | BPF_K:
|
||||||
@ -1056,12 +1073,16 @@ jmp_cmp:
|
|||||||
break;
|
break;
|
||||||
case BPF_RET | BPF_A:
|
case BPF_RET | BPF_A:
|
||||||
ctx->flags |= SEEN_A;
|
ctx->flags |= SEEN_A;
|
||||||
if (i != prog->len - 1)
|
if (i != prog->len - 1) {
|
||||||
/*
|
/*
|
||||||
* If this is not the last instruction
|
* If this is not the last instruction
|
||||||
* then jump to the epilogue
|
* then jump to the epilogue
|
||||||
*/
|
*/
|
||||||
emit_b(b_imm(prog->len, ctx), ctx);
|
b_off = b_imm(prog->len, ctx);
|
||||||
|
if (is_bad_offset(b_off))
|
||||||
|
return -E2BIG;
|
||||||
|
emit_b(b_off, ctx);
|
||||||
|
}
|
||||||
emit_reg_move(r_ret, r_A, ctx); /* delay slot */
|
emit_reg_move(r_ret, r_A, ctx); /* delay slot */
|
||||||
break;
|
break;
|
||||||
case BPF_RET | BPF_K:
|
case BPF_RET | BPF_K:
|
||||||
@ -1075,7 +1096,10 @@ jmp_cmp:
|
|||||||
* If this is not the last instruction
|
* If this is not the last instruction
|
||||||
* then jump to the epilogue
|
* then jump to the epilogue
|
||||||
*/
|
*/
|
||||||
emit_b(b_imm(prog->len, ctx), ctx);
|
b_off = b_imm(prog->len, ctx);
|
||||||
|
if (is_bad_offset(b_off))
|
||||||
|
return -E2BIG;
|
||||||
|
emit_b(b_off, ctx);
|
||||||
emit_nop(ctx);
|
emit_nop(ctx);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1133,8 +1157,10 @@ jmp_cmp:
|
|||||||
/* Load *dev pointer */
|
/* Load *dev pointer */
|
||||||
emit_load_ptr(r_s0, r_skb, off, ctx);
|
emit_load_ptr(r_s0, r_skb, off, ctx);
|
||||||
/* error (0) in the delay slot */
|
/* error (0) in the delay slot */
|
||||||
emit_bcond(MIPS_COND_EQ, r_s0, r_zero,
|
b_off = b_imm(prog->len, ctx);
|
||||||
b_imm(prog->len, ctx), ctx);
|
if (is_bad_offset(b_off))
|
||||||
|
return -E2BIG;
|
||||||
|
emit_bcond(MIPS_COND_EQ, r_s0, r_zero, b_off, ctx);
|
||||||
emit_reg_move(r_ret, r_zero, ctx);
|
emit_reg_move(r_ret, r_zero, ctx);
|
||||||
if (code == (BPF_ANC | SKF_AD_IFINDEX)) {
|
if (code == (BPF_ANC | SKF_AD_IFINDEX)) {
|
||||||
BUILD_BUG_ON(sizeof_field(struct net_device, ifindex) != 4);
|
BUILD_BUG_ON(sizeof_field(struct net_device, ifindex) != 4);
|
||||||
@ -1244,7 +1270,10 @@ void bpf_jit_compile(struct bpf_prog *fp)
|
|||||||
|
|
||||||
/* Generate the actual JIT code */
|
/* Generate the actual JIT code */
|
||||||
build_prologue(&ctx);
|
build_prologue(&ctx);
|
||||||
build_body(&ctx);
|
if (build_body(&ctx)) {
|
||||||
|
module_memfree(ctx.target);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
build_epilogue(&ctx);
|
build_epilogue(&ctx);
|
||||||
|
|
||||||
/* Update the icache */
|
/* Update the icache */
|
||||||
|
@ -27,7 +27,6 @@ config NDS32
|
|||||||
select GENERIC_LIB_MULDI3
|
select GENERIC_LIB_MULDI3
|
||||||
select GENERIC_LIB_UCMPDI2
|
select GENERIC_LIB_UCMPDI2
|
||||||
select GENERIC_TIME_VSYSCALL
|
select GENERIC_TIME_VSYSCALL
|
||||||
select HANDLE_DOMAIN_IRQ
|
|
||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
select HAVE_DEBUG_KMEMLEAK
|
select HAVE_DEBUG_KMEMLEAK
|
||||||
select HAVE_EXIT_THREAD
|
select HAVE_EXIT_THREAD
|
||||||
|
@ -3,9 +3,10 @@
|
|||||||
config EARLY_PRINTK
|
config EARLY_PRINTK
|
||||||
bool "Activate early kernel debugging"
|
bool "Activate early kernel debugging"
|
||||||
default y
|
default y
|
||||||
|
depends on TTY
|
||||||
select SERIAL_CORE_CONSOLE
|
select SERIAL_CORE_CONSOLE
|
||||||
help
|
help
|
||||||
Enable early printk on console
|
Enable early printk on console.
|
||||||
This is useful for kernel debugging when your machine crashes very
|
This is useful for kernel debugging when your machine crashes very
|
||||||
early before the console code is initialized.
|
early before the console code is initialized.
|
||||||
You should normally say N here, unless you want to debug such a crash.
|
You should normally say N here, unless you want to debug such a crash.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user