提交 c049ffb3 编写于 作者: G Greg Kroah-Hartman

Merge 4.17-rc6 into usb-next

We want the bug fixes and this resolves the merge issues with the usbip
driver.
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
...@@ -244,3 +244,11 @@ Description: read only ...@@ -244,3 +244,11 @@ Description: read only
Returns 1 if the psl timebase register is synchronized Returns 1 if the psl timebase register is synchronized
with the core timebase register, 0 otherwise. with the core timebase register, 0 otherwise.
Users: https://github.com/ibm-capi/libcxl Users: https://github.com/ibm-capi/libcxl
What: /sys/class/cxl/<card>/tunneled_ops_supported
Date: May 2018
Contact: linuxppc-dev@lists.ozlabs.org
Description: read only
Returns 1 if tunneled operations are supported in capi mode,
0 otherwise.
Users: https://github.com/ibm-capi/libcxl
...@@ -145,7 +145,7 @@ feature enabled.] ...@@ -145,7 +145,7 @@ feature enabled.]
In this mode ``intel_pstate`` registers utilization update callbacks with the In this mode ``intel_pstate`` registers utilization update callbacks with the
CPU scheduler in order to run a P-state selection algorithm, either CPU scheduler in order to run a P-state selection algorithm, either
``powersave`` or ``performance``, depending on the ``scaling_cur_freq`` policy ``powersave`` or ``performance``, depending on the ``scaling_governor`` policy
setting in ``sysfs``. The current CPU frequency information to be made setting in ``sysfs``. The current CPU frequency information to be made
available from the ``scaling_cur_freq`` policy attribute in ``sysfs`` is available from the ``scaling_cur_freq`` policy attribute in ``sysfs`` is
periodically updated by those utilization update callbacks too. periodically updated by those utilization update callbacks too.
......
...@@ -15,7 +15,7 @@ Sleep States That Can Be Supported ...@@ -15,7 +15,7 @@ Sleep States That Can Be Supported
================================== ==================================
Depending on its configuration and the capabilities of the platform it runs on, Depending on its configuration and the capabilities of the platform it runs on,
the Linux kernel can support up to four system sleep states, includig the Linux kernel can support up to four system sleep states, including
hibernation and up to three variants of system suspend. The sleep states that hibernation and up to three variants of system suspend. The sleep states that
can be supported by the kernel are listed below. can be supported by the kernel are listed below.
......
...@@ -264,7 +264,10 @@ i) Constructor ...@@ -264,7 +264,10 @@ i) Constructor
data device, but just remove the mapping. data device, but just remove the mapping.
read_only: Don't allow any changes to be made to the pool read_only: Don't allow any changes to be made to the pool
metadata. metadata. This mode is only available after the
thin-pool has been created and first used in full
read/write mode. It cannot be specified on initial
thin-pool creation.
error_if_no_space: Error IOs, instead of queueing, if no space. error_if_no_space: Error IOs, instead of queueing, if no space.
......
...@@ -30,7 +30,6 @@ compatible: ...@@ -30,7 +30,6 @@ compatible:
Optional properties: Optional properties:
- dma-coherent : Present if dma operations are coherent - dma-coherent : Present if dma operations are coherent
- clocks : a list of phandle + clock specifier pairs - clocks : a list of phandle + clock specifier pairs
- resets : a list of phandle + reset specifier pairs
- target-supply : regulator for SATA target power - target-supply : regulator for SATA target power
- phys : reference to the SATA PHY node - phys : reference to the SATA PHY node
- phy-names : must be "sata-phy" - phy-names : must be "sata-phy"
......
...@@ -38,7 +38,7 @@ Display Timings ...@@ -38,7 +38,7 @@ Display Timings
require specific display timings. The panel-timing subnode expresses those require specific display timings. The panel-timing subnode expresses those
timings as specified in the timing subnode section of the display timing timings as specified in the timing subnode section of the display timing
bindings defined in bindings defined in
Documentation/devicetree/bindings/display/display-timing.txt. Documentation/devicetree/bindings/display/panel/display-timing.txt.
Connectivity Connectivity
......
...@@ -26,6 +26,7 @@ Required Properties: ...@@ -26,6 +26,7 @@ Required Properties:
- "renesas,dmac-r8a7794" (R-Car E2) - "renesas,dmac-r8a7794" (R-Car E2)
- "renesas,dmac-r8a7795" (R-Car H3) - "renesas,dmac-r8a7795" (R-Car H3)
- "renesas,dmac-r8a7796" (R-Car M3-W) - "renesas,dmac-r8a7796" (R-Car M3-W)
- "renesas,dmac-r8a77965" (R-Car M3-N)
- "renesas,dmac-r8a77970" (R-Car V3M) - "renesas,dmac-r8a77970" (R-Car V3M)
- "renesas,dmac-r8a77980" (R-Car V3H) - "renesas,dmac-r8a77980" (R-Car V3H)
......
...@@ -5,7 +5,9 @@ Required properties: ...@@ -5,7 +5,9 @@ Required properties:
- compatible: Must contain one or more of the following: - compatible: Must contain one or more of the following:
- "renesas,rcar-gen3-canfd" for R-Car Gen3 compatible controller. - "renesas,rcar-gen3-canfd" for R-Car Gen3 compatible controller.
- "renesas,r8a7795-canfd" for R8A7795 (R-Car H3) compatible controller. - "renesas,r8a7795-canfd" for R8A7795 (R-Car H3) compatible controller.
- "renesas,r8a7796-canfd" for R8A7796 (R-Car M3) compatible controller. - "renesas,r8a7796-canfd" for R8A7796 (R-Car M3-W) compatible controller.
- "renesas,r8a77970-canfd" for R8A77970 (R-Car V3M) compatible controller.
- "renesas,r8a77980-canfd" for R8A77980 (R-Car V3H) compatible controller.
When compatible with the generic version, nodes must list the When compatible with the generic version, nodes must list the
SoC-specific version corresponding to the platform first, followed by the SoC-specific version corresponding to the platform first, followed by the
......
...@@ -21,9 +21,10 @@ Required properties: ...@@ -21,9 +21,10 @@ Required properties:
- main controller clock (for both armada-375-pp2 and armada-7k-pp2) - main controller clock (for both armada-375-pp2 and armada-7k-pp2)
- GOP clock (for both armada-375-pp2 and armada-7k-pp2) - GOP clock (for both armada-375-pp2 and armada-7k-pp2)
- MG clock (only for armada-7k-pp2) - MG clock (only for armada-7k-pp2)
- MG Core clock (only for armada-7k-pp2)
- AXI clock (only for armada-7k-pp2) - AXI clock (only for armada-7k-pp2)
- clock-names: names of used clocks, must be "pp_clk", "gop_clk", "mg_clk" - clock-names: names of used clocks, must be "pp_clk", "gop_clk", "mg_clk",
and "axi_clk" (the 2 latter only for armada-7k-pp2). "mg_core_clk" and "axi_clk" (the 3 latter only for armada-7k-pp2).
The ethernet ports are represented by subnodes. At least one port is The ethernet ports are represented by subnodes. At least one port is
required. required.
...@@ -80,8 +81,8 @@ cpm_ethernet: ethernet@0 { ...@@ -80,8 +81,8 @@ cpm_ethernet: ethernet@0 {
compatible = "marvell,armada-7k-pp22"; compatible = "marvell,armada-7k-pp22";
reg = <0x0 0x100000>, <0x129000 0xb000>; reg = <0x0 0x100000>, <0x129000 0xb000>;
clocks = <&cpm_syscon0 1 3>, <&cpm_syscon0 1 9>, clocks = <&cpm_syscon0 1 3>, <&cpm_syscon0 1 9>,
<&cpm_syscon0 1 5>, <&cpm_syscon0 1 18>; <&cpm_syscon0 1 5>, <&cpm_syscon0 1 6>, <&cpm_syscon0 1 18>;
clock-names = "pp_clk", "gop_clk", "gp_clk", "axi_clk"; clock-names = "pp_clk", "gop_clk", "mg_clk", "mg_core_clk", "axi_clk";
eth0: eth0 { eth0: eth0 {
interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>, interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>,
......
...@@ -18,6 +18,7 @@ Required properties: ...@@ -18,6 +18,7 @@ Required properties:
- "renesas,etheravb-r8a7795" for the R8A7795 SoC. - "renesas,etheravb-r8a7795" for the R8A7795 SoC.
- "renesas,etheravb-r8a7796" for the R8A7796 SoC. - "renesas,etheravb-r8a7796" for the R8A7796 SoC.
- "renesas,etheravb-r8a77965" for the R8A77965 SoC.
- "renesas,etheravb-r8a77970" for the R8A77970 SoC. - "renesas,etheravb-r8a77970" for the R8A77970 SoC.
- "renesas,etheravb-r8a77980" for the R8A77980 SoC. - "renesas,etheravb-r8a77980" for the R8A77980 SoC.
- "renesas,etheravb-r8a77995" for the R8A77995 SoC. - "renesas,etheravb-r8a77995" for the R8A77995 SoC.
......
...@@ -56,9 +56,9 @@ pins it needs, and how they should be configured, with regard to muxer ...@@ -56,9 +56,9 @@ pins it needs, and how they should be configured, with regard to muxer
configuration, drive strength and pullups. If one of these options is configuration, drive strength and pullups. If one of these options is
not set, its actual value will be unspecified. not set, its actual value will be unspecified.
This driver supports the generic pin multiplexing and configuration Allwinner A1X Pin Controller supports the generic pin multiplexing and
bindings. For details on each properties, you can refer to configuration bindings. For details on each properties, you can refer to
./pinctrl-bindings.txt. ./pinctrl-bindings.txt.
Required sub-node properties: Required sub-node properties:
- pins - pins
......
...@@ -43,6 +43,8 @@ Required properties: ...@@ -43,6 +43,8 @@ Required properties:
- "renesas,hscif-r8a7795" for R8A7795 (R-Car H3) HSCIF compatible UART. - "renesas,hscif-r8a7795" for R8A7795 (R-Car H3) HSCIF compatible UART.
- "renesas,scif-r8a7796" for R8A7796 (R-Car M3-W) SCIF compatible UART. - "renesas,scif-r8a7796" for R8A7796 (R-Car M3-W) SCIF compatible UART.
- "renesas,hscif-r8a7796" for R8A7796 (R-Car M3-W) HSCIF compatible UART. - "renesas,hscif-r8a7796" for R8A7796 (R-Car M3-W) HSCIF compatible UART.
- "renesas,scif-r8a77965" for R8A77965 (R-Car M3-N) SCIF compatible UART.
- "renesas,hscif-r8a77965" for R8A77965 (R-Car M3-N) HSCIF compatible UART.
- "renesas,scif-r8a77970" for R8A77970 (R-Car V3M) SCIF compatible UART. - "renesas,scif-r8a77970" for R8A77970 (R-Car V3M) SCIF compatible UART.
- "renesas,hscif-r8a77970" for R8A77970 (R-Car V3M) HSCIF compatible UART. - "renesas,hscif-r8a77970" for R8A77970 (R-Car V3M) HSCIF compatible UART.
- "renesas,scif-r8a77980" for R8A77980 (R-Car V3H) SCIF compatible UART. - "renesas,scif-r8a77980" for R8A77980 (R-Car V3H) SCIF compatible UART.
......
...@@ -182,6 +182,7 @@ karo Ka-Ro electronics GmbH ...@@ -182,6 +182,7 @@ karo Ka-Ro electronics GmbH
keithkoep Keith & Koep GmbH keithkoep Keith & Koep GmbH
keymile Keymile GmbH keymile Keymile GmbH
khadas Khadas khadas Khadas
kiebackpeter Kieback & Peter GmbH
kinetic Kinetic Technologies kinetic Kinetic Technologies
kingnovel Kingnovel Technology Co., Ltd. kingnovel Kingnovel Technology Co., Ltd.
kosagi Sutajio Ko-Usagi PTE Ltd. kosagi Sutajio Ko-Usagi PTE Ltd.
......
...@@ -98,6 +98,14 @@ Finally, if you need to remove all overlays in one-go, just call ...@@ -98,6 +98,14 @@ Finally, if you need to remove all overlays in one-go, just call
of_overlay_remove_all() which will remove every single one in the correct of_overlay_remove_all() which will remove every single one in the correct
order. order.
In addition, there is the option to register notifiers that get called on
overlay operations. See of_overlay_notifier_register/unregister and
enum of_overlay_notify_action for details.
Note that a notifier callback is not supposed to store pointers to a device
tree node or its content beyond OF_OVERLAY_POST_REMOVE corresponding to the
respective node it received.
Overlay DTS Format Overlay DTS Format
------------------ ------------------
......
...@@ -72,8 +72,8 @@ KVM_FEATURE_CLOCKSOURCE_STABLE_BIT || 24 || host will warn if no guest-side ...@@ -72,8 +72,8 @@ KVM_FEATURE_CLOCKSOURCE_STABLE_BIT || 24 || host will warn if no guest-side
flag || value || meaning flag || value || meaning
================================================================================== ==================================================================================
KVM_HINTS_DEDICATED || 0 || guest checks this feature bit to KVM_HINTS_REALTIME || 0 || guest checks this feature bit to
|| || determine if there is vCPU pinning || || determine that vCPUs are never
|| || and there is no vCPU over-commitment, || || preempted for an unlimited time,
|| || allowing optimizations || || allowing optimizations
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
...@@ -137,9 +137,9 @@ Maintainers List (try to look for most precise areas first) ...@@ -137,9 +137,9 @@ Maintainers List (try to look for most precise areas first)
----------------------------------- -----------------------------------
3C59X NETWORK DRIVER 3C59X NETWORK DRIVER
M: Steffen Klassert <klassert@mathematik.tu-chemnitz.de> M: Steffen Klassert <klassert@kernel.org>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Odd Fixes
F: Documentation/networking/vortex.txt F: Documentation/networking/vortex.txt
F: drivers/net/ethernet/3com/3c59x.c F: drivers/net/ethernet/3com/3c59x.c
...@@ -3691,7 +3691,6 @@ F: drivers/cpufreq/arm_big_little_dt.c ...@@ -3691,7 +3691,6 @@ F: drivers/cpufreq/arm_big_little_dt.c
CPU POWER MONITORING SUBSYSTEM CPU POWER MONITORING SUBSYSTEM
M: Thomas Renninger <trenn@suse.com> M: Thomas Renninger <trenn@suse.com>
M: Shuah Khan <shuahkh@osg.samsung.com>
M: Shuah Khan <shuah@kernel.org> M: Shuah Khan <shuah@kernel.org>
L: linux-pm@vger.kernel.org L: linux-pm@vger.kernel.org
S: Maintained S: Maintained
...@@ -4310,7 +4309,7 @@ F: Documentation/driver-api/dma-buf.rst ...@@ -4310,7 +4309,7 @@ F: Documentation/driver-api/dma-buf.rst
T: git git://anongit.freedesktop.org/drm/drm-misc T: git git://anongit.freedesktop.org/drm/drm-misc
DMA GENERIC OFFLOAD ENGINE SUBSYSTEM DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
M: Vinod Koul <vinod.koul@intel.com> M: Vinod Koul <vkoul@kernel.org>
L: dmaengine@vger.kernel.org L: dmaengine@vger.kernel.org
Q: https://patchwork.kernel.org/project/linux-dmaengine/list/ Q: https://patchwork.kernel.org/project/linux-dmaengine/list/
S: Maintained S: Maintained
...@@ -7696,10 +7695,10 @@ F: include/linux/sunrpc/ ...@@ -7696,10 +7695,10 @@ F: include/linux/sunrpc/
F: include/uapi/linux/sunrpc/ F: include/uapi/linux/sunrpc/
KERNEL SELFTEST FRAMEWORK KERNEL SELFTEST FRAMEWORK
M: Shuah Khan <shuahkh@osg.samsung.com>
M: Shuah Khan <shuah@kernel.org> M: Shuah Khan <shuah@kernel.org>
L: linux-kselftest@vger.kernel.org L: linux-kselftest@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git
Q: https://patchwork.kernel.org/project/linux-kselftest/list/
S: Maintained S: Maintained
F: tools/testing/selftests/ F: tools/testing/selftests/
F: Documentation/dev-tools/kselftest* F: Documentation/dev-tools/kselftest*
...@@ -9873,7 +9872,7 @@ F: include/linux/platform_data/nxp-nci.h ...@@ -9873,7 +9872,7 @@ F: include/linux/platform_data/nxp-nci.h
F: Documentation/devicetree/bindings/net/nfc/ F: Documentation/devicetree/bindings/net/nfc/
NFS, SUNRPC, AND LOCKD CLIENTS NFS, SUNRPC, AND LOCKD CLIENTS
M: Trond Myklebust <trond.myklebust@primarydata.com> M: Trond Myklebust <trond.myklebust@hammerspace.com>
M: Anna Schumaker <anna.schumaker@netapp.com> M: Anna Schumaker <anna.schumaker@netapp.com>
L: linux-nfs@vger.kernel.org L: linux-nfs@vger.kernel.org
W: http://client.linux-nfs.org W: http://client.linux-nfs.org
...@@ -12223,7 +12222,7 @@ F: Documentation/s390/vfio-ccw.txt ...@@ -12223,7 +12222,7 @@ F: Documentation/s390/vfio-ccw.txt
F: include/uapi/linux/vfio_ccw.h F: include/uapi/linux/vfio_ccw.h
S390 ZCRYPT DRIVER S390 ZCRYPT DRIVER
M: Harald Freudenberger <freude@de.ibm.com> M: Harald Freudenberger <freude@linux.ibm.com>
L: linux-s390@vger.kernel.org L: linux-s390@vger.kernel.org
W: http://www.ibm.com/developerworks/linux/linux390/ W: http://www.ibm.com/developerworks/linux/linux390/
S: Supported S: Supported
...@@ -13267,6 +13266,12 @@ M: Jan-Benedict Glaw <jbglaw@lug-owl.de> ...@@ -13267,6 +13266,12 @@ M: Jan-Benedict Glaw <jbglaw@lug-owl.de>
S: Maintained S: Maintained
F: arch/alpha/kernel/srm_env.c F: arch/alpha/kernel/srm_env.c
ST STM32 I2C/SMBUS DRIVER
M: Pierre-Yves MORDRET <pierre-yves.mordret@st.com>
L: linux-i2c@vger.kernel.org
S: Maintained
F: drivers/i2c/busses/i2c-stm32*
STABLE BRANCH STABLE BRANCH
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
L: stable@vger.kernel.org L: stable@vger.kernel.org
...@@ -14651,7 +14656,6 @@ F: drivers/usb/common/usb-otg-fsm.c ...@@ -14651,7 +14656,6 @@ F: drivers/usb/common/usb-otg-fsm.c
USB OVER IP DRIVER USB OVER IP DRIVER
M: Valentina Manea <valentina.manea.m@gmail.com> M: Valentina Manea <valentina.manea.m@gmail.com>
M: Shuah Khan <shuahkh@osg.samsung.com>
M: Shuah Khan <shuah@kernel.org> M: Shuah Khan <shuah@kernel.org>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Maintained S: Maintained
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 17 PATCHLEVEL = 17
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc4 EXTRAVERSION = -rc6
NAME = Merciless Moray NAME = Merciless Moray
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -464,6 +464,10 @@ config GCC_PLUGIN_LATENT_ENTROPY ...@@ -464,6 +464,10 @@ config GCC_PLUGIN_LATENT_ENTROPY
config GCC_PLUGIN_STRUCTLEAK config GCC_PLUGIN_STRUCTLEAK
bool "Force initialization of variables containing userspace addresses" bool "Force initialization of variables containing userspace addresses"
depends on GCC_PLUGINS depends on GCC_PLUGINS
# Currently STRUCTLEAK inserts initialization out of live scope of
# variables from KASAN point of view. This leads to KASAN false
# positive reports. Prohibit this combination for now.
depends on !KASAN_EXTRA
help help
This plugin zero-initializes any structures containing a This plugin zero-initializes any structures containing a
__user attribute. This can prevent some classes of information __user attribute. This can prevent some classes of information
......
...@@ -117,11 +117,9 @@ ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj) ...@@ -117,11 +117,9 @@ ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj)
asflags-y := -DZIMAGE asflags-y := -DZIMAGE
# Supply kernel BSS size to the decompressor via a linker symbol. # Supply kernel BSS size to the decompressor via a linker symbol.
KBSS_SZ = $(shell $(CROSS_COMPILE)nm $(obj)/../../../../vmlinux | \ KBSS_SZ = $(shell echo $$(($$($(CROSS_COMPILE)nm $(obj)/../../../../vmlinux | \
perl -e 'while (<>) { \ sed -n -e 's/^\([^ ]*\) [AB] __bss_start$$/-0x\1/p' \
$$bss_start=hex($$1) if /^([[:xdigit:]]+) B __bss_start$$/; \ -e 's/^\([^ ]*\) [AB] __bss_stop$$/+0x\1/p') )) )
$$bss_end=hex($$1) if /^([[:xdigit:]]+) B __bss_stop$$/; \
}; printf "%d\n", $$bss_end - $$bss_start;')
LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ) LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
# Supply ZRELADDR to the decompressor via a linker symbol. # Supply ZRELADDR to the decompressor via a linker symbol.
ifneq ($(CONFIG_AUTO_ZRELADDR),y) ifneq ($(CONFIG_AUTO_ZRELADDR),y)
......
...@@ -29,19 +29,19 @@ ...@@ -29,19 +29,19 @@
#if defined(CONFIG_DEBUG_ICEDCC) #if defined(CONFIG_DEBUG_ICEDCC)
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7) #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
.macro loadsp, rb, tmp .macro loadsp, rb, tmp1, tmp2
.endm .endm
.macro writeb, ch, rb .macro writeb, ch, rb
mcr p14, 0, \ch, c0, c5, 0 mcr p14, 0, \ch, c0, c5, 0
.endm .endm
#elif defined(CONFIG_CPU_XSCALE) #elif defined(CONFIG_CPU_XSCALE)
.macro loadsp, rb, tmp .macro loadsp, rb, tmp1, tmp2
.endm .endm
.macro writeb, ch, rb .macro writeb, ch, rb
mcr p14, 0, \ch, c8, c0, 0 mcr p14, 0, \ch, c8, c0, 0
.endm .endm
#else #else
.macro loadsp, rb, tmp .macro loadsp, rb, tmp1, tmp2
.endm .endm
.macro writeb, ch, rb .macro writeb, ch, rb
mcr p14, 0, \ch, c1, c0, 0 mcr p14, 0, \ch, c1, c0, 0
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
.endm .endm
#if defined(CONFIG_ARCH_SA1100) #if defined(CONFIG_ARCH_SA1100)
.macro loadsp, rb, tmp .macro loadsp, rb, tmp1, tmp2
mov \rb, #0x80000000 @ physical base address mov \rb, #0x80000000 @ physical base address
#ifdef CONFIG_DEBUG_LL_SER3 #ifdef CONFIG_DEBUG_LL_SER3
add \rb, \rb, #0x00050000 @ Ser3 add \rb, \rb, #0x00050000 @ Ser3
...@@ -66,8 +66,8 @@ ...@@ -66,8 +66,8 @@
#endif #endif
.endm .endm
#else #else
.macro loadsp, rb, tmp .macro loadsp, rb, tmp1, tmp2
addruart \rb, \tmp addruart \rb, \tmp1, \tmp2
.endm .endm
#endif #endif
#endif #endif
...@@ -561,8 +561,6 @@ not_relocated: mov r0, #0 ...@@ -561,8 +561,6 @@ not_relocated: mov r0, #0
bl decompress_kernel bl decompress_kernel
bl cache_clean_flush bl cache_clean_flush
bl cache_off bl cache_off
mov r1, r7 @ restore architecture number
mov r2, r8 @ restore atags pointer
#ifdef CONFIG_ARM_VIRT_EXT #ifdef CONFIG_ARM_VIRT_EXT
mrs r0, spsr @ Get saved CPU boot mode mrs r0, spsr @ Get saved CPU boot mode
...@@ -1297,7 +1295,7 @@ phex: adr r3, phexbuf ...@@ -1297,7 +1295,7 @@ phex: adr r3, phexbuf
b 1b b 1b
@ puts corrupts {r0, r1, r2, r3} @ puts corrupts {r0, r1, r2, r3}
puts: loadsp r3, r1 puts: loadsp r3, r2, r1
1: ldrb r2, [r0], #1 1: ldrb r2, [r0], #1
teq r2, #0 teq r2, #0
moveq pc, lr moveq pc, lr
...@@ -1314,8 +1312,8 @@ puts: loadsp r3, r1 ...@@ -1314,8 +1312,8 @@ puts: loadsp r3, r1
@ putc corrupts {r0, r1, r2, r3} @ putc corrupts {r0, r1, r2, r3}
putc: putc:
mov r2, r0 mov r2, r0
loadsp r3, r1, r0
mov r0, #0 mov r0, #0
loadsp r3, r1
b 2b b 2b
@ memdump corrupts {r0, r1, r2, r3, r10, r11, r12, lr} @ memdump corrupts {r0, r1, r2, r3, r10, r11, r12, lr}
...@@ -1365,6 +1363,8 @@ __hyp_reentry_vectors: ...@@ -1365,6 +1363,8 @@ __hyp_reentry_vectors:
__enter_kernel: __enter_kernel:
mov r0, #0 @ must be 0 mov r0, #0 @ must be 0
mov r1, r7 @ restore architecture number
mov r2, r8 @ restore atags pointer
ARM( mov pc, r4 ) @ call kernel ARM( mov pc, r4 ) @ call kernel
M_CLASS( add r4, r4, #1 ) @ enter in Thumb mode for M class M_CLASS( add r4, r4, #1 ) @ enter in Thumb mode for M class
THUMB( bx r4 ) @ entry point is always ARM for A/R classes THUMB( bx r4 ) @ entry point is always ARM for A/R classes
......
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
timer@20200 { timer@20200 {
compatible = "arm,cortex-a9-global-timer"; compatible = "arm,cortex-a9-global-timer";
reg = <0x20200 0x100>; reg = <0x20200 0x100>;
interrupts = <GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_PPI 11 IRQ_TYPE_EDGE_RISING>;
clocks = <&periph_clk>; clocks = <&periph_clk>;
}; };
......
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
stdout-path = "serial2:115200n8"; stdout-path = "serial2:115200n8";
}; };
memory { memory@c0000000 {
device_type = "memory"; /* 128 MB DDR2 SDRAM @ 0xc0000000 */
reg = <0xc0000000 0x08000000>; reg = <0xc0000000 0x08000000>;
}; };
......
...@@ -7,10 +7,19 @@ ...@@ -7,10 +7,19 @@
* Free Software Foundation; either version 2 of the License, or (at your * Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. * option) any later version.
*/ */
#include "skeleton.dtsi"
#include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/interrupt-controller/irq.h>
/ { / {
#address-cells = <1>;
#size-cells = <1>;
chosen { };
aliases { };
memory@c0000000 {
device_type = "memory";
reg = <0xc0000000 0x0>;
};
arm { arm {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
...@@ -46,8 +55,6 @@ ...@@ -46,8 +55,6 @@
pmx_core: pinmux@14120 { pmx_core: pinmux@14120 {
compatible = "pinctrl-single"; compatible = "pinctrl-single";
reg = <0x14120 0x50>; reg = <0x14120 0x50>;
#address-cells = <1>;
#size-cells = <0>;
#pinctrl-cells = <2>; #pinctrl-cells = <2>;
pinctrl-single,bit-per-mux; pinctrl-single,bit-per-mux;
pinctrl-single,register-width = <32>; pinctrl-single,register-width = <32>;
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
/ { / {
model = "DM8148 EVM"; model = "DM8148 EVM";
compatible = "ti,dm8148-evm", "ti,dm8148"; compatible = "ti,dm8148-evm", "ti,dm8148", "ti,dm814";
memory@80000000 { memory@80000000 {
device_type = "memory"; device_type = "memory";
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
/ { / {
model = "HP t410 Smart Zero Client"; model = "HP t410 Smart Zero Client";
compatible = "hp,t410", "ti,dm8148"; compatible = "hp,t410", "ti,dm8148", "ti,dm814";
memory@80000000 { memory@80000000 {
device_type = "memory"; device_type = "memory";
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
/ { / {
model = "DM8168 EVM"; model = "DM8168 EVM";
compatible = "ti,dm8168-evm", "ti,dm8168"; compatible = "ti,dm8168-evm", "ti,dm8168", "ti,dm816";
memory@80000000 { memory@80000000 {
device_type = "memory"; device_type = "memory";
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
/ { / {
model = "DRA62x J5 Eco EVM"; model = "DRA62x J5 Eco EVM";
compatible = "ti,dra62x-j5eco-evm", "ti,dra62x", "ti,dm8148"; compatible = "ti,dra62x-j5eco-evm", "ti,dra62x", "ti,dm8148", "ti,dm814";
memory@80000000 { memory@80000000 {
device_type = "memory"; device_type = "memory";
......
...@@ -303,7 +303,7 @@ ...@@ -303,7 +303,7 @@
}; };
can1: can@53fe4000 { can1: can@53fe4000 {
compatible = "fsl,imx35-flexcan"; compatible = "fsl,imx35-flexcan", "fsl,imx25-flexcan";
reg = <0x53fe4000 0x1000>; reg = <0x53fe4000 0x1000>;
clocks = <&clks 33>, <&clks 33>; clocks = <&clks 33>, <&clks 33>;
clock-names = "ipg", "per"; clock-names = "ipg", "per";
...@@ -312,7 +312,7 @@ ...@@ -312,7 +312,7 @@
}; };
can2: can@53fe8000 { can2: can@53fe8000 {
compatible = "fsl,imx35-flexcan"; compatible = "fsl,imx35-flexcan", "fsl,imx25-flexcan";
reg = <0x53fe8000 0x1000>; reg = <0x53fe8000 0x1000>;
clocks = <&clks 34>, <&clks 34>; clocks = <&clks 34>, <&clks 34>;
clock-names = "ipg", "per"; clock-names = "ipg", "per";
......
...@@ -523,7 +523,7 @@ ...@@ -523,7 +523,7 @@
}; };
touchscreen@20 { touchscreen@20 {
compatible = "syna,rmi4_i2c"; compatible = "syna,rmi4-i2c";
reg = <0x20>; reg = <0x20>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ts>; pinctrl-0 = <&pinctrl_ts>;
...@@ -541,8 +541,8 @@ ...@@ -541,8 +541,8 @@
rmi4-f11@11 { rmi4-f11@11 {
reg = <0x11>; reg = <0x11>;
touch-inverted-y; touchscreen-inverted-y;
touch-swapped-x-y; touchscreen-swapped-x-y;
syna,sensor-type = <1>; syna,sensor-type = <1>;
}; };
}; };
......
...@@ -551,7 +551,7 @@ ...@@ -551,7 +551,7 @@
}; };
can1: can@53fc8000 { can1: can@53fc8000 {
compatible = "fsl,imx53-flexcan"; compatible = "fsl,imx53-flexcan", "fsl,imx25-flexcan";
reg = <0x53fc8000 0x4000>; reg = <0x53fc8000 0x4000>;
interrupts = <82>; interrupts = <82>;
clocks = <&clks IMX5_CLK_CAN1_IPG_GATE>, clocks = <&clks IMX5_CLK_CAN1_IPG_GATE>,
...@@ -561,7 +561,7 @@ ...@@ -561,7 +561,7 @@
}; };
can2: can@53fcc000 { can2: can@53fcc000 {
compatible = "fsl,imx53-flexcan"; compatible = "fsl,imx53-flexcan", "fsl,imx25-flexcan";
reg = <0x53fcc000 0x4000>; reg = <0x53fcc000 0x4000>;
interrupts = <83>; interrupts = <83>;
clocks = <&clks IMX5_CLK_CAN2_IPG_GATE>, clocks = <&clks IMX5_CLK_CAN2_IPG_GATE>,
......
...@@ -868,6 +868,7 @@ ...@@ -868,6 +868,7 @@
crypto: caam@30900000 { crypto: caam@30900000 {
compatible = "fsl,sec-v4.0"; compatible = "fsl,sec-v4.0";
fsl,sec-era = <8>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
reg = <0x30900000 0x40000>; reg = <0x30900000 0x40000>;
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
gpio = <&gpio1 3 0>; /* gpio_3 */ gpio = <&gpio1 3 0>; /* gpio_3 */
startup-delay-us = <70000>; startup-delay-us = <70000>;
enable-active-high; enable-active-high;
vin-supply = <&vmmc2>; vin-supply = <&vaux3>;
}; };
/* HS USB Host PHY on PORT 1 */ /* HS USB Host PHY on PORT 1 */
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
twl_audio: audio { twl_audio: audio {
compatible = "ti,twl4030-audio"; compatible = "ti,twl4030-audio";
codec { codec {
ti,hs_extmute_gpio = <&gpio2 25 GPIO_ACTIVE_HIGH>;
}; };
}; };
}; };
...@@ -199,6 +200,7 @@ ...@@ -199,6 +200,7 @@
pinctrl-single,pins = < pinctrl-single,pins = <
OMAP3_CORE1_IOPAD(0x21ba, PIN_INPUT | MUX_MODE0) /* i2c1_scl.i2c1_scl */ OMAP3_CORE1_IOPAD(0x21ba, PIN_INPUT | MUX_MODE0) /* i2c1_scl.i2c1_scl */
OMAP3_CORE1_IOPAD(0x21bc, PIN_INPUT | MUX_MODE0) /* i2c1_sda.i2c1_sda */ OMAP3_CORE1_IOPAD(0x21bc, PIN_INPUT | MUX_MODE0) /* i2c1_sda.i2c1_sda */
OMAP3_CORE1_IOPAD(0x20ba, PIN_OUTPUT | MUX_MODE4) /* gpmc_ncs6.gpio_57 */
>; >;
}; };
}; };
...@@ -213,7 +215,7 @@ ...@@ -213,7 +215,7 @@
}; };
wl127x_gpio: pinmux_wl127x_gpio_pin { wl127x_gpio: pinmux_wl127x_gpio_pin {
pinctrl-single,pins = < pinctrl-single,pins = <
OMAP3_WKUP_IOPAD(0x2a0c, PIN_INPUT | MUX_MODE4) /* sys_boot0.gpio_2 */ OMAP3_WKUP_IOPAD(0x2a0a, PIN_INPUT | MUX_MODE4) /* sys_boot0.gpio_2 */
OMAP3_WKUP_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */ OMAP3_WKUP_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */
>; >;
}; };
...@@ -260,6 +262,11 @@ ...@@ -260,6 +262,11 @@
#include "twl4030.dtsi" #include "twl4030.dtsi"
#include "twl4030_omap3.dtsi" #include "twl4030_omap3.dtsi"
&vaux3 {
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
};
&twl { &twl {
twl_power: power { twl_power: power {
compatible = "ti,twl4030-power-idle-osc-off", "ti,twl4030-power-idle"; compatible = "ti,twl4030-power-idle-osc-off", "ti,twl4030-power-idle";
......
...@@ -379,7 +379,7 @@ ...@@ -379,7 +379,7 @@
port@0 { port@0 {
reg = <0>; reg = <0>;
adv7511_in: endpoint { adv7511_in: endpoint {
remote-endpoint = <&du_out_lvds0>; remote-endpoint = <&lvds0_out>;
}; };
}; };
...@@ -467,10 +467,8 @@ ...@@ -467,10 +467,8 @@
status = "okay"; status = "okay";
clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>, <&cpg CPG_MOD 722>, clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>, <&cpg CPG_MOD 722>,
<&cpg CPG_MOD 726>, <&cpg CPG_MOD 725>,
<&x13_clk>, <&x2_clk>; <&x13_clk>, <&x2_clk>;
clock-names = "du.0", "du.1", "du.2", "lvds.0", "lvds.1", clock-names = "du.0", "du.1", "du.2", "dclkin.0", "dclkin.1";
"dclkin.0", "dclkin.1";
ports { ports {
port@0 { port@0 {
...@@ -478,12 +476,26 @@ ...@@ -478,12 +476,26 @@
remote-endpoint = <&adv7123_in>; remote-endpoint = <&adv7123_in>;
}; };
}; };
};
};
&lvds0 {
status = "okay";
ports {
port@1 { port@1 {
endpoint { endpoint {
remote-endpoint = <&adv7511_in>; remote-endpoint = <&adv7511_in>;
}; };
}; };
port@2 { };
};
&lvds1 {
status = "okay";
ports {
port@1 {
lvds_connector: endpoint { lvds_connector: endpoint {
}; };
}; };
......
...@@ -1627,18 +1627,13 @@ ...@@ -1627,18 +1627,13 @@
du: display@feb00000 { du: display@feb00000 {
compatible = "renesas,du-r8a7790"; compatible = "renesas,du-r8a7790";
reg = <0 0xfeb00000 0 0x70000>, reg = <0 0xfeb00000 0 0x70000>;
<0 0xfeb90000 0 0x1c>,
<0 0xfeb94000 0 0x1c>;
reg-names = "du", "lvds.0", "lvds.1";
interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH>; <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>, clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>,
<&cpg CPG_MOD 722>, <&cpg CPG_MOD 726>, <&cpg CPG_MOD 722>;
<&cpg CPG_MOD 725>; clock-names = "du.0", "du.1", "du.2";
clock-names = "du.0", "du.1", "du.2", "lvds.0",
"lvds.1";
status = "disabled"; status = "disabled";
ports { ports {
...@@ -1653,11 +1648,65 @@ ...@@ -1653,11 +1648,65 @@
port@1 { port@1 {
reg = <1>; reg = <1>;
du_out_lvds0: endpoint { du_out_lvds0: endpoint {
remote-endpoint = <&lvds0_in>;
}; };
}; };
port@2 { port@2 {
reg = <2>; reg = <2>;
du_out_lvds1: endpoint { du_out_lvds1: endpoint {
remote-endpoint = <&lvds1_in>;
};
};
};
};
lvds0: lvds@feb90000 {
compatible = "renesas,r8a7790-lvds";
reg = <0 0xfeb90000 0 0x1c>;
clocks = <&cpg CPG_MOD 726>;
power-domains = <&sysc R8A7790_PD_ALWAYS_ON>;
resets = <&cpg 726>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
lvds0_in: endpoint {
remote-endpoint = <&du_out_lvds0>;
};
};
port@1 {
reg = <1>;
lvds0_out: endpoint {
};
};
};
};
lvds1: lvds@feb94000 {
compatible = "renesas,r8a7790-lvds";
reg = <0 0xfeb94000 0 0x1c>;
clocks = <&cpg CPG_MOD 725>;
power-domains = <&sysc R8A7790_PD_ALWAYS_ON>;
resets = <&cpg 725>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
lvds1_in: endpoint {
remote-endpoint = <&du_out_lvds1>;
};
};
port@1 {
reg = <1>;
lvds1_out: endpoint {
}; };
}; };
}; };
......
...@@ -468,10 +468,9 @@ ...@@ -468,10 +468,9 @@
pinctrl-names = "default"; pinctrl-names = "default";
status = "okay"; status = "okay";
clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>, <&cpg CPG_MOD 726>, clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>,
<&x13_clk>, <&x2_clk>; <&x13_clk>, <&x2_clk>;
clock-names = "du.0", "du.1", "lvds.0", clock-names = "du.0", "du.1", "dclkin.0", "dclkin.1";
"dclkin.0", "dclkin.1";
ports { ports {
port@0 { port@0 {
...@@ -479,6 +478,13 @@ ...@@ -479,6 +478,13 @@
remote-endpoint = <&adv7511_in>; remote-endpoint = <&adv7511_in>;
}; };
}; };
};
};
&lvds0 {
status = "okay";
ports {
port@1 { port@1 {
lvds_connector: endpoint { lvds_connector: endpoint {
}; };
......
...@@ -441,10 +441,9 @@ ...@@ -441,10 +441,9 @@
pinctrl-names = "default"; pinctrl-names = "default";
status = "okay"; status = "okay";
clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>, <&cpg CPG_MOD 726>, clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>,
<&x3_clk>, <&x16_clk>; <&x3_clk>, <&x16_clk>;
clock-names = "du.0", "du.1", "lvds.0", clock-names = "du.0", "du.1", "dclkin.0", "dclkin.1";
"dclkin.0", "dclkin.1";
ports { ports {
port@0 { port@0 {
...@@ -455,6 +454,17 @@ ...@@ -455,6 +454,17 @@
}; };
}; };
&lvds0 {
status = "okay";
ports {
port@1 {
lvds_connector: endpoint {
};
};
};
};
&rcar_sound { &rcar_sound {
pinctrl-0 = <&ssi_pins &audio_clk_pins>; pinctrl-0 = <&ssi_pins &audio_clk_pins>;
pinctrl-names = "default"; pinctrl-names = "default";
......
...@@ -1633,15 +1633,12 @@ ...@@ -1633,15 +1633,12 @@
du: display@feb00000 { du: display@feb00000 {
compatible = "renesas,du-r8a7791"; compatible = "renesas,du-r8a7791";
reg = <0 0xfeb00000 0 0x40000>, reg = <0 0xfeb00000 0 0x40000>;
<0 0xfeb90000 0 0x1c>;
reg-names = "du", "lvds.0";
interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>; <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cpg CPG_MOD 724>, clocks = <&cpg CPG_MOD 724>,
<&cpg CPG_MOD 723>, <&cpg CPG_MOD 723>;
<&cpg CPG_MOD 726>; clock-names = "du.0", "du.1";
clock-names = "du.0", "du.1", "lvds.0";
status = "disabled"; status = "disabled";
ports { ports {
...@@ -1656,6 +1653,33 @@ ...@@ -1656,6 +1653,33 @@
port@1 { port@1 {
reg = <1>; reg = <1>;
du_out_lvds0: endpoint { du_out_lvds0: endpoint {
remote-endpoint = <&lvds0_in>;
};
};
};
};
lvds0: lvds@feb90000 {
compatible = "renesas,r8a7791-lvds";
reg = <0 0xfeb90000 0 0x1c>;
clocks = <&cpg CPG_MOD 726>;
power-domains = <&sysc R8A7791_PD_ALWAYS_ON>;
resets = <&cpg 726>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
lvds0_in: endpoint {
remote-endpoint = <&du_out_lvds0>;
};
};
port@1 {
reg = <1>;
lvds0_out: endpoint {
}; };
}; };
}; };
......
...@@ -447,10 +447,9 @@ ...@@ -447,10 +447,9 @@
pinctrl-names = "default"; pinctrl-names = "default";
status = "okay"; status = "okay";
clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>, <&cpg CPG_MOD 726>, clocks = <&cpg CPG_MOD 724>, <&cpg CPG_MOD 723>,
<&x13_clk>, <&x2_clk>; <&x13_clk>, <&x2_clk>;
clock-names = "du.0", "du.1", "lvds.0", clock-names = "du.0", "du.1", "dclkin.0", "dclkin.1";
"dclkin.0", "dclkin.1";
ports { ports {
port@0 { port@0 {
...@@ -458,6 +457,11 @@ ...@@ -458,6 +457,11 @@
remote-endpoint = <&adv7511_in>; remote-endpoint = <&adv7511_in>;
}; };
}; };
};
};
&lvds0 {
ports {
port@1 { port@1 {
lvds_connector: endpoint { lvds_connector: endpoint {
}; };
......
...@@ -1292,15 +1292,12 @@ ...@@ -1292,15 +1292,12 @@
du: display@feb00000 { du: display@feb00000 {
compatible = "renesas,du-r8a7793"; compatible = "renesas,du-r8a7793";
reg = <0 0xfeb00000 0 0x40000>, reg = <0 0xfeb00000 0 0x40000>;
<0 0xfeb90000 0 0x1c>;
reg-names = "du", "lvds.0";
interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>; <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cpg CPG_MOD 724>, clocks = <&cpg CPG_MOD 724>,
<&cpg CPG_MOD 723>, <&cpg CPG_MOD 723>;
<&cpg CPG_MOD 726>; clock-names = "du.0", "du.1";
clock-names = "du.0", "du.1", "lvds.0";
status = "disabled"; status = "disabled";
ports { ports {
...@@ -1315,6 +1312,34 @@ ...@@ -1315,6 +1312,34 @@
port@1 { port@1 {
reg = <1>; reg = <1>;
du_out_lvds0: endpoint { du_out_lvds0: endpoint {
remote-endpoint = <&lvds0_in>;
};
};
};
};
lvds0: lvds@feb90000 {
compatible = "renesas,r8a7793-lvds";
reg = <0 0xfeb90000 0 0x1c>;
clocks = <&cpg CPG_MOD 726>;
power-domains = <&sysc R8A7793_PD_ALWAYS_ON>;
resets = <&cpg 726>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
lvds0_in: endpoint {
remote-endpoint = <&du_out_lvds0>;
};
};
port@1 {
reg = <1>;
lvds0_out: endpoint {
}; };
}; };
}; };
......
...@@ -741,7 +741,7 @@ ...@@ -741,7 +741,7 @@
phy_type = "ulpi"; phy_type = "ulpi";
clocks = <&tegra_car TEGRA20_CLK_USB2>, clocks = <&tegra_car TEGRA20_CLK_USB2>,
<&tegra_car TEGRA20_CLK_PLL_U>, <&tegra_car TEGRA20_CLK_PLL_U>,
<&tegra_car TEGRA20_CLK_PLL_P_OUT4>; <&tegra_car TEGRA20_CLK_CDEV2>;
clock-names = "reg", "pll_u", "ulpi-link"; clock-names = "reg", "pll_u", "ulpi-link";
resets = <&tegra_car 58>, <&tegra_car 22>; resets = <&tegra_car 58>, <&tegra_car 22>;
reset-names = "usb", "utmi-pads"; reset-names = "usb", "utmi-pads";
......
...@@ -536,4 +536,14 @@ THUMB( orr \reg , \reg , #PSR_T_BIT ) ...@@ -536,4 +536,14 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
#endif #endif
.endm .endm
#ifdef CONFIG_KPROBES
#define _ASM_NOKPROBE(entry) \
.pushsection "_kprobe_blacklist", "aw" ; \
.balign 4 ; \
.long entry; \
.popsection
#else
#define _ASM_NOKPROBE(entry)
#endif
#endif /* __ASM_ASSEMBLER_H__ */ #endif /* __ASM_ASSEMBLER_H__ */
...@@ -309,6 +309,22 @@ static inline unsigned int kvm_get_vmid_bits(void) ...@@ -309,6 +309,22 @@ static inline unsigned int kvm_get_vmid_bits(void)
return 8; return 8;
} }
/*
* We are not in the kvm->srcu critical section most of the time, so we take
* the SRCU read lock here. Since we copy the data from the user page, we
* can immediately drop the lock again.
*/
static inline int kvm_read_guest_lock(struct kvm *kvm,
gpa_t gpa, void *data, unsigned long len)
{
int srcu_idx = srcu_read_lock(&kvm->srcu);
int ret = kvm_read_guest(kvm, gpa, data, len);
srcu_read_unlock(&kvm->srcu, srcu_idx);
return ret;
}
static inline void *kvm_get_hyp_vector(void) static inline void *kvm_get_hyp_vector(void)
{ {
return kvm_ksym_ref(__kvm_hyp_vector); return kvm_ksym_ref(__kvm_hyp_vector);
......
#ifndef __ASM_SIGINFO_H
#define __ASM_SIGINFO_H
#include <asm-generic/siginfo.h>
/*
* SIGFPE si_codes
*/
#ifdef __KERNEL__
#define FPE_FIXME 0 /* Broken dup of SI_USER */
#endif /* __KERNEL__ */
#endif
...@@ -83,7 +83,7 @@ void machine_crash_nonpanic_core(void *unused) ...@@ -83,7 +83,7 @@ void machine_crash_nonpanic_core(void *unused)
{ {
struct pt_regs regs; struct pt_regs regs;
crash_setup_regs(&regs, NULL); crash_setup_regs(&regs, get_irq_regs());
printk(KERN_DEBUG "CPU %u will stop doing anything useful since another CPU has crashed\n", printk(KERN_DEBUG "CPU %u will stop doing anything useful since another CPU has crashed\n",
smp_processor_id()); smp_processor_id());
crash_save_cpu(&regs, smp_processor_id()); crash_save_cpu(&regs, smp_processor_id());
...@@ -95,6 +95,27 @@ void machine_crash_nonpanic_core(void *unused) ...@@ -95,6 +95,27 @@ void machine_crash_nonpanic_core(void *unused)
cpu_relax(); cpu_relax();
} }
void crash_smp_send_stop(void)
{
static int cpus_stopped;
unsigned long msecs;
if (cpus_stopped)
return;
atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
smp_call_function(machine_crash_nonpanic_core, NULL, false);
msecs = 1000; /* Wait at most a second for the other cpus to stop */
while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
mdelay(1);
msecs--;
}
if (atomic_read(&waiting_for_crash_ipi) > 0)
pr_warn("Non-crashing CPUs did not react to IPI\n");
cpus_stopped = 1;
}
static void machine_kexec_mask_interrupts(void) static void machine_kexec_mask_interrupts(void)
{ {
unsigned int i; unsigned int i;
...@@ -120,19 +141,8 @@ static void machine_kexec_mask_interrupts(void) ...@@ -120,19 +141,8 @@ static void machine_kexec_mask_interrupts(void)
void machine_crash_shutdown(struct pt_regs *regs) void machine_crash_shutdown(struct pt_regs *regs)
{ {
unsigned long msecs;
local_irq_disable(); local_irq_disable();
crash_smp_send_stop();
atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
smp_call_function(machine_crash_nonpanic_core, NULL, false);
msecs = 1000; /* Wait at most a second for the other cpus to stop */
while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
mdelay(1);
msecs--;
}
if (atomic_read(&waiting_for_crash_ipi) > 0)
pr_warn("Non-crashing CPUs did not react to IPI\n");
crash_save_cpu(regs, smp_processor_id()); crash_save_cpu(regs, smp_processor_id());
machine_kexec_mask_interrupts(); machine_kexec_mask_interrupts();
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/hardirq.h> #include <linux/hardirq.h>
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/kprobes.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kexec.h> #include <linux/kexec.h>
#include <linux/bug.h> #include <linux/bug.h>
...@@ -417,7 +418,8 @@ void unregister_undef_hook(struct undef_hook *hook) ...@@ -417,7 +418,8 @@ void unregister_undef_hook(struct undef_hook *hook)
raw_spin_unlock_irqrestore(&undef_lock, flags); raw_spin_unlock_irqrestore(&undef_lock, flags);
} }
static int call_undef_hook(struct pt_regs *regs, unsigned int instr) static nokprobe_inline
int call_undef_hook(struct pt_regs *regs, unsigned int instr)
{ {
struct undef_hook *hook; struct undef_hook *hook;
unsigned long flags; unsigned long flags;
...@@ -490,6 +492,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs) ...@@ -490,6 +492,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs)
arm_notify_die("Oops - undefined instruction", regs, &info, 0, 6); arm_notify_die("Oops - undefined instruction", regs, &info, 0, 6);
} }
NOKPROBE_SYMBOL(do_undefinstr)
/* /*
* Handle FIQ similarly to NMI on x86 systems. * Handle FIQ similarly to NMI on x86 systems.
......
...@@ -38,6 +38,7 @@ ENTRY(__get_user_1) ...@@ -38,6 +38,7 @@ ENTRY(__get_user_1)
mov r0, #0 mov r0, #0
ret lr ret lr
ENDPROC(__get_user_1) ENDPROC(__get_user_1)
_ASM_NOKPROBE(__get_user_1)
ENTRY(__get_user_2) ENTRY(__get_user_2)
check_uaccess r0, 2, r1, r2, __get_user_bad check_uaccess r0, 2, r1, r2, __get_user_bad
...@@ -58,6 +59,7 @@ rb .req r0 ...@@ -58,6 +59,7 @@ rb .req r0
mov r0, #0 mov r0, #0
ret lr ret lr
ENDPROC(__get_user_2) ENDPROC(__get_user_2)
_ASM_NOKPROBE(__get_user_2)
ENTRY(__get_user_4) ENTRY(__get_user_4)
check_uaccess r0, 4, r1, r2, __get_user_bad check_uaccess r0, 4, r1, r2, __get_user_bad
...@@ -65,6 +67,7 @@ ENTRY(__get_user_4) ...@@ -65,6 +67,7 @@ ENTRY(__get_user_4)
mov r0, #0 mov r0, #0
ret lr ret lr
ENDPROC(__get_user_4) ENDPROC(__get_user_4)
_ASM_NOKPROBE(__get_user_4)
ENTRY(__get_user_8) ENTRY(__get_user_8)
check_uaccess r0, 8, r1, r2, __get_user_bad8 check_uaccess r0, 8, r1, r2, __get_user_bad8
...@@ -78,6 +81,7 @@ ENTRY(__get_user_8) ...@@ -78,6 +81,7 @@ ENTRY(__get_user_8)
mov r0, #0 mov r0, #0
ret lr ret lr
ENDPROC(__get_user_8) ENDPROC(__get_user_8)
_ASM_NOKPROBE(__get_user_8)
#ifdef __ARMEB__ #ifdef __ARMEB__
ENTRY(__get_user_32t_8) ENTRY(__get_user_32t_8)
...@@ -91,6 +95,7 @@ ENTRY(__get_user_32t_8) ...@@ -91,6 +95,7 @@ ENTRY(__get_user_32t_8)
mov r0, #0 mov r0, #0
ret lr ret lr
ENDPROC(__get_user_32t_8) ENDPROC(__get_user_32t_8)
_ASM_NOKPROBE(__get_user_32t_8)
ENTRY(__get_user_64t_1) ENTRY(__get_user_64t_1)
check_uaccess r0, 1, r1, r2, __get_user_bad8 check_uaccess r0, 1, r1, r2, __get_user_bad8
...@@ -98,6 +103,7 @@ ENTRY(__get_user_64t_1) ...@@ -98,6 +103,7 @@ ENTRY(__get_user_64t_1)
mov r0, #0 mov r0, #0
ret lr ret lr
ENDPROC(__get_user_64t_1) ENDPROC(__get_user_64t_1)
_ASM_NOKPROBE(__get_user_64t_1)
ENTRY(__get_user_64t_2) ENTRY(__get_user_64t_2)
check_uaccess r0, 2, r1, r2, __get_user_bad8 check_uaccess r0, 2, r1, r2, __get_user_bad8
...@@ -114,6 +120,7 @@ rb .req r0 ...@@ -114,6 +120,7 @@ rb .req r0
mov r0, #0 mov r0, #0
ret lr ret lr
ENDPROC(__get_user_64t_2) ENDPROC(__get_user_64t_2)
_ASM_NOKPROBE(__get_user_64t_2)
ENTRY(__get_user_64t_4) ENTRY(__get_user_64t_4)
check_uaccess r0, 4, r1, r2, __get_user_bad8 check_uaccess r0, 4, r1, r2, __get_user_bad8
...@@ -121,6 +128,7 @@ ENTRY(__get_user_64t_4) ...@@ -121,6 +128,7 @@ ENTRY(__get_user_64t_4)
mov r0, #0 mov r0, #0
ret lr ret lr
ENDPROC(__get_user_64t_4) ENDPROC(__get_user_64t_4)
_ASM_NOKPROBE(__get_user_64t_4)
#endif #endif
__get_user_bad8: __get_user_bad8:
...@@ -131,6 +139,8 @@ __get_user_bad: ...@@ -131,6 +139,8 @@ __get_user_bad:
ret lr ret lr
ENDPROC(__get_user_bad) ENDPROC(__get_user_bad)
ENDPROC(__get_user_bad8) ENDPROC(__get_user_bad8)
_ASM_NOKPROBE(__get_user_bad)
_ASM_NOKPROBE(__get_user_bad8)
.pushsection __ex_table, "a" .pushsection __ex_table, "a"
.long 1b, __get_user_bad .long 1b, __get_user_bad
......
...@@ -205,12 +205,17 @@ static const short da830_evm_mmc_sd_pins[] = { ...@@ -205,12 +205,17 @@ static const short da830_evm_mmc_sd_pins[] = {
-1 -1
}; };
#define DA830_MMCSD_WP_PIN GPIO_TO_PIN(2, 1)
#define DA830_MMCSD_CD_PIN GPIO_TO_PIN(2, 2)
static struct gpiod_lookup_table mmc_gpios_table = { static struct gpiod_lookup_table mmc_gpios_table = {
.dev_id = "da830-mmc.0", .dev_id = "da830-mmc.0",
.table = { .table = {
/* gpio chip 1 contains gpio range 32-63 */ /* gpio chip 1 contains gpio range 32-63 */
GPIO_LOOKUP("davinci_gpio.1", 2, "cd", GPIO_ACTIVE_LOW), GPIO_LOOKUP("davinci_gpio.0", DA830_MMCSD_CD_PIN, "cd",
GPIO_LOOKUP("davinci_gpio.1", 1, "wp", GPIO_ACTIVE_LOW), GPIO_ACTIVE_LOW),
GPIO_LOOKUP("davinci_gpio.0", DA830_MMCSD_WP_PIN, "wp",
GPIO_ACTIVE_LOW),
}, },
}; };
......
...@@ -763,12 +763,17 @@ static const short da850_evm_mcasp_pins[] __initconst = { ...@@ -763,12 +763,17 @@ static const short da850_evm_mcasp_pins[] __initconst = {
-1 -1
}; };
#define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0)
#define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1)
static struct gpiod_lookup_table mmc_gpios_table = { static struct gpiod_lookup_table mmc_gpios_table = {
.dev_id = "da830-mmc.0", .dev_id = "da830-mmc.0",
.table = { .table = {
/* gpio chip 2 contains gpio range 64-95 */ /* gpio chip 2 contains gpio range 64-95 */
GPIO_LOOKUP("davinci_gpio.2", 0, "cd", GPIO_ACTIVE_LOW), GPIO_LOOKUP("davinci_gpio.0", DA850_MMCSD_CD_PIN, "cd",
GPIO_LOOKUP("davinci_gpio.2", 1, "wp", GPIO_ACTIVE_LOW), GPIO_ACTIVE_LOW),
GPIO_LOOKUP("davinci_gpio.0", DA850_MMCSD_WP_PIN, "wp",
GPIO_ACTIVE_LOW),
}, },
}; };
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/machine.h> #include <linux/gpio/machine.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/dm9000.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/i2c/tvp514x.h> #include <media/i2c/tvp514x.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
...@@ -109,12 +110,15 @@ static struct platform_device davinci_nand_device = { ...@@ -109,12 +110,15 @@ static struct platform_device davinci_nand_device = {
}, },
}; };
#define DM355_I2C_SDA_PIN GPIO_TO_PIN(0, 15)
#define DM355_I2C_SCL_PIN GPIO_TO_PIN(0, 14)
static struct gpiod_lookup_table i2c_recovery_gpiod_table = { static struct gpiod_lookup_table i2c_recovery_gpiod_table = {
.dev_id = "i2c_davinci", .dev_id = "i2c_davinci.1",
.table = { .table = {
GPIO_LOOKUP("davinci_gpio", 15, "sda", GPIO_LOOKUP("davinci_gpio.0", DM355_I2C_SDA_PIN, "sda",
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
GPIO_LOOKUP("davinci_gpio", 14, "scl", GPIO_LOOKUP("davinci_gpio.0", DM355_I2C_SCL_PIN, "scl",
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
}, },
}; };
...@@ -179,11 +183,16 @@ static struct resource dm355evm_dm9000_rsrc[] = { ...@@ -179,11 +183,16 @@ static struct resource dm355evm_dm9000_rsrc[] = {
}, },
}; };
static struct dm9000_plat_data dm335evm_dm9000_platdata;
static struct platform_device dm355evm_dm9000 = { static struct platform_device dm355evm_dm9000 = {
.name = "dm9000", .name = "dm9000",
.id = -1, .id = -1,
.resource = dm355evm_dm9000_rsrc, .resource = dm355evm_dm9000_rsrc,
.num_resources = ARRAY_SIZE(dm355evm_dm9000_rsrc), .num_resources = ARRAY_SIZE(dm355evm_dm9000_rsrc),
.dev = {
.platform_data = &dm335evm_dm9000_platdata,
},
}; };
static struct tvp514x_platform_data tvp5146_pdata = { static struct tvp514x_platform_data tvp5146_pdata = {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/platform_data/pcf857x.h> #include <linux/platform_data/pcf857x.h>
#include <linux/platform_data/at24.h> #include <linux/platform_data/at24.h>
#include <linux/platform_data/gpio-davinci.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/rawnand.h> #include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
...@@ -596,12 +597,15 @@ static struct i2c_board_info __initdata i2c_info[] = { ...@@ -596,12 +597,15 @@ static struct i2c_board_info __initdata i2c_info[] = {
}, },
}; };
#define DM644X_I2C_SDA_PIN GPIO_TO_PIN(2, 12)
#define DM644X_I2C_SCL_PIN GPIO_TO_PIN(2, 11)
static struct gpiod_lookup_table i2c_recovery_gpiod_table = { static struct gpiod_lookup_table i2c_recovery_gpiod_table = {
.dev_id = "i2c_davinci", .dev_id = "i2c_davinci.1",
.table = { .table = {
GPIO_LOOKUP("davinci_gpio", 44, "sda", GPIO_LOOKUP("davinci_gpio.0", DM644X_I2C_SDA_PIN, "sda",
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
GPIO_LOOKUP("davinci_gpio", 43, "scl", GPIO_LOOKUP("davinci_gpio.0", DM644X_I2C_SCL_PIN, "scl",
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
}, },
}; };
......
...@@ -532,11 +532,12 @@ static struct vpif_display_config dm646x_vpif_display_config = { ...@@ -532,11 +532,12 @@ static struct vpif_display_config dm646x_vpif_display_config = {
.set_clock = set_vpif_clock, .set_clock = set_vpif_clock,
.subdevinfo = dm646x_vpif_subdev, .subdevinfo = dm646x_vpif_subdev,
.subdev_count = ARRAY_SIZE(dm646x_vpif_subdev), .subdev_count = ARRAY_SIZE(dm646x_vpif_subdev),
.i2c_adapter_id = 1,
.chan_config[0] = { .chan_config[0] = {
.outputs = dm6467_ch0_outputs, .outputs = dm6467_ch0_outputs,
.output_count = ARRAY_SIZE(dm6467_ch0_outputs), .output_count = ARRAY_SIZE(dm6467_ch0_outputs),
}, },
.card_name = "DM646x EVM", .card_name = "DM646x EVM Video Display",
}; };
/** /**
...@@ -674,6 +675,7 @@ static struct vpif_capture_config dm646x_vpif_capture_cfg = { ...@@ -674,6 +675,7 @@ static struct vpif_capture_config dm646x_vpif_capture_cfg = {
.setup_input_channel_mode = setup_vpif_input_channel_mode, .setup_input_channel_mode = setup_vpif_input_channel_mode,
.subdev_info = vpif_capture_sdev_info, .subdev_info = vpif_capture_sdev_info,
.subdev_count = ARRAY_SIZE(vpif_capture_sdev_info), .subdev_count = ARRAY_SIZE(vpif_capture_sdev_info),
.i2c_adapter_id = 1,
.chan_config[0] = { .chan_config[0] = {
.inputs = dm6467_ch0_inputs, .inputs = dm6467_ch0_inputs,
.input_count = ARRAY_SIZE(dm6467_ch0_inputs), .input_count = ARRAY_SIZE(dm6467_ch0_inputs),
...@@ -694,6 +696,7 @@ static struct vpif_capture_config dm646x_vpif_capture_cfg = { ...@@ -694,6 +696,7 @@ static struct vpif_capture_config dm646x_vpif_capture_cfg = {
.fid_pol = 0, .fid_pol = 0,
}, },
}, },
.card_name = "DM646x EVM Video Capture",
}; };
static void __init evm_init_video(void) static void __init evm_init_video(void)
......
...@@ -123,12 +123,16 @@ static const short hawk_mmcsd0_pins[] = { ...@@ -123,12 +123,16 @@ static const short hawk_mmcsd0_pins[] = {
-1 -1
}; };
#define DA850_HAWK_MMCSD_CD_PIN GPIO_TO_PIN(3, 12)
#define DA850_HAWK_MMCSD_WP_PIN GPIO_TO_PIN(3, 13)
static struct gpiod_lookup_table mmc_gpios_table = { static struct gpiod_lookup_table mmc_gpios_table = {
.dev_id = "da830-mmc.0", .dev_id = "da830-mmc.0",
.table = { .table = {
/* CD: gpio3_12: gpio60: chip 1 contains gpio range 32-63*/ GPIO_LOOKUP("davinci_gpio.0", DA850_HAWK_MMCSD_CD_PIN, "cd",
GPIO_LOOKUP("davinci_gpio.0", 28, "cd", GPIO_ACTIVE_LOW), GPIO_ACTIVE_LOW),
GPIO_LOOKUP("davinci_gpio.0", 29, "wp", GPIO_ACTIVE_LOW), GPIO_LOOKUP("davinci_gpio.0", DA850_HAWK_MMCSD_WP_PIN, "wp",
GPIO_ACTIVE_LOW),
}, },
}; };
......
...@@ -488,7 +488,8 @@ static u8 dm646x_default_priorities[DAVINCI_N_AINTC_IRQ] = { ...@@ -488,7 +488,8 @@ static u8 dm646x_default_priorities[DAVINCI_N_AINTC_IRQ] = {
[IRQ_DM646X_MCASP0TXINT] = 7, [IRQ_DM646X_MCASP0TXINT] = 7,
[IRQ_DM646X_MCASP0RXINT] = 7, [IRQ_DM646X_MCASP0RXINT] = 7,
[IRQ_DM646X_RESERVED_3] = 7, [IRQ_DM646X_RESERVED_3] = 7,
[IRQ_DM646X_MCASP1TXINT] = 7, /* clockevent */ [IRQ_DM646X_MCASP1TXINT] = 7,
[IRQ_TINT0_TINT12] = 7, /* clockevent */
[IRQ_TINT0_TINT34] = 7, /* clocksource */ [IRQ_TINT0_TINT34] = 7, /* clocksource */
[IRQ_TINT1_TINT12] = 7, /* DSP timer */ [IRQ_TINT1_TINT12] = 7, /* DSP timer */
[IRQ_TINT1_TINT34] = 7, /* system tick */ [IRQ_TINT1_TINT34] = 7, /* system tick */
......
...@@ -29,6 +29,7 @@ static struct dev_pm_domain keystone_pm_domain = { ...@@ -29,6 +29,7 @@ static struct dev_pm_domain keystone_pm_domain = {
static struct pm_clk_notifier_block platform_domain_notifier = { static struct pm_clk_notifier_block platform_domain_notifier = {
.pm_domain = &keystone_pm_domain, .pm_domain = &keystone_pm_domain,
.con_ids = { NULL },
}; };
static const struct of_device_id of_keystone_table[] = { static const struct of_device_id of_keystone_table[] = {
......
...@@ -58,22 +58,24 @@ static irqreturn_t deferred_fiq(int irq, void *dev_id) ...@@ -58,22 +58,24 @@ static irqreturn_t deferred_fiq(int irq, void *dev_id)
irq_num = gpio_to_irq(gpio); irq_num = gpio_to_irq(gpio);
fiq_count = fiq_buffer[FIQ_CNT_INT_00 + gpio]; fiq_count = fiq_buffer[FIQ_CNT_INT_00 + gpio];
while (irq_counter[gpio] < fiq_count) { if (irq_counter[gpio] < fiq_count &&
if (gpio != AMS_DELTA_GPIO_PIN_KEYBRD_CLK) { gpio != AMS_DELTA_GPIO_PIN_KEYBRD_CLK) {
struct irq_data *d = irq_get_irq_data(irq_num); struct irq_data *d = irq_get_irq_data(irq_num);
/* /*
* It looks like handle_edge_irq() that * handle_simple_irq() that OMAP GPIO edge
* OMAP GPIO edge interrupts default to, * interrupts default to since commit 80ac93c27441
* expects interrupt already unmasked. * requires interrupt already acked and unmasked.
*/ */
if (irq_chip && irq_chip->irq_unmask) if (irq_chip) {
if (irq_chip->irq_ack)
irq_chip->irq_ack(d);
if (irq_chip->irq_unmask)
irq_chip->irq_unmask(d); irq_chip->irq_unmask(d);
} }
generic_handle_irq(irq_num);
irq_counter[gpio]++;
} }
for (; irq_counter[gpio] < fiq_count; irq_counter[gpio]++)
generic_handle_irq(irq_num);
} }
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -188,7 +188,7 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) ...@@ -188,7 +188,7 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
((prev & OMAP_POWERSTATE_MASK) << 0)); ((prev & OMAP_POWERSTATE_MASK) << 0));
trace_power_domain_target_rcuidle(pwrdm->name, trace_power_domain_target_rcuidle(pwrdm->name,
trace_state, trace_state,
smp_processor_id()); raw_smp_processor_id());
} }
break; break;
default: default:
...@@ -518,7 +518,7 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) ...@@ -518,7 +518,7 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) { if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) {
/* Trace the pwrdm desired target state */ /* Trace the pwrdm desired target state */
trace_power_domain_target_rcuidle(pwrdm->name, pwrst, trace_power_domain_target_rcuidle(pwrdm->name, pwrst,
smp_processor_id()); raw_smp_processor_id());
/* Program the pwrdm desired target state */ /* Program the pwrdm desired target state */
ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst); ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
} }
......
...@@ -165,13 +165,14 @@ optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs) ...@@ -165,13 +165,14 @@ optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs)
{ {
unsigned long flags; unsigned long flags;
struct kprobe *p = &op->kp; struct kprobe *p = &op->kp;
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); struct kprobe_ctlblk *kcb;
/* Save skipped registers */ /* Save skipped registers */
regs->ARM_pc = (unsigned long)op->kp.addr; regs->ARM_pc = (unsigned long)op->kp.addr;
regs->ARM_ORIG_r0 = ~0UL; regs->ARM_ORIG_r0 = ~0UL;
local_irq_save(flags); local_irq_save(flags);
kcb = get_kprobe_ctlblk();
if (kprobe_running()) { if (kprobe_running()) {
kprobes_inc_nmissed_count(&op->kp); kprobes_inc_nmissed_count(&op->kp);
...@@ -191,6 +192,7 @@ optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs) ...@@ -191,6 +192,7 @@ optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs)
local_irq_restore(flags); local_irq_restore(flags);
} }
NOKPROBE_SYMBOL(optimized_callback)
int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *orig) int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *orig)
{ {
......
...@@ -257,7 +257,7 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_ ...@@ -257,7 +257,7 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_
if (exceptions == VFP_EXCEPTION_ERROR) { if (exceptions == VFP_EXCEPTION_ERROR) {
vfp_panic("unhandled bounce", inst); vfp_panic("unhandled bounce", inst);
vfp_raise_sigfpe(FPE_FIXME, regs); vfp_raise_sigfpe(FPE_FLTINV, regs);
return; return;
} }
......
...@@ -1317,7 +1317,7 @@ ...@@ -1317,7 +1317,7 @@
reg = <0x14d60000 0x100>; reg = <0x14d60000 0x100>;
dmas = <&pdma0 31 &pdma0 30>; dmas = <&pdma0 31 &pdma0 30>;
dma-names = "tx", "rx"; dma-names = "tx", "rx";
interrupts = <GIC_SPI 435 IRQ_TYPE_NONE>; interrupts = <GIC_SPI 435 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cmu_peric CLK_PCLK_I2S1>, clocks = <&cmu_peric CLK_PCLK_I2S1>,
<&cmu_peric CLK_PCLK_I2S1>, <&cmu_peric CLK_PCLK_I2S1>,
<&cmu_peric CLK_SCLK_I2S1>; <&cmu_peric CLK_SCLK_I2S1>;
......
...@@ -38,9 +38,10 @@ ...@@ -38,9 +38,10 @@
compatible = "marvell,armada-7k-pp22"; compatible = "marvell,armada-7k-pp22";
reg = <0x0 0x100000>, <0x129000 0xb000>; reg = <0x0 0x100000>, <0x129000 0xb000>;
clocks = <&CP110_LABEL(clk) 1 3>, <&CP110_LABEL(clk) 1 9>, clocks = <&CP110_LABEL(clk) 1 3>, <&CP110_LABEL(clk) 1 9>,
<&CP110_LABEL(clk) 1 5>, <&CP110_LABEL(clk) 1 18>; <&CP110_LABEL(clk) 1 5>, <&CP110_LABEL(clk) 1 6>,
<&CP110_LABEL(clk) 1 18>;
clock-names = "pp_clk", "gop_clk", clock-names = "pp_clk", "gop_clk",
"mg_clk", "axi_clk"; "mg_clk", "mg_core_clk", "axi_clk";
marvell,system-controller = <&CP110_LABEL(syscon0)>; marvell,system-controller = <&CP110_LABEL(syscon0)>;
status = "disabled"; status = "disabled";
dma-coherent; dma-coherent;
...@@ -141,6 +142,8 @@ ...@@ -141,6 +142,8 @@
#size-cells = <0>; #size-cells = <0>;
compatible = "marvell,xmdio"; compatible = "marvell,xmdio";
reg = <0x12a600 0x10>; reg = <0x12a600 0x10>;
clocks = <&CP110_LABEL(clk) 1 5>,
<&CP110_LABEL(clk) 1 6>, <&CP110_LABEL(clk) 1 18>;
status = "disabled"; status = "disabled";
}; };
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
compatible = "ethernet-phy-ieee802.3-c22"; compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x0>; reg = <0x0>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <TEGRA_MAIN_GPIO(M, 5) IRQ_TYPE_LEVEL_HIGH>; interrupts = <TEGRA_MAIN_GPIO(M, 5) IRQ_TYPE_LEVEL_LOW>;
}; };
}; };
}; };
......
...@@ -414,7 +414,7 @@ ...@@ -414,7 +414,7 @@
mmc-ddr-1_8v; mmc-ddr-1_8v;
mmc-hs200-1_8v; mmc-hs200-1_8v;
mmc-pwrseq = <&emmc_pwrseq>; mmc-pwrseq = <&emmc_pwrseq>;
cdns,phy-input-delay-legacy = <4>; cdns,phy-input-delay-legacy = <9>;
cdns,phy-input-delay-mmc-highspeed = <2>; cdns,phy-input-delay-mmc-highspeed = <2>;
cdns,phy-input-delay-mmc-ddr = <3>; cdns,phy-input-delay-mmc-ddr = <3>;
cdns,phy-dll-delay-sdclk = <21>; cdns,phy-dll-delay-sdclk = <21>;
......
...@@ -67,3 +67,11 @@ ...@@ -67,3 +67,11 @@
reg = <0>; reg = <0>;
}; };
}; };
&pinctrl_ether_rgmii {
tx {
pins = "RGMII_TXCLK", "RGMII_TXD0", "RGMII_TXD1",
"RGMII_TXD2", "RGMII_TXD3", "RGMII_TXCTL";
drive-strength = <9>;
};
};
...@@ -519,7 +519,7 @@ ...@@ -519,7 +519,7 @@
mmc-ddr-1_8v; mmc-ddr-1_8v;
mmc-hs200-1_8v; mmc-hs200-1_8v;
mmc-pwrseq = <&emmc_pwrseq>; mmc-pwrseq = <&emmc_pwrseq>;
cdns,phy-input-delay-legacy = <4>; cdns,phy-input-delay-legacy = <9>;
cdns,phy-input-delay-mmc-highspeed = <2>; cdns,phy-input-delay-mmc-highspeed = <2>;
cdns,phy-input-delay-mmc-ddr = <3>; cdns,phy-input-delay-mmc-ddr = <3>;
cdns,phy-dll-delay-sdclk = <21>; cdns,phy-dll-delay-sdclk = <21>;
......
...@@ -334,7 +334,7 @@ ...@@ -334,7 +334,7 @@
mmc-ddr-1_8v; mmc-ddr-1_8v;
mmc-hs200-1_8v; mmc-hs200-1_8v;
mmc-pwrseq = <&emmc_pwrseq>; mmc-pwrseq = <&emmc_pwrseq>;
cdns,phy-input-delay-legacy = <4>; cdns,phy-input-delay-legacy = <9>;
cdns,phy-input-delay-mmc-highspeed = <2>; cdns,phy-input-delay-mmc-highspeed = <2>;
cdns,phy-input-delay-mmc-ddr = <3>; cdns,phy-input-delay-mmc-ddr = <3>;
cdns,phy-dll-delay-sdclk = <21>; cdns,phy-dll-delay-sdclk = <21>;
......
...@@ -75,6 +75,7 @@ ...@@ -75,6 +75,7 @@
#define ARM_CPU_IMP_CAVIUM 0x43 #define ARM_CPU_IMP_CAVIUM 0x43
#define ARM_CPU_IMP_BRCM 0x42 #define ARM_CPU_IMP_BRCM 0x42
#define ARM_CPU_IMP_QCOM 0x51 #define ARM_CPU_IMP_QCOM 0x51
#define ARM_CPU_IMP_NVIDIA 0x4E
#define ARM_CPU_PART_AEM_V8 0xD0F #define ARM_CPU_PART_AEM_V8 0xD0F
#define ARM_CPU_PART_FOUNDATION 0xD00 #define ARM_CPU_PART_FOUNDATION 0xD00
...@@ -99,6 +100,9 @@ ...@@ -99,6 +100,9 @@
#define QCOM_CPU_PART_FALKOR 0xC00 #define QCOM_CPU_PART_FALKOR 0xC00
#define QCOM_CPU_PART_KRYO 0x200 #define QCOM_CPU_PART_KRYO 0x200
#define NVIDIA_CPU_PART_DENVER 0x003
#define NVIDIA_CPU_PART_CARMEL 0x004
#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53) #define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57) #define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
#define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72) #define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
...@@ -114,6 +118,8 @@ ...@@ -114,6 +118,8 @@
#define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1) #define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
#define MIDR_QCOM_FALKOR MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR) #define MIDR_QCOM_FALKOR MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR)
#define MIDR_QCOM_KRYO MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO) #define MIDR_QCOM_KRYO MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO)
#define MIDR_NVIDIA_DENVER MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_DENVER)
#define MIDR_NVIDIA_CARMEL MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_CARMEL)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
......
...@@ -360,6 +360,22 @@ static inline unsigned int kvm_get_vmid_bits(void) ...@@ -360,6 +360,22 @@ static inline unsigned int kvm_get_vmid_bits(void)
return (cpuid_feature_extract_unsigned_field(reg, ID_AA64MMFR1_VMIDBITS_SHIFT) == 2) ? 16 : 8; return (cpuid_feature_extract_unsigned_field(reg, ID_AA64MMFR1_VMIDBITS_SHIFT) == 2) ? 16 : 8;
} }
/*
* We are not in the kvm->srcu critical section most of the time, so we take
* the SRCU read lock here. Since we copy the data from the user page, we
* can immediately drop the lock again.
*/
static inline int kvm_read_guest_lock(struct kvm *kvm,
gpa_t gpa, void *data, unsigned long len)
{
int srcu_idx = srcu_read_lock(&kvm->srcu);
int ret = kvm_read_guest(kvm, gpa, data, len);
srcu_read_unlock(&kvm->srcu, srcu_idx);
return ret;
}
#ifdef CONFIG_KVM_INDIRECT_VECTORS #ifdef CONFIG_KVM_INDIRECT_VECTORS
/* /*
* EL2 vectors can be mapped and rerouted in a number of ways, * EL2 vectors can be mapped and rerouted in a number of ways,
......
...@@ -316,6 +316,7 @@ static const struct midr_range arm64_bp_harden_smccc_cpus[] = { ...@@ -316,6 +316,7 @@ static const struct midr_range arm64_bp_harden_smccc_cpus[] = {
MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2), MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2),
MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR_V1), MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR_V1),
MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR), MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR),
MIDR_ALL_VERSIONS(MIDR_NVIDIA_DENVER),
{}, {},
}; };
......
...@@ -646,8 +646,10 @@ static int keep_initrd __initdata; ...@@ -646,8 +646,10 @@ static int keep_initrd __initdata;
void __init free_initrd_mem(unsigned long start, unsigned long end) void __init free_initrd_mem(unsigned long start, unsigned long end)
{ {
if (!keep_initrd) if (!keep_initrd) {
free_reserved_area((void *)start, (void *)end, 0, "initrd"); free_reserved_area((void *)start, (void *)end, 0, "initrd");
memblock_free(__virt_to_phys(start), end - start);
}
} }
static int __init keepinitrd_setup(char *__unused) static int __init keepinitrd_setup(char *__unused)
......
...@@ -268,7 +268,7 @@ static struct parisc_device *find_device_by_addr(unsigned long hpa) ...@@ -268,7 +268,7 @@ static struct parisc_device *find_device_by_addr(unsigned long hpa)
* Walks up the device tree looking for a device of the specified type. * Walks up the device tree looking for a device of the specified type.
* If it finds it, it returns it. If not, it returns NULL. * If it finds it, it returns it. If not, it returns NULL.
*/ */
const struct parisc_device * __init const struct parisc_device *
find_pa_parent_type(const struct parisc_device *padev, int type) find_pa_parent_type(const struct parisc_device *padev, int type)
{ {
const struct device *dev = &padev->dev; const struct device *dev = &padev->dev;
......
...@@ -423,8 +423,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle) ...@@ -423,8 +423,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)
} }
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
int __init int setup_profiling_timer(unsigned int multiplier)
setup_profiling_timer(unsigned int multiplier)
{ {
return -EINVAL; return -EINVAL;
} }
......
...@@ -69,17 +69,30 @@ struct dyn_arch_ftrace { ...@@ -69,17 +69,30 @@ struct dyn_arch_ftrace {
#endif #endif
#if defined(CONFIG_FTRACE_SYSCALLS) && !defined(__ASSEMBLY__) #if defined(CONFIG_FTRACE_SYSCALLS) && !defined(__ASSEMBLY__)
#ifdef PPC64_ELF_ABI_v1 /*
* Some syscall entry functions on powerpc start with "ppc_" (fork and clone,
* for instance) or ppc32_/ppc64_. We should also match the sys_ variant with
* those.
*/
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME #define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
#ifdef PPC64_ELF_ABI_v1
static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
{
/* We need to skip past the initial dot, and the __se_sys alias */
return !strcmp(sym + 1, name) ||
(!strncmp(sym, ".__se_sys", 9) && !strcmp(sym + 6, name)) ||
(!strncmp(sym, ".ppc_", 5) && !strcmp(sym + 5, name + 4)) ||
(!strncmp(sym, ".ppc32_", 7) && !strcmp(sym + 7, name + 4)) ||
(!strncmp(sym, ".ppc64_", 7) && !strcmp(sym + 7, name + 4));
}
#else
static inline bool arch_syscall_match_sym_name(const char *sym, const char *name) static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
{ {
/* return !strcmp(sym, name) ||
* Compare the symbol name with the system call name. Skip the .sys or .SyS (!strncmp(sym, "__se_sys", 8) && !strcmp(sym + 5, name)) ||
* prefix from the symbol name and the sys prefix from the system call name and (!strncmp(sym, "ppc_", 4) && !strcmp(sym + 4, name + 4)) ||
* just match the rest. This is only needed on ppc64 since symbol names on (!strncmp(sym, "ppc32_", 6) && !strcmp(sym + 6, name + 4)) ||
* 32bit do not start with a period so the generic function will work. (!strncmp(sym, "ppc64_", 6) && !strcmp(sym + 6, name + 4));
*/
return !strcmp(sym + 4, name + 3);
} }
#endif #endif
#endif /* CONFIG_FTRACE_SYSCALLS && !__ASSEMBLY__ */ #endif /* CONFIG_FTRACE_SYSCALLS && !__ASSEMBLY__ */
......
...@@ -165,7 +165,6 @@ struct paca_struct { ...@@ -165,7 +165,6 @@ struct paca_struct {
u64 saved_msr; /* MSR saved here by enter_rtas */ u64 saved_msr; /* MSR saved here by enter_rtas */
u16 trap_save; /* Used when bad stack is encountered */ u16 trap_save; /* Used when bad stack is encountered */
u8 irq_soft_mask; /* mask for irq soft masking */ u8 irq_soft_mask; /* mask for irq soft masking */
u8 soft_enabled; /* irq soft-enable flag */
u8 irq_happened; /* irq happened while soft-disabled */ u8 irq_happened; /* irq happened while soft-disabled */
u8 io_sync; /* writel() needs spin_unlock sync */ u8 io_sync; /* writel() needs spin_unlock sync */
u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */ u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */
......
...@@ -91,6 +91,7 @@ extern int start_topology_update(void); ...@@ -91,6 +91,7 @@ extern int start_topology_update(void);
extern int stop_topology_update(void); extern int stop_topology_update(void);
extern int prrn_is_enabled(void); extern int prrn_is_enabled(void);
extern int find_and_online_cpu_nid(int cpu); extern int find_and_online_cpu_nid(int cpu);
extern int timed_topology_update(int nsecs);
#else #else
static inline int start_topology_update(void) static inline int start_topology_update(void)
{ {
...@@ -108,16 +109,12 @@ static inline int find_and_online_cpu_nid(int cpu) ...@@ -108,16 +109,12 @@ static inline int find_and_online_cpu_nid(int cpu)
{ {
return 0; return 0;
} }
static inline int timed_topology_update(int nsecs)
{
return 0;
}
#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */ #endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_NEED_MULTIPLE_NODES)
#if defined(CONFIG_PPC_SPLPAR)
extern int timed_topology_update(int nsecs);
#else
#define timed_topology_update(nsecs)
#endif /* CONFIG_PPC_SPLPAR */
#endif /* CONFIG_HOTPLUG_CPU || CONFIG_NEED_MULTIPLE_NODES */
#include <asm-generic/topology.h> #include <asm-generic/topology.h>
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
...@@ -44,6 +44,10 @@ static ssize_t opal_nvram_read(char *buf, size_t count, loff_t *index) ...@@ -44,6 +44,10 @@ static ssize_t opal_nvram_read(char *buf, size_t count, loff_t *index)
return count; return count;
} }
/*
* This can be called in the panic path with interrupts off, so use
* mdelay in that case.
*/
static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index)
{ {
s64 rc = OPAL_BUSY; s64 rc = OPAL_BUSY;
...@@ -58,10 +62,16 @@ static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) ...@@ -58,10 +62,16 @@ static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index)
while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) {
rc = opal_write_nvram(__pa(buf), count, off); rc = opal_write_nvram(__pa(buf), count, off);
if (rc == OPAL_BUSY_EVENT) { if (rc == OPAL_BUSY_EVENT) {
msleep(OPAL_BUSY_DELAY_MS); if (in_interrupt() || irqs_disabled())
mdelay(OPAL_BUSY_DELAY_MS);
else
msleep(OPAL_BUSY_DELAY_MS);
opal_poll_events(NULL); opal_poll_events(NULL);
} else if (rc == OPAL_BUSY) { } else if (rc == OPAL_BUSY) {
msleep(OPAL_BUSY_DELAY_MS); if (in_interrupt() || irqs_disabled())
mdelay(OPAL_BUSY_DELAY_MS);
else
msleep(OPAL_BUSY_DELAY_MS);
} }
} }
......
...@@ -261,9 +261,9 @@ CONFIG_IP_VS_NQ=m ...@@ -261,9 +261,9 @@ CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m CONFIG_IP_VS_PE_SIP=m
CONFIG_NF_CONNTRACK_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_NF_TABLES_IPV4=m CONFIG_NF_TABLES_IPV4=y
CONFIG_NFT_CHAIN_ROUTE_IPV4=m CONFIG_NFT_CHAIN_ROUTE_IPV4=m
CONFIG_NF_TABLES_ARP=m CONFIG_NF_TABLES_ARP=y
CONFIG_NFT_CHAIN_NAT_IPV4=m CONFIG_NFT_CHAIN_NAT_IPV4=m
CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_AH=m
...@@ -284,7 +284,7 @@ CONFIG_IP_NF_ARPTABLES=m ...@@ -284,7 +284,7 @@ CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_NF_CONNTRACK_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m
CONFIG_NF_TABLES_IPV6=m CONFIG_NF_TABLES_IPV6=y
CONFIG_NFT_CHAIN_ROUTE_IPV6=m CONFIG_NFT_CHAIN_ROUTE_IPV6=m
CONFIG_NFT_CHAIN_NAT_IPV6=m CONFIG_NFT_CHAIN_NAT_IPV6=m
CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_IPTABLES=m
...@@ -305,7 +305,7 @@ CONFIG_IP6_NF_RAW=m ...@@ -305,7 +305,7 @@ CONFIG_IP6_NF_RAW=m
CONFIG_IP6_NF_SECURITY=m CONFIG_IP6_NF_SECURITY=m
CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_NAT=m
CONFIG_IP6_NF_TARGET_MASQUERADE=m CONFIG_IP6_NF_TARGET_MASQUERADE=m
CONFIG_NF_TABLES_BRIDGE=m CONFIG_NF_TABLES_BRIDGE=y
CONFIG_RDS=m CONFIG_RDS=m
CONFIG_RDS_RDMA=m CONFIG_RDS_RDMA=m
CONFIG_RDS_TCP=m CONFIG_RDS_TCP=m
...@@ -604,7 +604,6 @@ CONFIG_DETECT_HUNG_TASK=y ...@@ -604,7 +604,6 @@ CONFIG_DETECT_HUNG_TASK=y
CONFIG_WQ_WATCHDOG=y CONFIG_WQ_WATCHDOG=y
CONFIG_PANIC_ON_OOPS=y CONFIG_PANIC_ON_OOPS=y
CONFIG_DEBUG_TIMEKEEPING=y CONFIG_DEBUG_TIMEKEEPING=y
CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
CONFIG_PROVE_LOCKING=y CONFIG_PROVE_LOCKING=y
CONFIG_LOCK_STAT=y CONFIG_LOCK_STAT=y
CONFIG_DEBUG_LOCKDEP=y CONFIG_DEBUG_LOCKDEP=y
......
...@@ -259,9 +259,9 @@ CONFIG_IP_VS_NQ=m ...@@ -259,9 +259,9 @@ CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m CONFIG_IP_VS_PE_SIP=m
CONFIG_NF_CONNTRACK_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_NF_TABLES_IPV4=m CONFIG_NF_TABLES_IPV4=y
CONFIG_NFT_CHAIN_ROUTE_IPV4=m CONFIG_NFT_CHAIN_ROUTE_IPV4=m
CONFIG_NF_TABLES_ARP=m CONFIG_NF_TABLES_ARP=y
CONFIG_NFT_CHAIN_NAT_IPV4=m CONFIG_NFT_CHAIN_NAT_IPV4=m
CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_AH=m
...@@ -282,7 +282,7 @@ CONFIG_IP_NF_ARPTABLES=m ...@@ -282,7 +282,7 @@ CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_NF_CONNTRACK_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m
CONFIG_NF_TABLES_IPV6=m CONFIG_NF_TABLES_IPV6=y
CONFIG_NFT_CHAIN_ROUTE_IPV6=m CONFIG_NFT_CHAIN_ROUTE_IPV6=m
CONFIG_NFT_CHAIN_NAT_IPV6=m CONFIG_NFT_CHAIN_NAT_IPV6=m
CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_IPTABLES=m
...@@ -303,7 +303,7 @@ CONFIG_IP6_NF_RAW=m ...@@ -303,7 +303,7 @@ CONFIG_IP6_NF_RAW=m
CONFIG_IP6_NF_SECURITY=m CONFIG_IP6_NF_SECURITY=m
CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_NAT=m
CONFIG_IP6_NF_TARGET_MASQUERADE=m CONFIG_IP6_NF_TARGET_MASQUERADE=m
CONFIG_NF_TABLES_BRIDGE=m CONFIG_NF_TABLES_BRIDGE=y
CONFIG_RDS=m CONFIG_RDS=m
CONFIG_RDS_RDMA=m CONFIG_RDS_RDMA=m
CONFIG_RDS_TCP=m CONFIG_RDS_TCP=m
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/nospec-insn.h>
#include <asm/vx-insn.h> #include <asm/vx-insn.h>
/* Vector register range containing CRC-32 constants */ /* Vector register range containing CRC-32 constants */
...@@ -67,6 +68,8 @@ ...@@ -67,6 +68,8 @@
.previous .previous
GEN_BR_THUNK %r14
.text .text
/* /*
* The CRC-32 function(s) use these calling conventions: * The CRC-32 function(s) use these calling conventions:
...@@ -203,6 +206,6 @@ ENTRY(crc32_be_vgfm_16) ...@@ -203,6 +206,6 @@ ENTRY(crc32_be_vgfm_16)
.Ldone: .Ldone:
VLGVF %r2,%v2,3 VLGVF %r2,%v2,3
br %r14 BR_EX %r14
.previous .previous
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/nospec-insn.h>
#include <asm/vx-insn.h> #include <asm/vx-insn.h>
/* Vector register range containing CRC-32 constants */ /* Vector register range containing CRC-32 constants */
...@@ -76,6 +77,7 @@ ...@@ -76,6 +77,7 @@
.previous .previous
GEN_BR_THUNK %r14
.text .text
...@@ -264,6 +266,6 @@ crc32_le_vgfm_generic: ...@@ -264,6 +266,6 @@ crc32_le_vgfm_generic:
.Ldone: .Ldone:
VLGVF %r2,%v2,2 VLGVF %r2,%v2,2
br %r14 BR_EX %r14
.previous .previous
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_S390_NOSPEC_ASM_H
#define _ASM_S390_NOSPEC_ASM_H
#include <asm/alternative-asm.h>
#include <asm/asm-offsets.h>
#include <asm/dwarf.h>
#ifdef __ASSEMBLY__
#ifdef CONFIG_EXPOLINE
_LC_BR_R1 = __LC_BR_R1
/*
* The expoline macros are used to create thunks in the same format
* as gcc generates them. The 'comdat' section flag makes sure that
* the various thunks are merged into a single copy.
*/
.macro __THUNK_PROLOG_NAME name
.pushsection .text.\name,"axG",@progbits,\name,comdat
.globl \name
.hidden \name
.type \name,@function
\name:
CFI_STARTPROC
.endm
.macro __THUNK_EPILOG
CFI_ENDPROC
.popsection
.endm
.macro __THUNK_PROLOG_BR r1,r2
__THUNK_PROLOG_NAME __s390x_indirect_jump_r\r2\()use_r\r1
.endm
.macro __THUNK_PROLOG_BC d0,r1,r2
__THUNK_PROLOG_NAME __s390x_indirect_branch_\d0\()_\r2\()use_\r1
.endm
.macro __THUNK_BR r1,r2
jg __s390x_indirect_jump_r\r2\()use_r\r1
.endm
.macro __THUNK_BC d0,r1,r2
jg __s390x_indirect_branch_\d0\()_\r2\()use_\r1
.endm
.macro __THUNK_BRASL r1,r2,r3
brasl \r1,__s390x_indirect_jump_r\r3\()use_r\r2
.endm
.macro __DECODE_RR expand,reg,ruse
.set __decode_fail,1
.irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.ifc \reg,%r\r1
.irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.ifc \ruse,%r\r2
\expand \r1,\r2
.set __decode_fail,0
.endif
.endr
.endif
.endr
.if __decode_fail == 1
.error "__DECODE_RR failed"
.endif
.endm
.macro __DECODE_RRR expand,rsave,rtarget,ruse
.set __decode_fail,1
.irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.ifc \rsave,%r\r1
.irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.ifc \rtarget,%r\r2
.irp r3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.ifc \ruse,%r\r3
\expand \r1,\r2,\r3
.set __decode_fail,0
.endif
.endr
.endif
.endr
.endif
.endr
.if __decode_fail == 1
.error "__DECODE_RRR failed"
.endif
.endm
.macro __DECODE_DRR expand,disp,reg,ruse
.set __decode_fail,1
.irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.ifc \reg,%r\r1
.irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.ifc \ruse,%r\r2
\expand \disp,\r1,\r2
.set __decode_fail,0
.endif
.endr
.endif
.endr
.if __decode_fail == 1
.error "__DECODE_DRR failed"
.endif
.endm
.macro __THUNK_EX_BR reg,ruse
# Be very careful when adding instructions to this macro!
# The ALTERNATIVE replacement code has a .+10 which targets
# the "br \reg" after the code has been patched.
#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
exrl 0,555f
j .
#else
.ifc \reg,%r1
ALTERNATIVE "ex %r0,_LC_BR_R1", ".insn ril,0xc60000000000,0,.+10", 35
j .
.else
larl \ruse,555f
ex 0,0(\ruse)
j .
.endif
#endif
555: br \reg
.endm
.macro __THUNK_EX_BC disp,reg,ruse
#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
exrl 0,556f
j .
#else
larl \ruse,556f
ex 0,0(\ruse)
j .
#endif
556: b \disp(\reg)
.endm
.macro GEN_BR_THUNK reg,ruse=%r1
__DECODE_RR __THUNK_PROLOG_BR,\reg,\ruse
__THUNK_EX_BR \reg,\ruse
__THUNK_EPILOG
.endm
.macro GEN_B_THUNK disp,reg,ruse=%r1
__DECODE_DRR __THUNK_PROLOG_BC,\disp,\reg,\ruse
__THUNK_EX_BC \disp,\reg,\ruse
__THUNK_EPILOG
.endm
.macro BR_EX reg,ruse=%r1
557: __DECODE_RR __THUNK_BR,\reg,\ruse
.pushsection .s390_indirect_branches,"a",@progbits
.long 557b-.
.popsection
.endm
.macro B_EX disp,reg,ruse=%r1
558: __DECODE_DRR __THUNK_BC,\disp,\reg,\ruse
.pushsection .s390_indirect_branches,"a",@progbits
.long 558b-.
.popsection
.endm
.macro BASR_EX rsave,rtarget,ruse=%r1
559: __DECODE_RRR __THUNK_BRASL,\rsave,\rtarget,\ruse
.pushsection .s390_indirect_branches,"a",@progbits
.long 559b-.
.popsection
.endm
#else
.macro GEN_BR_THUNK reg,ruse=%r1
.endm
.macro GEN_B_THUNK disp,reg,ruse=%r1
.endm
.macro BR_EX reg,ruse=%r1
br \reg
.endm
.macro B_EX disp,reg,ruse=%r1
b \disp(\reg)
.endm
.macro BASR_EX rsave,rtarget,ruse=%r1
basr \rsave,\rtarget
.endm
#endif
#endif /* __ASSEMBLY__ */
#endif /* _ASM_S390_NOSPEC_ASM_H */
...@@ -13,5 +13,11 @@ ...@@ -13,5 +13,11 @@
int verify_sha256_digest(void); int verify_sha256_digest(void);
extern u64 kernel_entry;
extern u64 kernel_type;
extern u64 crash_start;
extern u64 crash_size;
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* _S390_PURGATORY_H_ */ #endif /* _S390_PURGATORY_H_ */
...@@ -65,6 +65,7 @@ obj-y += nospec-branch.o ...@@ -65,6 +65,7 @@ obj-y += nospec-branch.o
extra-y += head.o head64.o vmlinux.lds extra-y += head.o head64.o vmlinux.lds
obj-$(CONFIG_SYSFS) += nospec-sysfs.o
CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE) CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE)
obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_MODULES) += module.o
......
...@@ -181,6 +181,7 @@ int main(void) ...@@ -181,6 +181,7 @@ int main(void)
OFFSET(__LC_MACHINE_FLAGS, lowcore, machine_flags); OFFSET(__LC_MACHINE_FLAGS, lowcore, machine_flags);
OFFSET(__LC_PREEMPT_COUNT, lowcore, preempt_count); OFFSET(__LC_PREEMPT_COUNT, lowcore, preempt_count);
OFFSET(__LC_GMAP, lowcore, gmap); OFFSET(__LC_GMAP, lowcore, gmap);
OFFSET(__LC_BR_R1, lowcore, br_r1_trampoline);
/* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */ /* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */
OFFSET(__LC_DUMP_REIPL, lowcore, ipib); OFFSET(__LC_DUMP_REIPL, lowcore, ipib);
/* hardware defined lowcore locations 0x1000 - 0x18ff */ /* hardware defined lowcore locations 0x1000 - 0x18ff */
......
...@@ -9,18 +9,22 @@ ...@@ -9,18 +9,22 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/nospec-insn.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/sigp.h> #include <asm/sigp.h>
GEN_BR_THUNK %r9
GEN_BR_THUNK %r14
ENTRY(s390_base_mcck_handler) ENTRY(s390_base_mcck_handler)
basr %r13,0 basr %r13,0
0: lg %r15,__LC_PANIC_STACK # load panic stack 0: lg %r15,__LC_PANIC_STACK # load panic stack
aghi %r15,-STACK_FRAME_OVERHEAD aghi %r15,-STACK_FRAME_OVERHEAD
larl %r1,s390_base_mcck_handler_fn larl %r1,s390_base_mcck_handler_fn
lg %r1,0(%r1) lg %r9,0(%r1)
ltgr %r1,%r1 ltgr %r9,%r9
jz 1f jz 1f
basr %r14,%r1 BASR_EX %r14,%r9
1: la %r1,4095 1: la %r1,4095
lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1) lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
lpswe __LC_MCK_OLD_PSW lpswe __LC_MCK_OLD_PSW
...@@ -37,10 +41,10 @@ ENTRY(s390_base_ext_handler) ...@@ -37,10 +41,10 @@ ENTRY(s390_base_ext_handler)
basr %r13,0 basr %r13,0
0: aghi %r15,-STACK_FRAME_OVERHEAD 0: aghi %r15,-STACK_FRAME_OVERHEAD
larl %r1,s390_base_ext_handler_fn larl %r1,s390_base_ext_handler_fn
lg %r1,0(%r1) lg %r9,0(%r1)
ltgr %r1,%r1 ltgr %r9,%r9
jz 1f jz 1f
basr %r14,%r1 BASR_EX %r14,%r9
1: lmg %r0,%r15,__LC_SAVE_AREA_ASYNC 1: lmg %r0,%r15,__LC_SAVE_AREA_ASYNC
ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
lpswe __LC_EXT_OLD_PSW lpswe __LC_EXT_OLD_PSW
...@@ -57,10 +61,10 @@ ENTRY(s390_base_pgm_handler) ...@@ -57,10 +61,10 @@ ENTRY(s390_base_pgm_handler)
basr %r13,0 basr %r13,0
0: aghi %r15,-STACK_FRAME_OVERHEAD 0: aghi %r15,-STACK_FRAME_OVERHEAD
larl %r1,s390_base_pgm_handler_fn larl %r1,s390_base_pgm_handler_fn
lg %r1,0(%r1) lg %r9,0(%r1)
ltgr %r1,%r1 ltgr %r9,%r9
jz 1f jz 1f
basr %r14,%r1 BASR_EX %r14,%r9
lmg %r0,%r15,__LC_SAVE_AREA_SYNC lmg %r0,%r15,__LC_SAVE_AREA_SYNC
lpswe __LC_PGM_OLD_PSW lpswe __LC_PGM_OLD_PSW
1: lpswe disabled_wait_psw-0b(%r13) 1: lpswe disabled_wait_psw-0b(%r13)
...@@ -117,7 +121,7 @@ ENTRY(diag308_reset) ...@@ -117,7 +121,7 @@ ENTRY(diag308_reset)
larl %r4,.Lcontinue_psw # Restore PSW flags larl %r4,.Lcontinue_psw # Restore PSW flags
lpswe 0(%r4) lpswe 0(%r4)
.Lcontinue: .Lcontinue:
br %r14 BR_EX %r14
.align 16 .align 16
.Lrestart_psw: .Lrestart_psw:
.long 0x00080000,0x80000000 + .Lrestart_part2 .long 0x00080000,0x80000000 + .Lrestart_part2
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/export.h> #include <asm/export.h>
#include <asm/nospec-insn.h>
__PT_R0 = __PT_GPRS __PT_R0 = __PT_GPRS
__PT_R1 = __PT_GPRS + 8 __PT_R1 = __PT_GPRS + 8
...@@ -183,67 +184,9 @@ _LPP_OFFSET = __LC_LPP ...@@ -183,67 +184,9 @@ _LPP_OFFSET = __LC_LPP
"jnz .+8; .long 0xb2e8d000", 82 "jnz .+8; .long 0xb2e8d000", 82
.endm .endm
#ifdef CONFIG_EXPOLINE GEN_BR_THUNK %r9
GEN_BR_THUNK %r14
.macro GEN_BR_THUNK name,reg,tmp GEN_BR_THUNK %r14,%r11
.section .text.\name,"axG",@progbits,\name,comdat
.globl \name
.hidden \name
.type \name,@function
\name:
CFI_STARTPROC
#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
exrl 0,0f
#else
larl \tmp,0f
ex 0,0(\tmp)
#endif
j .
0: br \reg
CFI_ENDPROC
.endm
GEN_BR_THUNK __s390x_indirect_jump_r1use_r9,%r9,%r1
GEN_BR_THUNK __s390x_indirect_jump_r1use_r14,%r14,%r1
GEN_BR_THUNK __s390x_indirect_jump_r11use_r14,%r14,%r11
.macro BASR_R14_R9
0: brasl %r14,__s390x_indirect_jump_r1use_r9
.pushsection .s390_indirect_branches,"a",@progbits
.long 0b-.
.popsection
.endm
.macro BR_R1USE_R14
0: jg __s390x_indirect_jump_r1use_r14
.pushsection .s390_indirect_branches,"a",@progbits
.long 0b-.
.popsection
.endm
.macro BR_R11USE_R14
0: jg __s390x_indirect_jump_r11use_r14
.pushsection .s390_indirect_branches,"a",@progbits
.long 0b-.
.popsection
.endm
#else /* CONFIG_EXPOLINE */
.macro BASR_R14_R9
basr %r14,%r9
.endm
.macro BR_R1USE_R14
br %r14
.endm
.macro BR_R11USE_R14
br %r14
.endm
#endif /* CONFIG_EXPOLINE */
.section .kprobes.text, "ax" .section .kprobes.text, "ax"
.Ldummy: .Ldummy:
...@@ -260,7 +203,7 @@ _LPP_OFFSET = __LC_LPP ...@@ -260,7 +203,7 @@ _LPP_OFFSET = __LC_LPP
ENTRY(__bpon) ENTRY(__bpon)
.globl __bpon .globl __bpon
BPON BPON
BR_R1USE_R14 BR_EX %r14
/* /*
* Scheduler resume function, called by switch_to * Scheduler resume function, called by switch_to
...@@ -284,7 +227,7 @@ ENTRY(__switch_to) ...@@ -284,7 +227,7 @@ ENTRY(__switch_to)
mvc __LC_CURRENT_PID(4,%r0),0(%r3) # store pid of next mvc __LC_CURRENT_PID(4,%r0),0(%r3) # store pid of next
lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task
ALTERNATIVE "", ".insn s,0xb2800000,_LPP_OFFSET", 40 ALTERNATIVE "", ".insn s,0xb2800000,_LPP_OFFSET", 40
BR_R1USE_R14 BR_EX %r14
.L__critical_start: .L__critical_start:
...@@ -351,7 +294,7 @@ sie_exit: ...@@ -351,7 +294,7 @@ sie_exit:
xgr %r5,%r5 xgr %r5,%r5
lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers
lg %r2,__SF_SIE_REASON(%r15) # return exit reason code lg %r2,__SF_SIE_REASON(%r15) # return exit reason code
BR_R1USE_R14 BR_EX %r14
.Lsie_fault: .Lsie_fault:
lghi %r14,-EFAULT lghi %r14,-EFAULT
stg %r14,__SF_SIE_REASON(%r15) # set exit reason code stg %r14,__SF_SIE_REASON(%r15) # set exit reason code
...@@ -410,7 +353,7 @@ ENTRY(system_call) ...@@ -410,7 +353,7 @@ ENTRY(system_call)
lgf %r9,0(%r8,%r10) # get system call add. lgf %r9,0(%r8,%r10) # get system call add.
TSTMSK __TI_flags(%r12),_TIF_TRACE TSTMSK __TI_flags(%r12),_TIF_TRACE
jnz .Lsysc_tracesys jnz .Lsysc_tracesys
BASR_R14_R9 # call sys_xxxx BASR_EX %r14,%r9 # call sys_xxxx
stg %r2,__PT_R2(%r11) # store return value stg %r2,__PT_R2(%r11) # store return value
.Lsysc_return: .Lsysc_return:
...@@ -595,7 +538,7 @@ ENTRY(system_call) ...@@ -595,7 +538,7 @@ ENTRY(system_call)
lmg %r3,%r7,__PT_R3(%r11) lmg %r3,%r7,__PT_R3(%r11)
stg %r7,STACK_FRAME_OVERHEAD(%r15) stg %r7,STACK_FRAME_OVERHEAD(%r15)
lg %r2,__PT_ORIG_GPR2(%r11) lg %r2,__PT_ORIG_GPR2(%r11)
BASR_R14_R9 # call sys_xxx BASR_EX %r14,%r9 # call sys_xxx
stg %r2,__PT_R2(%r11) # store return value stg %r2,__PT_R2(%r11) # store return value
.Lsysc_tracenogo: .Lsysc_tracenogo:
TSTMSK __TI_flags(%r12),_TIF_TRACE TSTMSK __TI_flags(%r12),_TIF_TRACE
...@@ -619,7 +562,7 @@ ENTRY(ret_from_fork) ...@@ -619,7 +562,7 @@ ENTRY(ret_from_fork)
lmg %r9,%r10,__PT_R9(%r11) # load gprs lmg %r9,%r10,__PT_R9(%r11) # load gprs
ENTRY(kernel_thread_starter) ENTRY(kernel_thread_starter)
la %r2,0(%r10) la %r2,0(%r10)
BASR_R14_R9 BASR_EX %r14,%r9
j .Lsysc_tracenogo j .Lsysc_tracenogo
/* /*
...@@ -701,7 +644,7 @@ ENTRY(pgm_check_handler) ...@@ -701,7 +644,7 @@ ENTRY(pgm_check_handler)
je .Lpgm_return je .Lpgm_return
lgf %r9,0(%r10,%r1) # load address of handler routine lgf %r9,0(%r10,%r1) # load address of handler routine
lgr %r2,%r11 # pass pointer to pt_regs lgr %r2,%r11 # pass pointer to pt_regs
BASR_R14_R9 # branch to interrupt-handler BASR_EX %r14,%r9 # branch to interrupt-handler
.Lpgm_return: .Lpgm_return:
LOCKDEP_SYS_EXIT LOCKDEP_SYS_EXIT
tm __PT_PSW+1(%r11),0x01 # returning to user ? tm __PT_PSW+1(%r11),0x01 # returning to user ?
...@@ -1019,7 +962,7 @@ ENTRY(psw_idle) ...@@ -1019,7 +962,7 @@ ENTRY(psw_idle)
stpt __TIMER_IDLE_ENTER(%r2) stpt __TIMER_IDLE_ENTER(%r2)
.Lpsw_idle_lpsw: .Lpsw_idle_lpsw:
lpswe __SF_EMPTY(%r15) lpswe __SF_EMPTY(%r15)
BR_R1USE_R14 BR_EX %r14
.Lpsw_idle_end: .Lpsw_idle_end:
/* /*
...@@ -1061,7 +1004,7 @@ ENTRY(save_fpu_regs) ...@@ -1061,7 +1004,7 @@ ENTRY(save_fpu_regs)
.Lsave_fpu_regs_done: .Lsave_fpu_regs_done:
oi __LC_CPU_FLAGS+7,_CIF_FPU oi __LC_CPU_FLAGS+7,_CIF_FPU
.Lsave_fpu_regs_exit: .Lsave_fpu_regs_exit:
BR_R1USE_R14 BR_EX %r14
.Lsave_fpu_regs_end: .Lsave_fpu_regs_end:
EXPORT_SYMBOL(save_fpu_regs) EXPORT_SYMBOL(save_fpu_regs)
...@@ -1107,7 +1050,7 @@ load_fpu_regs: ...@@ -1107,7 +1050,7 @@ load_fpu_regs:
.Lload_fpu_regs_done: .Lload_fpu_regs_done:
ni __LC_CPU_FLAGS+7,255-_CIF_FPU ni __LC_CPU_FLAGS+7,255-_CIF_FPU
.Lload_fpu_regs_exit: .Lload_fpu_regs_exit:
BR_R1USE_R14 BR_EX %r14
.Lload_fpu_regs_end: .Lload_fpu_regs_end:
.L__critical_end: .L__critical_end:
...@@ -1322,7 +1265,7 @@ cleanup_critical: ...@@ -1322,7 +1265,7 @@ cleanup_critical:
jl 0f jl 0f
clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end
jl .Lcleanup_load_fpu_regs jl .Lcleanup_load_fpu_regs
0: BR_R11USE_R14 0: BR_EX %r14
.align 8 .align 8
.Lcleanup_table: .Lcleanup_table:
...@@ -1358,7 +1301,7 @@ cleanup_critical: ...@@ -1358,7 +1301,7 @@ cleanup_critical:
ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
larl %r9,sie_exit # skip forward to sie_exit larl %r9,sie_exit # skip forward to sie_exit
BR_R11USE_R14 BR_EX %r14
#endif #endif
.Lcleanup_system_call: .Lcleanup_system_call:
...@@ -1412,7 +1355,7 @@ cleanup_critical: ...@@ -1412,7 +1355,7 @@ cleanup_critical:
stg %r15,56(%r11) # r15 stack pointer stg %r15,56(%r11) # r15 stack pointer
# set new psw address and exit # set new psw address and exit
larl %r9,.Lsysc_do_svc larl %r9,.Lsysc_do_svc
BR_R11USE_R14 BR_EX %r14,%r11
.Lcleanup_system_call_insn: .Lcleanup_system_call_insn:
.quad system_call .quad system_call
.quad .Lsysc_stmg .quad .Lsysc_stmg
...@@ -1424,7 +1367,7 @@ cleanup_critical: ...@@ -1424,7 +1367,7 @@ cleanup_critical:
.Lcleanup_sysc_tif: .Lcleanup_sysc_tif:
larl %r9,.Lsysc_tif larl %r9,.Lsysc_tif
BR_R11USE_R14 BR_EX %r14,%r11
.Lcleanup_sysc_restore: .Lcleanup_sysc_restore:
# check if stpt has been executed # check if stpt has been executed
...@@ -1441,14 +1384,14 @@ cleanup_critical: ...@@ -1441,14 +1384,14 @@ cleanup_critical:
mvc 0(64,%r11),__PT_R8(%r9) mvc 0(64,%r11),__PT_R8(%r9)
lmg %r0,%r7,__PT_R0(%r9) lmg %r0,%r7,__PT_R0(%r9)
1: lmg %r8,%r9,__LC_RETURN_PSW 1: lmg %r8,%r9,__LC_RETURN_PSW
BR_R11USE_R14 BR_EX %r14,%r11
.Lcleanup_sysc_restore_insn: .Lcleanup_sysc_restore_insn:
.quad .Lsysc_exit_timer .quad .Lsysc_exit_timer
.quad .Lsysc_done - 4 .quad .Lsysc_done - 4
.Lcleanup_io_tif: .Lcleanup_io_tif:
larl %r9,.Lio_tif larl %r9,.Lio_tif
BR_R11USE_R14 BR_EX %r14,%r11
.Lcleanup_io_restore: .Lcleanup_io_restore:
# check if stpt has been executed # check if stpt has been executed
...@@ -1462,7 +1405,7 @@ cleanup_critical: ...@@ -1462,7 +1405,7 @@ cleanup_critical:
mvc 0(64,%r11),__PT_R8(%r9) mvc 0(64,%r11),__PT_R8(%r9)
lmg %r0,%r7,__PT_R0(%r9) lmg %r0,%r7,__PT_R0(%r9)
1: lmg %r8,%r9,__LC_RETURN_PSW 1: lmg %r8,%r9,__LC_RETURN_PSW
BR_R11USE_R14 BR_EX %r14,%r11
.Lcleanup_io_restore_insn: .Lcleanup_io_restore_insn:
.quad .Lio_exit_timer .quad .Lio_exit_timer
.quad .Lio_done - 4 .quad .Lio_done - 4
...@@ -1515,17 +1458,17 @@ cleanup_critical: ...@@ -1515,17 +1458,17 @@ cleanup_critical:
# prepare return psw # prepare return psw
nihh %r8,0xfcfd # clear irq & wait state bits nihh %r8,0xfcfd # clear irq & wait state bits
lg %r9,48(%r11) # return from psw_idle lg %r9,48(%r11) # return from psw_idle
BR_R11USE_R14 BR_EX %r14,%r11
.Lcleanup_idle_insn: .Lcleanup_idle_insn:
.quad .Lpsw_idle_lpsw .quad .Lpsw_idle_lpsw
.Lcleanup_save_fpu_regs: .Lcleanup_save_fpu_regs:
larl %r9,save_fpu_regs larl %r9,save_fpu_regs
BR_R11USE_R14 BR_EX %r14,%r11
.Lcleanup_load_fpu_regs: .Lcleanup_load_fpu_regs:
larl %r9,load_fpu_regs larl %r9,load_fpu_regs
BR_R11USE_R14 BR_EX %r14,%r11
/* /*
* Integer constants * Integer constants
......
...@@ -176,10 +176,9 @@ void do_softirq_own_stack(void) ...@@ -176,10 +176,9 @@ void do_softirq_own_stack(void)
new -= STACK_FRAME_OVERHEAD; new -= STACK_FRAME_OVERHEAD;
((struct stack_frame *) new)->back_chain = old; ((struct stack_frame *) new)->back_chain = old;
asm volatile(" la 15,0(%0)\n" asm volatile(" la 15,0(%0)\n"
" basr 14,%2\n" " brasl 14,__do_softirq\n"
" la 15,0(%1)\n" " la 15,0(%1)\n"
: : "a" (new), "a" (old), : : "a" (new), "a" (old)
"a" (__do_softirq)
: "0", "1", "2", "3", "4", "5", "14", : "0", "1", "2", "3", "4", "5", "14",
"cc", "memory" ); "cc", "memory" );
} else { } else {
......
...@@ -9,13 +9,17 @@ ...@@ -9,13 +9,17 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/ftrace.h> #include <asm/ftrace.h>
#include <asm/nospec-insn.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/export.h> #include <asm/export.h>
GEN_BR_THUNK %r1
GEN_BR_THUNK %r14
.section .kprobes.text, "ax" .section .kprobes.text, "ax"
ENTRY(ftrace_stub) ENTRY(ftrace_stub)
br %r14 BR_EX %r14
#define STACK_FRAME_SIZE (STACK_FRAME_OVERHEAD + __PT_SIZE) #define STACK_FRAME_SIZE (STACK_FRAME_OVERHEAD + __PT_SIZE)
#define STACK_PTREGS (STACK_FRAME_OVERHEAD) #define STACK_PTREGS (STACK_FRAME_OVERHEAD)
...@@ -23,7 +27,7 @@ ENTRY(ftrace_stub) ...@@ -23,7 +27,7 @@ ENTRY(ftrace_stub)
#define STACK_PTREGS_PSW (STACK_PTREGS + __PT_PSW) #define STACK_PTREGS_PSW (STACK_PTREGS + __PT_PSW)
ENTRY(_mcount) ENTRY(_mcount)
br %r14 BR_EX %r14
EXPORT_SYMBOL(_mcount) EXPORT_SYMBOL(_mcount)
...@@ -53,7 +57,7 @@ ENTRY(ftrace_caller) ...@@ -53,7 +57,7 @@ ENTRY(ftrace_caller)
#endif #endif
lgr %r3,%r14 lgr %r3,%r14
la %r5,STACK_PTREGS(%r15) la %r5,STACK_PTREGS(%r15)
basr %r14,%r1 BASR_EX %r14,%r1
#ifdef CONFIG_FUNCTION_GRAPH_TRACER #ifdef CONFIG_FUNCTION_GRAPH_TRACER
# The j instruction gets runtime patched to a nop instruction. # The j instruction gets runtime patched to a nop instruction.
# See ftrace_enable_ftrace_graph_caller. # See ftrace_enable_ftrace_graph_caller.
...@@ -68,7 +72,7 @@ ftrace_graph_caller_end: ...@@ -68,7 +72,7 @@ ftrace_graph_caller_end:
#endif #endif
lg %r1,(STACK_PTREGS_PSW+8)(%r15) lg %r1,(STACK_PTREGS_PSW+8)(%r15)
lmg %r2,%r15,(STACK_PTREGS_GPRS+2*8)(%r15) lmg %r2,%r15,(STACK_PTREGS_GPRS+2*8)(%r15)
br %r1 BR_EX %r1
#ifdef CONFIG_FUNCTION_GRAPH_TRACER #ifdef CONFIG_FUNCTION_GRAPH_TRACER
...@@ -81,6 +85,6 @@ ENTRY(return_to_handler) ...@@ -81,6 +85,6 @@ ENTRY(return_to_handler)
aghi %r15,STACK_FRAME_OVERHEAD aghi %r15,STACK_FRAME_OVERHEAD
lgr %r14,%r2 lgr %r14,%r2
lmg %r2,%r5,32(%r15) lmg %r2,%r5,32(%r15)
br %r14 BR_EX %r14
#endif #endif
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include <linux/module.h> #include <linux/module.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/cpu.h>
#include <asm/nospec-branch.h> #include <asm/nospec-branch.h>
static int __init nobp_setup_early(char *str) static int __init nobp_setup_early(char *str)
...@@ -44,24 +43,6 @@ static int __init nospec_report(void) ...@@ -44,24 +43,6 @@ static int __init nospec_report(void)
} }
arch_initcall(nospec_report); arch_initcall(nospec_report);
#ifdef CONFIG_SYSFS
ssize_t cpu_show_spectre_v1(struct device *dev,
struct device_attribute *attr, char *buf)
{
return sprintf(buf, "Mitigation: __user pointer sanitization\n");
}
ssize_t cpu_show_spectre_v2(struct device *dev,
struct device_attribute *attr, char *buf)
{
if (IS_ENABLED(CC_USING_EXPOLINE) && !nospec_disable)
return sprintf(buf, "Mitigation: execute trampolines\n");
if (__test_facility(82, S390_lowcore.alt_stfle_fac_list))
return sprintf(buf, "Mitigation: limited branch prediction.\n");
return sprintf(buf, "Vulnerable\n");
}
#endif
#ifdef CONFIG_EXPOLINE #ifdef CONFIG_EXPOLINE
int nospec_disable = IS_ENABLED(CONFIG_EXPOLINE_OFF); int nospec_disable = IS_ENABLED(CONFIG_EXPOLINE_OFF);
...@@ -112,7 +93,6 @@ static void __init_or_module __nospec_revert(s32 *start, s32 *end) ...@@ -112,7 +93,6 @@ static void __init_or_module __nospec_revert(s32 *start, s32 *end)
s32 *epo; s32 *epo;
/* Second part of the instruction replace is always a nop */ /* Second part of the instruction replace is always a nop */
memcpy(insnbuf + 2, (char[]) { 0x47, 0x00, 0x00, 0x00 }, 4);
for (epo = start; epo < end; epo++) { for (epo = start; epo < end; epo++) {
instr = (u8 *) epo + *epo; instr = (u8 *) epo + *epo;
if (instr[0] == 0xc0 && (instr[1] & 0x0f) == 0x04) if (instr[0] == 0xc0 && (instr[1] & 0x0f) == 0x04)
...@@ -133,18 +113,34 @@ static void __init_or_module __nospec_revert(s32 *start, s32 *end) ...@@ -133,18 +113,34 @@ static void __init_or_module __nospec_revert(s32 *start, s32 *end)
br = thunk + (*(int *)(thunk + 2)) * 2; br = thunk + (*(int *)(thunk + 2)) * 2;
else else
continue; continue;
if (br[0] != 0x07 || (br[1] & 0xf0) != 0xf0) /* Check for unconditional branch 0x07f? or 0x47f???? */
if ((br[0] & 0xbf) != 0x07 || (br[1] & 0xf0) != 0xf0)
continue; continue;
memcpy(insnbuf + 2, (char[]) { 0x47, 0x00, 0x07, 0x00 }, 4);
switch (type) { switch (type) {
case BRCL_EXPOLINE: case BRCL_EXPOLINE:
/* brcl to thunk, replace with br + nop */
insnbuf[0] = br[0]; insnbuf[0] = br[0];
insnbuf[1] = (instr[1] & 0xf0) | (br[1] & 0x0f); insnbuf[1] = (instr[1] & 0xf0) | (br[1] & 0x0f);
if (br[0] == 0x47) {
/* brcl to b, replace with bc + nopr */
insnbuf[2] = br[2];
insnbuf[3] = br[3];
} else {
/* brcl to br, replace with bcr + nop */
}
break; break;
case BRASL_EXPOLINE: case BRASL_EXPOLINE:
/* brasl to thunk, replace with basr + nop */
insnbuf[0] = 0x0d;
insnbuf[1] = (instr[1] & 0xf0) | (br[1] & 0x0f); insnbuf[1] = (instr[1] & 0xf0) | (br[1] & 0x0f);
if (br[0] == 0x47) {
/* brasl to b, replace with bas + nopr */
insnbuf[0] = 0x4d;
insnbuf[2] = br[2];
insnbuf[3] = br[3];
} else {
/* brasl to br, replace with basr + nop */
insnbuf[0] = 0x0d;
}
break; break;
} }
......
// SPDX-License-Identifier: GPL-2.0
#include <linux/device.h>
#include <linux/cpu.h>
#include <asm/facility.h>
#include <asm/nospec-branch.h>
ssize_t cpu_show_spectre_v1(struct device *dev,
struct device_attribute *attr, char *buf)
{
return sprintf(buf, "Mitigation: __user pointer sanitization\n");
}
ssize_t cpu_show_spectre_v2(struct device *dev,
struct device_attribute *attr, char *buf)
{
if (IS_ENABLED(CC_USING_EXPOLINE) && !nospec_disable)
return sprintf(buf, "Mitigation: execute trampolines\n");
if (__test_facility(82, S390_lowcore.alt_stfle_fac_list))
return sprintf(buf, "Mitigation: limited branch prediction\n");
return sprintf(buf, "Vulnerable\n");
}
...@@ -753,6 +753,10 @@ static int __hw_perf_event_init(struct perf_event *event) ...@@ -753,6 +753,10 @@ static int __hw_perf_event_init(struct perf_event *event)
*/ */
rate = 0; rate = 0;
if (attr->freq) { if (attr->freq) {
if (!attr->sample_freq) {
err = -EINVAL;
goto out;
}
rate = freq_to_sample_rate(&si, attr->sample_freq); rate = freq_to_sample_rate(&si, attr->sample_freq);
rate = hw_limit_rate(&si, rate); rate = hw_limit_rate(&si, rate);
attr->freq = 0; attr->freq = 0;
......
...@@ -7,8 +7,11 @@ ...@@ -7,8 +7,11 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/nospec-insn.h>
#include <asm/sigp.h> #include <asm/sigp.h>
GEN_BR_THUNK %r9
# #
# Issue "store status" for the current CPU to its prefix page # Issue "store status" for the current CPU to its prefix page
# and call passed function afterwards # and call passed function afterwards
...@@ -67,9 +70,9 @@ ENTRY(store_status) ...@@ -67,9 +70,9 @@ ENTRY(store_status)
st %r4,0(%r1) st %r4,0(%r1)
st %r5,4(%r1) st %r5,4(%r1)
stg %r2,8(%r1) stg %r2,8(%r1)
lgr %r1,%r2 lgr %r9,%r2
lgr %r2,%r3 lgr %r2,%r3
br %r1 BR_EX %r9
.section .bss .section .bss
.align 8 .align 8
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/nospec-insn.h>
#include <asm/sigp.h> #include <asm/sigp.h>
/* /*
...@@ -24,6 +25,8 @@ ...@@ -24,6 +25,8 @@
* (see below) in the resume process. * (see below) in the resume process.
* This function runs with disabled interrupts. * This function runs with disabled interrupts.
*/ */
GEN_BR_THUNK %r14
.section .text .section .text
ENTRY(swsusp_arch_suspend) ENTRY(swsusp_arch_suspend)
stmg %r6,%r15,__SF_GPRS(%r15) stmg %r6,%r15,__SF_GPRS(%r15)
...@@ -103,7 +106,7 @@ ENTRY(swsusp_arch_suspend) ...@@ -103,7 +106,7 @@ ENTRY(swsusp_arch_suspend)
spx 0x318(%r1) spx 0x318(%r1)
lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15)
lghi %r2,0 lghi %r2,0
br %r14 BR_EX %r14
/* /*
* Restore saved memory image to correct place and restore register context. * Restore saved memory image to correct place and restore register context.
...@@ -197,11 +200,10 @@ pgm_check_entry: ...@@ -197,11 +200,10 @@ pgm_check_entry:
larl %r15,init_thread_union larl %r15,init_thread_union
ahi %r15,1<<(PAGE_SHIFT+THREAD_SIZE_ORDER) ahi %r15,1<<(PAGE_SHIFT+THREAD_SIZE_ORDER)
larl %r2,.Lpanic_string larl %r2,.Lpanic_string
larl %r3,sclp_early_printk
lghi %r1,0 lghi %r1,0
sam31 sam31
sigp %r1,%r0,SIGP_SET_ARCHITECTURE sigp %r1,%r0,SIGP_SET_ARCHITECTURE
basr %r14,%r3 brasl %r14,sclp_early_printk
larl %r3,.Ldisabled_wait_31 larl %r3,.Ldisabled_wait_31
lpsw 0(%r3) lpsw 0(%r3)
4: 4:
...@@ -267,7 +269,7 @@ restore_registers: ...@@ -267,7 +269,7 @@ restore_registers:
/* Return 0 */ /* Return 0 */
lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15)
lghi %r2,0 lghi %r2,0
br %r14 BR_EX %r14
.section .data..nosave,"aw",@progbits .section .data..nosave,"aw",@progbits
.align 8 .align 8
......
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/export.h> #include <asm/export.h>
#include <asm/nospec-insn.h>
GEN_BR_THUNK %r14
/* /*
* void *memmove(void *dest, const void *src, size_t n) * void *memmove(void *dest, const void *src, size_t n)
...@@ -33,14 +36,14 @@ ENTRY(memmove) ...@@ -33,14 +36,14 @@ ENTRY(memmove)
.Lmemmove_forward_remainder: .Lmemmove_forward_remainder:
larl %r5,.Lmemmove_mvc larl %r5,.Lmemmove_mvc
ex %r4,0(%r5) ex %r4,0(%r5)
br %r14 BR_EX %r14
.Lmemmove_reverse: .Lmemmove_reverse:
ic %r0,0(%r4,%r3) ic %r0,0(%r4,%r3)
stc %r0,0(%r4,%r1) stc %r0,0(%r4,%r1)
brctg %r4,.Lmemmove_reverse brctg %r4,.Lmemmove_reverse
ic %r0,0(%r4,%r3) ic %r0,0(%r4,%r3)
stc %r0,0(%r4,%r1) stc %r0,0(%r4,%r1)
br %r14 BR_EX %r14
.Lmemmove_mvc: .Lmemmove_mvc:
mvc 0(1,%r1),0(%r3) mvc 0(1,%r1),0(%r3)
EXPORT_SYMBOL(memmove) EXPORT_SYMBOL(memmove)
...@@ -77,7 +80,7 @@ ENTRY(memset) ...@@ -77,7 +80,7 @@ ENTRY(memset)
.Lmemset_clear_remainder: .Lmemset_clear_remainder:
larl %r3,.Lmemset_xc larl %r3,.Lmemset_xc
ex %r4,0(%r3) ex %r4,0(%r3)
br %r14 BR_EX %r14
.Lmemset_fill: .Lmemset_fill:
cghi %r4,1 cghi %r4,1
lgr %r1,%r2 lgr %r1,%r2
...@@ -95,10 +98,10 @@ ENTRY(memset) ...@@ -95,10 +98,10 @@ ENTRY(memset)
stc %r3,0(%r1) stc %r3,0(%r1)
larl %r5,.Lmemset_mvc larl %r5,.Lmemset_mvc
ex %r4,0(%r5) ex %r4,0(%r5)
br %r14 BR_EX %r14
.Lmemset_fill_exit: .Lmemset_fill_exit:
stc %r3,0(%r1) stc %r3,0(%r1)
br %r14 BR_EX %r14
.Lmemset_xc: .Lmemset_xc:
xc 0(1,%r1),0(%r1) xc 0(1,%r1),0(%r1)
.Lmemset_mvc: .Lmemset_mvc:
...@@ -121,7 +124,7 @@ ENTRY(memcpy) ...@@ -121,7 +124,7 @@ ENTRY(memcpy)
.Lmemcpy_remainder: .Lmemcpy_remainder:
larl %r5,.Lmemcpy_mvc larl %r5,.Lmemcpy_mvc
ex %r4,0(%r5) ex %r4,0(%r5)
br %r14 BR_EX %r14
.Lmemcpy_loop: .Lmemcpy_loop:
mvc 0(256,%r1),0(%r3) mvc 0(256,%r1),0(%r3)
la %r1,256(%r1) la %r1,256(%r1)
...@@ -159,10 +162,10 @@ ENTRY(__memset\bits) ...@@ -159,10 +162,10 @@ ENTRY(__memset\bits)
\insn %r3,0(%r1) \insn %r3,0(%r1)
larl %r5,.L__memset_mvc\bits larl %r5,.L__memset_mvc\bits
ex %r4,0(%r5) ex %r4,0(%r5)
br %r14 BR_EX %r14
.L__memset_exit\bits: .L__memset_exit\bits:
\insn %r3,0(%r2) \insn %r3,0(%r2)
br %r14 BR_EX %r14
.L__memset_mvc\bits: .L__memset_mvc\bits:
mvc \bytes(1,%r1),0(%r1) mvc \bytes(1,%r1),0(%r1)
.endm .endm
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/nospec-insn.h>
#include "bpf_jit.h" #include "bpf_jit.h"
/* /*
...@@ -54,7 +55,7 @@ ENTRY(sk_load_##NAME##_pos); \ ...@@ -54,7 +55,7 @@ ENTRY(sk_load_##NAME##_pos); \
clg %r3,STK_OFF_HLEN(%r15); /* Offset + SIZE > hlen? */ \ clg %r3,STK_OFF_HLEN(%r15); /* Offset + SIZE > hlen? */ \
jh sk_load_##NAME##_slow; \ jh sk_load_##NAME##_slow; \
LOAD %r14,-SIZE(%r3,%r12); /* Get data from skb */ \ LOAD %r14,-SIZE(%r3,%r12); /* Get data from skb */ \
b OFF_OK(%r6); /* Return */ \ B_EX OFF_OK,%r6; /* Return */ \
\ \
sk_load_##NAME##_slow:; \ sk_load_##NAME##_slow:; \
lgr %r2,%r7; /* Arg1 = skb pointer */ \ lgr %r2,%r7; /* Arg1 = skb pointer */ \
...@@ -64,11 +65,14 @@ sk_load_##NAME##_slow:; \ ...@@ -64,11 +65,14 @@ sk_load_##NAME##_slow:; \
brasl %r14,skb_copy_bits; /* Get data from skb */ \ brasl %r14,skb_copy_bits; /* Get data from skb */ \
LOAD %r14,STK_OFF_TMP(%r15); /* Load from temp bufffer */ \ LOAD %r14,STK_OFF_TMP(%r15); /* Load from temp bufffer */ \
ltgr %r2,%r2; /* Set cc to (%r2 != 0) */ \ ltgr %r2,%r2; /* Set cc to (%r2 != 0) */ \
br %r6; /* Return */ BR_EX %r6; /* Return */
sk_load_common(word, 4, llgf) /* r14 = *(u32 *) (skb->data+offset) */ sk_load_common(word, 4, llgf) /* r14 = *(u32 *) (skb->data+offset) */
sk_load_common(half, 2, llgh) /* r14 = *(u16 *) (skb->data+offset) */ sk_load_common(half, 2, llgh) /* r14 = *(u16 *) (skb->data+offset) */
GEN_BR_THUNK %r6
GEN_B_THUNK OFF_OK,%r6
/* /*
* Load 1 byte from SKB (optimized version) * Load 1 byte from SKB (optimized version)
*/ */
...@@ -80,7 +84,7 @@ ENTRY(sk_load_byte_pos) ...@@ -80,7 +84,7 @@ ENTRY(sk_load_byte_pos)
clg %r3,STK_OFF_HLEN(%r15) # Offset >= hlen? clg %r3,STK_OFF_HLEN(%r15) # Offset >= hlen?
jnl sk_load_byte_slow jnl sk_load_byte_slow
llgc %r14,0(%r3,%r12) # Get byte from skb llgc %r14,0(%r3,%r12) # Get byte from skb
b OFF_OK(%r6) # Return OK B_EX OFF_OK,%r6 # Return OK
sk_load_byte_slow: sk_load_byte_slow:
lgr %r2,%r7 # Arg1 = skb pointer lgr %r2,%r7 # Arg1 = skb pointer
...@@ -90,7 +94,7 @@ sk_load_byte_slow: ...@@ -90,7 +94,7 @@ sk_load_byte_slow:
brasl %r14,skb_copy_bits # Get data from skb brasl %r14,skb_copy_bits # Get data from skb
llgc %r14,STK_OFF_TMP(%r15) # Load result from temp buffer llgc %r14,STK_OFF_TMP(%r15) # Load result from temp buffer
ltgr %r2,%r2 # Set cc to (%r2 != 0) ltgr %r2,%r2 # Set cc to (%r2 != 0)
br %r6 # Return cc BR_EX %r6 # Return cc
#define sk_negative_common(NAME, SIZE, LOAD) \ #define sk_negative_common(NAME, SIZE, LOAD) \
sk_load_##NAME##_slow_neg:; \ sk_load_##NAME##_slow_neg:; \
...@@ -104,7 +108,7 @@ sk_load_##NAME##_slow_neg:; \ ...@@ -104,7 +108,7 @@ sk_load_##NAME##_slow_neg:; \
jz bpf_error; \ jz bpf_error; \
LOAD %r14,0(%r2); /* Get data from pointer */ \ LOAD %r14,0(%r2); /* Get data from pointer */ \
xr %r3,%r3; /* Set cc to zero */ \ xr %r3,%r3; /* Set cc to zero */ \
br %r6; /* Return cc */ BR_EX %r6; /* Return cc */
sk_negative_common(word, 4, llgf) sk_negative_common(word, 4, llgf)
sk_negative_common(half, 2, llgh) sk_negative_common(half, 2, llgh)
...@@ -113,4 +117,4 @@ sk_negative_common(byte, 1, llgc) ...@@ -113,4 +117,4 @@ sk_negative_common(byte, 1, llgc)
bpf_error: bpf_error:
# force a return 0 from jit handler # force a return 0 from jit handler
ltgr %r15,%r15 # Set condition code ltgr %r15,%r15 # Set condition code
br %r6 BR_EX %r6
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include <linux/bpf.h> #include <linux/bpf.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/dis.h> #include <asm/dis.h>
#include <asm/facility.h>
#include <asm/nospec-branch.h>
#include <asm/set_memory.h> #include <asm/set_memory.h>
#include "bpf_jit.h" #include "bpf_jit.h"
...@@ -41,6 +43,8 @@ struct bpf_jit { ...@@ -41,6 +43,8 @@ struct bpf_jit {
int base_ip; /* Base address for literal pool */ int base_ip; /* Base address for literal pool */
int ret0_ip; /* Address of return 0 */ int ret0_ip; /* Address of return 0 */
int exit_ip; /* Address of exit */ int exit_ip; /* Address of exit */
int r1_thunk_ip; /* Address of expoline thunk for 'br %r1' */
int r14_thunk_ip; /* Address of expoline thunk for 'br %r14' */
int tail_call_start; /* Tail call start offset */ int tail_call_start; /* Tail call start offset */
int labels[1]; /* Labels for local jumps */ int labels[1]; /* Labels for local jumps */
}; };
...@@ -250,6 +254,19 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 b1) ...@@ -250,6 +254,19 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 b1)
REG_SET_SEEN(b2); \ REG_SET_SEEN(b2); \
}) })
#define EMIT6_PCREL_RILB(op, b, target) \
({ \
int rel = (target - jit->prg) / 2; \
_EMIT6(op | reg_high(b) << 16 | rel >> 16, rel & 0xffff); \
REG_SET_SEEN(b); \
})
#define EMIT6_PCREL_RIL(op, target) \
({ \
int rel = (target - jit->prg) / 2; \
_EMIT6(op | rel >> 16, rel & 0xffff); \
})
#define _EMIT6_IMM(op, imm) \ #define _EMIT6_IMM(op, imm) \
({ \ ({ \
unsigned int __imm = (imm); \ unsigned int __imm = (imm); \
...@@ -469,8 +486,45 @@ static void bpf_jit_epilogue(struct bpf_jit *jit, u32 stack_depth) ...@@ -469,8 +486,45 @@ static void bpf_jit_epilogue(struct bpf_jit *jit, u32 stack_depth)
EMIT4(0xb9040000, REG_2, BPF_REG_0); EMIT4(0xb9040000, REG_2, BPF_REG_0);
/* Restore registers */ /* Restore registers */
save_restore_regs(jit, REGS_RESTORE, stack_depth); save_restore_regs(jit, REGS_RESTORE, stack_depth);
if (IS_ENABLED(CC_USING_EXPOLINE) && !nospec_disable) {
jit->r14_thunk_ip = jit->prg;
/* Generate __s390_indirect_jump_r14 thunk */
if (test_facility(35)) {
/* exrl %r0,.+10 */
EMIT6_PCREL_RIL(0xc6000000, jit->prg + 10);
} else {
/* larl %r1,.+14 */
EMIT6_PCREL_RILB(0xc0000000, REG_1, jit->prg + 14);
/* ex 0,0(%r1) */
EMIT4_DISP(0x44000000, REG_0, REG_1, 0);
}
/* j . */
EMIT4_PCREL(0xa7f40000, 0);
}
/* br %r14 */ /* br %r14 */
_EMIT2(0x07fe); _EMIT2(0x07fe);
if (IS_ENABLED(CC_USING_EXPOLINE) && !nospec_disable &&
(jit->seen & SEEN_FUNC)) {
jit->r1_thunk_ip = jit->prg;
/* Generate __s390_indirect_jump_r1 thunk */
if (test_facility(35)) {
/* exrl %r0,.+10 */
EMIT6_PCREL_RIL(0xc6000000, jit->prg + 10);
/* j . */
EMIT4_PCREL(0xa7f40000, 0);
/* br %r1 */
_EMIT2(0x07f1);
} else {
/* larl %r1,.+14 */
EMIT6_PCREL_RILB(0xc0000000, REG_1, jit->prg + 14);
/* ex 0,S390_lowcore.br_r1_tampoline */
EMIT4_DISP(0x44000000, REG_0, REG_0,
offsetof(struct lowcore, br_r1_trampoline));
/* j . */
EMIT4_PCREL(0xa7f40000, 0);
}
}
} }
/* /*
...@@ -966,8 +1020,13 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i ...@@ -966,8 +1020,13 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
/* lg %w1,<d(imm)>(%l) */ /* lg %w1,<d(imm)>(%l) */
EMIT6_DISP_LH(0xe3000000, 0x0004, REG_W1, REG_0, REG_L, EMIT6_DISP_LH(0xe3000000, 0x0004, REG_W1, REG_0, REG_L,
EMIT_CONST_U64(func)); EMIT_CONST_U64(func));
/* basr %r14,%w1 */ if (IS_ENABLED(CC_USING_EXPOLINE) && !nospec_disable) {
EMIT2(0x0d00, REG_14, REG_W1); /* brasl %r14,__s390_indirect_jump_r1 */
EMIT6_PCREL_RILB(0xc0050000, REG_14, jit->r1_thunk_ip);
} else {
/* basr %r14,%w1 */
EMIT2(0x0d00, REG_14, REG_W1);
}
/* lgr %b0,%r2: load return value into %b0 */ /* lgr %b0,%r2: load return value into %b0 */
EMIT4(0xb9040000, BPF_REG_0, REG_2); EMIT4(0xb9040000, BPF_REG_0, REG_2);
if ((jit->seen & SEEN_SKB) && if ((jit->seen & SEEN_SKB) &&
......
...@@ -9,6 +9,7 @@ config SUPERH ...@@ -9,6 +9,7 @@ config SUPERH
select HAVE_IDE if HAS_IOPORT_MAP select HAVE_IDE if HAS_IOPORT_MAP
select HAVE_MEMBLOCK select HAVE_MEMBLOCK
select HAVE_MEMBLOCK_NODE_MAP select HAVE_MEMBLOCK_NODE_MAP
select NO_BOOTMEM
select ARCH_DISCARD_MEMBLOCK select ARCH_DISCARD_MEMBLOCK
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_GENERIC_DMA_COHERENT select HAVE_GENERIC_DMA_COHERENT
......
...@@ -43,7 +43,11 @@ void __ref cpu_probe(void) ...@@ -43,7 +43,11 @@ void __ref cpu_probe(void)
#endif #endif
#if defined(CONFIG_CPU_J2) #if defined(CONFIG_CPU_J2)
#if defined(CONFIG_SMP)
unsigned cpu = hard_smp_processor_id(); unsigned cpu = hard_smp_processor_id();
#else
unsigned cpu = 0;
#endif
if (cpu == 0) of_scan_flat_dt(scan_cache, NULL); if (cpu == 0) of_scan_flat_dt(scan_cache, NULL);
if (j2_ccr_base) __raw_writel(0x80000303, j2_ccr_base + 4*cpu); if (j2_ccr_base) __raw_writel(0x80000303, j2_ccr_base + 4*cpu);
if (cpu != 0) return; if (cpu != 0) return;
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/initrd.h> #include <linux/initrd.h>
#include <linux/bootmem.h>
#include <linux/console.h> #include <linux/console.h>
#include <linux/root_dev.h> #include <linux/root_dev.h>
#include <linux/utsname.h> #include <linux/utsname.h>
......
...@@ -59,7 +59,9 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size, ...@@ -59,7 +59,9 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size,
split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order); split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order);
*dma_handle = virt_to_phys(ret) - PFN_PHYS(dev->dma_pfn_offset); *dma_handle = virt_to_phys(ret);
if (!WARN_ON(!dev))
*dma_handle -= PFN_PHYS(dev->dma_pfn_offset);
return ret_nocache; return ret_nocache;
} }
...@@ -69,9 +71,12 @@ void dma_generic_free_coherent(struct device *dev, size_t size, ...@@ -69,9 +71,12 @@ void dma_generic_free_coherent(struct device *dev, size_t size,
unsigned long attrs) unsigned long attrs)
{ {
int order = get_order(size); int order = get_order(size);
unsigned long pfn = (dma_handle >> PAGE_SHIFT) + dev->dma_pfn_offset; unsigned long pfn = dma_handle >> PAGE_SHIFT;
int k; int k;
if (!WARN_ON(!dev))
pfn += dev->dma_pfn_offset;
for (k = 0; k < (1 << order); k++) for (k = 0; k < (1 << order); k++)
__free_pages(pfn_to_page(pfn + k), 0); __free_pages(pfn_to_page(pfn + k), 0);
...@@ -143,7 +148,7 @@ int __init platform_resource_setup_memory(struct platform_device *pdev, ...@@ -143,7 +148,7 @@ int __init platform_resource_setup_memory(struct platform_device *pdev,
if (!memsize) if (!memsize)
return 0; return 0;
buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL); buf = dma_alloc_coherent(&pdev->dev, memsize, &dma_handle, GFP_KERNEL);
if (!buf) { if (!buf) {
pr_warning("%s: unable to allocate memory\n", name); pr_warning("%s: unable to allocate memory\n", name);
return -ENOMEM; return -ENOMEM;
......
...@@ -211,59 +211,15 @@ void __init allocate_pgdat(unsigned int nid) ...@@ -211,59 +211,15 @@ void __init allocate_pgdat(unsigned int nid)
NODE_DATA(nid) = __va(phys); NODE_DATA(nid) = __va(phys);
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data)); memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
NODE_DATA(nid)->bdata = &bootmem_node_data[nid];
#endif #endif
NODE_DATA(nid)->node_start_pfn = start_pfn; NODE_DATA(nid)->node_start_pfn = start_pfn;
NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn; NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
} }
static void __init bootmem_init_one_node(unsigned int nid)
{
unsigned long total_pages, paddr;
unsigned long end_pfn;
struct pglist_data *p;
p = NODE_DATA(nid);
/* Nothing to do.. */
if (!p->node_spanned_pages)
return;
end_pfn = pgdat_end_pfn(p);
total_pages = bootmem_bootmap_pages(p->node_spanned_pages);
paddr = memblock_alloc(total_pages << PAGE_SHIFT, PAGE_SIZE);
if (!paddr)
panic("Can't allocate bootmap for nid[%d]\n", nid);
init_bootmem_node(p, paddr >> PAGE_SHIFT, p->node_start_pfn, end_pfn);
free_bootmem_with_active_regions(nid, end_pfn);
/*
* XXX Handle initial reservations for the system memory node
* only for the moment, we'll refactor this later for handling
* reservations in other nodes.
*/
if (nid == 0) {
struct memblock_region *reg;
/* Reserve the sections we're already using. */
for_each_memblock(reserved, reg) {
reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT);
}
}
sparse_memory_present_with_active_regions(nid);
}
static void __init do_init_bootmem(void) static void __init do_init_bootmem(void)
{ {
struct memblock_region *reg; struct memblock_region *reg;
int i;
/* Add active regions with valid PFNs. */ /* Add active regions with valid PFNs. */
for_each_memblock(memory, reg) { for_each_memblock(memory, reg) {
...@@ -279,9 +235,12 @@ static void __init do_init_bootmem(void) ...@@ -279,9 +235,12 @@ static void __init do_init_bootmem(void)
plat_mem_setup(); plat_mem_setup();
for_each_online_node(i) for_each_memblock(memory, reg) {
bootmem_init_one_node(i); int nid = memblock_get_region_node(reg);
memory_present(nid, memblock_region_memory_base_pfn(reg),
memblock_region_memory_end_pfn(reg));
}
sparse_init(); sparse_init();
} }
...@@ -322,7 +281,6 @@ void __init paging_init(void) ...@@ -322,7 +281,6 @@ void __init paging_init(void)
{ {
unsigned long max_zone_pfns[MAX_NR_ZONES]; unsigned long max_zone_pfns[MAX_NR_ZONES];
unsigned long vaddr, end; unsigned long vaddr, end;
int nid;
sh_mv.mv_mem_init(); sh_mv.mv_mem_init();
...@@ -377,21 +335,7 @@ void __init paging_init(void) ...@@ -377,21 +335,7 @@ void __init paging_init(void)
kmap_coherent_init(); kmap_coherent_init();
memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
for_each_online_node(nid) {
pg_data_t *pgdat = NODE_DATA(nid);
unsigned long low, start_pfn;
start_pfn = pgdat->bdata->node_min_pfn;
low = pgdat->bdata->node_low_pfn;
if (max_zone_pfns[ZONE_NORMAL] < low)
max_zone_pfns[ZONE_NORMAL] = low;
printk("Node %u: start_pfn = 0x%lx, low = 0x%lx\n",
nid, start_pfn, low);
}
free_area_init_nodes(max_zone_pfns); free_area_init_nodes(max_zone_pfns);
} }
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册