You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Lots of easy overlapping changes in the confict resolutions here. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -478,6 +478,7 @@ What: /sys/devices/system/cpu/vulnerabilities
|
|||||||
/sys/devices/system/cpu/vulnerabilities/meltdown
|
/sys/devices/system/cpu/vulnerabilities/meltdown
|
||||||
/sys/devices/system/cpu/vulnerabilities/spectre_v1
|
/sys/devices/system/cpu/vulnerabilities/spectre_v1
|
||||||
/sys/devices/system/cpu/vulnerabilities/spectre_v2
|
/sys/devices/system/cpu/vulnerabilities/spectre_v2
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass
|
||||||
Date: January 2018
|
Date: January 2018
|
||||||
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
||||||
Description: Information about CPU vulnerabilities
|
Description: Information about CPU vulnerabilities
|
||||||
|
|||||||
@@ -2680,6 +2680,9 @@
|
|||||||
allow data leaks with this option, which is equivalent
|
allow data leaks with this option, which is equivalent
|
||||||
to spectre_v2=off.
|
to spectre_v2=off.
|
||||||
|
|
||||||
|
nospec_store_bypass_disable
|
||||||
|
[HW] Disable all mitigations for the Speculative Store Bypass vulnerability
|
||||||
|
|
||||||
noxsave [BUGS=X86] Disables x86 extended register state save
|
noxsave [BUGS=X86] Disables x86 extended register state save
|
||||||
and restore using xsave. The kernel will fallback to
|
and restore using xsave. The kernel will fallback to
|
||||||
enabling legacy floating-point and sse state.
|
enabling legacy floating-point and sse state.
|
||||||
@@ -4025,6 +4028,48 @@
|
|||||||
Not specifying this option is equivalent to
|
Not specifying this option is equivalent to
|
||||||
spectre_v2=auto.
|
spectre_v2=auto.
|
||||||
|
|
||||||
|
spec_store_bypass_disable=
|
||||||
|
[HW] Control Speculative Store Bypass (SSB) Disable mitigation
|
||||||
|
(Speculative Store Bypass vulnerability)
|
||||||
|
|
||||||
|
Certain CPUs are vulnerable to an exploit against a
|
||||||
|
a common industry wide performance optimization known
|
||||||
|
as "Speculative Store Bypass" in which recent stores
|
||||||
|
to the same memory location may not be observed by
|
||||||
|
later loads during speculative execution. The idea
|
||||||
|
is that such stores are unlikely and that they can
|
||||||
|
be detected prior to instruction retirement at the
|
||||||
|
end of a particular speculation execution window.
|
||||||
|
|
||||||
|
In vulnerable processors, the speculatively forwarded
|
||||||
|
store can be used in a cache side channel attack, for
|
||||||
|
example to read memory to which the attacker does not
|
||||||
|
directly have access (e.g. inside sandboxed code).
|
||||||
|
|
||||||
|
This parameter controls whether the Speculative Store
|
||||||
|
Bypass optimization is used.
|
||||||
|
|
||||||
|
on - Unconditionally disable Speculative Store Bypass
|
||||||
|
off - Unconditionally enable Speculative Store Bypass
|
||||||
|
auto - Kernel detects whether the CPU model contains an
|
||||||
|
implementation of Speculative Store Bypass and
|
||||||
|
picks the most appropriate mitigation. If the
|
||||||
|
CPU is not vulnerable, "off" is selected. If the
|
||||||
|
CPU is vulnerable the default mitigation is
|
||||||
|
architecture and Kconfig dependent. See below.
|
||||||
|
prctl - Control Speculative Store Bypass per thread
|
||||||
|
via prctl. Speculative Store Bypass is enabled
|
||||||
|
for a process by default. The state of the control
|
||||||
|
is inherited on fork.
|
||||||
|
seccomp - Same as "prctl" above, but all seccomp threads
|
||||||
|
will disable SSB unless they explicitly opt out.
|
||||||
|
|
||||||
|
Not specifying this option is equivalent to
|
||||||
|
spec_store_bypass_disable=auto.
|
||||||
|
|
||||||
|
Default mitigations:
|
||||||
|
X86: If CONFIG_SECCOMP=y "seccomp", otherwise "prctl"
|
||||||
|
|
||||||
spia_io_base= [HW,MTD]
|
spia_io_base= [HW,MTD]
|
||||||
spia_fio_base=
|
spia_fio_base=
|
||||||
spia_pedr=
|
spia_pedr=
|
||||||
|
|||||||
@@ -300,12 +300,6 @@ unattached instance are:
|
|||||||
The ioctl calls available on an instance of /dev/ppp attached to a
|
The ioctl calls available on an instance of /dev/ppp attached to a
|
||||||
channel are:
|
channel are:
|
||||||
|
|
||||||
* PPPIOCDETACH detaches the instance from the channel. This ioctl is
|
|
||||||
deprecated since the same effect can be achieved by closing the
|
|
||||||
instance. In order to prevent possible races this ioctl will fail
|
|
||||||
with an EINVAL error if more than one file descriptor refers to this
|
|
||||||
instance (i.e. as a result of dup(), dup2() or fork()).
|
|
||||||
|
|
||||||
* PPPIOCCONNECT connects this channel to a PPP interface. The
|
* PPPIOCCONNECT connects this channel to a PPP interface. The
|
||||||
argument should point to an int containing the interface unit
|
argument should point to an int containing the interface unit
|
||||||
number. It will return an EINVAL error if the channel is already
|
number. It will return an EINVAL error if the channel is already
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ place where this information is gathered.
|
|||||||
no_new_privs
|
no_new_privs
|
||||||
seccomp_filter
|
seccomp_filter
|
||||||
unshare
|
unshare
|
||||||
|
spec_ctrl
|
||||||
|
|
||||||
.. only:: subproject and html
|
.. only:: subproject and html
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
===================
|
||||||
|
Speculation Control
|
||||||
|
===================
|
||||||
|
|
||||||
|
Quite some CPUs have speculation-related misfeatures which are in
|
||||||
|
fact vulnerabilities causing data leaks in various forms even across
|
||||||
|
privilege domains.
|
||||||
|
|
||||||
|
The kernel provides mitigation for such vulnerabilities in various
|
||||||
|
forms. Some of these mitigations are compile-time configurable and some
|
||||||
|
can be supplied on the kernel command line.
|
||||||
|
|
||||||
|
There is also a class of mitigations which are very expensive, but they can
|
||||||
|
be restricted to a certain set of processes or tasks in controlled
|
||||||
|
environments. The mechanism to control these mitigations is via
|
||||||
|
:manpage:`prctl(2)`.
|
||||||
|
|
||||||
|
There are two prctl options which are related to this:
|
||||||
|
|
||||||
|
* PR_GET_SPECULATION_CTRL
|
||||||
|
|
||||||
|
* PR_SET_SPECULATION_CTRL
|
||||||
|
|
||||||
|
PR_GET_SPECULATION_CTRL
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
PR_GET_SPECULATION_CTRL returns the state of the speculation misfeature
|
||||||
|
which is selected with arg2 of prctl(2). The return value uses bits 0-3 with
|
||||||
|
the following meaning:
|
||||||
|
|
||||||
|
==== ===================== ===================================================
|
||||||
|
Bit Define Description
|
||||||
|
==== ===================== ===================================================
|
||||||
|
0 PR_SPEC_PRCTL Mitigation can be controlled per task by
|
||||||
|
PR_SET_SPECULATION_CTRL.
|
||||||
|
1 PR_SPEC_ENABLE The speculation feature is enabled, mitigation is
|
||||||
|
disabled.
|
||||||
|
2 PR_SPEC_DISABLE The speculation feature is disabled, mitigation is
|
||||||
|
enabled.
|
||||||
|
3 PR_SPEC_FORCE_DISABLE Same as PR_SPEC_DISABLE, but cannot be undone. A
|
||||||
|
subsequent prctl(..., PR_SPEC_ENABLE) will fail.
|
||||||
|
==== ===================== ===================================================
|
||||||
|
|
||||||
|
If all bits are 0 the CPU is not affected by the speculation misfeature.
|
||||||
|
|
||||||
|
If PR_SPEC_PRCTL is set, then the per-task control of the mitigation is
|
||||||
|
available. If not set, prctl(PR_SET_SPECULATION_CTRL) for the speculation
|
||||||
|
misfeature will fail.
|
||||||
|
|
||||||
|
PR_SET_SPECULATION_CTRL
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
PR_SET_SPECULATION_CTRL allows to control the speculation misfeature, which
|
||||||
|
is selected by arg2 of :manpage:`prctl(2)` per task. arg3 is used to hand
|
||||||
|
in the control value, i.e. either PR_SPEC_ENABLE or PR_SPEC_DISABLE or
|
||||||
|
PR_SPEC_FORCE_DISABLE.
|
||||||
|
|
||||||
|
Common error codes
|
||||||
|
------------------
|
||||||
|
======= =================================================================
|
||||||
|
Value Meaning
|
||||||
|
======= =================================================================
|
||||||
|
EINVAL The prctl is not implemented by the architecture or unused
|
||||||
|
prctl(2) arguments are not 0.
|
||||||
|
|
||||||
|
ENODEV arg2 is selecting a not supported speculation misfeature.
|
||||||
|
======= =================================================================
|
||||||
|
|
||||||
|
PR_SET_SPECULATION_CTRL error codes
|
||||||
|
-----------------------------------
|
||||||
|
======= =================================================================
|
||||||
|
Value Meaning
|
||||||
|
======= =================================================================
|
||||||
|
0 Success
|
||||||
|
|
||||||
|
ERANGE arg3 is incorrect, i.e. it's neither PR_SPEC_ENABLE nor
|
||||||
|
PR_SPEC_DISABLE nor PR_SPEC_FORCE_DISABLE.
|
||||||
|
|
||||||
|
ENXIO Control of the selected speculation misfeature is not possible.
|
||||||
|
See PR_GET_SPECULATION_CTRL.
|
||||||
|
|
||||||
|
EPERM Speculation was disabled with PR_SPEC_FORCE_DISABLE and caller
|
||||||
|
tried to enable it again.
|
||||||
|
======= =================================================================
|
||||||
|
|
||||||
|
Speculation misfeature controls
|
||||||
|
-------------------------------
|
||||||
|
- PR_SPEC_STORE_BYPASS: Speculative Store Bypass
|
||||||
|
|
||||||
|
Invocations:
|
||||||
|
* prctl(PR_GET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, 0, 0, 0);
|
||||||
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_ENABLE, 0, 0);
|
||||||
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE, 0, 0);
|
||||||
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_FORCE_DISABLE, 0, 0);
|
||||||
+21
-9
@@ -2332,7 +2332,7 @@ F: drivers/gpio/gpio-ath79.c
|
|||||||
F: Documentation/devicetree/bindings/gpio/gpio-ath79.txt
|
F: Documentation/devicetree/bindings/gpio/gpio-ath79.txt
|
||||||
|
|
||||||
ATHEROS ATH GENERIC UTILITIES
|
ATHEROS ATH GENERIC UTILITIES
|
||||||
M: "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
|
M: Kalle Valo <kvalo@codeaurora.org>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/wireless/ath/*
|
F: drivers/net/wireless/ath/*
|
||||||
@@ -2347,7 +2347,7 @@ S: Maintained
|
|||||||
F: drivers/net/wireless/ath/ath5k/
|
F: drivers/net/wireless/ath/ath5k/
|
||||||
|
|
||||||
ATHEROS ATH6KL WIRELESS DRIVER
|
ATHEROS ATH6KL WIRELESS DRIVER
|
||||||
M: Kalle Valo <kvalo@qca.qualcomm.com>
|
M: Kalle Valo <kvalo@codeaurora.org>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/ath6kl
|
W: http://wireless.kernel.org/en/users/Drivers/ath6kl
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
||||||
@@ -5386,7 +5386,6 @@ S: Maintained
|
|||||||
F: drivers/iommu/exynos-iommu.c
|
F: drivers/iommu/exynos-iommu.c
|
||||||
|
|
||||||
EZchip NPS platform support
|
EZchip NPS platform support
|
||||||
M: Elad Kanfi <eladkan@mellanox.com>
|
|
||||||
M: Vineet Gupta <vgupta@synopsys.com>
|
M: Vineet Gupta <vgupta@synopsys.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/arc/plat-eznps
|
F: arch/arc/plat-eznps
|
||||||
@@ -6502,9 +6501,15 @@ F: Documentation/networking/hinic.txt
|
|||||||
F: drivers/net/ethernet/huawei/hinic/
|
F: drivers/net/ethernet/huawei/hinic/
|
||||||
|
|
||||||
HUGETLB FILESYSTEM
|
HUGETLB FILESYSTEM
|
||||||
M: Nadia Yvette Chambers <nyc@holomorphy.com>
|
M: Mike Kravetz <mike.kravetz@oracle.com>
|
||||||
|
L: linux-mm@kvack.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: fs/hugetlbfs/
|
F: fs/hugetlbfs/
|
||||||
|
F: mm/hugetlb.c
|
||||||
|
F: include/linux/hugetlb.h
|
||||||
|
F: Documentation/admin-guide/mm/hugetlbpage.rst
|
||||||
|
F: Documentation/vm/hugetlbfs_reserv.rst
|
||||||
|
F: Documentation/ABI/testing/sysfs-kernel-mm-hugepages
|
||||||
|
|
||||||
HVA ST MEDIA DRIVER
|
HVA ST MEDIA DRIVER
|
||||||
M: Jean-Christophe Trotin <jean-christophe.trotin@st.com>
|
M: Jean-Christophe Trotin <jean-christophe.trotin@st.com>
|
||||||
@@ -9020,7 +9025,7 @@ Q: http://patchwork.ozlabs.org/project/netdev/list/
|
|||||||
F: drivers/net/ethernet/mellanox/mlx5/core/en_*
|
F: drivers/net/ethernet/mellanox/mlx5/core/en_*
|
||||||
|
|
||||||
MELLANOX ETHERNET INNOVA DRIVERS
|
MELLANOX ETHERNET INNOVA DRIVERS
|
||||||
M: Boris Pismenny <borisp@mellanox.com>
|
R: Boris Pismenny <borisp@mellanox.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.mellanox.com
|
W: http://www.mellanox.com
|
||||||
@@ -9030,6 +9035,15 @@ F: drivers/net/ethernet/mellanox/mlx5/core/accel/*
|
|||||||
F: drivers/net/ethernet/mellanox/mlx5/core/fpga/*
|
F: drivers/net/ethernet/mellanox/mlx5/core/fpga/*
|
||||||
F: include/linux/mlx5/mlx5_ifc_fpga.h
|
F: include/linux/mlx5/mlx5_ifc_fpga.h
|
||||||
|
|
||||||
|
MELLANOX ETHERNET INNOVA IPSEC DRIVER
|
||||||
|
R: Boris Pismenny <borisp@mellanox.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
W: http://www.mellanox.com
|
||||||
|
Q: http://patchwork.ozlabs.org/project/netdev/list/
|
||||||
|
F: drivers/net/ethernet/mellanox/mlx5/core/en_ipsec/*
|
||||||
|
F: drivers/net/ethernet/mellanox/mlx5/core/ipsec*
|
||||||
|
|
||||||
MELLANOX ETHERNET SWITCH DRIVERS
|
MELLANOX ETHERNET SWITCH DRIVERS
|
||||||
M: Jiri Pirko <jiri@mellanox.com>
|
M: Jiri Pirko <jiri@mellanox.com>
|
||||||
M: Ido Schimmel <idosch@mellanox.com>
|
M: Ido Schimmel <idosch@mellanox.com>
|
||||||
@@ -9077,7 +9091,6 @@ F: include/uapi/rdma/mlx4-abi.h
|
|||||||
|
|
||||||
MELLANOX MLX5 core VPI driver
|
MELLANOX MLX5 core VPI driver
|
||||||
M: Saeed Mahameed <saeedm@mellanox.com>
|
M: Saeed Mahameed <saeedm@mellanox.com>
|
||||||
M: Matan Barak <matanb@mellanox.com>
|
|
||||||
M: Leon Romanovsky <leonro@mellanox.com>
|
M: Leon Romanovsky <leonro@mellanox.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: linux-rdma@vger.kernel.org
|
L: linux-rdma@vger.kernel.org
|
||||||
@@ -9088,7 +9101,6 @@ F: drivers/net/ethernet/mellanox/mlx5/core/
|
|||||||
F: include/linux/mlx5/
|
F: include/linux/mlx5/
|
||||||
|
|
||||||
MELLANOX MLX5 IB driver
|
MELLANOX MLX5 IB driver
|
||||||
M: Matan Barak <matanb@mellanox.com>
|
|
||||||
M: Leon Romanovsky <leonro@mellanox.com>
|
M: Leon Romanovsky <leonro@mellanox.com>
|
||||||
L: linux-rdma@vger.kernel.org
|
L: linux-rdma@vger.kernel.org
|
||||||
W: http://www.mellanox.com
|
W: http://www.mellanox.com
|
||||||
@@ -11628,7 +11640,7 @@ S: Maintained
|
|||||||
F: drivers/media/tuners/qt1010*
|
F: drivers/media/tuners/qt1010*
|
||||||
|
|
||||||
QUALCOMM ATHEROS ATH10K WIRELESS DRIVER
|
QUALCOMM ATHEROS ATH10K WIRELESS DRIVER
|
||||||
M: Kalle Valo <kvalo@qca.qualcomm.com>
|
M: Kalle Valo <kvalo@codeaurora.org>
|
||||||
L: ath10k@lists.infradead.org
|
L: ath10k@lists.infradead.org
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/ath10k
|
W: http://wireless.kernel.org/en/users/Drivers/ath10k
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
||||||
@@ -11679,7 +11691,7 @@ S: Maintained
|
|||||||
F: drivers/media/platform/qcom/venus/
|
F: drivers/media/platform/qcom/venus/
|
||||||
|
|
||||||
QUALCOMM WCN36XX WIRELESS DRIVER
|
QUALCOMM WCN36XX WIRELESS DRIVER
|
||||||
M: Eugene Krasnikov <k.eugene.e@gmail.com>
|
M: Kalle Valo <kvalo@codeaurora.org>
|
||||||
L: wcn36xx@lists.infradead.org
|
L: wcn36xx@lists.infradead.org
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/wcn36xx
|
W: http://wireless.kernel.org/en/users/Drivers/wcn36xx
|
||||||
T: git git://github.com/KrasnikovEugene/wcn36xx.git
|
T: git git://github.com/KrasnikovEugene/wcn36xx.git
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ config ALPHA_EIGER
|
|||||||
config ALPHA_JENSEN
|
config ALPHA_JENSEN
|
||||||
bool "Jensen"
|
bool "Jensen"
|
||||||
depends on BROKEN
|
depends on BROKEN
|
||||||
|
select DMA_DIRECT_OPS
|
||||||
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
|
||||||
of the first-generation Alpha systems. A number of these systems
|
of the first-generation Alpha systems. A number of these systems
|
||||||
|
|||||||
@@ -2,11 +2,15 @@
|
|||||||
#ifndef _ALPHA_DMA_MAPPING_H
|
#ifndef _ALPHA_DMA_MAPPING_H
|
||||||
#define _ALPHA_DMA_MAPPING_H
|
#define _ALPHA_DMA_MAPPING_H
|
||||||
|
|
||||||
extern const struct dma_map_ops *dma_ops;
|
extern const struct dma_map_ops alpha_pci_ops;
|
||||||
|
|
||||||
static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
|
static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
|
||||||
{
|
{
|
||||||
return dma_ops;
|
#ifdef CONFIG_ALPHA_JENSEN
|
||||||
|
return &dma_direct_ops;
|
||||||
|
#else
|
||||||
|
return &alpha_pci_ops;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _ALPHA_DMA_MAPPING_H */
|
#endif /* _ALPHA_DMA_MAPPING_H */
|
||||||
|
|||||||
@@ -37,20 +37,20 @@ unsigned int ioread32(void __iomem *addr)
|
|||||||
|
|
||||||
void iowrite8(u8 b, void __iomem *addr)
|
void iowrite8(u8 b, void __iomem *addr)
|
||||||
{
|
{
|
||||||
IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
|
|
||||||
mb();
|
mb();
|
||||||
|
IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void iowrite16(u16 b, void __iomem *addr)
|
void iowrite16(u16 b, void __iomem *addr)
|
||||||
{
|
{
|
||||||
IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
|
|
||||||
mb();
|
mb();
|
||||||
|
IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void iowrite32(u32 b, void __iomem *addr)
|
void iowrite32(u32 b, void __iomem *addr)
|
||||||
{
|
{
|
||||||
IO_CONCAT(__IO_PREFIX,iowrite32)(b, addr);
|
|
||||||
mb();
|
mb();
|
||||||
|
IO_CONCAT(__IO_PREFIX,iowrite32)(b, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(ioread8);
|
EXPORT_SYMBOL(ioread8);
|
||||||
@@ -176,26 +176,26 @@ u64 readq(const volatile void __iomem *addr)
|
|||||||
|
|
||||||
void writeb(u8 b, volatile void __iomem *addr)
|
void writeb(u8 b, volatile void __iomem *addr)
|
||||||
{
|
{
|
||||||
__raw_writeb(b, addr);
|
|
||||||
mb();
|
mb();
|
||||||
|
__raw_writeb(b, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void writew(u16 b, volatile void __iomem *addr)
|
void writew(u16 b, volatile void __iomem *addr)
|
||||||
{
|
{
|
||||||
__raw_writew(b, addr);
|
|
||||||
mb();
|
mb();
|
||||||
|
__raw_writew(b, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void writel(u32 b, volatile void __iomem *addr)
|
void writel(u32 b, volatile void __iomem *addr)
|
||||||
{
|
{
|
||||||
__raw_writel(b, addr);
|
|
||||||
mb();
|
mb();
|
||||||
|
__raw_writel(b, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeq(u64 b, volatile void __iomem *addr)
|
void writeq(u64 b, volatile void __iomem *addr)
|
||||||
{
|
{
|
||||||
__raw_writeq(b, addr);
|
|
||||||
mb();
|
mb();
|
||||||
|
__raw_writeq(b, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(readb);
|
EXPORT_SYMBOL(readb);
|
||||||
|
|||||||
@@ -102,36 +102,3 @@ SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, unsigned long, dfn,
|
|||||||
else
|
else
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *alpha_noop_alloc_coherent(struct device *dev, size_t size,
|
|
||||||
dma_addr_t *dma_handle, gfp_t gfp,
|
|
||||||
unsigned long attrs)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
if (!dev || *dev->dma_mask >= 0xffffffffUL)
|
|
||||||
gfp &= ~GFP_DMA;
|
|
||||||
ret = (void *)__get_free_pages(gfp, get_order(size));
|
|
||||||
if (ret) {
|
|
||||||
memset(ret, 0, size);
|
|
||||||
*dma_handle = virt_to_phys(ret);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int alpha_noop_supported(struct device *dev, u64 mask)
|
|
||||||
{
|
|
||||||
return mask < 0x00ffffffUL ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct dma_map_ops alpha_noop_ops = {
|
|
||||||
.alloc = alpha_noop_alloc_coherent,
|
|
||||||
.free = dma_noop_free_coherent,
|
|
||||||
.map_page = dma_noop_map_page,
|
|
||||||
.map_sg = dma_noop_map_sg,
|
|
||||||
.mapping_error = dma_noop_mapping_error,
|
|
||||||
.dma_supported = alpha_noop_supported,
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct dma_map_ops *dma_ops = &alpha_noop_ops;
|
|
||||||
EXPORT_SYMBOL(dma_ops);
|
|
||||||
|
|||||||
@@ -950,6 +950,4 @@ const struct dma_map_ops alpha_pci_ops = {
|
|||||||
.mapping_error = alpha_pci_mapping_error,
|
.mapping_error = alpha_pci_mapping_error,
|
||||||
.dma_supported = alpha_pci_supported,
|
.dma_supported = alpha_pci_supported,
|
||||||
};
|
};
|
||||||
|
EXPORT_SYMBOL(alpha_pci_ops);
|
||||||
const struct dma_map_ops *dma_ops = &alpha_pci_ops;
|
|
||||||
EXPORT_SYMBOL(dma_ops);
|
|
||||||
|
|||||||
@@ -466,12 +466,6 @@ void __init dma_contiguous_early_fixup(phys_addr_t base, unsigned long size)
|
|||||||
void __init dma_contiguous_remap(void)
|
void __init dma_contiguous_remap(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!dma_mmu_remap_num)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* call flush_cache_all() since CMA area would be large enough */
|
|
||||||
flush_cache_all();
|
|
||||||
for (i = 0; i < dma_mmu_remap_num; i++) {
|
for (i = 0; i < dma_mmu_remap_num; i++) {
|
||||||
phys_addr_t start = dma_mmu_remap[i].base;
|
phys_addr_t start = dma_mmu_remap[i].base;
|
||||||
phys_addr_t end = start + dma_mmu_remap[i].size;
|
phys_addr_t end = start + dma_mmu_remap[i].size;
|
||||||
@@ -504,15 +498,7 @@ void __init dma_contiguous_remap(void)
|
|||||||
flush_tlb_kernel_range(__phys_to_virt(start),
|
flush_tlb_kernel_range(__phys_to_virt(start),
|
||||||
__phys_to_virt(end));
|
__phys_to_virt(end));
|
||||||
|
|
||||||
/*
|
iotable_init(&map, 1);
|
||||||
* All the memory in CMA region will be on ZONE_MOVABLE.
|
|
||||||
* If that zone is considered as highmem, the memory in CMA
|
|
||||||
* region is also considered as highmem even if it's
|
|
||||||
* physical address belong to lowmem. In this case,
|
|
||||||
* re-mapping isn't required.
|
|
||||||
*/
|
|
||||||
if (!is_highmem_idx(ZONE_MOVABLE))
|
|
||||||
iotable_init(&map, 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ static inline void atomic_and(int i, atomic_t *v)
|
|||||||
/* LSE atomics */
|
/* LSE atomics */
|
||||||
" mvn %w[i], %w[i]\n"
|
" mvn %w[i], %w[i]\n"
|
||||||
" stclr %w[i], %[v]")
|
" stclr %w[i], %[v]")
|
||||||
: [i] "+r" (w0), [v] "+Q" (v->counter)
|
: [i] "+&r" (w0), [v] "+Q" (v->counter)
|
||||||
: "r" (x1)
|
: "r" (x1)
|
||||||
: __LL_SC_CLOBBERS);
|
: __LL_SC_CLOBBERS);
|
||||||
}
|
}
|
||||||
@@ -135,7 +135,7 @@ static inline int atomic_fetch_and##name(int i, atomic_t *v) \
|
|||||||
/* LSE atomics */ \
|
/* LSE atomics */ \
|
||||||
" mvn %w[i], %w[i]\n" \
|
" mvn %w[i], %w[i]\n" \
|
||||||
" ldclr" #mb " %w[i], %w[i], %[v]") \
|
" ldclr" #mb " %w[i], %w[i], %[v]") \
|
||||||
: [i] "+r" (w0), [v] "+Q" (v->counter) \
|
: [i] "+&r" (w0), [v] "+Q" (v->counter) \
|
||||||
: "r" (x1) \
|
: "r" (x1) \
|
||||||
: __LL_SC_CLOBBERS, ##cl); \
|
: __LL_SC_CLOBBERS, ##cl); \
|
||||||
\
|
\
|
||||||
@@ -161,7 +161,7 @@ static inline void atomic_sub(int i, atomic_t *v)
|
|||||||
/* LSE atomics */
|
/* LSE atomics */
|
||||||
" neg %w[i], %w[i]\n"
|
" neg %w[i], %w[i]\n"
|
||||||
" stadd %w[i], %[v]")
|
" stadd %w[i], %[v]")
|
||||||
: [i] "+r" (w0), [v] "+Q" (v->counter)
|
: [i] "+&r" (w0), [v] "+Q" (v->counter)
|
||||||
: "r" (x1)
|
: "r" (x1)
|
||||||
: __LL_SC_CLOBBERS);
|
: __LL_SC_CLOBBERS);
|
||||||
}
|
}
|
||||||
@@ -180,7 +180,7 @@ static inline int atomic_sub_return##name(int i, atomic_t *v) \
|
|||||||
" neg %w[i], %w[i]\n" \
|
" neg %w[i], %w[i]\n" \
|
||||||
" ldadd" #mb " %w[i], w30, %[v]\n" \
|
" ldadd" #mb " %w[i], w30, %[v]\n" \
|
||||||
" add %w[i], %w[i], w30") \
|
" add %w[i], %w[i], w30") \
|
||||||
: [i] "+r" (w0), [v] "+Q" (v->counter) \
|
: [i] "+&r" (w0), [v] "+Q" (v->counter) \
|
||||||
: "r" (x1) \
|
: "r" (x1) \
|
||||||
: __LL_SC_CLOBBERS , ##cl); \
|
: __LL_SC_CLOBBERS , ##cl); \
|
||||||
\
|
\
|
||||||
@@ -207,7 +207,7 @@ static inline int atomic_fetch_sub##name(int i, atomic_t *v) \
|
|||||||
/* LSE atomics */ \
|
/* LSE atomics */ \
|
||||||
" neg %w[i], %w[i]\n" \
|
" neg %w[i], %w[i]\n" \
|
||||||
" ldadd" #mb " %w[i], %w[i], %[v]") \
|
" ldadd" #mb " %w[i], %w[i], %[v]") \
|
||||||
: [i] "+r" (w0), [v] "+Q" (v->counter) \
|
: [i] "+&r" (w0), [v] "+Q" (v->counter) \
|
||||||
: "r" (x1) \
|
: "r" (x1) \
|
||||||
: __LL_SC_CLOBBERS, ##cl); \
|
: __LL_SC_CLOBBERS, ##cl); \
|
||||||
\
|
\
|
||||||
@@ -314,7 +314,7 @@ static inline void atomic64_and(long i, atomic64_t *v)
|
|||||||
/* LSE atomics */
|
/* LSE atomics */
|
||||||
" mvn %[i], %[i]\n"
|
" mvn %[i], %[i]\n"
|
||||||
" stclr %[i], %[v]")
|
" stclr %[i], %[v]")
|
||||||
: [i] "+r" (x0), [v] "+Q" (v->counter)
|
: [i] "+&r" (x0), [v] "+Q" (v->counter)
|
||||||
: "r" (x1)
|
: "r" (x1)
|
||||||
: __LL_SC_CLOBBERS);
|
: __LL_SC_CLOBBERS);
|
||||||
}
|
}
|
||||||
@@ -332,7 +332,7 @@ static inline long atomic64_fetch_and##name(long i, atomic64_t *v) \
|
|||||||
/* LSE atomics */ \
|
/* LSE atomics */ \
|
||||||
" mvn %[i], %[i]\n" \
|
" mvn %[i], %[i]\n" \
|
||||||
" ldclr" #mb " %[i], %[i], %[v]") \
|
" ldclr" #mb " %[i], %[i], %[v]") \
|
||||||
: [i] "+r" (x0), [v] "+Q" (v->counter) \
|
: [i] "+&r" (x0), [v] "+Q" (v->counter) \
|
||||||
: "r" (x1) \
|
: "r" (x1) \
|
||||||
: __LL_SC_CLOBBERS, ##cl); \
|
: __LL_SC_CLOBBERS, ##cl); \
|
||||||
\
|
\
|
||||||
@@ -358,7 +358,7 @@ static inline void atomic64_sub(long i, atomic64_t *v)
|
|||||||
/* LSE atomics */
|
/* LSE atomics */
|
||||||
" neg %[i], %[i]\n"
|
" neg %[i], %[i]\n"
|
||||||
" stadd %[i], %[v]")
|
" stadd %[i], %[v]")
|
||||||
: [i] "+r" (x0), [v] "+Q" (v->counter)
|
: [i] "+&r" (x0), [v] "+Q" (v->counter)
|
||||||
: "r" (x1)
|
: "r" (x1)
|
||||||
: __LL_SC_CLOBBERS);
|
: __LL_SC_CLOBBERS);
|
||||||
}
|
}
|
||||||
@@ -377,7 +377,7 @@ static inline long atomic64_sub_return##name(long i, atomic64_t *v) \
|
|||||||
" neg %[i], %[i]\n" \
|
" neg %[i], %[i]\n" \
|
||||||
" ldadd" #mb " %[i], x30, %[v]\n" \
|
" ldadd" #mb " %[i], x30, %[v]\n" \
|
||||||
" add %[i], %[i], x30") \
|
" add %[i], %[i], x30") \
|
||||||
: [i] "+r" (x0), [v] "+Q" (v->counter) \
|
: [i] "+&r" (x0), [v] "+Q" (v->counter) \
|
||||||
: "r" (x1) \
|
: "r" (x1) \
|
||||||
: __LL_SC_CLOBBERS, ##cl); \
|
: __LL_SC_CLOBBERS, ##cl); \
|
||||||
\
|
\
|
||||||
@@ -404,7 +404,7 @@ static inline long atomic64_fetch_sub##name(long i, atomic64_t *v) \
|
|||||||
/* LSE atomics */ \
|
/* LSE atomics */ \
|
||||||
" neg %[i], %[i]\n" \
|
" neg %[i], %[i]\n" \
|
||||||
" ldadd" #mb " %[i], %[i], %[v]") \
|
" ldadd" #mb " %[i], %[i], %[v]") \
|
||||||
: [i] "+r" (x0), [v] "+Q" (v->counter) \
|
: [i] "+&r" (x0), [v] "+Q" (v->counter) \
|
||||||
: "r" (x1) \
|
: "r" (x1) \
|
||||||
: __LL_SC_CLOBBERS, ##cl); \
|
: __LL_SC_CLOBBERS, ##cl); \
|
||||||
\
|
\
|
||||||
@@ -435,7 +435,7 @@ static inline long atomic64_dec_if_positive(atomic64_t *v)
|
|||||||
" sub x30, x30, %[ret]\n"
|
" sub x30, x30, %[ret]\n"
|
||||||
" cbnz x30, 1b\n"
|
" cbnz x30, 1b\n"
|
||||||
"2:")
|
"2:")
|
||||||
: [ret] "+r" (x0), [v] "+Q" (v->counter)
|
: [ret] "+&r" (x0), [v] "+Q" (v->counter)
|
||||||
:
|
:
|
||||||
: __LL_SC_CLOBBERS, "cc", "memory");
|
: __LL_SC_CLOBBERS, "cc", "memory");
|
||||||
|
|
||||||
@@ -516,7 +516,7 @@ static inline long __cmpxchg_double##name(unsigned long old1, \
|
|||||||
" eor %[old1], %[old1], %[oldval1]\n" \
|
" eor %[old1], %[old1], %[oldval1]\n" \
|
||||||
" eor %[old2], %[old2], %[oldval2]\n" \
|
" eor %[old2], %[old2], %[oldval2]\n" \
|
||||||
" orr %[old1], %[old1], %[old2]") \
|
" orr %[old1], %[old1], %[old2]") \
|
||||||
: [old1] "+r" (x0), [old2] "+r" (x1), \
|
: [old1] "+&r" (x0), [old2] "+&r" (x1), \
|
||||||
[v] "+Q" (*(unsigned long *)ptr) \
|
[v] "+Q" (*(unsigned long *)ptr) \
|
||||||
: [new1] "r" (x2), [new2] "r" (x3), [ptr] "r" (x4), \
|
: [new1] "r" (x2), [new2] "r" (x3), [ptr] "r" (x4), \
|
||||||
[oldval1] "r" (oldval1), [oldval2] "r" (oldval2) \
|
[oldval1] "r" (oldval1), [oldval2] "r" (oldval2) \
|
||||||
|
|||||||
@@ -75,3 +75,11 @@ NOKPROBE_SYMBOL(_mcount);
|
|||||||
/* arm-smccc */
|
/* arm-smccc */
|
||||||
EXPORT_SYMBOL(__arm_smccc_smc);
|
EXPORT_SYMBOL(__arm_smccc_smc);
|
||||||
EXPORT_SYMBOL(__arm_smccc_hvc);
|
EXPORT_SYMBOL(__arm_smccc_hvc);
|
||||||
|
|
||||||
|
/* tishift.S */
|
||||||
|
extern long long __ashlti3(long long a, int b);
|
||||||
|
EXPORT_SYMBOL(__ashlti3);
|
||||||
|
extern long long __ashrti3(long long a, int b);
|
||||||
|
EXPORT_SYMBOL(__ashrti3);
|
||||||
|
extern long long __lshrti3(long long a, int b);
|
||||||
|
EXPORT_SYMBOL(__lshrti3);
|
||||||
|
|||||||
@@ -1,17 +1,6 @@
|
|||||||
/*
|
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
|
||||||
* Copyright (C) 2017 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
|
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* Copyright (C) 2017-2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|||||||
@@ -293,6 +293,57 @@ static void __do_kernel_fault(unsigned long addr, unsigned int esr,
|
|||||||
static void __do_user_fault(struct siginfo *info, unsigned int esr)
|
static void __do_user_fault(struct siginfo *info, unsigned int esr)
|
||||||
{
|
{
|
||||||
current->thread.fault_address = (unsigned long)info->si_addr;
|
current->thread.fault_address = (unsigned long)info->si_addr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the faulting address is in the kernel, we must sanitize the ESR.
|
||||||
|
* From userspace's point of view, kernel-only mappings don't exist
|
||||||
|
* at all, so we report them as level 0 translation faults.
|
||||||
|
* (This is not quite the way that "no mapping there at all" behaves:
|
||||||
|
* an alignment fault not caused by the memory type would take
|
||||||
|
* precedence over translation fault for a real access to empty
|
||||||
|
* space. Unfortunately we can't easily distinguish "alignment fault
|
||||||
|
* not caused by memory type" from "alignment fault caused by memory
|
||||||
|
* type", so we ignore this wrinkle and just return the translation
|
||||||
|
* fault.)
|
||||||
|
*/
|
||||||
|
if (current->thread.fault_address >= TASK_SIZE) {
|
||||||
|
switch (ESR_ELx_EC(esr)) {
|
||||||
|
case ESR_ELx_EC_DABT_LOW:
|
||||||
|
/*
|
||||||
|
* These bits provide only information about the
|
||||||
|
* faulting instruction, which userspace knows already.
|
||||||
|
* We explicitly clear bits which are architecturally
|
||||||
|
* RES0 in case they are given meanings in future.
|
||||||
|
* We always report the ESR as if the fault was taken
|
||||||
|
* to EL1 and so ISV and the bits in ISS[23:14] are
|
||||||
|
* clear. (In fact it always will be a fault to EL1.)
|
||||||
|
*/
|
||||||
|
esr &= ESR_ELx_EC_MASK | ESR_ELx_IL |
|
||||||
|
ESR_ELx_CM | ESR_ELx_WNR;
|
||||||
|
esr |= ESR_ELx_FSC_FAULT;
|
||||||
|
break;
|
||||||
|
case ESR_ELx_EC_IABT_LOW:
|
||||||
|
/*
|
||||||
|
* Claim a level 0 translation fault.
|
||||||
|
* All other bits are architecturally RES0 for faults
|
||||||
|
* reported with that DFSC value, so we clear them.
|
||||||
|
*/
|
||||||
|
esr &= ESR_ELx_EC_MASK | ESR_ELx_IL;
|
||||||
|
esr |= ESR_ELx_FSC_FAULT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/*
|
||||||
|
* This should never happen (entry.S only brings us
|
||||||
|
* into this code for insn and data aborts from a lower
|
||||||
|
* exception level). Fail safe by not providing an ESR
|
||||||
|
* context record at all.
|
||||||
|
*/
|
||||||
|
WARN(1, "ESR 0x%x is not DABT or IABT from EL0\n", esr);
|
||||||
|
esr = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
current->thread.fault_code = esr;
|
current->thread.fault_code = esr;
|
||||||
arm64_force_sig_info(info, esr_to_fault_info(esr)->name, current);
|
arm64_force_sig_info(info, esr_to_fault_info(esr)->name, current);
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-6
@@ -933,13 +933,15 @@ int pud_set_huge(pud_t *pudp, phys_addr_t phys, pgprot_t prot)
|
|||||||
{
|
{
|
||||||
pgprot_t sect_prot = __pgprot(PUD_TYPE_SECT |
|
pgprot_t sect_prot = __pgprot(PUD_TYPE_SECT |
|
||||||
pgprot_val(mk_sect_prot(prot)));
|
pgprot_val(mk_sect_prot(prot)));
|
||||||
|
pud_t new_pud = pfn_pud(__phys_to_pfn(phys), sect_prot);
|
||||||
|
|
||||||
/* ioremap_page_range doesn't honour BBM */
|
/* Only allow permission changes for now */
|
||||||
if (pud_present(READ_ONCE(*pudp)))
|
if (!pgattr_change_is_safe(READ_ONCE(pud_val(*pudp)),
|
||||||
|
pud_val(new_pud)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
BUG_ON(phys & ~PUD_MASK);
|
BUG_ON(phys & ~PUD_MASK);
|
||||||
set_pud(pudp, pfn_pud(__phys_to_pfn(phys), sect_prot));
|
set_pud(pudp, new_pud);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -947,13 +949,15 @@ int pmd_set_huge(pmd_t *pmdp, phys_addr_t phys, pgprot_t prot)
|
|||||||
{
|
{
|
||||||
pgprot_t sect_prot = __pgprot(PMD_TYPE_SECT |
|
pgprot_t sect_prot = __pgprot(PMD_TYPE_SECT |
|
||||||
pgprot_val(mk_sect_prot(prot)));
|
pgprot_val(mk_sect_prot(prot)));
|
||||||
|
pmd_t new_pmd = pfn_pmd(__phys_to_pfn(phys), sect_prot);
|
||||||
|
|
||||||
/* ioremap_page_range doesn't honour BBM */
|
/* Only allow permission changes for now */
|
||||||
if (pmd_present(READ_ONCE(*pmdp)))
|
if (!pgattr_change_is_safe(READ_ONCE(pmd_val(*pmdp)),
|
||||||
|
pmd_val(new_pmd)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
BUG_ON(phys & ~PMD_MASK);
|
BUG_ON(phys & ~PMD_MASK);
|
||||||
set_pmd(pmdp, pfn_pmd(__phys_to_pfn(phys), sect_prot));
|
set_pmd(pmdp, new_pmd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,27 @@
|
|||||||
*/
|
*/
|
||||||
#define EX_R3 EX_DAR
|
#define EX_R3 EX_DAR
|
||||||
|
|
||||||
|
#define STF_ENTRY_BARRIER_SLOT \
|
||||||
|
STF_ENTRY_BARRIER_FIXUP_SECTION; \
|
||||||
|
nop; \
|
||||||
|
nop; \
|
||||||
|
nop
|
||||||
|
|
||||||
|
#define STF_EXIT_BARRIER_SLOT \
|
||||||
|
STF_EXIT_BARRIER_FIXUP_SECTION; \
|
||||||
|
nop; \
|
||||||
|
nop; \
|
||||||
|
nop; \
|
||||||
|
nop; \
|
||||||
|
nop; \
|
||||||
|
nop
|
||||||
|
|
||||||
|
/*
|
||||||
|
* r10 must be free to use, r13 must be paca
|
||||||
|
*/
|
||||||
|
#define INTERRUPT_TO_KERNEL \
|
||||||
|
STF_ENTRY_BARRIER_SLOT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Macros for annotating the expected destination of (h)rfid
|
* Macros for annotating the expected destination of (h)rfid
|
||||||
*
|
*
|
||||||
@@ -90,16 +111,19 @@
|
|||||||
rfid
|
rfid
|
||||||
|
|
||||||
#define RFI_TO_USER \
|
#define RFI_TO_USER \
|
||||||
|
STF_EXIT_BARRIER_SLOT; \
|
||||||
RFI_FLUSH_SLOT; \
|
RFI_FLUSH_SLOT; \
|
||||||
rfid; \
|
rfid; \
|
||||||
b rfi_flush_fallback
|
b rfi_flush_fallback
|
||||||
|
|
||||||
#define RFI_TO_USER_OR_KERNEL \
|
#define RFI_TO_USER_OR_KERNEL \
|
||||||
|
STF_EXIT_BARRIER_SLOT; \
|
||||||
RFI_FLUSH_SLOT; \
|
RFI_FLUSH_SLOT; \
|
||||||
rfid; \
|
rfid; \
|
||||||
b rfi_flush_fallback
|
b rfi_flush_fallback
|
||||||
|
|
||||||
#define RFI_TO_GUEST \
|
#define RFI_TO_GUEST \
|
||||||
|
STF_EXIT_BARRIER_SLOT; \
|
||||||
RFI_FLUSH_SLOT; \
|
RFI_FLUSH_SLOT; \
|
||||||
rfid; \
|
rfid; \
|
||||||
b rfi_flush_fallback
|
b rfi_flush_fallback
|
||||||
@@ -108,21 +132,25 @@
|
|||||||
hrfid
|
hrfid
|
||||||
|
|
||||||
#define HRFI_TO_USER \
|
#define HRFI_TO_USER \
|
||||||
|
STF_EXIT_BARRIER_SLOT; \
|
||||||
RFI_FLUSH_SLOT; \
|
RFI_FLUSH_SLOT; \
|
||||||
hrfid; \
|
hrfid; \
|
||||||
b hrfi_flush_fallback
|
b hrfi_flush_fallback
|
||||||
|
|
||||||
#define HRFI_TO_USER_OR_KERNEL \
|
#define HRFI_TO_USER_OR_KERNEL \
|
||||||
|
STF_EXIT_BARRIER_SLOT; \
|
||||||
RFI_FLUSH_SLOT; \
|
RFI_FLUSH_SLOT; \
|
||||||
hrfid; \
|
hrfid; \
|
||||||
b hrfi_flush_fallback
|
b hrfi_flush_fallback
|
||||||
|
|
||||||
#define HRFI_TO_GUEST \
|
#define HRFI_TO_GUEST \
|
||||||
|
STF_EXIT_BARRIER_SLOT; \
|
||||||
RFI_FLUSH_SLOT; \
|
RFI_FLUSH_SLOT; \
|
||||||
hrfid; \
|
hrfid; \
|
||||||
b hrfi_flush_fallback
|
b hrfi_flush_fallback
|
||||||
|
|
||||||
#define HRFI_TO_UNKNOWN \
|
#define HRFI_TO_UNKNOWN \
|
||||||
|
STF_EXIT_BARRIER_SLOT; \
|
||||||
RFI_FLUSH_SLOT; \
|
RFI_FLUSH_SLOT; \
|
||||||
hrfid; \
|
hrfid; \
|
||||||
b hrfi_flush_fallback
|
b hrfi_flush_fallback
|
||||||
@@ -254,6 +282,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
|||||||
#define __EXCEPTION_PROLOG_1_PRE(area) \
|
#define __EXCEPTION_PROLOG_1_PRE(area) \
|
||||||
OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \
|
OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \
|
||||||
OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \
|
OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \
|
||||||
|
INTERRUPT_TO_KERNEL; \
|
||||||
SAVE_CTR(r10, area); \
|
SAVE_CTR(r10, area); \
|
||||||
mfcr r9;
|
mfcr r9;
|
||||||
|
|
||||||
|
|||||||
@@ -187,6 +187,22 @@ label##3: \
|
|||||||
FTR_ENTRY_OFFSET label##1b-label##3b; \
|
FTR_ENTRY_OFFSET label##1b-label##3b; \
|
||||||
.popsection;
|
.popsection;
|
||||||
|
|
||||||
|
#define STF_ENTRY_BARRIER_FIXUP_SECTION \
|
||||||
|
953: \
|
||||||
|
.pushsection __stf_entry_barrier_fixup,"a"; \
|
||||||
|
.align 2; \
|
||||||
|
954: \
|
||||||
|
FTR_ENTRY_OFFSET 953b-954b; \
|
||||||
|
.popsection;
|
||||||
|
|
||||||
|
#define STF_EXIT_BARRIER_FIXUP_SECTION \
|
||||||
|
955: \
|
||||||
|
.pushsection __stf_exit_barrier_fixup,"a"; \
|
||||||
|
.align 2; \
|
||||||
|
956: \
|
||||||
|
FTR_ENTRY_OFFSET 955b-956b; \
|
||||||
|
.popsection;
|
||||||
|
|
||||||
#define RFI_FLUSH_FIXUP_SECTION \
|
#define RFI_FLUSH_FIXUP_SECTION \
|
||||||
951: \
|
951: \
|
||||||
.pushsection __rfi_flush_fixup,"a"; \
|
.pushsection __rfi_flush_fixup,"a"; \
|
||||||
@@ -199,6 +215,9 @@ label##3: \
|
|||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
extern long stf_barrier_fallback;
|
||||||
|
extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup;
|
||||||
|
extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup;
|
||||||
extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
|
extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
|
||||||
|
|
||||||
void apply_feature_fixups(void);
|
void apply_feature_fixups(void);
|
||||||
|
|||||||
@@ -12,6 +12,17 @@
|
|||||||
extern unsigned long powerpc_security_features;
|
extern unsigned long powerpc_security_features;
|
||||||
extern bool rfi_flush;
|
extern bool rfi_flush;
|
||||||
|
|
||||||
|
/* These are bit flags */
|
||||||
|
enum stf_barrier_type {
|
||||||
|
STF_BARRIER_NONE = 0x1,
|
||||||
|
STF_BARRIER_FALLBACK = 0x2,
|
||||||
|
STF_BARRIER_EIEIO = 0x4,
|
||||||
|
STF_BARRIER_SYNC_ORI = 0x8,
|
||||||
|
};
|
||||||
|
|
||||||
|
void setup_stf_barrier(void);
|
||||||
|
void do_stf_barrier_fixups(enum stf_barrier_type types);
|
||||||
|
|
||||||
static inline void security_ftr_set(unsigned long feature)
|
static inline void security_ftr_set(unsigned long feature)
|
||||||
{
|
{
|
||||||
powerpc_security_features |= feature;
|
powerpc_security_features |= feature;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user