diff options
Diffstat (limited to 'arch')
82 files changed, 502 insertions, 356 deletions
| diff --git a/arch/Kconfig b/arch/Kconfig index 98de654b79b3..17fe351cdde0 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -738,8 +738,9 @@ config HAVE_STACK_VALIDATION  config HAVE_RELIABLE_STACKTRACE  	bool  	help -	  Architecture has a save_stack_trace_tsk_reliable() function which -	  only returns a stack trace if it can guarantee the trace is reliable. +	  Architecture has either save_stack_trace_tsk_reliable() or +	  arch_stack_walk_reliable() function which only returns a stack trace +	  if it can guarantee the trace is reliable.  config HAVE_ARCH_HASH  	bool diff --git a/arch/arm/boot/dts/am437x-idk-evm.dts b/arch/arm/boot/dts/am437x-idk-evm.dts index f3ced6df0c9b..9f66f96d09c9 100644 --- a/arch/arm/boot/dts/am437x-idk-evm.dts +++ b/arch/arm/boot/dts/am437x-idk-evm.dts @@ -526,11 +526,11 @@  	 * Supply voltage supervisor on board will not allow opp50 so  	 * disable it and set opp100 as suspend OPP.  	 */ -	opp50@300000000 { +	opp50-300000000 {  		status = "disabled";  	}; -	opp100@600000000 { +	opp100-600000000 {  		opp-suspend;  	};  }; diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts index 1b5a835f66bd..efea891b1a76 100644 --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts @@ -21,6 +21,7 @@  	aliases {  		ethernet0 = &genet; +		pcie0 = &pcie0;  	};  	leds { @@ -31,6 +32,8 @@  		pwr {  			label = "PWR";  			gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; +			default-state = "keep"; +			linux,default-trigger = "default-on";  		};  	}; diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts index 66ab35eccba7..28be0332c1c8 100644 --- a/arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts +++ b/arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts @@ -26,6 +26,8 @@  		pwr {  			label = "PWR";  			gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; +			default-state = "keep"; +			linux,default-trigger = "default-on";  		};  	};  }; diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts index 74ed6d047807..37343148643d 100644 --- a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts +++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts @@ -27,6 +27,8 @@  		pwr {  			label = "PWR";  			gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; +			default-state = "keep"; +			linux,default-trigger = "default-on";  		};  	}; diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts index de7f85efaa51..af06a55d1c5c 100644 --- a/arch/arm/boot/dts/dra7-evm.dts +++ b/arch/arm/boot/dts/dra7-evm.dts @@ -61,10 +61,10 @@  		regulator-max-microvolt = <1800000>;  	}; -	evm_3v3: fixedregulator-evm3v3 { +	vsys_3v3: fixedregulator-vsys3v3 {  		/* Output of Cntlr A of TPS43351-Q1 on dra7-evm */  		compatible = "regulator-fixed"; -		regulator-name = "evm_3v3"; +		regulator-name = "vsys_3v3";  		regulator-min-microvolt = <3300000>;  		regulator-max-microvolt = <3300000>;  		vin-supply = <&evm_12v0>; diff --git a/arch/arm/boot/dts/dra7-l4.dtsi b/arch/arm/boot/dts/dra7-l4.dtsi index fc418834890d..2119a78e9c15 100644 --- a/arch/arm/boot/dts/dra7-l4.dtsi +++ b/arch/arm/boot/dts/dra7-l4.dtsi @@ -3474,6 +3474,7 @@  				clocks = <&l4per3_clkctrl DRA7_L4PER3_TIMER13_CLKCTRL 24>;  				clock-names = "fck";  				interrupts = <GIC_SPI 339 IRQ_TYPE_LEVEL_HIGH>; +				ti,timer-pwm;  			};  		}; @@ -3501,6 +3502,7 @@  				clocks = <&l4per3_clkctrl DRA7_L4PER3_TIMER14_CLKCTRL 24>;  				clock-names = "fck";  				interrupts = <GIC_SPI 340 IRQ_TYPE_LEVEL_HIGH>; +				ti,timer-pwm;  			};  		}; @@ -3528,6 +3530,7 @@  				clocks = <&l4per3_clkctrl DRA7_L4PER3_TIMER15_CLKCTRL 24>;  				clock-names = "fck";  				interrupts = <GIC_SPI 341 IRQ_TYPE_LEVEL_HIGH>; +				ti,timer-pwm;  			};  		}; @@ -3555,6 +3558,7 @@  				clocks = <&l4per3_clkctrl DRA7_L4PER3_TIMER16_CLKCTRL 24>;  				clock-names = "fck";  				interrupts = <GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH>; +				ti,timer-pwm;  			};  		}; diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi index d78b684e7fca..4305051bb769 100644 --- a/arch/arm/boot/dts/dra7.dtsi +++ b/arch/arm/boot/dts/dra7.dtsi @@ -184,6 +184,7 @@  				device_type = "pci";  				ranges = <0x81000000 0 0          0x03000 0 0x00010000  					  0x82000000 0 0x20013000 0x13000 0 0xffed000>; +				dma-ranges = <0x02000000 0x0 0x00000000 0x00000000 0x1 0x00000000>;  				bus-range = <0x00 0xff>;  				#interrupt-cells = <1>;  				num-lanes = <1>; @@ -238,6 +239,7 @@  				device_type = "pci";  				ranges = <0x81000000 0 0          0x03000 0 0x00010000  					  0x82000000 0 0x30013000 0x13000 0 0xffed000>; +				dma-ranges = <0x02000000 0x0 0x00000000 0x00000000 0x1 0x00000000>;  				bus-range = <0x00 0xff>;  				#interrupt-cells = <1>;  				num-lanes = <1>; diff --git a/arch/arm/boot/dts/dra76x.dtsi b/arch/arm/boot/dts/dra76x.dtsi index 2f7539afef2b..42b8a205b64f 100644 --- a/arch/arm/boot/dts/dra76x.dtsi +++ b/arch/arm/boot/dts/dra76x.dtsi @@ -128,3 +128,8 @@  &usb4_tm {  	status = "disabled";  }; + +&mmc3 { +	/* dra76x is not affected by i887 */ +	max-frequency = <96000000>; +}; diff --git a/arch/arm/boot/dts/dra7xx-clocks.dtsi b/arch/arm/boot/dts/dra7xx-clocks.dtsi index 55cef4cac5f1..dc0a93bccbf1 100644 --- a/arch/arm/boot/dts/dra7xx-clocks.dtsi +++ b/arch/arm/boot/dts/dra7xx-clocks.dtsi @@ -796,16 +796,6 @@  		clock-div = <1>;  	}; -	ipu1_gfclk_mux: ipu1_gfclk_mux@520 { -		#clock-cells = <0>; -		compatible = "ti,mux-clock"; -		clocks = <&dpll_abe_m2x2_ck>, <&dpll_core_h22x2_ck>; -		ti,bit-shift = <24>; -		reg = <0x0520>; -		assigned-clocks = <&ipu1_gfclk_mux>; -		assigned-clock-parents = <&dpll_core_h22x2_ck>; -	}; -  	dummy_ck: dummy_ck {  		#clock-cells = <0>;  		compatible = "fixed-clock"; @@ -1564,6 +1554,8 @@  			compatible = "ti,clkctrl";  			reg = <0x20 0x4>;  			#clock-cells = <2>; +			assigned-clocks = <&ipu1_clkctrl DRA7_IPU1_MMU_IPU1_CLKCTRL 24>; +			assigned-clock-parents = <&dpll_core_h22x2_ck>;  		};  		ipu_clkctrl: ipu-clkctrl@50 { diff --git a/arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts b/arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts index cd075621de52..84fcc203a2e4 100644 --- a/arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts +++ b/arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts @@ -275,7 +275,7 @@  	/* SRAM on Colibri nEXT_CS0 */  	sram@0,0 { -		compatible = "cypress,cy7c1019dv33-10zsxi, mtd-ram"; +		compatible = "cypress,cy7c1019dv33-10zsxi", "mtd-ram";  		reg = <0 0 0x00010000>;  		#address-cells = <1>;  		#size-cells = <1>; @@ -286,7 +286,7 @@  	/* SRAM on Colibri nEXT_CS1 */  	sram@1,0 { -		compatible = "cypress,cy7c1019dv33-10zsxi, mtd-ram"; +		compatible = "cypress,cy7c1019dv33-10zsxi", "mtd-ram";  		reg = <1 0 0x00010000>;  		#address-cells = <1>;  		#size-cells = <1>; diff --git a/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi b/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi index 978dc1c2ff1b..4d18952658f8 100644 --- a/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi +++ b/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi @@ -192,7 +192,6 @@  	pinctrl-0 = <&pinctrl_usdhc4>;  	bus-width = <8>;  	non-removable; -	vmmc-supply = <&vdd_emmc_1p8>;  	status = "disabled";  }; diff --git a/arch/arm/boot/dts/imx7-colibri.dtsi b/arch/arm/boot/dts/imx7-colibri.dtsi index d05be3f0e2a7..04717cf69db0 100644 --- a/arch/arm/boot/dts/imx7-colibri.dtsi +++ b/arch/arm/boot/dts/imx7-colibri.dtsi @@ -336,7 +336,6 @@  	assigned-clock-rates = <400000000>;  	bus-width = <8>;  	fsl,tuning-step = <2>; -	max-frequency = <100000000>;  	vmmc-supply = <®_module_3v3>;  	vqmmc-supply = <®_DCDC3>;  	non-removable; diff --git a/arch/arm/boot/dts/imx7d.dtsi b/arch/arm/boot/dts/imx7d.dtsi index 92f6d0c2a74f..4c22828df55f 100644 --- a/arch/arm/boot/dts/imx7d.dtsi +++ b/arch/arm/boot/dts/imx7d.dtsi @@ -44,7 +44,7 @@  			opp-hz = /bits/ 64 <792000000>;  			opp-microvolt = <1000000>;  			clock-latency-ns = <150000>; -			opp-supported-hw = <0xd>, <0xf>; +			opp-supported-hw = <0xd>, <0x7>;  			opp-suspend;  		}; @@ -52,7 +52,7 @@  			opp-hz = /bits/ 64 <996000000>;  			opp-microvolt = <1100000>;  			clock-latency-ns = <150000>; -			opp-supported-hw = <0xc>, <0xf>; +			opp-supported-hw = <0xc>, <0x7>;  			opp-suspend;  		}; @@ -60,7 +60,7 @@  			opp-hz = /bits/ 64 <1200000000>;  			opp-microvolt = <1225000>;  			clock-latency-ns = <150000>; -			opp-supported-hw = <0x8>, <0xf>; +			opp-supported-hw = <0x8>, <0x3>;  			opp-suspend;  		};  	}; diff --git a/arch/arm/boot/dts/ls1021a.dtsi b/arch/arm/boot/dts/ls1021a.dtsi index 0855b1fe98e0..760a68c163c8 100644 --- a/arch/arm/boot/dts/ls1021a.dtsi +++ b/arch/arm/boot/dts/ls1021a.dtsi @@ -747,7 +747,7 @@  		};  		mdio0: mdio@2d24000 { -			compatible = "fsl,etsec2-mdio"; +			compatible = "gianfar";  			device_type = "mdio";  			#address-cells = <1>;  			#size-cells = <0>; @@ -756,7 +756,7 @@  		};  		mdio1: mdio@2d64000 { -			compatible = "fsl,etsec2-mdio"; +			compatible = "gianfar";  			device_type = "mdio";  			#address-cells = <1>;  			#size-cells = <0>; diff --git a/arch/arm/boot/dts/motorola-mapphone-common.dtsi b/arch/arm/boot/dts/motorola-mapphone-common.dtsi index 85665506f4f8..b6e82b165f5c 100644 --- a/arch/arm/boot/dts/motorola-mapphone-common.dtsi +++ b/arch/arm/boot/dts/motorola-mapphone-common.dtsi @@ -182,6 +182,14 @@  		pwm-names = "enable", "direction";  		direction-duty-cycle-ns = <10000000>;  	}; + +	backlight: backlight { +		compatible = "led-backlight"; + +		leds = <&backlight_led>; +		brightness-levels = <31 63 95 127 159 191 223 255>; +		default-brightness-level = <6>; +	};  };  &dss { @@ -205,6 +213,8 @@  		vddi-supply = <&lcd_regulator>;  		reset-gpios = <&gpio4 5 GPIO_ACTIVE_HIGH>;	/* gpio101 */ +		backlight = <&backlight>; +  		width-mm = <50>;  		height-mm = <89>; @@ -393,12 +403,11 @@  		ramp-up-us = <1024>;  		ramp-down-us = <8193>; -		led@0 { +		backlight_led: led@0 {  			reg = <0>;  			led-sources = <2>;  			ti,led-mode = <0>;  			label = ":backlight"; -			linux,default-trigger = "backlight";  		};  		led@1 { diff --git a/arch/arm/boot/dts/r8a7779.dtsi b/arch/arm/boot/dts/r8a7779.dtsi index beb9885e6ffc..c0999e27e9b1 100644 --- a/arch/arm/boot/dts/r8a7779.dtsi +++ b/arch/arm/boot/dts/r8a7779.dtsi @@ -377,7 +377,7 @@  	};  	sata: sata@fc600000 { -		compatible = "renesas,sata-r8a7779", "renesas,rcar-sata"; +		compatible = "renesas,sata-r8a7779";  		reg = <0xfc600000 0x200000>;  		interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;  		clocks = <&mstp1_clks R8A7779_CLK_SATA>; diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig index 519ff58e67b3..0afcae9f7cf8 100644 --- a/arch/arm/configs/bcm2835_defconfig +++ b/arch/arm/configs/bcm2835_defconfig @@ -178,6 +178,7 @@ CONFIG_SCHED_TRACER=y  CONFIG_STACK_TRACER=y  CONFIG_FUNCTION_PROFILER=y  CONFIG_TEST_KSTRTOX=y +CONFIG_DEBUG_FS=y  CONFIG_KGDB=y  CONFIG_KGDB_KDB=y  CONFIG_STRICT_DEVMEM=y diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index c32c338f7704..847f9874ccc4 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig @@ -375,6 +375,7 @@ CONFIG_BACKLIGHT_GENERIC=m  CONFIG_BACKLIGHT_PWM=m  CONFIG_BACKLIGHT_PANDORA=m  CONFIG_BACKLIGHT_GPIO=m +CONFIG_BACKLIGHT_LED=m  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y  CONFIG_LOGO=y diff --git a/arch/arm/configs/socfpga_defconfig b/arch/arm/configs/socfpga_defconfig index fe2e1e82e233..e73c97b0f5b0 100644 --- a/arch/arm/configs/socfpga_defconfig +++ b/arch/arm/configs/socfpga_defconfig @@ -157,6 +157,7 @@ CONFIG_NLS_ISO8859_1=y  CONFIG_PRINTK_TIME=y  CONFIG_DEBUG_INFO=y  CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_FS=y  CONFIG_DETECT_HUNG_TASK=y  # CONFIG_SCHED_DEBUG is not set  CONFIG_FUNCTION_TRACER=y diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index c3314b286a61..a827b4d60d38 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h @@ -392,9 +392,6 @@ static inline void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu) {}  static inline void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu) {}  static inline void kvm_vcpu_pmu_restore_host(struct kvm_vcpu *vcpu) {} -static inline void kvm_arm_vhe_guest_enter(void) {} -static inline void kvm_arm_vhe_guest_exit(void) {} -  #define KVM_BP_HARDEN_UNKNOWN		-1  #define KVM_BP_HARDEN_WA_NEEDED		0  #define KVM_BP_HARDEN_NOT_REQUIRED	1 diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index 35ff620537e6..03506ce46149 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -91,6 +91,8 @@ AFLAGS_suspend-imx6.o :=-Wa,-march=armv7-a  obj-$(CONFIG_SOC_IMX6) += suspend-imx6.o  obj-$(CONFIG_SOC_IMX53) += suspend-imx53.o  endif +AFLAGS_resume-imx6.o :=-Wa,-march=armv7-a +obj-$(CONFIG_SOC_IMX6) += resume-imx6.o  obj-$(CONFIG_SOC_IMX6) += pm-imx6.o  obj-$(CONFIG_SOC_IMX1) += mach-imx1.o diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index 912aeceb4ff8..5aa5796cff0e 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -109,17 +109,17 @@ void imx_cpu_die(unsigned int cpu);  int imx_cpu_kill(unsigned int cpu);  #ifdef CONFIG_SUSPEND -void v7_cpu_resume(void);  void imx53_suspend(void __iomem *ocram_vbase);  extern const u32 imx53_suspend_sz;  void imx6_suspend(void __iomem *ocram_vbase);  #else -static inline void v7_cpu_resume(void) {}  static inline void imx53_suspend(void __iomem *ocram_vbase) {}  static const u32 imx53_suspend_sz;  static inline void imx6_suspend(void __iomem *ocram_vbase) {}  #endif +void v7_cpu_resume(void); +  void imx6_pm_ccm_init(const char *ccm_compat);  void imx6q_pm_init(void);  void imx6dl_pm_init(void); diff --git a/arch/arm/mach-imx/resume-imx6.S b/arch/arm/mach-imx/resume-imx6.S new file mode 100644 index 000000000000..5bd1ba7ef15b --- /dev/null +++ b/arch/arm/mach-imx/resume-imx6.S @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright 2014 Freescale Semiconductor, Inc. + */ + +#include <linux/linkage.h> +#include <asm/assembler.h> +#include <asm/asm-offsets.h> +#include <asm/hardware/cache-l2x0.h> +#include "hardware.h" + +/* + * The following code must assume it is running from physical address + * where absolute virtual addresses to the data section have to be + * turned into relative ones. + */ + +ENTRY(v7_cpu_resume) +	bl	v7_invalidate_l1 +#ifdef CONFIG_CACHE_L2X0 +	bl	l2c310_early_resume +#endif +	b	cpu_resume +ENDPROC(v7_cpu_resume) diff --git a/arch/arm/mach-imx/suspend-imx6.S b/arch/arm/mach-imx/suspend-imx6.S index 062391ff13da..1eabf2d2834b 100644 --- a/arch/arm/mach-imx/suspend-imx6.S +++ b/arch/arm/mach-imx/suspend-imx6.S @@ -327,17 +327,3 @@ resume:  	ret	lr  ENDPROC(imx6_suspend) - -/* - * The following code must assume it is running from physical address - * where absolute virtual addresses to the data section have to be - * turned into relative ones. - */ - -ENTRY(v7_cpu_resume) -	bl	v7_invalidate_l1 -#ifdef CONFIG_CACHE_L2X0 -	bl	l2c310_early_resume -#endif -	b	cpu_resume -ENDPROC(v7_cpu_resume) diff --git a/arch/arm/mach-meson/Kconfig b/arch/arm/mach-meson/Kconfig index 01f0f4b765e0..75034fe197e3 100644 --- a/arch/arm/mach-meson/Kconfig +++ b/arch/arm/mach-meson/Kconfig @@ -9,7 +9,6 @@ menuconfig ARCH_MESON  	select CACHE_L2X0  	select PINCTRL  	select PINCTRL_MESON -	select COMMON_CLK  	select HAVE_ARM_SCU if SMP  	select HAVE_ARM_TWD if SMP diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index e1135b9d67c6..5017a3be0ff0 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -16,7 +16,7 @@ hwmod-common				= omap_hwmod.o omap_hwmod_reset.o \  clock-common				= clock.o  secure-common				= omap-smc.o omap-secure.o -obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) $(secure-common) +obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common)  obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common)  obj-$(CONFIG_ARCH_OMAP4) += $(hwmod-common) $(secure-common)  obj-$(CONFIG_SOC_AM33XX) += $(hwmod-common) $(secure-common) diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index f28047233665..27608d1026cb 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -431,7 +431,6 @@ void __init omap2420_init_early(void)  	omap_hwmod_init_postsetup();  	omap_clk_soc_init = omap2420_dt_clk_init;  	rate_table = omap2420_rate_table; -	omap_secure_init();  }  void __init omap2420_init_late(void) @@ -456,7 +455,6 @@ void __init omap2430_init_early(void)  	omap_hwmod_init_postsetup();  	omap_clk_soc_init = omap2430_dt_clk_init;  	rate_table = omap2430_rate_table; -	omap_secure_init();  }  void __init omap2430_init_late(void) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts index f82f25c1a5f9..d5dc12878dfe 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts @@ -327,7 +327,7 @@  	#size-cells = <0>;  	bus-width = <4>; -	max-frequency = <50000000>; +	max-frequency = <60000000>;  	non-removable;  	disable-wp; diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts index a8bb3fa9fec9..cb1b48f5b8b1 100644 --- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts @@ -593,6 +593,7 @@  		compatible = "brcm,bcm43438-bt";  		interrupt-parent = <&gpio_intc>;  		interrupts = <95 IRQ_TYPE_LEVEL_HIGH>; +		interrupt-names = "host-wakeup";  		shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;  		max-speed = <2000000>;  		clocks = <&wifi32k>; diff --git a/arch/arm64/boot/dts/freescale/imx8qxp-mek.dts b/arch/arm64/boot/dts/freescale/imx8qxp-mek.dts index d3d26cca7d52..13460a360c6a 100644 --- a/arch/arm64/boot/dts/freescale/imx8qxp-mek.dts +++ b/arch/arm64/boot/dts/freescale/imx8qxp-mek.dts @@ -52,11 +52,6 @@  			compatible = "ethernet-phy-ieee802.3-c22";  			reg = <0>;  		}; - -		ethphy1: ethernet-phy@1 { -			compatible = "ethernet-phy-ieee802.3-c22"; -			reg = <1>; -		};  	};  }; diff --git a/arch/arm64/boot/dts/intel/socfpga_agilex.dtsi b/arch/arm64/boot/dts/intel/socfpga_agilex.dtsi index e1d357eaad7c..d8c44d3ca15a 100644 --- a/arch/arm64/boot/dts/intel/socfpga_agilex.dtsi +++ b/arch/arm64/boot/dts/intel/socfpga_agilex.dtsi @@ -102,7 +102,7 @@  		};  		gmac0: ethernet@ff800000 { -			compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac"; +			compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";  			reg = <0xff800000 0x2000>;  			interrupts = <0 90 4>;  			interrupt-names = "macirq"; @@ -118,7 +118,7 @@  		};  		gmac1: ethernet@ff802000 { -			compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac"; +			compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";  			reg = <0xff802000 0x2000>;  			interrupts = <0 91 4>;  			interrupt-names = "macirq"; @@ -134,7 +134,7 @@  		};  		gmac2: ethernet@ff804000 { -			compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac"; +			compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";  			reg = <0xff804000 0x2000>;  			interrupts = <0 92 4>;  			interrupt-names = "macirq"; diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index 905109f6814f..4db223dbc549 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -773,7 +773,7 @@ CONFIG_ARCH_R8A774A1=y  CONFIG_ARCH_R8A774B1=y  CONFIG_ARCH_R8A774C0=y  CONFIG_ARCH_R8A7795=y -CONFIG_ARCH_R8A7796=y +CONFIG_ARCH_R8A77960=y  CONFIG_ARCH_R8A77961=y  CONFIG_ARCH_R8A77965=y  CONFIG_ARCH_R8A77970=y diff --git a/arch/arm64/include/asm/arch_gicv3.h b/arch/arm64/include/asm/arch_gicv3.h index 25fec4bde43a..a358e97572c1 100644 --- a/arch/arm64/include/asm/arch_gicv3.h +++ b/arch/arm64/include/asm/arch_gicv3.h @@ -32,7 +32,7 @@ static inline void gic_write_eoir(u32 irq)  	isb();  } -static inline void gic_write_dir(u32 irq) +static __always_inline void gic_write_dir(u32 irq)  {  	write_sysreg_s(irq, SYS_ICC_DIR_EL1);  	isb(); diff --git a/arch/arm64/include/asm/cache.h b/arch/arm64/include/asm/cache.h index 806e9dc2a852..a4d1b5f771f6 100644 --- a/arch/arm64/include/asm/cache.h +++ b/arch/arm64/include/asm/cache.h @@ -69,7 +69,7 @@ static inline int icache_is_aliasing(void)  	return test_bit(ICACHEF_ALIASING, &__icache_flags);  } -static inline int icache_is_vpipt(void) +static __always_inline int icache_is_vpipt(void)  {  	return test_bit(ICACHEF_VPIPT, &__icache_flags);  } diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h index 665c78e0665a..e6cca3d4acf7 100644 --- a/arch/arm64/include/asm/cacheflush.h +++ b/arch/arm64/include/asm/cacheflush.h @@ -145,7 +145,7 @@ extern void copy_to_user_page(struct vm_area_struct *, struct page *,  #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1  extern void flush_dcache_page(struct page *); -static inline void __flush_icache_all(void) +static __always_inline void __flush_icache_all(void)  {  	if (cpus_have_const_cap(ARM64_HAS_CACHE_DIC))  		return; diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h index 92ef9539874a..2a746b99e937 100644 --- a/arch/arm64/include/asm/cpufeature.h +++ b/arch/arm64/include/asm/cpufeature.h @@ -435,13 +435,13 @@ cpuid_feature_extract_signed_field(u64 features, int field)  	return cpuid_feature_extract_signed_field_width(features, field, 4);  } -static inline unsigned int __attribute_const__ +static __always_inline unsigned int __attribute_const__  cpuid_feature_extract_unsigned_field_width(u64 features, int field, int width)  {  	return (u64)(features << (64 - width - field)) >> (64 - width);  } -static inline unsigned int __attribute_const__ +static __always_inline unsigned int __attribute_const__  cpuid_feature_extract_unsigned_field(u64 features, int field)  {  	return cpuid_feature_extract_unsigned_field_width(features, field, 4); @@ -564,7 +564,7 @@ static inline bool system_supports_mixed_endian(void)  	return val == 0x1;  } -static inline bool system_supports_fpsimd(void) +static __always_inline bool system_supports_fpsimd(void)  {  	return !cpus_have_const_cap(ARM64_HAS_NO_FPSIMD);  } @@ -575,13 +575,13 @@ static inline bool system_uses_ttbr0_pan(void)  		!cpus_have_const_cap(ARM64_HAS_PAN);  } -static inline bool system_supports_sve(void) +static __always_inline bool system_supports_sve(void)  {  	return IS_ENABLED(CONFIG_ARM64_SVE) &&  		cpus_have_const_cap(ARM64_SVE);  } -static inline bool system_supports_cnp(void) +static __always_inline bool system_supports_cnp(void)  {  	return IS_ENABLED(CONFIG_ARM64_CNP) &&  		cpus_have_const_cap(ARM64_HAS_CNP); diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h index 4e531f57147d..6facd1308e7c 100644 --- a/arch/arm64/include/asm/io.h +++ b/arch/arm64/include/asm/io.h @@ -34,7 +34,7 @@ static inline void __raw_writew(u16 val, volatile void __iomem *addr)  }  #define __raw_writel __raw_writel -static inline void __raw_writel(u32 val, volatile void __iomem *addr) +static __always_inline void __raw_writel(u32 val, volatile void __iomem *addr)  {  	asm volatile("str %w0, [%1]" : : "rZ" (val), "r" (addr));  } @@ -69,7 +69,7 @@ static inline u16 __raw_readw(const volatile void __iomem *addr)  }  #define __raw_readl __raw_readl -static inline u32 __raw_readl(const volatile void __iomem *addr) +static __always_inline u32 __raw_readl(const volatile void __iomem *addr)  {  	u32 val;  	asm volatile(ALTERNATIVE("ldr %w0, [%1]", diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h index 688c63412cc2..f658dda12364 100644 --- a/arch/arm64/include/asm/kvm_emulate.h +++ b/arch/arm64/include/asm/kvm_emulate.h @@ -36,7 +36,7 @@ void kvm_inject_undef32(struct kvm_vcpu *vcpu);  void kvm_inject_dabt32(struct kvm_vcpu *vcpu, unsigned long addr);  void kvm_inject_pabt32(struct kvm_vcpu *vcpu, unsigned long addr); -static inline bool vcpu_el1_is_32bit(struct kvm_vcpu *vcpu) +static __always_inline bool vcpu_el1_is_32bit(struct kvm_vcpu *vcpu)  {  	return !(vcpu->arch.hcr_el2 & HCR_RW);  } @@ -127,7 +127,7 @@ static inline void vcpu_set_vsesr(struct kvm_vcpu *vcpu, u64 vsesr)  	vcpu->arch.vsesr_el2 = vsesr;  } -static inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu) +static __always_inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu)  {  	return (unsigned long *)&vcpu_gp_regs(vcpu)->regs.pc;  } @@ -153,17 +153,17 @@ static inline void vcpu_write_elr_el1(const struct kvm_vcpu *vcpu, unsigned long  		*__vcpu_elr_el1(vcpu) = v;  } -static inline unsigned long *vcpu_cpsr(const struct kvm_vcpu *vcpu) +static __always_inline unsigned long *vcpu_cpsr(const struct kvm_vcpu *vcpu)  {  	return (unsigned long *)&vcpu_gp_regs(vcpu)->regs.pstate;  } -static inline bool vcpu_mode_is_32bit(const struct kvm_vcpu *vcpu) +static __always_inline bool vcpu_mode_is_32bit(const struct kvm_vcpu *vcpu)  {  	return !!(*vcpu_cpsr(vcpu) & PSR_MODE32_BIT);  } -static inline bool kvm_condition_valid(const struct kvm_vcpu *vcpu) +static __always_inline bool kvm_condition_valid(const struct kvm_vcpu *vcpu)  {  	if (vcpu_mode_is_32bit(vcpu))  		return kvm_condition_valid32(vcpu); @@ -181,13 +181,13 @@ static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu)   * coming from a read of ESR_EL2. Otherwise, it may give the wrong result on   * AArch32 with banked registers.   */ -static inline unsigned long vcpu_get_reg(const struct kvm_vcpu *vcpu, +static __always_inline unsigned long vcpu_get_reg(const struct kvm_vcpu *vcpu,  					 u8 reg_num)  {  	return (reg_num == 31) ? 0 : vcpu_gp_regs(vcpu)->regs.regs[reg_num];  } -static inline void vcpu_set_reg(struct kvm_vcpu *vcpu, u8 reg_num, +static __always_inline void vcpu_set_reg(struct kvm_vcpu *vcpu, u8 reg_num,  				unsigned long val)  {  	if (reg_num != 31) @@ -264,12 +264,12 @@ static inline bool vcpu_mode_priv(const struct kvm_vcpu *vcpu)  	return mode != PSR_MODE_EL0t;  } -static inline u32 kvm_vcpu_get_hsr(const struct kvm_vcpu *vcpu) +static __always_inline u32 kvm_vcpu_get_hsr(const struct kvm_vcpu *vcpu)  {  	return vcpu->arch.fault.esr_el2;  } -static inline int kvm_vcpu_get_condition(const struct kvm_vcpu *vcpu) +static __always_inline int kvm_vcpu_get_condition(const struct kvm_vcpu *vcpu)  {  	u32 esr = kvm_vcpu_get_hsr(vcpu); @@ -279,12 +279,12 @@ static inline int kvm_vcpu_get_condition(const struct kvm_vcpu *vcpu)  	return -1;  } -static inline unsigned long kvm_vcpu_get_hfar(const struct kvm_vcpu *vcpu) +static __always_inline unsigned long kvm_vcpu_get_hfar(const struct kvm_vcpu *vcpu)  {  	return vcpu->arch.fault.far_el2;  } -static inline phys_addr_t kvm_vcpu_get_fault_ipa(const struct kvm_vcpu *vcpu) +static __always_inline phys_addr_t kvm_vcpu_get_fault_ipa(const struct kvm_vcpu *vcpu)  {  	return ((phys_addr_t)vcpu->arch.fault.hpfar_el2 & HPFAR_MASK) << 8;  } @@ -299,7 +299,7 @@ static inline u32 kvm_vcpu_hvc_get_imm(const struct kvm_vcpu *vcpu)  	return kvm_vcpu_get_hsr(vcpu) & ESR_ELx_xVC_IMM_MASK;  } -static inline bool kvm_vcpu_dabt_isvalid(const struct kvm_vcpu *vcpu) +static __always_inline bool kvm_vcpu_dabt_isvalid(const struct kvm_vcpu *vcpu)  {  	return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_ISV);  } @@ -319,17 +319,17 @@ static inline bool kvm_vcpu_dabt_issf(const struct kvm_vcpu *vcpu)  	return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SF);  } -static inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu) +static __always_inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu)  {  	return (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT;  } -static inline bool kvm_vcpu_dabt_iss1tw(const struct kvm_vcpu *vcpu) +static __always_inline bool kvm_vcpu_dabt_iss1tw(const struct kvm_vcpu *vcpu)  {  	return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_S1PTW);  } -static inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu) +static __always_inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu)  {  	return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_WNR) ||  		kvm_vcpu_dabt_iss1tw(vcpu); /* AF/DBM update */ @@ -340,18 +340,18 @@ static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu)  	return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_CM);  } -static inline unsigned int kvm_vcpu_dabt_get_as(const struct kvm_vcpu *vcpu) +static __always_inline unsigned int kvm_vcpu_dabt_get_as(const struct kvm_vcpu *vcpu)  {  	return 1 << ((kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SAS) >> ESR_ELx_SAS_SHIFT);  }  /* This one is not specific to Data Abort */ -static inline bool kvm_vcpu_trap_il_is32bit(const struct kvm_vcpu *vcpu) +static __always_inline bool kvm_vcpu_trap_il_is32bit(const struct kvm_vcpu *vcpu)  {  	return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_IL);  } -static inline u8 kvm_vcpu_trap_get_class(const struct kvm_vcpu *vcpu) +static __always_inline u8 kvm_vcpu_trap_get_class(const struct kvm_vcpu *vcpu)  {  	return ESR_ELx_EC(kvm_vcpu_get_hsr(vcpu));  } @@ -361,17 +361,17 @@ static inline bool kvm_vcpu_trap_is_iabt(const struct kvm_vcpu *vcpu)  	return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW;  } -static inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu) +static __always_inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)  {  	return kvm_vcpu_get_hsr(vcpu) & ESR_ELx_FSC;  } -static inline u8 kvm_vcpu_trap_get_fault_type(const struct kvm_vcpu *vcpu) +static __always_inline u8 kvm_vcpu_trap_get_fault_type(const struct kvm_vcpu *vcpu)  {  	return kvm_vcpu_get_hsr(vcpu) & ESR_ELx_FSC_TYPE;  } -static inline bool kvm_vcpu_dabt_isextabt(const struct kvm_vcpu *vcpu) +static __always_inline bool kvm_vcpu_dabt_isextabt(const struct kvm_vcpu *vcpu)  {  	switch (kvm_vcpu_trap_get_fault(vcpu)) {  	case FSC_SEA: @@ -390,7 +390,7 @@ static inline bool kvm_vcpu_dabt_isextabt(const struct kvm_vcpu *vcpu)  	}  } -static inline int kvm_vcpu_sys_get_rt(struct kvm_vcpu *vcpu) +static __always_inline int kvm_vcpu_sys_get_rt(struct kvm_vcpu *vcpu)  {  	u32 esr = kvm_vcpu_get_hsr(vcpu);  	return ESR_ELx_SYS64_ISS_RT(esr); @@ -504,7 +504,7 @@ static inline unsigned long vcpu_data_host_to_guest(struct kvm_vcpu *vcpu,  	return data;		/* Leave LE untouched */  } -static inline void kvm_skip_instr(struct kvm_vcpu *vcpu, bool is_wide_instr) +static __always_inline void kvm_skip_instr(struct kvm_vcpu *vcpu, bool is_wide_instr)  {  	if (vcpu_mode_is_32bit(vcpu))  		kvm_skip_instr32(vcpu, is_wide_instr); @@ -519,7 +519,7 @@ static inline void kvm_skip_instr(struct kvm_vcpu *vcpu, bool is_wide_instr)   * Skip an instruction which has been emulated at hyp while most guest sysregs   * are live.   */ -static inline void __hyp_text __kvm_skip_instr(struct kvm_vcpu *vcpu) +static __always_inline void __hyp_text __kvm_skip_instr(struct kvm_vcpu *vcpu)  {  	*vcpu_pc(vcpu) = read_sysreg_el2(SYS_ELR);  	vcpu->arch.ctxt.gp_regs.regs.pstate = read_sysreg_el2(SYS_SPSR); diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index d87aa609d2b6..57fd46acd058 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -626,38 +626,6 @@ static inline void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr) {}  static inline void kvm_clr_pmu_events(u32 clr) {}  #endif -static inline void kvm_arm_vhe_guest_enter(void) -{ -	local_daif_mask(); - -	/* -	 * Having IRQs masked via PMR when entering the guest means the GIC -	 * will not signal the CPU of interrupts of lower priority, and the -	 * only way to get out will be via guest exceptions. -	 * Naturally, we want to avoid this. -	 * -	 * local_daif_mask() already sets GIC_PRIO_PSR_I_SET, we just need a -	 * dsb to ensure the redistributor is forwards EL2 IRQs to the CPU. -	 */ -	pmr_sync(); -} - -static inline void kvm_arm_vhe_guest_exit(void) -{ -	/* -	 * local_daif_restore() takes care to properly restore PSTATE.DAIF -	 * and the GIC PMR if the host is using IRQ priorities. -	 */ -	local_daif_restore(DAIF_PROCCTX_NOIRQ); - -	/* -	 * When we exit from the guest we change a number of CPU configuration -	 * parameters, such as traps.  Make sure these changes take effect -	 * before running the host or additional guests. -	 */ -	isb(); -} -  #define KVM_BP_HARDEN_UNKNOWN		-1  #define KVM_BP_HARDEN_WA_NEEDED		0  #define KVM_BP_HARDEN_NOT_REQUIRED	1 diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h index a3a6a2ba9a63..fe57f60f06a8 100644 --- a/arch/arm64/include/asm/kvm_hyp.h +++ b/arch/arm64/include/asm/kvm_hyp.h @@ -47,6 +47,13 @@  #define read_sysreg_el2(r)	read_sysreg_elx(r, _EL2, _EL1)  #define write_sysreg_el2(v,r)	write_sysreg_elx(v, r, _EL2, _EL1) +/* + * Without an __arch_swab32(), we fall back to ___constant_swab32(), but the + * static inline can allow the compiler to out-of-line this. KVM always wants + * the macro version as its always inlined. + */ +#define __kvm_swab32(x)	___constant_swab32(x) +  int __vgic_v2_perform_cpuif_access(struct kvm_vcpu *vcpu);  void __vgic_v3_save_state(struct kvm_vcpu *vcpu); diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 53d846f1bfe7..785762860c63 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -93,7 +93,7 @@ void kvm_update_va_mask(struct alt_instr *alt,  			__le32 *origptr, __le32 *updptr, int nr_inst);  void kvm_compute_layout(void); -static inline unsigned long __kern_hyp_va(unsigned long v) +static __always_inline unsigned long __kern_hyp_va(unsigned long v)  {  	asm volatile(ALTERNATIVE_CB("and %0, %0, #1\n"  				    "ror %0, %0, #1\n" @@ -473,6 +473,7 @@ static inline int kvm_write_guest_lock(struct kvm *kvm, gpa_t gpa,  extern void *__kvm_bp_vect_base;  extern int __kvm_harden_el2_vector_slot; +/*  This is only called on a VHE system */  static inline void *kvm_get_hyp_vector(void)  {  	struct bp_hardening_data *data = arm64_get_bp_hardening_data(); diff --git a/arch/arm64/include/asm/virt.h b/arch/arm64/include/asm/virt.h index 0958ed6191aa..61fd26752adc 100644 --- a/arch/arm64/include/asm/virt.h +++ b/arch/arm64/include/asm/virt.h @@ -83,7 +83,7 @@ static inline bool is_kernel_in_hyp_mode(void)  	return read_sysreg(CurrentEL) == CurrentEL_EL2;  } -static inline bool has_vhe(void) +static __always_inline bool has_vhe(void)  {  	if (cpus_have_const_cap(ARM64_HAS_VIRT_HOST_EXTN))  		return true; diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c index dfe8dd172512..925086b46136 100644 --- a/arch/arm64/kvm/hyp/switch.c +++ b/arch/arm64/kvm/hyp/switch.c @@ -625,7 +625,7 @@ static void __hyp_text __pmu_switch_to_host(struct kvm_cpu_context *host_ctxt)  }  /* Switch to the guest for VHE systems running in EL2 */ -int kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu) +static int __kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu)  {  	struct kvm_cpu_context *host_ctxt;  	struct kvm_cpu_context *guest_ctxt; @@ -678,7 +678,42 @@ int kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu)  	return exit_code;  } -NOKPROBE_SYMBOL(kvm_vcpu_run_vhe); +NOKPROBE_SYMBOL(__kvm_vcpu_run_vhe); + +int kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu) +{ +	int ret; + +	local_daif_mask(); + +	/* +	 * Having IRQs masked via PMR when entering the guest means the GIC +	 * will not signal the CPU of interrupts of lower priority, and the +	 * only way to get out will be via guest exceptions. +	 * Naturally, we want to avoid this. +	 * +	 * local_daif_mask() already sets GIC_PRIO_PSR_I_SET, we just need a +	 * dsb to ensure the redistributor is forwards EL2 IRQs to the CPU. +	 */ +	pmr_sync(); + +	ret = __kvm_vcpu_run_vhe(vcpu); + +	/* +	 * local_daif_restore() takes care to properly restore PSTATE.DAIF +	 * and the GIC PMR if the host is using IRQ priorities. +	 */ +	local_daif_restore(DAIF_PROCCTX_NOIRQ); + +	/* +	 * When we exit from the guest we change a number of CPU configuration +	 * parameters, such as traps.  Make sure these changes take effect +	 * before running the host or additional guests. +	 */ +	isb(); + +	return ret; +}  /* Switch to the guest for legacy non-VHE systems */  int __hyp_text __kvm_vcpu_run_nvhe(struct kvm_vcpu *vcpu) diff --git a/arch/arm64/kvm/hyp/vgic-v2-cpuif-proxy.c b/arch/arm64/kvm/hyp/vgic-v2-cpuif-proxy.c index 29ee1feba4eb..4f3a087e36d5 100644 --- a/arch/arm64/kvm/hyp/vgic-v2-cpuif-proxy.c +++ b/arch/arm64/kvm/hyp/vgic-v2-cpuif-proxy.c @@ -69,14 +69,14 @@ int __hyp_text __vgic_v2_perform_cpuif_access(struct kvm_vcpu *vcpu)  		u32 data = vcpu_get_reg(vcpu, rd);  		if (__is_be(vcpu)) {  			/* guest pre-swabbed data, undo this for writel() */ -			data = swab32(data); +			data = __kvm_swab32(data);  		}  		writel_relaxed(data, addr);  	} else {  		u32 data = readl_relaxed(addr);  		if (__is_be(vcpu)) {  			/* guest expects swabbed data */ -			data = swab32(data); +			data = __kvm_swab32(data);  		}  		vcpu_set_reg(vcpu, rd, data);  	} diff --git a/arch/arm64/mm/context.c b/arch/arm64/mm/context.c index 8ef73e89d514..d89bb22589f6 100644 --- a/arch/arm64/mm/context.c +++ b/arch/arm64/mm/context.c @@ -260,14 +260,26 @@ asmlinkage void post_ttbr_update_workaround(void)  			CONFIG_CAVIUM_ERRATUM_27456));  } -static int asids_init(void) +static int asids_update_limit(void)  { -	asid_bits = get_cpu_asid_bits(); +	unsigned long num_available_asids = NUM_USER_ASIDS; + +	if (arm64_kernel_unmapped_at_el0()) +		num_available_asids /= 2;  	/*  	 * Expect allocation after rollover to fail if we don't have at least  	 * one more ASID than CPUs. ASID #0 is reserved for init_mm.  	 */ -	WARN_ON(NUM_USER_ASIDS - 1 <= num_possible_cpus()); +	WARN_ON(num_available_asids - 1 <= num_possible_cpus()); +	pr_info("ASID allocator initialised with %lu entries\n", +		num_available_asids); +	return 0; +} +arch_initcall(asids_update_limit); + +static int asids_init(void) +{ +	asid_bits = get_cpu_asid_bits();  	atomic64_set(&asid_generation, ASID_FIRST_VERSION);  	asid_map = kcalloc(BITS_TO_LONGS(NUM_USER_ASIDS), sizeof(*asid_map),  			   GFP_KERNEL); @@ -282,8 +294,6 @@ static int asids_init(void)  	 */  	if (IS_ENABLED(CONFIG_UNMAP_KERNEL_AT_EL0))  		set_kpti_asid_bits(); - -	pr_info("ASID allocator initialised with %lu entries\n", NUM_USER_ASIDS);  	return 0;  }  early_initcall(asids_init); diff --git a/arch/mips/boot/dts/ingenic/ci20.dts b/arch/mips/boot/dts/ingenic/ci20.dts index 37b93166bf22..c340f947baa0 100644 --- a/arch/mips/boot/dts/ingenic/ci20.dts +++ b/arch/mips/boot/dts/ingenic/ci20.dts @@ -4,6 +4,8 @@  #include "jz4780.dtsi"  #include <dt-bindings/clock/ingenic,tcu.h>  #include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/interrupt-controller/irq.h> +#include <dt-bindings/regulator/active-semi,8865-regulator.h>  / {  	compatible = "img,ci20", "ingenic,jz4780"; @@ -163,63 +165,71 @@  		regulators {  			vddcore: SUDCDC1 { -				regulator-name = "VDDCORE"; +				regulator-name = "DCDC_REG1";  				regulator-min-microvolt = <1100000>;  				regulator-max-microvolt = <1100000>;  				regulator-always-on;  			};  			vddmem: SUDCDC2 { -				regulator-name = "VDDMEM"; +				regulator-name = "DCDC_REG2";  				regulator-min-microvolt = <1500000>;  				regulator-max-microvolt = <1500000>;  				regulator-always-on;  			};  			vcc_33: SUDCDC3 { -				regulator-name = "VCC33"; +				regulator-name = "DCDC_REG3";  				regulator-min-microvolt = <3300000>;  				regulator-max-microvolt = <3300000>;  				regulator-always-on;  			};  			vcc_50: SUDCDC4 { -				regulator-name = "VCC50"; +				regulator-name = "SUDCDC_REG4";  				regulator-min-microvolt = <5000000>;  				regulator-max-microvolt = <5000000>;  				regulator-always-on;  			};  			vcc_25: LDO_REG5 { -				regulator-name = "VCC25"; +				regulator-name = "LDO_REG5";  				regulator-min-microvolt = <2500000>;  				regulator-max-microvolt = <2500000>;  				regulator-always-on;  			};  			wifi_io: LDO_REG6 { -				regulator-name = "WIFIIO"; +				regulator-name = "LDO_REG6";  				regulator-min-microvolt = <2500000>;  				regulator-max-microvolt = <2500000>;  				regulator-always-on;  			};  			vcc_28: LDO_REG7 { -				regulator-name = "VCC28"; +				regulator-name = "LDO_REG7";  				regulator-min-microvolt = <2800000>;  				regulator-max-microvolt = <2800000>;  				regulator-always-on;  			};  			vcc_15: LDO_REG8 { -				regulator-name = "VCC15"; +				regulator-name = "LDO_REG8";  				regulator-min-microvolt = <1500000>;  				regulator-max-microvolt = <1500000>;  				regulator-always-on;  			}; -			vcc_18: LDO_REG9 { -				regulator-name = "VCC18"; -				regulator-min-microvolt = <1800000>; -				regulator-max-microvolt = <1800000>; +			vrtc_18: LDO_REG9 { +				regulator-name = "LDO_REG9"; +				/* Despite the datasheet stating 3.3V +				 * for REG9 and the driver expecting that, +				 * REG9 outputs 1.8V. +				 * Likely the CI20 uses a proprietary +				 * factory programmed chip variant. +				 * Since this is a simple on/off LDO the +				 * exact values do not matter. +				 */ +				regulator-min-microvolt = <3300000>; +				regulator-max-microvolt = <3300000>;  				regulator-always-on;  			};  			vcc_11: LDO_REG10 { -				regulator-name = "VCC11"; -				regulator-min-microvolt = <1100000>; -				regulator-max-microvolt = <1100000>; +				regulator-name = "LDO_REG10"; +				regulator-min-microvolt = <1200000>; +				regulator-max-microvolt = <1200000>;  				regulator-always-on;  			};  		}; @@ -261,7 +271,9 @@  		rtc@51 {  			compatible = "nxp,pcf8563";  			reg = <0x51>; -			interrupts = <110>; + +			interrupt-parent = <&gpf>; +			interrupts = <30 IRQ_TYPE_LEVEL_LOW>;  		};  }; diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 1ac2752fb791..a7b469d89e2c 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -605,7 +605,8 @@ static void __init bootcmdline_init(char **cmdline_p)  	 * If we're configured to take boot arguments from DT, look for those  	 * now.  	 */ -	if (IS_ENABLED(CONFIG_MIPS_CMDLINE_FROM_DTB)) +	if (IS_ENABLED(CONFIG_MIPS_CMDLINE_FROM_DTB) || +	    IS_ENABLED(CONFIG_MIPS_CMDLINE_DTB_EXTEND))  		of_scan_flat_dt(bootcmdline_scan_chosen, &dt_bootargs);  #endif diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index e745abc5457a..245be4fafe13 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -2193,11 +2193,13 @@ static struct cpu_spec * __init setup_cpu_spec(unsigned long offset,  		 * oprofile_cpu_type already has a value, then we are  		 * possibly overriding a real PVR with a logical one,  		 * and, in that case, keep the current value for -		 * oprofile_cpu_type. +		 * oprofile_cpu_type. Futhermore, let's ensure that the +		 * fix for the PMAO bug is enabled on compatibility mode.  		 */  		if (old.oprofile_cpu_type != NULL) {  			t->oprofile_cpu_type = old.oprofile_cpu_type;  			t->oprofile_type = old.oprofile_type; +			t->cpu_features |= old.cpu_features & CPU_FTR_PMAO_BUG;  		}  	} diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c index 2462cd7c565c..d0854320bb50 100644 --- a/arch/powerpc/kernel/hw_breakpoint.c +++ b/arch/powerpc/kernel/hw_breakpoint.c @@ -331,11 +331,13 @@ int hw_breakpoint_handler(struct die_args *args)  	}  	info->type &= ~HW_BRK_TYPE_EXTRANEOUS_IRQ; -	if (!dar_within_range(regs->dar, info)) -		info->type |= HW_BRK_TYPE_EXTRANEOUS_IRQ; - -	if (!IS_ENABLED(CONFIG_PPC_8xx) && !stepping_handler(regs, bp, info)) -		goto out; +	if (IS_ENABLED(CONFIG_PPC_8xx)) { +		if (!dar_within_range(regs->dar, info)) +			info->type |= HW_BRK_TYPE_EXTRANEOUS_IRQ; +	} else { +		if (!stepping_handler(regs, bp, info)) +			goto out; +	}  	/*  	 * As a policy, the callback is invoked in a 'trigger-after-execute' diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index b4c89a1acebb..a32d478a7f41 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S @@ -303,6 +303,12 @@ SECTIONS  		*(.branch_lt)  	} +#ifdef CONFIG_DEBUG_INFO_BTF +	.BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { +		*(.BTF) +	} +#endif +  	.opd : AT(ADDR(.opd) - LOAD_OFFSET) {  		__start_opd = .;  		KEEP(*(.opd)) diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index ef7b1119b2e2..1c07d5a3f543 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -373,7 +373,9 @@ static inline bool flush_coherent_icache(unsigned long addr)  	 */  	if (cpu_has_feature(CPU_FTR_COHERENT_ICACHE)) {  		mb(); /* sync */ +		allow_read_from_user((const void __user *)addr, L1_CACHE_BYTES);  		icbi((void *)addr); +		prevent_read_from_user((const void __user *)addr, L1_CACHE_BYTES);  		mb(); /* sync */  		isync();  		return true; diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 73f029eae0cc..1a3b5a5276be 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -121,6 +121,7 @@ config ARCH_FLATMEM_ENABLE  config ARCH_SPARSEMEM_ENABLE  	def_bool y +	depends on MMU  	select SPARSEMEM_VMEMMAP_ENABLE  config ARCH_SELECT_MEMORY_MODEL diff --git a/arch/riscv/Kconfig.socs b/arch/riscv/Kconfig.socs index d325b67d00df..3078b2de0b2d 100644 --- a/arch/riscv/Kconfig.socs +++ b/arch/riscv/Kconfig.socs @@ -10,4 +10,28 @@ config SOC_SIFIVE  	help  	  This enables support for SiFive SoC platform hardware. +config SOC_VIRT +       bool "QEMU Virt Machine" +       select VIRTIO_PCI +       select VIRTIO_BALLOON +       select VIRTIO_MMIO +       select VIRTIO_CONSOLE +       select VIRTIO_NET +       select NET_9P_VIRTIO +       select VIRTIO_BLK +       select SCSI_VIRTIO +       select DRM_VIRTIO_GPU +       select HW_RANDOM_VIRTIO +       select RPMSG_CHAR +       select RPMSG_VIRTIO +       select CRYPTO_DEV_VIRTIO +       select VIRTIO_INPUT +       select POWER_RESET_SYSCON +       select POWER_RESET_SYSCON_POWEROFF +       select GOLDFISH +       select RTC_DRV_GOLDFISH +       select SIFIVE_PLIC +       help +         This enables support for QEMU Virt Machine. +  endmenu diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile index b9009a2fbaf5..259cb53d7f20 100644 --- a/arch/riscv/Makefile +++ b/arch/riscv/Makefile @@ -13,8 +13,10 @@ LDFLAGS_vmlinux :=  ifeq ($(CONFIG_DYNAMIC_FTRACE),y)  	LDFLAGS_vmlinux := --no-relax  endif -KBUILD_AFLAGS_MODULE += -fPIC -KBUILD_CFLAGS_MODULE += -fPIC + +ifeq ($(CONFIG_64BIT)$(CONFIG_CMODEL_MEDLOW),yy) +KBUILD_CFLAGS_MODULE += -mcmodel=medany +endif  export BITS  ifeq ($(CONFIG_ARCH_RV64I),y) diff --git a/arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dts b/arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dts index 609198cb1163..4a2729f5ca3f 100644 --- a/arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dts +++ b/arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dts @@ -2,6 +2,7 @@  /* Copyright (c) 2018-2019 SiFive, Inc */  #include "fu540-c000.dtsi" +#include <dt-bindings/gpio/gpio.h>  /* Clock frequency (in Hz) of the PCB crystal for rtcclk */  #define RTCCLK_FREQ		1000000 @@ -41,6 +42,10 @@  		clock-frequency = <RTCCLK_FREQ>;  		clock-output-names = "rtcclk";  	}; +	gpio-restart { +		compatible = "gpio-restart"; +		gpios = <&gpio 10 GPIO_ACTIVE_LOW>; +	};  };  &uart0 { diff --git a/arch/riscv/configs/defconfig b/arch/riscv/configs/defconfig index e2ff95cb3390..c8f084203067 100644 --- a/arch/riscv/configs/defconfig +++ b/arch/riscv/configs/defconfig @@ -15,6 +15,7 @@ CONFIG_BLK_DEV_INITRD=y  CONFIG_EXPERT=y  CONFIG_BPF_SYSCALL=y  CONFIG_SOC_SIFIVE=y +CONFIG_SOC_VIRT=y  CONFIG_SMP=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y @@ -30,7 +31,6 @@ CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NETLINK_DIAG=y  CONFIG_NET_9P=y -CONFIG_NET_9P_VIRTIO=y  CONFIG_PCI=y  CONFIG_PCIEPORTBUS=y  CONFIG_PCI_HOST_GENERIC=y @@ -38,15 +38,12 @@ CONFIG_PCIE_XILINX=y  CONFIG_DEVTMPFS=y  CONFIG_DEVTMPFS_MOUNT=y  CONFIG_BLK_DEV_LOOP=y -CONFIG_VIRTIO_BLK=y  CONFIG_BLK_DEV_SD=y  CONFIG_BLK_DEV_SR=y -CONFIG_SCSI_VIRTIO=y  CONFIG_ATA=y  CONFIG_SATA_AHCI=y  CONFIG_SATA_AHCI_PLATFORM=y  CONFIG_NETDEVICES=y -CONFIG_VIRTIO_NET=y  CONFIG_MACB=y  CONFIG_E1000E=y  CONFIG_R8169=y @@ -57,15 +54,13 @@ CONFIG_SERIAL_8250_CONSOLE=y  CONFIG_SERIAL_OF_PLATFORM=y  CONFIG_SERIAL_EARLYCON_RISCV_SBI=y  CONFIG_HVC_RISCV_SBI=y -CONFIG_VIRTIO_CONSOLE=y  CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_VIRTIO=y  CONFIG_SPI=y  CONFIG_SPI_SIFIVE=y  # CONFIG_PTP_1588_CLOCK is not set +CONFIG_POWER_RESET=y  CONFIG_DRM=y  CONFIG_DRM_RADEON=y -CONFIG_DRM_VIRTIO_GPU=y  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_USB=y  CONFIG_USB_XHCI_HCD=y @@ -78,12 +73,7 @@ CONFIG_USB_STORAGE=y  CONFIG_USB_UAS=y  CONFIG_MMC=y  CONFIG_MMC_SPI=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_INPUT=y -CONFIG_VIRTIO_MMIO=y -CONFIG_RPMSG_CHAR=y -CONFIG_RPMSG_VIRTIO=y +CONFIG_RTC_CLASS=y  CONFIG_EXT4_FS=y  CONFIG_EXT4_FS_POSIX_ACL=y  CONFIG_AUTOFS4_FS=y @@ -98,7 +88,6 @@ CONFIG_NFS_V4_2=y  CONFIG_ROOT_NFS=y  CONFIG_9P_FS=y  CONFIG_CRYPTO_USER_API_HASH=y -CONFIG_CRYPTO_DEV_VIRTIO=y  CONFIG_PRINTK_TIME=y  CONFIG_DEBUG_FS=y  CONFIG_DEBUG_PAGEALLOC=y diff --git a/arch/riscv/configs/rv32_defconfig b/arch/riscv/configs/rv32_defconfig index eb519407c841..a844920a261f 100644 --- a/arch/riscv/configs/rv32_defconfig +++ b/arch/riscv/configs/rv32_defconfig @@ -14,6 +14,7 @@ CONFIG_CHECKPOINT_RESTORE=y  CONFIG_BLK_DEV_INITRD=y  CONFIG_EXPERT=y  CONFIG_BPF_SYSCALL=y +CONFIG_SOC_VIRT=y  CONFIG_ARCH_RV32I=y  CONFIG_SMP=y  CONFIG_MODULES=y @@ -30,7 +31,6 @@ CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NETLINK_DIAG=y  CONFIG_NET_9P=y -CONFIG_NET_9P_VIRTIO=y  CONFIG_PCI=y  CONFIG_PCIEPORTBUS=y  CONFIG_PCI_HOST_GENERIC=y @@ -38,15 +38,12 @@ CONFIG_PCIE_XILINX=y  CONFIG_DEVTMPFS=y  CONFIG_DEVTMPFS_MOUNT=y  CONFIG_BLK_DEV_LOOP=y -CONFIG_VIRTIO_BLK=y  CONFIG_BLK_DEV_SD=y  CONFIG_BLK_DEV_SR=y -CONFIG_SCSI_VIRTIO=y  CONFIG_ATA=y  CONFIG_SATA_AHCI=y  CONFIG_SATA_AHCI_PLATFORM=y  CONFIG_NETDEVICES=y -CONFIG_VIRTIO_NET=y  CONFIG_MACB=y  CONFIG_E1000E=y  CONFIG_R8169=y @@ -57,13 +54,11 @@ CONFIG_SERIAL_8250_CONSOLE=y  CONFIG_SERIAL_OF_PLATFORM=y  CONFIG_SERIAL_EARLYCON_RISCV_SBI=y  CONFIG_HVC_RISCV_SBI=y -CONFIG_VIRTIO_CONSOLE=y  CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_VIRTIO=y  # CONFIG_PTP_1588_CLOCK is not set +CONFIG_POWER_RESET=y  CONFIG_DRM=y  CONFIG_DRM_RADEON=y -CONFIG_DRM_VIRTIO_GPU=y  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_USB=y  CONFIG_USB_XHCI_HCD=y @@ -74,13 +69,7 @@ CONFIG_USB_OHCI_HCD=y  CONFIG_USB_OHCI_HCD_PLATFORM=y  CONFIG_USB_STORAGE=y  CONFIG_USB_UAS=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_INPUT=y -CONFIG_VIRTIO_MMIO=y -CONFIG_RPMSG_CHAR=y -CONFIG_RPMSG_VIRTIO=y -CONFIG_SIFIVE_PLIC=y +CONFIG_RTC_CLASS=y  CONFIG_EXT4_FS=y  CONFIG_EXT4_FS_POSIX_ACL=y  CONFIG_AUTOFS4_FS=y @@ -95,7 +84,6 @@ CONFIG_NFS_V4_2=y  CONFIG_ROOT_NFS=y  CONFIG_9P_FS=y  CONFIG_CRYPTO_USER_API_HASH=y -CONFIG_CRYPTO_DEV_VIRTIO=y  CONFIG_PRINTK_TIME=y  CONFIG_DEBUG_FS=y  CONFIG_DEBUG_PAGEALLOC=y diff --git a/arch/riscv/include/asm/syscall.h b/arch/riscv/include/asm/syscall.h index 42347d0981e7..49350c8bd7b0 100644 --- a/arch/riscv/include/asm/syscall.h +++ b/arch/riscv/include/asm/syscall.h @@ -28,13 +28,6 @@ static inline int syscall_get_nr(struct task_struct *task,  	return regs->a7;  } -static inline void syscall_set_nr(struct task_struct *task, -				  struct pt_regs *regs, -				  int sysno) -{ -	regs->a7 = sysno; -} -  static inline void syscall_rollback(struct task_struct *task,  				    struct pt_regs *regs)  { diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S index bad4d85b5e91..208702d8c18e 100644 --- a/arch/riscv/kernel/entry.S +++ b/arch/riscv/kernel/entry.S @@ -229,19 +229,12 @@ check_syscall_nr:  	li t0, __NR_syscalls  	la s0, sys_ni_syscall  	/* -	 * The tracer can change syscall number to valid/invalid value. -	 * We use syscall_set_nr helper in syscall_trace_enter thus we -	 * cannot trust the current value in a7 and have to reload from -	 * the current task pt_regs. -	 */ -	REG_L a7, PT_A7(sp) -	/*  	 * Syscall number held in a7.  	 * If syscall number is above allowed value, redirect to ni_syscall.  	 */  	bge a7, t0, 1f  	/* -	 * Check if syscall is rejected by tracer or seccomp, i.e., a7 == -1. +	 * Check if syscall is rejected by tracer, i.e., a7 == -1.  	 * If yes, we pretend it was executed.  	 */  	li t1, -1 @@ -334,6 +327,7 @@ work_resched:  handle_syscall_trace_enter:  	move a0, sp  	call do_syscall_trace_enter +	move t0, a0  	REG_L a0, PT_A0(sp)  	REG_L a1, PT_A1(sp)  	REG_L a2, PT_A2(sp) @@ -342,6 +336,7 @@ handle_syscall_trace_enter:  	REG_L a5, PT_A5(sp)  	REG_L a6, PT_A6(sp)  	REG_L a7, PT_A7(sp) +	bnez t0, ret_from_syscall_rejected  	j check_syscall_nr  handle_syscall_trace_exit:  	move a0, sp diff --git a/arch/riscv/kernel/module.c b/arch/riscv/kernel/module.c index b7401858d872..8bbe5dbe1341 100644 --- a/arch/riscv/kernel/module.c +++ b/arch/riscv/kernel/module.c @@ -8,6 +8,10 @@  #include <linux/err.h>  #include <linux/errno.h>  #include <linux/moduleloader.h> +#include <linux/vmalloc.h> +#include <linux/sizes.h> +#include <asm/pgtable.h> +#include <asm/sections.h>  static int apply_r_riscv_32_rela(struct module *me, u32 *location, Elf_Addr v)  { @@ -386,3 +390,15 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,  	return 0;  } + +#if defined(CONFIG_MMU) && defined(CONFIG_64BIT) +#define VMALLOC_MODULE_START \ +	 max(PFN_ALIGN((unsigned long)&_end - SZ_2G), VMALLOC_START) +void *module_alloc(unsigned long size) +{ +	return __vmalloc_node_range(size, 1, VMALLOC_MODULE_START, +				    VMALLOC_END, GFP_KERNEL, +				    PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE, +				    __builtin_return_address(0)); +} +#endif diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c index 407464201b91..444dc7b0fd78 100644 --- a/arch/riscv/kernel/ptrace.c +++ b/arch/riscv/kernel/ptrace.c @@ -148,21 +148,19 @@ long arch_ptrace(struct task_struct *child, long request,   * Allows PTRACE_SYSCALL to work.  These are called from entry.S in   * {handle,ret_from}_syscall.   */ -__visible void do_syscall_trace_enter(struct pt_regs *regs) +__visible int do_syscall_trace_enter(struct pt_regs *regs)  {  	if (test_thread_flag(TIF_SYSCALL_TRACE))  		if (tracehook_report_syscall_entry(regs)) -			syscall_set_nr(current, regs, -1); +			return -1;  	/*  	 * Do the secure computing after ptrace; failures should be fast.  	 * If this fails we might have return value in a0 from seccomp  	 * (via SECCOMP_RET_ERRNO/TRACE).  	 */ -	if (secure_computing() == -1) { -		syscall_set_nr(current, regs, -1); -		return; -	} +	if (secure_computing() == -1) +		return -1;  #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS  	if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) @@ -170,6 +168,7 @@ __visible void do_syscall_trace_enter(struct pt_regs *regs)  #endif  	audit_syscall_entry(regs->a7, regs->a0, regs->a1, regs->a2, regs->a3); +	return 0;  }  __visible void do_syscall_trace_exit(struct pt_regs *regs) diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 965a8cf4829c..fab855963c73 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -131,7 +131,7 @@ void __init setup_bootmem(void)  	for_each_memblock(memory, reg) {  		phys_addr_t end = reg->base + reg->size; -		if (reg->base <= vmlinux_end && vmlinux_end <= end) { +		if (reg->base <= vmlinux_start && vmlinux_end <= end) {  			mem_size = min(reg->size, (phys_addr_t)-PAGE_OFFSET);  			/* diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 137a3920ca36..6d7c3b7e9281 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h @@ -752,6 +752,12 @@ static inline int pmd_write(pmd_t pmd)  	return (pmd_val(pmd) & _SEGMENT_ENTRY_WRITE) != 0;  } +#define pud_write pud_write +static inline int pud_write(pud_t pud) +{ +	return (pud_val(pud) & _REGION3_ENTRY_WRITE) != 0; +} +  static inline int pmd_dirty(pmd_t pmd)  {  	return (pmd_val(pmd) & _SEGMENT_ENTRY_DIRTY) != 0; diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index bc61ea18e88d..60716d18ce5a 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -424,7 +424,7 @@ static void zpci_map_resources(struct pci_dev *pdev)  		if (zpci_use_mio(zdev))  			pdev->resource[i].start = -				(resource_size_t __force) zdev->bars[i].mio_wb; +				(resource_size_t __force) zdev->bars[i].mio_wt;  		else  			pdev->resource[i].start = (resource_size_t __force)  				pci_iomap_range_fh(pdev, i, 0, 0); @@ -531,7 +531,7 @@ static int zpci_setup_bus_resources(struct zpci_dev *zdev,  			flags |= IORESOURCE_MEM_64;  		if (zpci_use_mio(zdev)) -			addr = (unsigned long) zdev->bars[i].mio_wb; +			addr = (unsigned long) zdev->bars[i].mio_wt;  		else  			addr = ZPCI_ADDR(entry);  		size = 1UL << zdev->bars[i].size; diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 94df0868804b..513a55562d75 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -194,9 +194,10 @@ avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1)  avx512_instr :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,-DCONFIG_AS_AVX512=1)  sha1_ni_instr :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA1_NI=1)  sha256_ni_instr :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA256_NI=1) +adx_instr := $(call as-instr,adox %r10$(comma)%r10,-DCONFIG_AS_ADX=1) -KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) -KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) +KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) $(adx_instr) +KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) $(adx_instr)  KBUILD_LDFLAGS := -m elf_$(UTS_MACHINE) diff --git a/arch/x86/crypto/Makefile b/arch/x86/crypto/Makefile index b69e00bf20b8..8c2e9eadee8a 100644 --- a/arch/x86/crypto/Makefile +++ b/arch/x86/crypto/Makefile @@ -11,6 +11,7 @@ avx2_supported := $(call as-instr,vpgatherdd %ymm0$(comma)(%eax$(comma)%ymm1\  avx512_supported :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,yes,no)  sha1_ni_supported :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,yes,no)  sha256_ni_supported :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,yes,no) +adx_supported := $(call as-instr,adox %r10$(comma)%r10,yes,no)  obj-$(CONFIG_CRYPTO_GLUE_HELPER_X86) += glue_helper.o @@ -39,7 +40,11 @@ obj-$(CONFIG_CRYPTO_AEGIS128_AESNI_SSE2) += aegis128-aesni.o  obj-$(CONFIG_CRYPTO_NHPOLY1305_SSE2) += nhpoly1305-sse2.o  obj-$(CONFIG_CRYPTO_NHPOLY1305_AVX2) += nhpoly1305-avx2.o -obj-$(CONFIG_CRYPTO_CURVE25519_X86) += curve25519-x86_64.o + +# These modules require the assembler to support ADX. +ifeq ($(adx_supported),yes) +	obj-$(CONFIG_CRYPTO_CURVE25519_X86) += curve25519-x86_64.o +endif  # These modules require assembler to support AVX.  ifeq ($(avx_supported),yes) diff --git a/arch/x86/include/asm/io_bitmap.h b/arch/x86/include/asm/io_bitmap.h index 02c6ef8f7667..07344d82e88e 100644 --- a/arch/x86/include/asm/io_bitmap.h +++ b/arch/x86/include/asm/io_bitmap.h @@ -19,7 +19,14 @@ struct task_struct;  void io_bitmap_share(struct task_struct *tsk);  void io_bitmap_exit(void); -void tss_update_io_bitmap(void); +void native_tss_update_io_bitmap(void); + +#ifdef CONFIG_PARAVIRT_XXL +#include <asm/paravirt.h> +#else +#define tss_update_io_bitmap native_tss_update_io_bitmap +#endif +  #else  static inline void io_bitmap_share(struct task_struct *tsk) { }  static inline void io_bitmap_exit(void) { } diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 86e7317eb31f..694d8daf4983 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -295,6 +295,13 @@ static inline void write_idt_entry(gate_desc *dt, int entry, const gate_desc *g)  	PVOP_VCALL3(cpu.write_idt_entry, dt, entry, g);  } +#ifdef CONFIG_X86_IOPL_IOPERM +static inline void tss_update_io_bitmap(void) +{ +	PVOP_VCALL0(cpu.update_io_bitmap); +} +#endif +  static inline void paravirt_activate_mm(struct mm_struct *prev,  					struct mm_struct *next)  { diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 84812964d3dd..732f62e04ddb 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h @@ -140,6 +140,10 @@ struct pv_cpu_ops {  	void (*load_sp0)(unsigned long sp0); +#ifdef CONFIG_X86_IOPL_IOPERM +	void (*update_io_bitmap)(void); +#endif +  	void (*wbinvd)(void);  	/* cpuid emulation, mostly so that caps bits can be disabled */ diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 52c9bfbbdb2a..4cdb123ff66a 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -445,7 +445,7 @@ static __always_inline void setup_pku(struct cpuinfo_x86 *c)  	 * cpuid bit to be set.  We need to ensure that we  	 * update that bit in this CPU's "cpu_info".  	 */ -	get_cpu_cap(c); +	set_cpu_cap(c, X86_FEATURE_OSPKE);  }  #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index d817f255aed8..6efe0410fb72 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -425,7 +425,29 @@ static void __init sev_map_percpu_data(void)  	}  } +static bool pv_tlb_flush_supported(void) +{ +	return (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH) && +		!kvm_para_has_hint(KVM_HINTS_REALTIME) && +		kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)); +} + +static DEFINE_PER_CPU(cpumask_var_t, __pv_cpu_mask); +  #ifdef CONFIG_SMP + +static bool pv_ipi_supported(void) +{ +	return kvm_para_has_feature(KVM_FEATURE_PV_SEND_IPI); +} + +static bool pv_sched_yield_supported(void) +{ +	return (kvm_para_has_feature(KVM_FEATURE_PV_SCHED_YIELD) && +		!kvm_para_has_hint(KVM_HINTS_REALTIME) && +	    kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)); +} +  #define KVM_IPI_CLUSTER_SIZE	(2 * BITS_PER_LONG)  static void __send_ipi_mask(const struct cpumask *mask, int vector) @@ -490,12 +512,12 @@ static void kvm_send_ipi_mask(const struct cpumask *mask, int vector)  static void kvm_send_ipi_mask_allbutself(const struct cpumask *mask, int vector)  {  	unsigned int this_cpu = smp_processor_id(); -	struct cpumask new_mask; +	struct cpumask *new_mask = this_cpu_cpumask_var_ptr(__pv_cpu_mask);  	const struct cpumask *local_mask; -	cpumask_copy(&new_mask, mask); -	cpumask_clear_cpu(this_cpu, &new_mask); -	local_mask = &new_mask; +	cpumask_copy(new_mask, mask); +	cpumask_clear_cpu(this_cpu, new_mask); +	local_mask = new_mask;  	__send_ipi_mask(local_mask, vector);  } @@ -575,7 +597,6 @@ static void __init kvm_apf_trap_init(void)  	update_intr_gate(X86_TRAP_PF, async_page_fault);  } -static DEFINE_PER_CPU(cpumask_var_t, __pv_tlb_mask);  static void kvm_flush_tlb_others(const struct cpumask *cpumask,  			const struct flush_tlb_info *info) @@ -583,7 +604,7 @@ static void kvm_flush_tlb_others(const struct cpumask *cpumask,  	u8 state;  	int cpu;  	struct kvm_steal_time *src; -	struct cpumask *flushmask = this_cpu_cpumask_var_ptr(__pv_tlb_mask); +	struct cpumask *flushmask = this_cpu_cpumask_var_ptr(__pv_cpu_mask);  	cpumask_copy(flushmask, cpumask);  	/* @@ -619,11 +640,10 @@ static void __init kvm_guest_init(void)  		pv_ops.time.steal_clock = kvm_steal_clock;  	} -	if (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH) && -	    !kvm_para_has_hint(KVM_HINTS_REALTIME) && -	    kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) { +	if (pv_tlb_flush_supported()) {  		pv_ops.mmu.flush_tlb_others = kvm_flush_tlb_others;  		pv_ops.mmu.tlb_remove_table = tlb_remove_table; +		pr_info("KVM setup pv remote TLB flush\n");  	}  	if (kvm_para_has_feature(KVM_FEATURE_PV_EOI)) @@ -632,9 +652,7 @@ static void __init kvm_guest_init(void)  #ifdef CONFIG_SMP  	smp_ops.smp_prepare_cpus = kvm_smp_prepare_cpus;  	smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu; -	if (kvm_para_has_feature(KVM_FEATURE_PV_SCHED_YIELD) && -	    !kvm_para_has_hint(KVM_HINTS_REALTIME) && -	    kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) { +	if (pv_sched_yield_supported()) {  		smp_ops.send_call_func_ipi = kvm_smp_send_call_func_ipi;  		pr_info("KVM setup pv sched yield\n");  	} @@ -700,7 +718,7 @@ static uint32_t __init kvm_detect(void)  static void __init kvm_apic_init(void)  {  #if defined(CONFIG_SMP) -	if (kvm_para_has_feature(KVM_FEATURE_PV_SEND_IPI)) +	if (pv_ipi_supported())  		kvm_setup_pv_ipi();  #endif  } @@ -732,26 +750,31 @@ static __init int activate_jump_labels(void)  }  arch_initcall(activate_jump_labels); -static __init int kvm_setup_pv_tlb_flush(void) +static __init int kvm_alloc_cpumask(void)  {  	int cpu; +	bool alloc = false;  	if (!kvm_para_available() || nopv)  		return 0; -	if (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH) && -	    !kvm_para_has_hint(KVM_HINTS_REALTIME) && -	    kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) { +	if (pv_tlb_flush_supported()) +		alloc = true; + +#if defined(CONFIG_SMP) +	if (pv_ipi_supported()) +		alloc = true; +#endif + +	if (alloc)  		for_each_possible_cpu(cpu) { -			zalloc_cpumask_var_node(per_cpu_ptr(&__pv_tlb_mask, cpu), +			zalloc_cpumask_var_node(per_cpu_ptr(&__pv_cpu_mask, cpu),  				GFP_KERNEL, cpu_to_node(cpu));  		} -		pr_info("KVM setup pv remote TLB flush\n"); -	}  	return 0;  } -arch_initcall(kvm_setup_pv_tlb_flush); +arch_initcall(kvm_alloc_cpumask);  #ifdef CONFIG_PARAVIRT_SPINLOCKS diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 789f5e4f89de..c131ba4e70ef 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c @@ -30,6 +30,7 @@  #include <asm/timer.h>  #include <asm/special_insns.h>  #include <asm/tlb.h> +#include <asm/io_bitmap.h>  /*   * nop stub, which must not clobber anything *including the stack* to @@ -341,6 +342,10 @@ struct paravirt_patch_template pv_ops = {  	.cpu.iret		= native_iret,  	.cpu.swapgs		= native_swapgs, +#ifdef CONFIG_X86_IOPL_IOPERM +	.cpu.update_io_bitmap	= native_tss_update_io_bitmap, +#endif +  	.cpu.start_context_switch	= paravirt_nop,  	.cpu.end_context_switch		= paravirt_nop, diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 839b5244e3b7..3053c85e0e42 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -374,7 +374,7 @@ static void tss_copy_io_bitmap(struct tss_struct *tss, struct io_bitmap *iobm)  /**   * tss_update_io_bitmap - Update I/O bitmap before exiting to usermode   */ -void tss_update_io_bitmap(void) +void native_tss_update_io_bitmap(void)  {  	struct tss_struct *tss = this_cpu_ptr(&cpu_tss_rw);  	struct thread_struct *t = ¤t->thread; diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 991019d5eee1..1bb4927030af 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -59,6 +59,19 @@ config KVM  	  If unsure, say N. +config KVM_WERROR +	bool "Compile KVM with -Werror" +	# KASAN may cause the build to fail due to larger frames +	default y if X86_64 && !KASAN +	# We use the dependency on !COMPILE_TEST to not be enabled +	# blindly in allmodconfig or allyesconfig configurations +	depends on (X86_64 && !KASAN) || !COMPILE_TEST +	depends on EXPERT +	help +	  Add -Werror to the build flags for (and only for) i915.ko. + +	  If in doubt, say "N". +  config KVM_INTEL  	tristate "KVM for Intel (and compatible) processors support"  	depends on KVM && IA32_FEAT_CTL diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index b19ef421084d..e553f0fdd87d 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -1,6 +1,7 @@  # SPDX-License-Identifier: GPL-2.0  ccflags-y += -Iarch/x86/kvm +ccflags-$(CONFIG_KVM_WERROR) += -Werror  KVM := ../../../virt/kvm diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index ad3f5b178a03..24c0b2ba8fb9 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -57,11 +57,13 @@  MODULE_AUTHOR("Qumranet");  MODULE_LICENSE("GPL"); +#ifdef MODULE  static const struct x86_cpu_id svm_cpu_id[] = {  	X86_FEATURE_MATCH(X86_FEATURE_SVM),  	{}  };  MODULE_DEVICE_TABLE(x86cpu, svm_cpu_id); +#endif  #define IOPM_ALLOC_ORDER 2  #define MSRPM_ALLOC_ORDER 1 @@ -2194,8 +2196,9 @@ static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)  static int avic_init_vcpu(struct vcpu_svm *svm)  {  	int ret; +	struct kvm_vcpu *vcpu = &svm->vcpu; -	if (!kvm_vcpu_apicv_active(&svm->vcpu)) +	if (!avic || !irqchip_in_kernel(vcpu->kvm))  		return 0;  	ret = avic_init_backing_page(&svm->vcpu); diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 63aaf44edd1f..40b1e6138cd5 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -64,11 +64,13 @@  MODULE_AUTHOR("Qumranet");  MODULE_LICENSE("GPL"); +#ifdef MODULE  static const struct x86_cpu_id vmx_cpu_id[] = {  	X86_FEATURE_MATCH(X86_FEATURE_VMX),  	{}  };  MODULE_DEVICE_TABLE(x86cpu, vmx_cpu_id); +#endif  bool __read_mostly enable_vpid = 1;  module_param_named(vpid, enable_vpid, bool, 0444); @@ -7175,6 +7177,7 @@ static int vmx_check_intercept_io(struct kvm_vcpu *vcpu,  	else  		intercept = nested_vmx_check_io_bitmaps(vcpu, port, size); +	/* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED.  */  	return intercept ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE;  } @@ -7204,6 +7207,20 @@ static int vmx_check_intercept(struct kvm_vcpu *vcpu,  	case x86_intercept_outs:  		return vmx_check_intercept_io(vcpu, info); +	case x86_intercept_lgdt: +	case x86_intercept_lidt: +	case x86_intercept_lldt: +	case x86_intercept_ltr: +	case x86_intercept_sgdt: +	case x86_intercept_sidt: +	case x86_intercept_sldt: +	case x86_intercept_str: +		if (!nested_cpu_has2(vmcs12, SECONDARY_EXEC_DESC)) +			return X86EMUL_CONTINUE; + +		/* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED.  */ +		break; +  	/* TODO: check more intercepts... */  	default:  		break; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 359fcd395132..5de200663f51 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -7190,15 +7190,15 @@ static void kvm_timer_init(void)  	if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) {  #ifdef CONFIG_CPU_FREQ -		struct cpufreq_policy policy; +		struct cpufreq_policy *policy;  		int cpu; -		memset(&policy, 0, sizeof(policy));  		cpu = get_cpu(); -		cpufreq_get_policy(&policy, cpu); -		if (policy.cpuinfo.max_freq) -			max_tsc_khz = policy.cpuinfo.max_freq; +		policy = cpufreq_cpu_get(cpu); +		if (policy && policy->cpuinfo.max_freq) +			max_tsc_khz = policy->cpuinfo.max_freq;  		put_cpu(); +		cpufreq_cpu_put(policy);  #endif  		cpufreq_register_notifier(&kvmclock_cpufreq_notifier_block,  					  CPUFREQ_TRANSITION_NOTIFIER); @@ -7308,12 +7308,12 @@ int kvm_arch_init(void *opaque)  	}  	if (!ops->cpu_has_kvm_support()) { -		printk(KERN_ERR "kvm: no hardware support\n"); +		pr_err_ratelimited("kvm: no hardware support\n");  		r = -EOPNOTSUPP;  		goto out;  	}  	if (ops->disabled_by_bios()) { -		printk(KERN_ERR "kvm: disabled by bios\n"); +		pr_err_ratelimited("kvm: disabled by bios\n");  		r = -EOPNOTSUPP;  		goto out;  	} diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c index 64229dad7eab..69309cd56fdf 100644 --- a/arch/x86/mm/dump_pagetables.c +++ b/arch/x86/mm/dump_pagetables.c @@ -363,13 +363,8 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m,  {  	const struct ptdump_range ptdump_ranges[] = {  #ifdef CONFIG_X86_64 - -#define normalize_addr_shift (64 - (__VIRTUAL_MASK_SHIFT + 1)) -#define normalize_addr(u) ((signed long)((u) << normalize_addr_shift) >> \ -			   normalize_addr_shift) -  	{0, PTRS_PER_PGD * PGD_LEVEL_MULT / 2}, -	{normalize_addr(PTRS_PER_PGD * PGD_LEVEL_MULT / 2), ~0UL}, +	{GUARD_HOLE_END_ADDR, ~0UL},  #else  	{0, ~0UL},  #endif diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index fa8506e76bbe..d19a2edd63cb 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c @@ -180,7 +180,7 @@ void efi_sync_low_kernel_mappings(void)  static inline phys_addr_t  virt_to_phys_or_null_size(void *va, unsigned long size)  { -	bool bad_size; +	phys_addr_t pa;  	if (!va)  		return 0; @@ -188,16 +188,13 @@ virt_to_phys_or_null_size(void *va, unsigned long size)  	if (virt_addr_valid(va))  		return virt_to_phys(va); -	/* -	 * A fully aligned variable on the stack is guaranteed not to -	 * cross a page bounary. Try to catch strings on the stack by -	 * checking that 'size' is a power of two. -	 */ -	bad_size = size > PAGE_SIZE || !is_power_of_2(size); +	pa = slow_virt_to_phys(va); -	WARN_ON(!IS_ALIGNED((unsigned long)va, size) || bad_size); +	/* check if the object crosses a page boundary */ +	if (WARN_ON((pa ^ (pa + size - 1)) & PAGE_MASK)) +		return 0; -	return slow_virt_to_phys(va); +	return pa;  }  #define virt_to_phys_or_null(addr)				\ @@ -568,85 +565,25 @@ efi_thunk_set_virtual_address_map(unsigned long memory_map_size,  static efi_status_t efi_thunk_get_time(efi_time_t *tm, efi_time_cap_t *tc)  { -	efi_status_t status; -	u32 phys_tm, phys_tc; -	unsigned long flags; - -	spin_lock(&rtc_lock); -	spin_lock_irqsave(&efi_runtime_lock, flags); - -	phys_tm = virt_to_phys_or_null(tm); -	phys_tc = virt_to_phys_or_null(tc); - -	status = efi_thunk(get_time, phys_tm, phys_tc); - -	spin_unlock_irqrestore(&efi_runtime_lock, flags); -	spin_unlock(&rtc_lock); - -	return status; +	return EFI_UNSUPPORTED;  }  static efi_status_t efi_thunk_set_time(efi_time_t *tm)  { -	efi_status_t status; -	u32 phys_tm; -	unsigned long flags; - -	spin_lock(&rtc_lock); -	spin_lock_irqsave(&efi_runtime_lock, flags); - -	phys_tm = virt_to_phys_or_null(tm); - -	status = efi_thunk(set_time, phys_tm); - -	spin_unlock_irqrestore(&efi_runtime_lock, flags); -	spin_unlock(&rtc_lock); - -	return status; +	return EFI_UNSUPPORTED;  }  static efi_status_t  efi_thunk_get_wakeup_time(efi_bool_t *enabled, efi_bool_t *pending,  			  efi_time_t *tm)  { -	efi_status_t status; -	u32 phys_enabled, phys_pending, phys_tm; -	unsigned long flags; - -	spin_lock(&rtc_lock); -	spin_lock_irqsave(&efi_runtime_lock, flags); - -	phys_enabled = virt_to_phys_or_null(enabled); -	phys_pending = virt_to_phys_or_null(pending); -	phys_tm = virt_to_phys_or_null(tm); - -	status = efi_thunk(get_wakeup_time, phys_enabled, -			     phys_pending, phys_tm); - -	spin_unlock_irqrestore(&efi_runtime_lock, flags); -	spin_unlock(&rtc_lock); - -	return status; +	return EFI_UNSUPPORTED;  }  static efi_status_t  efi_thunk_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)  { -	efi_status_t status; -	u32 phys_tm; -	unsigned long flags; - -	spin_lock(&rtc_lock); -	spin_lock_irqsave(&efi_runtime_lock, flags); - -	phys_tm = virt_to_phys_or_null(tm); - -	status = efi_thunk(set_wakeup_time, enabled, phys_tm); - -	spin_unlock_irqrestore(&efi_runtime_lock, flags); -	spin_unlock(&rtc_lock); - -	return status; +	return EFI_UNSUPPORTED;  }  static unsigned long efi_name_size(efi_char16_t *name) @@ -658,6 +595,8 @@ static efi_status_t  efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,  		       u32 *attr, unsigned long *data_size, void *data)  { +	u8 buf[24] __aligned(8); +	efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));  	efi_status_t status;  	u32 phys_name, phys_vendor, phys_attr;  	u32 phys_data_size, phys_data; @@ -665,14 +604,19 @@ efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,  	spin_lock_irqsave(&efi_runtime_lock, flags); +	*vnd = *vendor; +  	phys_data_size = virt_to_phys_or_null(data_size); -	phys_vendor = virt_to_phys_or_null(vendor); +	phys_vendor = virt_to_phys_or_null(vnd);  	phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));  	phys_attr = virt_to_phys_or_null(attr);  	phys_data = virt_to_phys_or_null_size(data, *data_size); -	status = efi_thunk(get_variable, phys_name, phys_vendor, -			   phys_attr, phys_data_size, phys_data); +	if (!phys_name || (data && !phys_data)) +		status = EFI_INVALID_PARAMETER; +	else +		status = efi_thunk(get_variable, phys_name, phys_vendor, +				   phys_attr, phys_data_size, phys_data);  	spin_unlock_irqrestore(&efi_runtime_lock, flags); @@ -683,19 +627,25 @@ static efi_status_t  efi_thunk_set_variable(efi_char16_t *name, efi_guid_t *vendor,  		       u32 attr, unsigned long data_size, void *data)  { +	u8 buf[24] __aligned(8); +	efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));  	u32 phys_name, phys_vendor, phys_data;  	efi_status_t status;  	unsigned long flags;  	spin_lock_irqsave(&efi_runtime_lock, flags); +	*vnd = *vendor; +  	phys_name = virt_to_phys_or_null_size(name, efi_name_size(name)); -	phys_vendor = virt_to_phys_or_null(vendor); +	phys_vendor = virt_to_phys_or_null(vnd);  	phys_data = virt_to_phys_or_null_size(data, data_size); -	/* If data_size is > sizeof(u32) we've got problems */ -	status = efi_thunk(set_variable, phys_name, phys_vendor, -			   attr, data_size, phys_data); +	if (!phys_name || !phys_data) +		status = EFI_INVALID_PARAMETER; +	else +		status = efi_thunk(set_variable, phys_name, phys_vendor, +				   attr, data_size, phys_data);  	spin_unlock_irqrestore(&efi_runtime_lock, flags); @@ -707,6 +657,8 @@ efi_thunk_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,  				   u32 attr, unsigned long data_size,  				   void *data)  { +	u8 buf[24] __aligned(8); +	efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));  	u32 phys_name, phys_vendor, phys_data;  	efi_status_t status;  	unsigned long flags; @@ -714,13 +666,17 @@ efi_thunk_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,  	if (!spin_trylock_irqsave(&efi_runtime_lock, flags))  		return EFI_NOT_READY; +	*vnd = *vendor; +  	phys_name = virt_to_phys_or_null_size(name, efi_name_size(name)); -	phys_vendor = virt_to_phys_or_null(vendor); +	phys_vendor = virt_to_phys_or_null(vnd);  	phys_data = virt_to_phys_or_null_size(data, data_size); -	/* If data_size is > sizeof(u32) we've got problems */ -	status = efi_thunk(set_variable, phys_name, phys_vendor, -			   attr, data_size, phys_data); +	if (!phys_name || !phys_data) +		status = EFI_INVALID_PARAMETER; +	else +		status = efi_thunk(set_variable, phys_name, phys_vendor, +				   attr, data_size, phys_data);  	spin_unlock_irqrestore(&efi_runtime_lock, flags); @@ -732,39 +688,36 @@ efi_thunk_get_next_variable(unsigned long *name_size,  			    efi_char16_t *name,  			    efi_guid_t *vendor)  { +	u8 buf[24] __aligned(8); +	efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));  	efi_status_t status;  	u32 phys_name_size, phys_name, phys_vendor;  	unsigned long flags;  	spin_lock_irqsave(&efi_runtime_lock, flags); +	*vnd = *vendor; +  	phys_name_size = virt_to_phys_or_null(name_size); -	phys_vendor = virt_to_phys_or_null(vendor); +	phys_vendor = virt_to_phys_or_null(vnd);  	phys_name = virt_to_phys_or_null_size(name, *name_size); -	status = efi_thunk(get_next_variable, phys_name_size, -			   phys_name, phys_vendor); +	if (!phys_name) +		status = EFI_INVALID_PARAMETER; +	else +		status = efi_thunk(get_next_variable, phys_name_size, +				   phys_name, phys_vendor);  	spin_unlock_irqrestore(&efi_runtime_lock, flags); +	*vendor = *vnd;  	return status;  }  static efi_status_t  efi_thunk_get_next_high_mono_count(u32 *count)  { -	efi_status_t status; -	u32 phys_count; -	unsigned long flags; - -	spin_lock_irqsave(&efi_runtime_lock, flags); - -	phys_count = virt_to_phys_or_null(count); -	status = efi_thunk(get_next_high_mono_count, phys_count); - -	spin_unlock_irqrestore(&efi_runtime_lock, flags); - -	return status; +	return EFI_UNSUPPORTED;  }  static void diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c index 79409120a603..507f4fb88fa7 100644 --- a/arch/x86/xen/enlighten_pv.c +++ b/arch/x86/xen/enlighten_pv.c @@ -72,6 +72,9 @@  #include <asm/mwait.h>  #include <asm/pci_x86.h>  #include <asm/cpu.h> +#ifdef CONFIG_X86_IOPL_IOPERM +#include <asm/io_bitmap.h> +#endif  #ifdef CONFIG_ACPI  #include <linux/acpi.h> @@ -837,6 +840,25 @@ static void xen_load_sp0(unsigned long sp0)  	this_cpu_write(cpu_tss_rw.x86_tss.sp0, sp0);  } +#ifdef CONFIG_X86_IOPL_IOPERM +static void xen_update_io_bitmap(void) +{ +	struct physdev_set_iobitmap iobitmap; +	struct tss_struct *tss = this_cpu_ptr(&cpu_tss_rw); + +	native_tss_update_io_bitmap(); + +	iobitmap.bitmap = (uint8_t *)(&tss->x86_tss) + +			  tss->x86_tss.io_bitmap_base; +	if (tss->x86_tss.io_bitmap_base == IO_BITMAP_OFFSET_INVALID) +		iobitmap.nr_ports = 0; +	else +		iobitmap.nr_ports = IO_BITMAP_BITS; + +	HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &iobitmap); +} +#endif +  static void xen_io_delay(void)  {  } @@ -1047,6 +1069,9 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {  	.write_idt_entry = xen_write_idt_entry,  	.load_sp0 = xen_load_sp0, +#ifdef CONFIG_X86_IOPL_IOPERM +	.update_io_bitmap = xen_update_io_bitmap, +#endif  	.io_delay = xen_io_delay,  	/* Xen takes care of %gs when switching to usermode for us */ |