diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-09-01 12:33:46 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-09-01 12:33:46 -0400 |
commit | 0cb7bf61b1e9f05027de58c80f9b46a714d24e35 (patch) | |
tree | 41fb55cf62d07b425122f9a8b96412c0d8eb99c5 /arch | |
parent | aa877175e7a9982233ed8f10cb4bfddd78d82741 (diff) | |
parent | 3eab887a55424fc2c27553b7bfe32330df83f7b8 (diff) |
Merge branch 'linus' into smp/hotplug
Apply upstream changes to avoid conflicts with pending patches.
Diffstat (limited to 'arch')
140 files changed, 973 insertions, 674 deletions
diff --git a/arch/arc/include/asm/entry.h b/arch/arc/include/asm/entry.h index ad7860c5ce15..51597f344a62 100644 --- a/arch/arc/include/asm/entry.h +++ b/arch/arc/include/asm/entry.h | |||
@@ -142,7 +142,7 @@ | |||
142 | 142 | ||
143 | #ifdef CONFIG_ARC_CURR_IN_REG | 143 | #ifdef CONFIG_ARC_CURR_IN_REG |
144 | ; Retrieve orig r25 and save it with rest of callee_regs | 144 | ; Retrieve orig r25 and save it with rest of callee_regs |
145 | ld.as r12, [r12, PT_user_r25] | 145 | ld r12, [r12, PT_user_r25] |
146 | PUSH r12 | 146 | PUSH r12 |
147 | #else | 147 | #else |
148 | PUSH r25 | 148 | PUSH r25 |
@@ -198,7 +198,7 @@ | |||
198 | 198 | ||
199 | ; SP is back to start of pt_regs | 199 | ; SP is back to start of pt_regs |
200 | #ifdef CONFIG_ARC_CURR_IN_REG | 200 | #ifdef CONFIG_ARC_CURR_IN_REG |
201 | st.as r12, [sp, PT_user_r25] | 201 | st r12, [sp, PT_user_r25] |
202 | #endif | 202 | #endif |
203 | .endm | 203 | .endm |
204 | 204 | ||
diff --git a/arch/arc/include/asm/irqflags-compact.h b/arch/arc/include/asm/irqflags-compact.h index c1d36458bfb7..4c6eed80cd8b 100644 --- a/arch/arc/include/asm/irqflags-compact.h +++ b/arch/arc/include/asm/irqflags-compact.h | |||
@@ -188,10 +188,10 @@ static inline int arch_irqs_disabled(void) | |||
188 | .endm | 188 | .endm |
189 | 189 | ||
190 | .macro IRQ_ENABLE scratch | 190 | .macro IRQ_ENABLE scratch |
191 | TRACE_ASM_IRQ_ENABLE | ||
191 | lr \scratch, [status32] | 192 | lr \scratch, [status32] |
192 | or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) | 193 | or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) |
193 | flag \scratch | 194 | flag \scratch |
194 | TRACE_ASM_IRQ_ENABLE | ||
195 | .endm | 195 | .endm |
196 | 196 | ||
197 | #endif /* __ASSEMBLY__ */ | 197 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h index 0f92d97432a2..89eeb3720051 100644 --- a/arch/arc/include/asm/pgtable.h +++ b/arch/arc/include/asm/pgtable.h | |||
@@ -280,7 +280,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep) | |||
280 | 280 | ||
281 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) | 281 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) |
282 | #define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot) | 282 | #define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot) |
283 | #define pfn_pte(pfn, prot) (__pte(((pte_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) | 283 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) |
284 | 284 | ||
285 | /* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/ | 285 | /* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/ |
286 | #define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) | 286 | #define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) |
diff --git a/arch/arc/include/uapi/asm/elf.h b/arch/arc/include/uapi/asm/elf.h index 0f99ac8fcbb2..0037a587320d 100644 --- a/arch/arc/include/uapi/asm/elf.h +++ b/arch/arc/include/uapi/asm/elf.h | |||
@@ -13,8 +13,15 @@ | |||
13 | 13 | ||
14 | /* Machine specific ELF Hdr flags */ | 14 | /* Machine specific ELF Hdr flags */ |
15 | #define EF_ARC_OSABI_MSK 0x00000f00 | 15 | #define EF_ARC_OSABI_MSK 0x00000f00 |
16 | #define EF_ARC_OSABI_ORIG 0x00000000 /* MUST be zero for back-compat */ | 16 | |
17 | #define EF_ARC_OSABI_CURRENT 0x00000300 /* v3 (no legacy syscalls) */ | 17 | #define EF_ARC_OSABI_V3 0x00000300 /* v3 (no legacy syscalls) */ |
18 | #define EF_ARC_OSABI_V4 0x00000400 /* v4 (64bit data any reg align) */ | ||
19 | |||
20 | #if __GNUC__ < 6 | ||
21 | #define EF_ARC_OSABI_CURRENT EF_ARC_OSABI_V3 | ||
22 | #else | ||
23 | #define EF_ARC_OSABI_CURRENT EF_ARC_OSABI_V4 | ||
24 | #endif | ||
18 | 25 | ||
19 | typedef unsigned long elf_greg_t; | 26 | typedef unsigned long elf_greg_t; |
20 | typedef unsigned long elf_fpregset_t; | 27 | typedef unsigned long elf_fpregset_t; |
diff --git a/arch/arc/kernel/arcksyms.c b/arch/arc/kernel/arcksyms.c index 4d9e77724bed..000dd041ab42 100644 --- a/arch/arc/kernel/arcksyms.c +++ b/arch/arc/kernel/arcksyms.c | |||
@@ -28,6 +28,7 @@ extern void __muldf3(void); | |||
28 | extern void __divdf3(void); | 28 | extern void __divdf3(void); |
29 | extern void __floatunsidf(void); | 29 | extern void __floatunsidf(void); |
30 | extern void __floatunsisf(void); | 30 | extern void __floatunsisf(void); |
31 | extern void __udivdi3(void); | ||
31 | 32 | ||
32 | EXPORT_SYMBOL(__ashldi3); | 33 | EXPORT_SYMBOL(__ashldi3); |
33 | EXPORT_SYMBOL(__ashrdi3); | 34 | EXPORT_SYMBOL(__ashrdi3); |
@@ -45,6 +46,7 @@ EXPORT_SYMBOL(__muldf3); | |||
45 | EXPORT_SYMBOL(__divdf3); | 46 | EXPORT_SYMBOL(__divdf3); |
46 | EXPORT_SYMBOL(__floatunsidf); | 47 | EXPORT_SYMBOL(__floatunsidf); |
47 | EXPORT_SYMBOL(__floatunsisf); | 48 | EXPORT_SYMBOL(__floatunsisf); |
49 | EXPORT_SYMBOL(__udivdi3); | ||
48 | 50 | ||
49 | /* ARC optimised assembler routines */ | 51 | /* ARC optimised assembler routines */ |
50 | EXPORT_SYMBOL(memset); | 52 | EXPORT_SYMBOL(memset); |
diff --git a/arch/arc/kernel/process.c b/arch/arc/kernel/process.c index b5db9e7fd649..be1972bd2729 100644 --- a/arch/arc/kernel/process.c +++ b/arch/arc/kernel/process.c | |||
@@ -199,7 +199,7 @@ int elf_check_arch(const struct elf32_hdr *x) | |||
199 | } | 199 | } |
200 | 200 | ||
201 | eflags = x->e_flags; | 201 | eflags = x->e_flags; |
202 | if ((eflags & EF_ARC_OSABI_MSK) < EF_ARC_OSABI_CURRENT) { | 202 | if ((eflags & EF_ARC_OSABI_MSK) != EF_ARC_OSABI_CURRENT) { |
203 | pr_err("ABI mismatch - you need newer toolchain\n"); | 203 | pr_err("ABI mismatch - you need newer toolchain\n"); |
204 | force_sigsegv(SIGSEGV, current); | 204 | force_sigsegv(SIGSEGV, current); |
205 | return 0; | 205 | return 0; |
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c index a946400a86d0..f52a0d0dc462 100644 --- a/arch/arc/kernel/setup.c +++ b/arch/arc/kernel/setup.c | |||
@@ -291,8 +291,10 @@ static char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len) | |||
291 | cpu->dccm.base_addr, TO_KB(cpu->dccm.sz), | 291 | cpu->dccm.base_addr, TO_KB(cpu->dccm.sz), |
292 | cpu->iccm.base_addr, TO_KB(cpu->iccm.sz)); | 292 | cpu->iccm.base_addr, TO_KB(cpu->iccm.sz)); |
293 | 293 | ||
294 | n += scnprintf(buf + n, len - n, | 294 | n += scnprintf(buf + n, len - n, "OS ABI [v%d]\t: %s\n", |
295 | "OS ABI [v3]\t: no-legacy-syscalls\n"); | 295 | EF_ARC_OSABI_CURRENT >> 8, |
296 | EF_ARC_OSABI_CURRENT == EF_ARC_OSABI_V3 ? | ||
297 | "no-legacy-syscalls" : "64-bit data any register aligned"); | ||
296 | 298 | ||
297 | return buf; | 299 | return buf; |
298 | } | 300 | } |
diff --git a/arch/arc/mm/cache.c b/arch/arc/mm/cache.c index 5a294b2c3cb3..0b10efe3a6a7 100644 --- a/arch/arc/mm/cache.c +++ b/arch/arc/mm/cache.c | |||
@@ -921,6 +921,15 @@ void arc_cache_init(void) | |||
921 | 921 | ||
922 | printk(arc_cache_mumbojumbo(0, str, sizeof(str))); | 922 | printk(arc_cache_mumbojumbo(0, str, sizeof(str))); |
923 | 923 | ||
924 | /* | ||
925 | * Only master CPU needs to execute rest of function: | ||
926 | * - Assume SMP so all cores will have same cache config so | ||
927 | * any geomtry checks will be same for all | ||
928 | * - IOC setup / dma callbacks only need to be setup once | ||
929 | */ | ||
930 | if (cpu) | ||
931 | return; | ||
932 | |||
924 | if (IS_ENABLED(CONFIG_ARC_HAS_ICACHE)) { | 933 | if (IS_ENABLED(CONFIG_ARC_HAS_ICACHE)) { |
925 | struct cpuinfo_arc_cache *ic = &cpuinfo_arc700[cpu].icache; | 934 | struct cpuinfo_arc_cache *ic = &cpuinfo_arc700[cpu].icache; |
926 | 935 | ||
diff --git a/arch/arc/mm/highmem.c b/arch/arc/mm/highmem.c index 04f83322c9fd..77ff64a874a1 100644 --- a/arch/arc/mm/highmem.c +++ b/arch/arc/mm/highmem.c | |||
@@ -61,6 +61,7 @@ void *kmap(struct page *page) | |||
61 | 61 | ||
62 | return kmap_high(page); | 62 | return kmap_high(page); |
63 | } | 63 | } |
64 | EXPORT_SYMBOL(kmap); | ||
64 | 65 | ||
65 | void *kmap_atomic(struct page *page) | 66 | void *kmap_atomic(struct page *page) |
66 | { | 67 | { |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 56ea5c60b318..61f6ccc19cfa 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -260,12 +260,14 @@ machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y)) | |||
260 | platdirs := $(patsubst %,arch/arm/plat-%/,$(sort $(plat-y))) | 260 | platdirs := $(patsubst %,arch/arm/plat-%/,$(sort $(plat-y))) |
261 | 261 | ||
262 | ifneq ($(CONFIG_ARCH_MULTIPLATFORM),y) | 262 | ifneq ($(CONFIG_ARCH_MULTIPLATFORM),y) |
263 | ifneq ($(CONFIG_ARM_SINGLE_ARMV7M),y) | ||
263 | ifeq ($(KBUILD_SRC),) | 264 | ifeq ($(KBUILD_SRC),) |
264 | KBUILD_CPPFLAGS += $(patsubst %,-I%include,$(machdirs) $(platdirs)) | 265 | KBUILD_CPPFLAGS += $(patsubst %,-I%include,$(machdirs) $(platdirs)) |
265 | else | 266 | else |
266 | KBUILD_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(machdirs) $(platdirs)) | 267 | KBUILD_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(machdirs) $(platdirs)) |
267 | endif | 268 | endif |
268 | endif | 269 | endif |
270 | endif | ||
269 | 271 | ||
270 | export TEXT_OFFSET GZFLAGS MMUEXT | 272 | export TEXT_OFFSET GZFLAGS MMUEXT |
271 | 273 | ||
diff --git a/arch/arm/boot/dts/arm-realview-pbx-a9.dts b/arch/arm/boot/dts/arm-realview-pbx-a9.dts index db808f92dd79..90d00b407f85 100644 --- a/arch/arm/boot/dts/arm-realview-pbx-a9.dts +++ b/arch/arm/boot/dts/arm-realview-pbx-a9.dts | |||
@@ -70,13 +70,12 @@ | |||
70 | * associativity as these may be erroneously set | 70 | * associativity as these may be erroneously set |
71 | * up by boot loader(s). | 71 | * up by boot loader(s). |
72 | */ | 72 | */ |
73 | cache-size = <1048576>; // 1MB | 73 | cache-size = <131072>; // 128KB |
74 | cache-sets = <4096>; | 74 | cache-sets = <512>; |
75 | cache-line-size = <32>; | 75 | cache-line-size = <32>; |
76 | arm,parity-disable; | 76 | arm,parity-disable; |
77 | arm,tag-latency = <1>; | 77 | arm,tag-latency = <1 1 1>; |
78 | arm,data-latency = <1 1>; | 78 | arm,data-latency = <1 1 1>; |
79 | arm,dirty-latency = <1>; | ||
80 | }; | 79 | }; |
81 | 80 | ||
82 | scu: scu@1f000000 { | 81 | scu: scu@1f000000 { |
diff --git a/arch/arm/boot/dts/integratorap.dts b/arch/arm/boot/dts/integratorap.dts index cf06e32ee108..4b34b54e09a1 100644 --- a/arch/arm/boot/dts/integratorap.dts +++ b/arch/arm/boot/dts/integratorap.dts | |||
@@ -42,7 +42,7 @@ | |||
42 | }; | 42 | }; |
43 | 43 | ||
44 | syscon { | 44 | syscon { |
45 | compatible = "arm,integrator-ap-syscon"; | 45 | compatible = "arm,integrator-ap-syscon", "syscon"; |
46 | reg = <0x11000000 0x100>; | 46 | reg = <0x11000000 0x100>; |
47 | interrupt-parent = <&pic>; | 47 | interrupt-parent = <&pic>; |
48 | /* These are the logical module IRQs */ | 48 | /* These are the logical module IRQs */ |
diff --git a/arch/arm/boot/dts/integratorcp.dts b/arch/arm/boot/dts/integratorcp.dts index d43f15b4f79a..79430fbfec3b 100644 --- a/arch/arm/boot/dts/integratorcp.dts +++ b/arch/arm/boot/dts/integratorcp.dts | |||
@@ -94,7 +94,7 @@ | |||
94 | }; | 94 | }; |
95 | 95 | ||
96 | syscon { | 96 | syscon { |
97 | compatible = "arm,integrator-cp-syscon"; | 97 | compatible = "arm,integrator-cp-syscon", "syscon"; |
98 | reg = <0xcb000000 0x100>; | 98 | reg = <0xcb000000 0x100>; |
99 | }; | 99 | }; |
100 | 100 | ||
diff --git a/arch/arm/boot/dts/keystone.dtsi b/arch/arm/boot/dts/keystone.dtsi index 00cb314d5e4d..e23f46d15c80 100644 --- a/arch/arm/boot/dts/keystone.dtsi +++ b/arch/arm/boot/dts/keystone.dtsi | |||
@@ -70,14 +70,6 @@ | |||
70 | cpu_on = <0x84000003>; | 70 | cpu_on = <0x84000003>; |
71 | }; | 71 | }; |
72 | 72 | ||
73 | psci { | ||
74 | compatible = "arm,psci"; | ||
75 | method = "smc"; | ||
76 | cpu_suspend = <0x84000001>; | ||
77 | cpu_off = <0x84000002>; | ||
78 | cpu_on = <0x84000003>; | ||
79 | }; | ||
80 | |||
81 | soc { | 73 | soc { |
82 | #address-cells = <1>; | 74 | #address-cells = <1>; |
83 | #size-cells = <1>; | 75 | #size-cells = <1>; |
diff --git a/arch/arm/boot/dts/tegra124-jetson-tk1.dts b/arch/arm/boot/dts/tegra124-jetson-tk1.dts index e52b82449a79..6403e0de540e 100644 --- a/arch/arm/boot/dts/tegra124-jetson-tk1.dts +++ b/arch/arm/boot/dts/tegra124-jetson-tk1.dts | |||
@@ -1382,7 +1382,7 @@ | |||
1382 | * Pin 41: BR_UART1_TXD | 1382 | * Pin 41: BR_UART1_TXD |
1383 | * Pin 44: BR_UART1_RXD | 1383 | * Pin 44: BR_UART1_RXD |
1384 | */ | 1384 | */ |
1385 | serial@70006000 { | 1385 | serial@0,70006000 { |
1386 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; | 1386 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; |
1387 | status = "okay"; | 1387 | status = "okay"; |
1388 | }; | 1388 | }; |
@@ -1394,7 +1394,7 @@ | |||
1394 | * Pin 71: UART2_CTS_L | 1394 | * Pin 71: UART2_CTS_L |
1395 | * Pin 74: UART2_RTS_L | 1395 | * Pin 74: UART2_RTS_L |
1396 | */ | 1396 | */ |
1397 | serial@70006040 { | 1397 | serial@0,70006040 { |
1398 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; | 1398 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; |
1399 | status = "okay"; | 1399 | status = "okay"; |
1400 | }; | 1400 | }; |
diff --git a/arch/arm/configs/aspeed_g4_defconfig b/arch/arm/configs/aspeed_g4_defconfig index b6e54ee9bdbd..ca39c04fec6b 100644 --- a/arch/arm/configs/aspeed_g4_defconfig +++ b/arch/arm/configs/aspeed_g4_defconfig | |||
@@ -58,7 +58,7 @@ CONFIG_SERIAL_OF_PLATFORM=y | |||
58 | # CONFIG_IOMMU_SUPPORT is not set | 58 | # CONFIG_IOMMU_SUPPORT is not set |
59 | CONFIG_FIRMWARE_MEMMAP=y | 59 | CONFIG_FIRMWARE_MEMMAP=y |
60 | CONFIG_FANOTIFY=y | 60 | CONFIG_FANOTIFY=y |
61 | CONFIG_PRINTK_TIME=1 | 61 | CONFIG_PRINTK_TIME=y |
62 | CONFIG_DYNAMIC_DEBUG=y | 62 | CONFIG_DYNAMIC_DEBUG=y |
63 | CONFIG_STRIP_ASM_SYMS=y | 63 | CONFIG_STRIP_ASM_SYMS=y |
64 | CONFIG_PAGE_POISONING=y | 64 | CONFIG_PAGE_POISONING=y |
diff --git a/arch/arm/configs/aspeed_g5_defconfig b/arch/arm/configs/aspeed_g5_defconfig index 892605167357..4f366b0370e9 100644 --- a/arch/arm/configs/aspeed_g5_defconfig +++ b/arch/arm/configs/aspeed_g5_defconfig | |||
@@ -59,7 +59,7 @@ CONFIG_SERIAL_OF_PLATFORM=y | |||
59 | # CONFIG_IOMMU_SUPPORT is not set | 59 | # CONFIG_IOMMU_SUPPORT is not set |
60 | CONFIG_FIRMWARE_MEMMAP=y | 60 | CONFIG_FIRMWARE_MEMMAP=y |
61 | CONFIG_FANOTIFY=y | 61 | CONFIG_FANOTIFY=y |
62 | CONFIG_PRINTK_TIME=1 | 62 | CONFIG_PRINTK_TIME=y |
63 | CONFIG_DYNAMIC_DEBUG=y | 63 | CONFIG_DYNAMIC_DEBUG=y |
64 | CONFIG_STRIP_ASM_SYMS=y | 64 | CONFIG_STRIP_ASM_SYMS=y |
65 | CONFIG_PAGE_POISONING=y | 65 | CONFIG_PAGE_POISONING=y |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index bc5f50799d75..9f157e7c51e7 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -295,6 +295,7 @@ __und_svc_fault: | |||
295 | bl __und_fault | 295 | bl __und_fault |
296 | 296 | ||
297 | __und_svc_finish: | 297 | __und_svc_finish: |
298 | get_thread_info tsk | ||
298 | ldr r5, [sp, #S_PSR] @ Get SVC cpsr | 299 | ldr r5, [sp, #S_PSR] @ Get SVC cpsr |
299 | svc_exit r5 @ return from exception | 300 | svc_exit r5 @ return from exception |
300 | UNWIND(.fnend ) | 301 | UNWIND(.fnend ) |
diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c index 087acb569b63..5f221acd21ae 100644 --- a/arch/arm/kernel/sys_oabi-compat.c +++ b/arch/arm/kernel/sys_oabi-compat.c | |||
@@ -279,8 +279,12 @@ asmlinkage long sys_oabi_epoll_wait(int epfd, | |||
279 | mm_segment_t fs; | 279 | mm_segment_t fs; |
280 | long ret, err, i; | 280 | long ret, err, i; |
281 | 281 | ||
282 | if (maxevents <= 0 || maxevents > (INT_MAX/sizeof(struct epoll_event))) | 282 | if (maxevents <= 0 || |
283 | maxevents > (INT_MAX/sizeof(*kbuf)) || | ||
284 | maxevents > (INT_MAX/sizeof(*events))) | ||
283 | return -EINVAL; | 285 | return -EINVAL; |
286 | if (!access_ok(VERIFY_WRITE, events, sizeof(*events) * maxevents)) | ||
287 | return -EFAULT; | ||
284 | kbuf = kmalloc(sizeof(*kbuf) * maxevents, GFP_KERNEL); | 288 | kbuf = kmalloc(sizeof(*kbuf) * maxevents, GFP_KERNEL); |
285 | if (!kbuf) | 289 | if (!kbuf) |
286 | return -ENOMEM; | 290 | return -ENOMEM; |
@@ -317,6 +321,8 @@ asmlinkage long sys_oabi_semtimedop(int semid, | |||
317 | 321 | ||
318 | if (nsops < 1 || nsops > SEMOPM) | 322 | if (nsops < 1 || nsops > SEMOPM) |
319 | return -EINVAL; | 323 | return -EINVAL; |
324 | if (!access_ok(VERIFY_READ, tsops, sizeof(*tsops) * nsops)) | ||
325 | return -EFAULT; | ||
320 | sops = kmalloc(sizeof(*sops) * nsops, GFP_KERNEL); | 326 | sops = kmalloc(sizeof(*sops) * nsops, GFP_KERNEL); |
321 | if (!sops) | 327 | if (!sops) |
322 | return -ENOMEM; | 328 | return -ENOMEM; |
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index d94bb9093ead..75f130ef6504 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
@@ -1009,9 +1009,13 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
1009 | 1009 | ||
1010 | switch (ioctl) { | 1010 | switch (ioctl) { |
1011 | case KVM_CREATE_IRQCHIP: { | 1011 | case KVM_CREATE_IRQCHIP: { |
1012 | int ret; | ||
1012 | if (!vgic_present) | 1013 | if (!vgic_present) |
1013 | return -ENXIO; | 1014 | return -ENXIO; |
1014 | return kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); | 1015 | mutex_lock(&kvm->lock); |
1016 | ret = kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); | ||
1017 | mutex_unlock(&kvm->lock); | ||
1018 | return ret; | ||
1015 | } | 1019 | } |
1016 | case KVM_ARM_SET_DEVICE_ADDR: { | 1020 | case KVM_ARM_SET_DEVICE_ADDR: { |
1017 | struct kvm_arm_device_addr dev_addr; | 1021 | struct kvm_arm_device_addr dev_addr; |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index bda27b6b1aa2..29d0b23af2a9 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
@@ -1309,7 +1309,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | |||
1309 | smp_rmb(); | 1309 | smp_rmb(); |
1310 | 1310 | ||
1311 | pfn = gfn_to_pfn_prot(kvm, gfn, write_fault, &writable); | 1311 | pfn = gfn_to_pfn_prot(kvm, gfn, write_fault, &writable); |
1312 | if (is_error_pfn(pfn)) | 1312 | if (is_error_noslot_pfn(pfn)) |
1313 | return -EFAULT; | 1313 | return -EFAULT; |
1314 | 1314 | ||
1315 | if (kvm_is_device_pfn(pfn)) { | 1315 | if (kvm_is_device_pfn(pfn)) { |
diff --git a/arch/arm/mach-clps711x/Kconfig b/arch/arm/mach-clps711x/Kconfig index dc7c6edeab39..61284b9389cf 100644 --- a/arch/arm/mach-clps711x/Kconfig +++ b/arch/arm/mach-clps711x/Kconfig | |||
@@ -1,13 +1,13 @@ | |||
1 | menuconfig ARCH_CLPS711X | 1 | menuconfig ARCH_CLPS711X |
2 | bool "Cirrus Logic EP721x/EP731x-based" | 2 | bool "Cirrus Logic EP721x/EP731x-based" |
3 | depends on ARCH_MULTI_V4T | 3 | depends on ARCH_MULTI_V4T |
4 | select ARCH_REQUIRE_GPIOLIB | ||
5 | select AUTO_ZRELADDR | 4 | select AUTO_ZRELADDR |
6 | select CLKSRC_OF | 5 | select CLKSRC_OF |
7 | select CLPS711X_TIMER | 6 | select CLPS711X_TIMER |
8 | select COMMON_CLK | 7 | select COMMON_CLK |
9 | select CPU_ARM720T | 8 | select CPU_ARM720T |
10 | select GENERIC_CLOCKEVENTS | 9 | select GENERIC_CLOCKEVENTS |
10 | select GPIOLIB | ||
11 | select MFD_SYSCON | 11 | select MFD_SYSCON |
12 | select OF_IRQ | 12 | select OF_IRQ |
13 | select USE_OF | 13 | select USE_OF |
diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c index fd8720532471..0df062d8b2c9 100644 --- a/arch/arm/mach-imx/gpc.c +++ b/arch/arm/mach-imx/gpc.c | |||
@@ -271,6 +271,12 @@ static int __init imx_gpc_init(struct device_node *node, | |||
271 | for (i = 0; i < IMR_NUM; i++) | 271 | for (i = 0; i < IMR_NUM; i++) |
272 | writel_relaxed(~0, gpc_base + GPC_IMR1 + i * 4); | 272 | writel_relaxed(~0, gpc_base + GPC_IMR1 + i * 4); |
273 | 273 | ||
274 | /* | ||
275 | * Clear the OF_POPULATED flag set in of_irq_init so that | ||
276 | * later the GPC power domain driver will not be skipped. | ||
277 | */ | ||
278 | of_node_clear_flag(node, OF_POPULATED); | ||
279 | |||
274 | return 0; | 280 | return 0; |
275 | } | 281 | } |
276 | IRQCHIP_DECLARE(imx_gpc, "fsl,imx6q-gpc", imx_gpc_init); | 282 | IRQCHIP_DECLARE(imx_gpc, "fsl,imx6q-gpc", imx_gpc_init); |
diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile index e53c6cfcab51..6c6497e80a7b 100644 --- a/arch/arm/mach-mvebu/Makefile +++ b/arch/arm/mach-mvebu/Makefile | |||
@@ -1,5 +1,4 @@ | |||
1 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \ | 1 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/arch/arm/plat-orion/include |
2 | -I$(srctree)/arch/arm/plat-orion/include | ||
3 | 2 | ||
4 | AFLAGS_coherency_ll.o := -Wa,-march=armv7-a | 3 | AFLAGS_coherency_ll.o := -Wa,-march=armv7-a |
5 | CFLAGS_pmsu.o := -march=armv7-a | 4 | CFLAGS_pmsu.o := -march=armv7-a |
diff --git a/arch/arm/mach-oxnas/Kconfig b/arch/arm/mach-oxnas/Kconfig index 567496bd250a..29100beb2e7f 100644 --- a/arch/arm/mach-oxnas/Kconfig +++ b/arch/arm/mach-oxnas/Kconfig | |||
@@ -11,11 +11,13 @@ if ARCH_OXNAS | |||
11 | 11 | ||
12 | config MACH_OX810SE | 12 | config MACH_OX810SE |
13 | bool "Support OX810SE Based Products" | 13 | bool "Support OX810SE Based Products" |
14 | select ARCH_HAS_RESET_CONTROLLER | ||
14 | select COMMON_CLK_OXNAS | 15 | select COMMON_CLK_OXNAS |
15 | select CPU_ARM926T | 16 | select CPU_ARM926T |
16 | select MFD_SYSCON | 17 | select MFD_SYSCON |
17 | select OXNAS_RPS_TIMER | 18 | select OXNAS_RPS_TIMER |
18 | select PINCTRL_OXNAS | 19 | select PINCTRL_OXNAS |
20 | select RESET_CONTROLLER | ||
19 | select RESET_OXNAS | 21 | select RESET_OXNAS |
20 | select VERSATILE_FPGA_IRQ | 22 | select VERSATILE_FPGA_IRQ |
21 | help | 23 | help |
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index dc109dc3a622..10bfdb169366 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c | |||
@@ -13,6 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/module.h> /* symbol_get ; symbol_put */ | ||
16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
17 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
18 | #include <linux/major.h> | 19 | #include <linux/major.h> |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 1080580b1343..2c150bfc0cd5 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -13,6 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/module.h> /* symbol_get ; symbol_put */ | ||
16 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
17 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
18 | #include <linux/gpio_keys.h> | 19 | #include <linux/gpio_keys.h> |
diff --git a/arch/arm/mach-realview/Makefile b/arch/arm/mach-realview/Makefile index dae8d86ef4cc..404882130956 100644 --- a/arch/arm/mach-realview/Makefile +++ b/arch/arm/mach-realview/Makefile | |||
@@ -1,8 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
3 | # | 3 | # |
4 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \ | 4 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/arch/arm/plat-versatile/include |
5 | -I$(srctree)/arch/arm/plat-versatile/include | ||
6 | 5 | ||
7 | obj-y := core.o | 6 | obj-y := core.o |
8 | obj-$(CONFIG_REALVIEW_DT) += realview-dt.o | 7 | obj-$(CONFIG_REALVIEW_DT) += realview-dt.o |
diff --git a/arch/arm/mach-s5pv210/Makefile b/arch/arm/mach-s5pv210/Makefile index 72b9e9671507..fa7fb716e388 100644 --- a/arch/arm/mach-s5pv210/Makefile +++ b/arch/arm/mach-s5pv210/Makefile | |||
@@ -5,7 +5,7 @@ | |||
5 | # | 5 | # |
6 | # Licensed under GPLv2 | 6 | # Licensed under GPLv2 |
7 | 7 | ||
8 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) += -I$(srctree)/$(src)/include -I$(srctree)/arch/arm/plat-samsung/include | 8 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) += -I$(srctree)/arch/arm/plat-samsung/include |
9 | 9 | ||
10 | # Core | 10 | # Core |
11 | 11 | ||
diff --git a/arch/arm/mach-shmobile/platsmp.c b/arch/arm/mach-shmobile/platsmp.c index f3dba6f356e2..02e21bceb085 100644 --- a/arch/arm/mach-shmobile/platsmp.c +++ b/arch/arm/mach-shmobile/platsmp.c | |||
@@ -40,5 +40,8 @@ bool shmobile_smp_cpu_can_disable(unsigned int cpu) | |||
40 | bool __init shmobile_smp_init_fallback_ops(void) | 40 | bool __init shmobile_smp_init_fallback_ops(void) |
41 | { | 41 | { |
42 | /* fallback on PSCI/smp_ops if no other DT based method is detected */ | 42 | /* fallback on PSCI/smp_ops if no other DT based method is detected */ |
43 | if (!IS_ENABLED(CONFIG_SMP)) | ||
44 | return false; | ||
45 | |||
43 | return platform_can_secondary_boot() ? true : false; | 46 | return platform_can_secondary_boot() ? true : false; |
44 | } | 47 | } |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 62f4d01941f7..6344913f0804 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -728,7 +728,8 @@ static void *__init late_alloc(unsigned long sz) | |||
728 | { | 728 | { |
729 | void *ptr = (void *)__get_free_pages(PGALLOC_GFP, get_order(sz)); | 729 | void *ptr = (void *)__get_free_pages(PGALLOC_GFP, get_order(sz)); |
730 | 730 | ||
731 | BUG_ON(!ptr); | 731 | if (!ptr || !pgtable_page_ctor(virt_to_page(ptr))) |
732 | BUG(); | ||
732 | return ptr; | 733 | return ptr; |
733 | } | 734 | } |
734 | 735 | ||
@@ -1155,10 +1156,19 @@ void __init sanity_check_meminfo(void) | |||
1155 | { | 1156 | { |
1156 | phys_addr_t memblock_limit = 0; | 1157 | phys_addr_t memblock_limit = 0; |
1157 | int highmem = 0; | 1158 | int highmem = 0; |
1158 | phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1; | 1159 | u64 vmalloc_limit; |
1159 | struct memblock_region *reg; | 1160 | struct memblock_region *reg; |
1160 | bool should_use_highmem = false; | 1161 | bool should_use_highmem = false; |
1161 | 1162 | ||
1163 | /* | ||
1164 | * Let's use our own (unoptimized) equivalent of __pa() that is | ||
1165 | * not affected by wrap-arounds when sizeof(phys_addr_t) == 4. | ||
1166 | * The result is used as the upper bound on physical memory address | ||
1167 | * and may itself be outside the valid range for which phys_addr_t | ||
1168 | * and therefore __pa() is defined. | ||
1169 | */ | ||
1170 | vmalloc_limit = (u64)(uintptr_t)vmalloc_min - PAGE_OFFSET + PHYS_OFFSET; | ||
1171 | |||
1162 | for_each_memblock(memory, reg) { | 1172 | for_each_memblock(memory, reg) { |
1163 | phys_addr_t block_start = reg->base; | 1173 | phys_addr_t block_start = reg->base; |
1164 | phys_addr_t block_end = reg->base + reg->size; | 1174 | phys_addr_t block_end = reg->base + reg->size; |
@@ -1183,10 +1193,11 @@ void __init sanity_check_meminfo(void) | |||
1183 | if (reg->size > size_limit) { | 1193 | if (reg->size > size_limit) { |
1184 | phys_addr_t overlap_size = reg->size - size_limit; | 1194 | phys_addr_t overlap_size = reg->size - size_limit; |
1185 | 1195 | ||
1186 | pr_notice("Truncating RAM at %pa-%pa to -%pa", | 1196 | pr_notice("Truncating RAM at %pa-%pa", |
1187 | &block_start, &block_end, &vmalloc_limit); | 1197 | &block_start, &block_end); |
1188 | memblock_remove(vmalloc_limit, overlap_size); | ||
1189 | block_end = vmalloc_limit; | 1198 | block_end = vmalloc_limit; |
1199 | pr_cont(" to -%pa", &block_end); | ||
1200 | memblock_remove(vmalloc_limit, overlap_size); | ||
1190 | should_use_highmem = true; | 1201 | should_use_highmem = true; |
1191 | } | 1202 | } |
1192 | } | 1203 | } |
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index b0b82f5ea338..3d2cef6488ea 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c | |||
@@ -50,7 +50,7 @@ DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); | |||
50 | static struct vcpu_info __percpu *xen_vcpu_info; | 50 | static struct vcpu_info __percpu *xen_vcpu_info; |
51 | 51 | ||
52 | /* Linux <-> Xen vCPU id mapping */ | 52 | /* Linux <-> Xen vCPU id mapping */ |
53 | DEFINE_PER_CPU(int, xen_vcpu_id) = -1; | 53 | DEFINE_PER_CPU(uint32_t, xen_vcpu_id); |
54 | EXPORT_PER_CPU_SYMBOL(xen_vcpu_id); | 54 | EXPORT_PER_CPU_SYMBOL(xen_vcpu_id); |
55 | 55 | ||
56 | /* These are unused until we support booting "pre-ballooned" */ | 56 | /* These are unused until we support booting "pre-ballooned" */ |
diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms index bb2616b16157..be5d824ebdba 100644 --- a/arch/arm64/Kconfig.platforms +++ b/arch/arm64/Kconfig.platforms | |||
@@ -8,7 +8,7 @@ config ARCH_SUNXI | |||
8 | 8 | ||
9 | config ARCH_ALPINE | 9 | config ARCH_ALPINE |
10 | bool "Annapurna Labs Alpine platform" | 10 | bool "Annapurna Labs Alpine platform" |
11 | select ALPINE_MSI | 11 | select ALPINE_MSI if PCI |
12 | help | 12 | help |
13 | This enables support for the Annapurna Labs Alpine | 13 | This enables support for the Annapurna Labs Alpine |
14 | Soc family. | 14 | Soc family. |
@@ -66,7 +66,7 @@ config ARCH_LG1K | |||
66 | config ARCH_HISI | 66 | config ARCH_HISI |
67 | bool "Hisilicon SoC Family" | 67 | bool "Hisilicon SoC Family" |
68 | select ARM_TIMER_SP804 | 68 | select ARM_TIMER_SP804 |
69 | select HISILICON_IRQ_MBIGEN | 69 | select HISILICON_IRQ_MBIGEN if PCI |
70 | help | 70 | help |
71 | This enables support for Hisilicon ARMv8 SoC family | 71 | This enables support for Hisilicon ARMv8 SoC family |
72 | 72 | ||
diff --git a/arch/arm64/boot/dts/exynos/exynos7-espresso.dts b/arch/arm64/boot/dts/exynos/exynos7-espresso.dts index 299f3ce969ab..c528dd52ba2d 100644 --- a/arch/arm64/boot/dts/exynos/exynos7-espresso.dts +++ b/arch/arm64/boot/dts/exynos/exynos7-espresso.dts | |||
@@ -12,6 +12,7 @@ | |||
12 | /dts-v1/; | 12 | /dts-v1/; |
13 | #include "exynos7.dtsi" | 13 | #include "exynos7.dtsi" |
14 | #include <dt-bindings/interrupt-controller/irq.h> | 14 | #include <dt-bindings/interrupt-controller/irq.h> |
15 | #include <dt-bindings/clock/samsung,s2mps11.h> | ||
15 | 16 | ||
16 | / { | 17 | / { |
17 | model = "Samsung Exynos7 Espresso board based on EXYNOS7"; | 18 | model = "Samsung Exynos7 Espresso board based on EXYNOS7"; |
@@ -43,6 +44,8 @@ | |||
43 | 44 | ||
44 | &rtc { | 45 | &rtc { |
45 | status = "okay"; | 46 | status = "okay"; |
47 | clocks = <&clock_ccore PCLK_RTC>, <&s2mps15_osc S2MPS11_CLK_AP>; | ||
48 | clock-names = "rtc", "rtc_src"; | ||
46 | }; | 49 | }; |
47 | 50 | ||
48 | &watchdog { | 51 | &watchdog { |
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index 0555b7caaf2c..eadf4855ad2d 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig | |||
@@ -1,4 +1,3 @@ | |||
1 | # CONFIG_LOCALVERSION_AUTO is not set | ||
2 | CONFIG_SYSVIPC=y | 1 | CONFIG_SYSVIPC=y |
3 | CONFIG_POSIX_MQUEUE=y | 2 | CONFIG_POSIX_MQUEUE=y |
4 | CONFIG_AUDIT=y | 3 | CONFIG_AUDIT=y |
@@ -15,10 +14,14 @@ CONFIG_IKCONFIG_PROC=y | |||
15 | CONFIG_LOG_BUF_SHIFT=14 | 14 | CONFIG_LOG_BUF_SHIFT=14 |
16 | CONFIG_MEMCG=y | 15 | CONFIG_MEMCG=y |
17 | CONFIG_MEMCG_SWAP=y | 16 | CONFIG_MEMCG_SWAP=y |
17 | CONFIG_BLK_CGROUP=y | ||
18 | CONFIG_CGROUP_PIDS=y | ||
18 | CONFIG_CGROUP_HUGETLB=y | 19 | CONFIG_CGROUP_HUGETLB=y |
19 | # CONFIG_UTS_NS is not set | 20 | CONFIG_CPUSETS=y |
20 | # CONFIG_IPC_NS is not set | 21 | CONFIG_CGROUP_DEVICE=y |
21 | # CONFIG_NET_NS is not set | 22 | CONFIG_CGROUP_CPUACCT=y |
23 | CONFIG_CGROUP_PERF=y | ||
24 | CONFIG_USER_NS=y | ||
22 | CONFIG_SCHED_AUTOGROUP=y | 25 | CONFIG_SCHED_AUTOGROUP=y |
23 | CONFIG_BLK_DEV_INITRD=y | 26 | CONFIG_BLK_DEV_INITRD=y |
24 | CONFIG_KALLSYMS_ALL=y | 27 | CONFIG_KALLSYMS_ALL=y |
@@ -71,6 +74,7 @@ CONFIG_PREEMPT=y | |||
71 | CONFIG_KSM=y | 74 | CONFIG_KSM=y |
72 | CONFIG_TRANSPARENT_HUGEPAGE=y | 75 | CONFIG_TRANSPARENT_HUGEPAGE=y |
73 | CONFIG_CMA=y | 76 | CONFIG_CMA=y |
77 | CONFIG_SECCOMP=y | ||
74 | CONFIG_XEN=y | 78 | CONFIG_XEN=y |
75 | CONFIG_KEXEC=y | 79 | CONFIG_KEXEC=y |
76 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 80 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
@@ -84,10 +88,37 @@ CONFIG_NET=y | |||
84 | CONFIG_PACKET=y | 88 | CONFIG_PACKET=y |
85 | CONFIG_UNIX=y | 89 | CONFIG_UNIX=y |
86 | CONFIG_INET=y | 90 | CONFIG_INET=y |
91 | CONFIG_IP_MULTICAST=y | ||
87 | CONFIG_IP_PNP=y | 92 | CONFIG_IP_PNP=y |
88 | CONFIG_IP_PNP_DHCP=y | 93 | CONFIG_IP_PNP_DHCP=y |
89 | CONFIG_IP_PNP_BOOTP=y | 94 | CONFIG_IP_PNP_BOOTP=y |
90 | # CONFIG_IPV6 is not set | 95 | CONFIG_IPV6=m |
96 | CONFIG_NETFILTER=y | ||
97 | CONFIG_NF_CONNTRACK=m | ||
98 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
99 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | ||
100 | CONFIG_NETFILTER_XT_TARGET_LOG=m | ||
101 | CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m | ||
102 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m | ||
103 | CONFIG_NF_CONNTRACK_IPV4=m | ||
104 | CONFIG_IP_NF_IPTABLES=m | ||
105 | CONFIG_IP_NF_FILTER=m | ||
106 | CONFIG_IP_NF_TARGET_REJECT=m | ||
107 | CONFIG_IP_NF_NAT=m | ||
108 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
109 | CONFIG_IP_NF_MANGLE=m | ||
110 | CONFIG_NF_CONNTRACK_IPV6=m | ||
111 | CONFIG_IP6_NF_IPTABLES=m | ||
112 | CONFIG_IP6_NF_FILTER=m | ||
113 | CONFIG_IP6_NF_TARGET_REJECT=m | ||
114 | CONFIG_IP6_NF_MANGLE=m | ||
115 | CONFIG_IP6_NF_NAT=m | ||
116 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | ||
117 | CONFIG_BRIDGE=m | ||
118 | CONFIG_BRIDGE_VLAN_FILTERING=y | ||
119 | CONFIG_VLAN_8021Q=m | ||
120 | CONFIG_VLAN_8021Q_GVRP=y | ||
121 | CONFIG_VLAN_8021Q_MVRP=y | ||
91 | CONFIG_BPF_JIT=y | 122 | CONFIG_BPF_JIT=y |
92 | CONFIG_CFG80211=m | 123 | CONFIG_CFG80211=m |
93 | CONFIG_MAC80211=m | 124 | CONFIG_MAC80211=m |
@@ -103,6 +134,7 @@ CONFIG_MTD=y | |||
103 | CONFIG_MTD_M25P80=y | 134 | CONFIG_MTD_M25P80=y |
104 | CONFIG_MTD_SPI_NOR=y | 135 | CONFIG_MTD_SPI_NOR=y |
105 | CONFIG_BLK_DEV_LOOP=y | 136 | CONFIG_BLK_DEV_LOOP=y |
137 | CONFIG_BLK_DEV_NBD=m | ||
106 | CONFIG_VIRTIO_BLK=y | 138 | CONFIG_VIRTIO_BLK=y |
107 | CONFIG_SRAM=y | 139 | CONFIG_SRAM=y |
108 | # CONFIG_SCSI_PROC_FS is not set | 140 | # CONFIG_SCSI_PROC_FS is not set |
@@ -120,7 +152,10 @@ CONFIG_SATA_SIL24=y | |||
120 | CONFIG_PATA_PLATFORM=y | 152 | CONFIG_PATA_PLATFORM=y |
121 | CONFIG_PATA_OF_PLATFORM=y | 153 | CONFIG_PATA_OF_PLATFORM=y |
122 | CONFIG_NETDEVICES=y | 154 | CONFIG_NETDEVICES=y |
155 | CONFIG_MACVLAN=m | ||
156 | CONFIG_MACVTAP=m | ||
123 | CONFIG_TUN=y | 157 | CONFIG_TUN=y |
158 | CONFIG_VETH=m | ||
124 | CONFIG_VIRTIO_NET=y | 159 | CONFIG_VIRTIO_NET=y |
125 | CONFIG_AMD_XGBE=y | 160 | CONFIG_AMD_XGBE=y |
126 | CONFIG_NET_XGENE=y | 161 | CONFIG_NET_XGENE=y |
@@ -350,12 +385,16 @@ CONFIG_EXYNOS_ADC=y | |||
350 | CONFIG_PWM_SAMSUNG=y | 385 | CONFIG_PWM_SAMSUNG=y |
351 | CONFIG_EXT2_FS=y | 386 | CONFIG_EXT2_FS=y |
352 | CONFIG_EXT3_FS=y | 387 | CONFIG_EXT3_FS=y |
388 | CONFIG_EXT4_FS_POSIX_ACL=y | ||
389 | CONFIG_BTRFS_FS=m | ||
390 | CONFIG_BTRFS_FS_POSIX_ACL=y | ||
353 | CONFIG_FANOTIFY=y | 391 | CONFIG_FANOTIFY=y |
354 | CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y | 392 | CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y |
355 | CONFIG_QUOTA=y | 393 | CONFIG_QUOTA=y |
356 | CONFIG_AUTOFS4_FS=y | 394 | CONFIG_AUTOFS4_FS=y |
357 | CONFIG_FUSE_FS=y | 395 | CONFIG_FUSE_FS=m |
358 | CONFIG_CUSE=y | 396 | CONFIG_CUSE=m |
397 | CONFIG_OVERLAY_FS=m | ||
359 | CONFIG_VFAT_FS=y | 398 | CONFIG_VFAT_FS=y |
360 | CONFIG_TMPFS=y | 399 | CONFIG_TMPFS=y |
361 | CONFIG_HUGETLBFS=y | 400 | CONFIG_HUGETLBFS=y |
diff --git a/arch/arm64/include/asm/kprobes.h b/arch/arm64/include/asm/kprobes.h index 61b49150dfa3..1737aecfcc5e 100644 --- a/arch/arm64/include/asm/kprobes.h +++ b/arch/arm64/include/asm/kprobes.h | |||
@@ -22,7 +22,6 @@ | |||
22 | 22 | ||
23 | #define __ARCH_WANT_KPROBES_INSN_SLOT | 23 | #define __ARCH_WANT_KPROBES_INSN_SLOT |
24 | #define MAX_INSN_SIZE 1 | 24 | #define MAX_INSN_SIZE 1 |
25 | #define MAX_STACK_SIZE 128 | ||
26 | 25 | ||
27 | #define flush_insn_slot(p) do { } while (0) | 26 | #define flush_insn_slot(p) do { } while (0) |
28 | #define kretprobe_blacklist_size 0 | 27 | #define kretprobe_blacklist_size 0 |
@@ -47,7 +46,6 @@ struct kprobe_ctlblk { | |||
47 | struct prev_kprobe prev_kprobe; | 46 | struct prev_kprobe prev_kprobe; |
48 | struct kprobe_step_ctx ss_ctx; | 47 | struct kprobe_step_ctx ss_ctx; |
49 | struct pt_regs jprobe_saved_regs; | 48 | struct pt_regs jprobe_saved_regs; |
50 | char jprobes_stack[MAX_STACK_SIZE]; | ||
51 | }; | 49 | }; |
52 | 50 | ||
53 | void arch_remove_kprobe(struct kprobe *); | 51 | void arch_remove_kprobe(struct kprobe *); |
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 96e4a2b64cc1..441420ca7d08 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S | |||
@@ -353,6 +353,8 @@ el1_sync: | |||
353 | lsr x24, x1, #ESR_ELx_EC_SHIFT // exception class | 353 | lsr x24, x1, #ESR_ELx_EC_SHIFT // exception class |
354 | cmp x24, #ESR_ELx_EC_DABT_CUR // data abort in EL1 | 354 | cmp x24, #ESR_ELx_EC_DABT_CUR // data abort in EL1 |
355 | b.eq el1_da | 355 | b.eq el1_da |
356 | cmp x24, #ESR_ELx_EC_IABT_CUR // instruction abort in EL1 | ||
357 | b.eq el1_ia | ||
356 | cmp x24, #ESR_ELx_EC_SYS64 // configurable trap | 358 | cmp x24, #ESR_ELx_EC_SYS64 // configurable trap |
357 | b.eq el1_undef | 359 | b.eq el1_undef |
358 | cmp x24, #ESR_ELx_EC_SP_ALIGN // stack alignment exception | 360 | cmp x24, #ESR_ELx_EC_SP_ALIGN // stack alignment exception |
@@ -364,6 +366,11 @@ el1_sync: | |||
364 | cmp x24, #ESR_ELx_EC_BREAKPT_CUR // debug exception in EL1 | 366 | cmp x24, #ESR_ELx_EC_BREAKPT_CUR // debug exception in EL1 |
365 | b.ge el1_dbg | 367 | b.ge el1_dbg |
366 | b el1_inv | 368 | b el1_inv |
369 | |||
370 | el1_ia: | ||
371 | /* | ||
372 | * Fall through to the Data abort case | ||
373 | */ | ||
367 | el1_da: | 374 | el1_da: |
368 | /* | 375 | /* |
369 | * Data abort handling | 376 | * Data abort handling |
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index b77f58355da1..3e7b050e99dc 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S | |||
@@ -757,6 +757,9 @@ ENTRY(__enable_mmu) | |||
757 | isb | 757 | isb |
758 | bl __create_page_tables // recreate kernel mapping | 758 | bl __create_page_tables // recreate kernel mapping |
759 | 759 | ||
760 | tlbi vmalle1 // Remove any stale TLB entries | ||
761 | dsb nsh | ||
762 | |||
760 | msr sctlr_el1, x19 // re-enable the MMU | 763 | msr sctlr_el1, x19 // re-enable the MMU |
761 | isb | 764 | isb |
762 | ic iallu // flush instructions fetched | 765 | ic iallu // flush instructions fetched |
diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c index 21ab5df9fa76..65d81f965e74 100644 --- a/arch/arm64/kernel/hibernate.c +++ b/arch/arm64/kernel/hibernate.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <asm/sections.h> | 35 | #include <asm/sections.h> |
36 | #include <asm/smp.h> | 36 | #include <asm/smp.h> |
37 | #include <asm/suspend.h> | 37 | #include <asm/suspend.h> |
38 | #include <asm/sysreg.h> | ||
38 | #include <asm/virt.h> | 39 | #include <asm/virt.h> |
39 | 40 | ||
40 | /* | 41 | /* |
@@ -217,12 +218,22 @@ static int create_safe_exec_page(void *src_start, size_t length, | |||
217 | set_pte(pte, __pte(virt_to_phys((void *)dst) | | 218 | set_pte(pte, __pte(virt_to_phys((void *)dst) | |
218 | pgprot_val(PAGE_KERNEL_EXEC))); | 219 | pgprot_val(PAGE_KERNEL_EXEC))); |
219 | 220 | ||
220 | /* Load our new page tables */ | 221 | /* |
221 | asm volatile("msr ttbr0_el1, %0;" | 222 | * Load our new page tables. A strict BBM approach requires that we |
222 | "isb;" | 223 | * ensure that TLBs are free of any entries that may overlap with the |
223 | "tlbi vmalle1is;" | 224 | * global mappings we are about to install. |
224 | "dsb ish;" | 225 | * |
225 | "isb" : : "r"(virt_to_phys(pgd))); | 226 | * For a real hibernate/resume cycle TTBR0 currently points to a zero |
227 | * page, but TLBs may contain stale ASID-tagged entries (e.g. for EFI | ||
228 | * runtime services), while for a userspace-driven test_resume cycle it | ||
229 | * points to userspace page tables (and we must point it at a zero page | ||
230 | * ourselves). Elsewhere we only (un)install the idmap with preemption | ||
231 | * disabled, so T0SZ should be as required regardless. | ||
232 | */ | ||
233 | cpu_set_reserved_ttbr0(); | ||
234 | local_flush_tlb_all(); | ||
235 | write_sysreg(virt_to_phys(pgd), ttbr0_el1); | ||
236 | isb(); | ||
226 | 237 | ||
227 | *phys_dst_addr = virt_to_phys((void *)dst); | 238 | *phys_dst_addr = virt_to_phys((void *)dst); |
228 | 239 | ||
@@ -394,6 +405,38 @@ int swsusp_arch_resume(void) | |||
394 | void *, phys_addr_t, phys_addr_t); | 405 | void *, phys_addr_t, phys_addr_t); |
395 | 406 | ||
396 | /* | 407 | /* |
408 | * Restoring the memory image will overwrite the ttbr1 page tables. | ||
409 | * Create a second copy of just the linear map, and use this when | ||
410 | * restoring. | ||
411 | */ | ||
412 | tmp_pg_dir = (pgd_t *)get_safe_page(GFP_ATOMIC); | ||
413 | if (!tmp_pg_dir) { | ||
414 | pr_err("Failed to allocate memory for temporary page tables."); | ||
415 | rc = -ENOMEM; | ||
416 | goto out; | ||
417 | } | ||
418 | rc = copy_page_tables(tmp_pg_dir, PAGE_OFFSET, 0); | ||
419 | if (rc) | ||
420 | goto out; | ||
421 | |||
422 | /* | ||
423 | * Since we only copied the linear map, we need to find restore_pblist's | ||
424 | * linear map address. | ||
425 | */ | ||
426 | lm_restore_pblist = LMADDR(restore_pblist); | ||
427 | |||
428 | /* | ||
429 | * We need a zero page that is zero before & after resume in order to | ||
430 | * to break before make on the ttbr1 page tables. | ||
431 | */ | ||
432 | zero_page = (void *)get_safe_page(GFP_ATOMIC); | ||
433 | if (!zero_page) { | ||
434 | pr_err("Failed to allocate zero page."); | ||
435 | rc = -ENOMEM; | ||
436 | goto out; | ||
437 | } | ||
438 | |||
439 | /* | ||
397 | * Locate the exit code in the bottom-but-one page, so that *NULL | 440 | * Locate the exit code in the bottom-but-one page, so that *NULL |
398 | * still has disastrous affects. | 441 | * still has disastrous affects. |
399 | */ | 442 | */ |
@@ -419,27 +462,6 @@ int swsusp_arch_resume(void) | |||
419 | __flush_dcache_area(hibernate_exit, exit_size); | 462 | __flush_dcache_area(hibernate_exit, exit_size); |
420 | 463 | ||
421 | /* | 464 | /* |
422 | * Restoring the memory image will overwrite the ttbr1 page tables. | ||
423 | * Create a second copy of just the linear map, and use this when | ||
424 | * restoring. | ||
425 | */ | ||
426 | tmp_pg_dir = (pgd_t *)get_safe_page(GFP_ATOMIC); | ||
427 | if (!tmp_pg_dir) { | ||
428 | pr_err("Failed to allocate memory for temporary page tables."); | ||
429 | rc = -ENOMEM; | ||
430 | goto out; | ||
431 | } | ||
432 | rc = copy_page_tables(tmp_pg_dir, PAGE_OFFSET, 0); | ||
433 | if (rc) | ||
434 | goto out; | ||
435 | |||
436 | /* | ||
437 | * Since we only copied the linear map, we need to find restore_pblist's | ||
438 | * linear map address. | ||
439 | */ | ||
440 | lm_restore_pblist = LMADDR(restore_pblist); | ||
441 | |||
442 | /* | ||
443 | * KASLR will cause the el2 vectors to be in a different location in | 465 | * KASLR will cause the el2 vectors to be in a different location in |
444 | * the resumed kernel. Load hibernate's temporary copy into el2. | 466 | * the resumed kernel. Load hibernate's temporary copy into el2. |
445 | * | 467 | * |
@@ -453,12 +475,6 @@ int swsusp_arch_resume(void) | |||
453 | __hyp_set_vectors(el2_vectors); | 475 | __hyp_set_vectors(el2_vectors); |
454 | } | 476 | } |
455 | 477 | ||
456 | /* | ||
457 | * We need a zero page that is zero before & after resume in order to | ||
458 | * to break before make on the ttbr1 page tables. | ||
459 | */ | ||
460 | zero_page = (void *)get_safe_page(GFP_ATOMIC); | ||
461 | |||
462 | hibernate_exit(virt_to_phys(tmp_pg_dir), resume_hdr.ttbr1_el1, | 478 | hibernate_exit(virt_to_phys(tmp_pg_dir), resume_hdr.ttbr1_el1, |
463 | resume_hdr.reenter_kernel, lm_restore_pblist, | 479 | resume_hdr.reenter_kernel, lm_restore_pblist, |
464 | resume_hdr.__hyp_stub_vectors, virt_to_phys(zero_page)); | 480 | resume_hdr.__hyp_stub_vectors, virt_to_phys(zero_page)); |
diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c index bf9768588288..c6b0f40620d8 100644 --- a/arch/arm64/kernel/probes/kprobes.c +++ b/arch/arm64/kernel/probes/kprobes.c | |||
@@ -41,18 +41,6 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); | |||
41 | static void __kprobes | 41 | static void __kprobes |
42 | post_kprobe_handler(struct kprobe_ctlblk *, struct pt_regs *); | 42 | post_kprobe_handler(struct kprobe_ctlblk *, struct pt_regs *); |
43 | 43 | ||
44 | static inline unsigned long min_stack_size(unsigned long addr) | ||
45 | { | ||
46 | unsigned long size; | ||
47 | |||
48 | if (on_irq_stack(addr, raw_smp_processor_id())) | ||
49 | size = IRQ_STACK_PTR(raw_smp_processor_id()) - addr; | ||
50 | else | ||
51 | size = (unsigned long)current_thread_info() + THREAD_START_SP - addr; | ||
52 | |||
53 | return min(size, FIELD_SIZEOF(struct kprobe_ctlblk, jprobes_stack)); | ||
54 | } | ||
55 | |||
56 | static void __kprobes arch_prepare_ss_slot(struct kprobe *p) | 44 | static void __kprobes arch_prepare_ss_slot(struct kprobe *p) |
57 | { | 45 | { |
58 | /* prepare insn slot */ | 46 | /* prepare insn slot */ |
@@ -489,20 +477,15 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | |||
489 | { | 477 | { |
490 | struct jprobe *jp = container_of(p, struct jprobe, kp); | 478 | struct jprobe *jp = container_of(p, struct jprobe, kp); |
491 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 479 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
492 | long stack_ptr = kernel_stack_pointer(regs); | ||
493 | 480 | ||
494 | kcb->jprobe_saved_regs = *regs; | 481 | kcb->jprobe_saved_regs = *regs; |
495 | /* | 482 | /* |
496 | * As Linus pointed out, gcc assumes that the callee | 483 | * Since we can't be sure where in the stack frame "stacked" |
497 | * owns the argument space and could overwrite it, e.g. | 484 | * pass-by-value arguments are stored we just don't try to |
498 | * tailcall optimization. So, to be absolutely safe | 485 | * duplicate any of the stack. Do not use jprobes on functions that |
499 | * we also save and restore enough stack bytes to cover | 486 | * use more than 64 bytes (after padding each to an 8 byte boundary) |
500 | * the argument area. | 487 | * of arguments, or pass individual arguments larger than 16 bytes. |
501 | */ | 488 | */ |
502 | kasan_disable_current(); | ||
503 | memcpy(kcb->jprobes_stack, (void *)stack_ptr, | ||
504 | min_stack_size(stack_ptr)); | ||
505 | kasan_enable_current(); | ||
506 | 489 | ||
507 | instruction_pointer_set(regs, (unsigned long) jp->entry); | 490 | instruction_pointer_set(regs, (unsigned long) jp->entry); |
508 | preempt_disable(); | 491 | preempt_disable(); |
@@ -554,10 +537,6 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | |||
554 | } | 537 | } |
555 | unpause_graph_tracing(); | 538 | unpause_graph_tracing(); |
556 | *regs = kcb->jprobe_saved_regs; | 539 | *regs = kcb->jprobe_saved_regs; |
557 | kasan_disable_current(); | ||
558 | memcpy((void *)stack_addr, kcb->jprobes_stack, | ||
559 | min_stack_size(stack_addr)); | ||
560 | kasan_enable_current(); | ||
561 | preempt_enable_no_resched(); | 540 | preempt_enable_no_resched(); |
562 | return 1; | 541 | return 1; |
563 | } | 542 | } |
diff --git a/arch/arm64/kernel/sleep.S b/arch/arm64/kernel/sleep.S index 9a3aec97ac09..ccf79d849e0a 100644 --- a/arch/arm64/kernel/sleep.S +++ b/arch/arm64/kernel/sleep.S | |||
@@ -101,12 +101,20 @@ ENTRY(cpu_resume) | |||
101 | bl el2_setup // if in EL2 drop to EL1 cleanly | 101 | bl el2_setup // if in EL2 drop to EL1 cleanly |
102 | /* enable the MMU early - so we can access sleep_save_stash by va */ | 102 | /* enable the MMU early - so we can access sleep_save_stash by va */ |
103 | adr_l lr, __enable_mmu /* __cpu_setup will return here */ | 103 | adr_l lr, __enable_mmu /* __cpu_setup will return here */ |
104 | ldr x27, =_cpu_resume /* __enable_mmu will branch here */ | 104 | adr_l x27, _resume_switched /* __enable_mmu will branch here */ |
105 | adrp x25, idmap_pg_dir | 105 | adrp x25, idmap_pg_dir |
106 | adrp x26, swapper_pg_dir | 106 | adrp x26, swapper_pg_dir |
107 | b __cpu_setup | 107 | b __cpu_setup |
108 | ENDPROC(cpu_resume) | 108 | ENDPROC(cpu_resume) |
109 | 109 | ||
110 | .pushsection ".idmap.text", "ax" | ||
111 | _resume_switched: | ||
112 | ldr x8, =_cpu_resume | ||
113 | br x8 | ||
114 | ENDPROC(_resume_switched) | ||
115 | .ltorg | ||
116 | .popsection | ||
117 | |||
110 | ENTRY(_cpu_resume) | 118 | ENTRY(_cpu_resume) |
111 | mrs x1, mpidr_el1 | 119 | mrs x1, mpidr_el1 |
112 | adrp x8, mpidr_hash | 120 | adrp x8, mpidr_hash |
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index 76a6d9263908..d93d43352504 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c | |||
@@ -661,9 +661,9 @@ void __init smp_init_cpus(void) | |||
661 | acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT, | 661 | acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT, |
662 | acpi_parse_gic_cpu_interface, 0); | 662 | acpi_parse_gic_cpu_interface, 0); |
663 | 663 | ||
664 | if (cpu_count > NR_CPUS) | 664 | if (cpu_count > nr_cpu_ids) |
665 | pr_warn("no. of cores (%d) greater than configured maximum of %d - clipping\n", | 665 | pr_warn("Number of cores (%d) exceeds configured maximum of %d - clipping\n", |
666 | cpu_count, NR_CPUS); | 666 | cpu_count, nr_cpu_ids); |
667 | 667 | ||
668 | if (!bootcpu_valid) { | 668 | if (!bootcpu_valid) { |
669 | pr_err("missing boot CPU MPIDR, not enabling secondaries\n"); | 669 | pr_err("missing boot CPU MPIDR, not enabling secondaries\n"); |
@@ -677,7 +677,7 @@ void __init smp_init_cpus(void) | |||
677 | * with entries in cpu_logical_map while initializing the cpus. | 677 | * with entries in cpu_logical_map while initializing the cpus. |
678 | * If the cpu set-up fails, invalidate the cpu_logical_map entry. | 678 | * If the cpu set-up fails, invalidate the cpu_logical_map entry. |
679 | */ | 679 | */ |
680 | for (i = 1; i < NR_CPUS; i++) { | 680 | for (i = 1; i < nr_cpu_ids; i++) { |
681 | if (cpu_logical_map(i) != INVALID_HWID) { | 681 | if (cpu_logical_map(i) != INVALID_HWID) { |
682 | if (smp_cpu_setup(i)) | 682 | if (smp_cpu_setup(i)) |
683 | cpu_logical_map(i) = INVALID_HWID; | 683 | cpu_logical_map(i) = INVALID_HWID; |
diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c index ae7855f16ec2..5a84b4562603 100644 --- a/arch/arm64/kvm/hyp/switch.c +++ b/arch/arm64/kvm/hyp/switch.c | |||
@@ -256,7 +256,7 @@ static int __hyp_text __guest_run(struct kvm_vcpu *vcpu) | |||
256 | 256 | ||
257 | /* | 257 | /* |
258 | * We must restore the 32-bit state before the sysregs, thanks | 258 | * We must restore the 32-bit state before the sysregs, thanks |
259 | * to Cortex-A57 erratum #852523. | 259 | * to erratum #852523 (Cortex-A57) or #853709 (Cortex-A72). |
260 | */ | 260 | */ |
261 | __sysreg32_restore_state(vcpu); | 261 | __sysreg32_restore_state(vcpu); |
262 | __sysreg_restore_guest_state(guest_ctxt); | 262 | __sysreg_restore_guest_state(guest_ctxt); |
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index b0b225ceca18..e51367d159d0 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c | |||
@@ -823,14 +823,6 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p, | |||
823 | * Architected system registers. | 823 | * Architected system registers. |
824 | * Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2 | 824 | * Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2 |
825 | * | 825 | * |
826 | * We could trap ID_DFR0 and tell the guest we don't support performance | ||
827 | * monitoring. Unfortunately the patch to make the kernel check ID_DFR0 was | ||
828 | * NAKed, so it will read the PMCR anyway. | ||
829 | * | ||
830 | * Therefore we tell the guest we have 0 counters. Unfortunately, we | ||
831 | * must always support PMCCNTR (the cycle counter): we just RAZ/WI for | ||
832 | * all PM registers, which doesn't crash the guest kernel at least. | ||
833 | * | ||
834 | * Debug handling: We do trap most, if not all debug related system | 826 | * Debug handling: We do trap most, if not all debug related system |
835 | * registers. The implementation is good enough to ensure that a guest | 827 | * registers. The implementation is good enough to ensure that a guest |
836 | * can use these with minimal performance degradation. The drawback is | 828 | * can use these with minimal performance degradation. The drawback is |
@@ -1360,7 +1352,7 @@ static const struct sys_reg_desc cp15_regs[] = { | |||
1360 | { Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 }, | 1352 | { Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 }, |
1361 | 1353 | ||
1362 | /* ICC_SRE */ | 1354 | /* ICC_SRE */ |
1363 | { Op1( 0), CRn(12), CRm(12), Op2( 5), trap_raz_wi }, | 1355 | { Op1( 0), CRn(12), CRm(12), Op2( 5), access_gic_sre }, |
1364 | 1356 | ||
1365 | { Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID }, | 1357 | { Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID }, |
1366 | 1358 | ||
diff --git a/arch/arm64/mm/dump.c b/arch/arm64/mm/dump.c index f94b80eb295d..9c3e75df2180 100644 --- a/arch/arm64/mm/dump.c +++ b/arch/arm64/mm/dump.c | |||
@@ -242,7 +242,7 @@ static void note_page(struct pg_state *st, unsigned long addr, unsigned level, | |||
242 | 242 | ||
243 | static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start) | 243 | static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start) |
244 | { | 244 | { |
245 | pte_t *pte = pte_offset_kernel(pmd, 0); | 245 | pte_t *pte = pte_offset_kernel(pmd, 0UL); |
246 | unsigned long addr; | 246 | unsigned long addr; |
247 | unsigned i; | 247 | unsigned i; |
248 | 248 | ||
@@ -254,7 +254,7 @@ static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start) | |||
254 | 254 | ||
255 | static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start) | 255 | static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start) |
256 | { | 256 | { |
257 | pmd_t *pmd = pmd_offset(pud, 0); | 257 | pmd_t *pmd = pmd_offset(pud, 0UL); |
258 | unsigned long addr; | 258 | unsigned long addr; |
259 | unsigned i; | 259 | unsigned i; |
260 | 260 | ||
@@ -271,7 +271,7 @@ static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start) | |||
271 | 271 | ||
272 | static void walk_pud(struct pg_state *st, pgd_t *pgd, unsigned long start) | 272 | static void walk_pud(struct pg_state *st, pgd_t *pgd, unsigned long start) |
273 | { | 273 | { |
274 | pud_t *pud = pud_offset(pgd, 0); | 274 | pud_t *pud = pud_offset(pgd, 0UL); |
275 | unsigned long addr; | 275 | unsigned long addr; |
276 | unsigned i; | 276 | unsigned i; |
277 | 277 | ||
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index c8beaa0da7df..05d2bd776c69 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c | |||
@@ -153,6 +153,11 @@ int ptep_set_access_flags(struct vm_area_struct *vma, | |||
153 | } | 153 | } |
154 | #endif | 154 | #endif |
155 | 155 | ||
156 | static bool is_el1_instruction_abort(unsigned int esr) | ||
157 | { | ||
158 | return ESR_ELx_EC(esr) == ESR_ELx_EC_IABT_CUR; | ||
159 | } | ||
160 | |||
156 | /* | 161 | /* |
157 | * The kernel tried to access some page that wasn't present. | 162 | * The kernel tried to access some page that wasn't present. |
158 | */ | 163 | */ |
@@ -161,8 +166,9 @@ static void __do_kernel_fault(struct mm_struct *mm, unsigned long addr, | |||
161 | { | 166 | { |
162 | /* | 167 | /* |
163 | * Are we prepared to handle this kernel fault? | 168 | * Are we prepared to handle this kernel fault? |
169 | * We are almost certainly not prepared to handle instruction faults. | ||
164 | */ | 170 | */ |
165 | if (fixup_exception(regs)) | 171 | if (!is_el1_instruction_abort(esr) && fixup_exception(regs)) |
166 | return; | 172 | return; |
167 | 173 | ||
168 | /* | 174 | /* |
@@ -267,7 +273,8 @@ static inline bool is_permission_fault(unsigned int esr) | |||
267 | unsigned int ec = ESR_ELx_EC(esr); | 273 | unsigned int ec = ESR_ELx_EC(esr); |
268 | unsigned int fsc_type = esr & ESR_ELx_FSC_TYPE; | 274 | unsigned int fsc_type = esr & ESR_ELx_FSC_TYPE; |
269 | 275 | ||
270 | return (ec == ESR_ELx_EC_DABT_CUR && fsc_type == ESR_ELx_FSC_PERM); | 276 | return (ec == ESR_ELx_EC_DABT_CUR && fsc_type == ESR_ELx_FSC_PERM) || |
277 | (ec == ESR_ELx_EC_IABT_CUR && fsc_type == ESR_ELx_FSC_PERM); | ||
271 | } | 278 | } |
272 | 279 | ||
273 | static bool is_el0_instruction_abort(unsigned int esr) | 280 | static bool is_el0_instruction_abort(unsigned int esr) |
@@ -312,6 +319,9 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, | |||
312 | if (regs->orig_addr_limit == KERNEL_DS) | 319 | if (regs->orig_addr_limit == KERNEL_DS) |
313 | die("Accessing user space memory with fs=KERNEL_DS", regs, esr); | 320 | die("Accessing user space memory with fs=KERNEL_DS", regs, esr); |
314 | 321 | ||
322 | if (is_el1_instruction_abort(esr)) | ||
323 | die("Attempting to execute userspace memory", regs, esr); | ||
324 | |||
315 | if (!search_exception_tables(regs->pc)) | 325 | if (!search_exception_tables(regs->pc)) |
316 | die("Accessing user space memory outside uaccess.h routines", regs, esr); | 326 | die("Accessing user space memory outside uaccess.h routines", regs, esr); |
317 | } | 327 | } |
diff --git a/arch/arm64/mm/numa.c b/arch/arm64/mm/numa.c index c7fe3ec70774..5bb15eab6f00 100644 --- a/arch/arm64/mm/numa.c +++ b/arch/arm64/mm/numa.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/of.h> | 24 | #include <linux/of.h> |
25 | 25 | ||
26 | #include <asm/acpi.h> | ||
27 | |||
26 | struct pglist_data *node_data[MAX_NUMNODES] __read_mostly; | 28 | struct pglist_data *node_data[MAX_NUMNODES] __read_mostly; |
27 | EXPORT_SYMBOL(node_data); | 29 | EXPORT_SYMBOL(node_data); |
28 | nodemask_t numa_nodes_parsed __initdata; | 30 | nodemask_t numa_nodes_parsed __initdata; |
diff --git a/arch/h8300/include/asm/io.h b/arch/h8300/include/asm/io.h index 2e221c5f0203..f86918aed9e1 100644 --- a/arch/h8300/include/asm/io.h +++ b/arch/h8300/include/asm/io.h | |||
@@ -3,6 +3,8 @@ | |||
3 | 3 | ||
4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
5 | 5 | ||
6 | #include <linux/types.h> | ||
7 | |||
6 | /* H8/300 internal I/O functions */ | 8 | /* H8/300 internal I/O functions */ |
7 | 9 | ||
8 | #define __raw_readb __raw_readb | 10 | #define __raw_readb __raw_readb |
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c index 2dcee3a88867..9202f82dfce6 100644 --- a/arch/m68k/kernel/signal.c +++ b/arch/m68k/kernel/signal.c | |||
@@ -213,7 +213,6 @@ static inline int frame_extra_sizes(int f) | |||
213 | 213 | ||
214 | static inline void adjustformat(struct pt_regs *regs) | 214 | static inline void adjustformat(struct pt_regs *regs) |
215 | { | 215 | { |
216 | ((struct switch_stack *)regs - 1)->a5 = current->mm->start_data; | ||
217 | /* | 216 | /* |
218 | * set format byte to make stack appear modulo 4, which it will | 217 | * set format byte to make stack appear modulo 4, which it will |
219 | * be when doing the rte | 218 | * be when doing the rte |
diff --git a/arch/metag/mm/init.c b/arch/metag/mm/init.c index 11fa51c89617..c0ec116b3993 100644 --- a/arch/metag/mm/init.c +++ b/arch/metag/mm/init.c | |||
@@ -390,7 +390,6 @@ void __init mem_init(void) | |||
390 | 390 | ||
391 | free_all_bootmem(); | 391 | free_all_bootmem(); |
392 | mem_init_print_info(NULL); | 392 | mem_init_print_info(NULL); |
393 | show_mem(0); | ||
394 | } | 393 | } |
395 | 394 | ||
396 | void free_initmem(void) | 395 | void free_initmem(void) |
diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index ea0cd9773914..5f987598054f 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h | |||
@@ -164,7 +164,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
164 | */ | 164 | */ |
165 | static inline unsigned long ___pa(unsigned long x) | 165 | static inline unsigned long ___pa(unsigned long x) |
166 | { | 166 | { |
167 | if (config_enabled(CONFIG_64BIT)) { | 167 | if (IS_ENABLED(CONFIG_64BIT)) { |
168 | /* | 168 | /* |
169 | * For MIPS64 the virtual address may either be in one of | 169 | * For MIPS64 the virtual address may either be in one of |
170 | * the compatibility segements ckseg0 or ckseg1, or it may | 170 | * the compatibility segements ckseg0 or ckseg1, or it may |
@@ -173,7 +173,7 @@ static inline unsigned long ___pa(unsigned long x) | |||
173 | return x < CKSEG0 ? XPHYSADDR(x) : CPHYSADDR(x); | 173 | return x < CKSEG0 ? XPHYSADDR(x) : CPHYSADDR(x); |
174 | } | 174 | } |
175 | 175 | ||
176 | if (!config_enabled(CONFIG_EVA)) { | 176 | if (!IS_ENABLED(CONFIG_EVA)) { |
177 | /* | 177 | /* |
178 | * We're using the standard MIPS32 legacy memory map, ie. | 178 | * We're using the standard MIPS32 legacy memory map, ie. |
179 | * the address x is going to be in kseg0 or kseg1. We can | 179 | * the address x is going to be in kseg0 or kseg1. We can |
diff --git a/arch/mips/kvm/emulate.c b/arch/mips/kvm/emulate.c index 6eb52b9c9818..e788515f766b 100644 --- a/arch/mips/kvm/emulate.c +++ b/arch/mips/kvm/emulate.c | |||
@@ -1642,8 +1642,14 @@ enum emulation_result kvm_mips_emulate_cache(union mips_instruction inst, | |||
1642 | 1642 | ||
1643 | preempt_disable(); | 1643 | preempt_disable(); |
1644 | if (KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG0) { | 1644 | if (KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG0) { |
1645 | if (kvm_mips_host_tlb_lookup(vcpu, va) < 0) | 1645 | if (kvm_mips_host_tlb_lookup(vcpu, va) < 0 && |
1646 | kvm_mips_handle_kseg0_tlb_fault(va, vcpu); | 1646 | kvm_mips_handle_kseg0_tlb_fault(va, vcpu)) { |
1647 | kvm_err("%s: handling mapped kseg0 tlb fault for %lx, vcpu: %p, ASID: %#lx\n", | ||
1648 | __func__, va, vcpu, read_c0_entryhi()); | ||
1649 | er = EMULATE_FAIL; | ||
1650 | preempt_enable(); | ||
1651 | goto done; | ||
1652 | } | ||
1647 | } else if ((KVM_GUEST_KSEGX(va) < KVM_GUEST_KSEG0) || | 1653 | } else if ((KVM_GUEST_KSEGX(va) < KVM_GUEST_KSEG0) || |
1648 | KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG23) { | 1654 | KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG23) { |
1649 | int index; | 1655 | int index; |
@@ -1680,12 +1686,18 @@ enum emulation_result kvm_mips_emulate_cache(union mips_instruction inst, | |||
1680 | run, vcpu); | 1686 | run, vcpu); |
1681 | preempt_enable(); | 1687 | preempt_enable(); |
1682 | goto dont_update_pc; | 1688 | goto dont_update_pc; |
1683 | } else { | 1689 | } |
1684 | /* | 1690 | /* |
1685 | * We fault an entry from the guest tlb to the | 1691 | * We fault an entry from the guest tlb to the |
1686 | * shadow host TLB | 1692 | * shadow host TLB |
1687 | */ | 1693 | */ |
1688 | kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb); | 1694 | if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb)) { |
1695 | kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n", | ||
1696 | __func__, va, index, vcpu, | ||
1697 | read_c0_entryhi()); | ||
1698 | er = EMULATE_FAIL; | ||
1699 | preempt_enable(); | ||
1700 | goto done; | ||
1689 | } | 1701 | } |
1690 | } | 1702 | } |
1691 | } else { | 1703 | } else { |
@@ -2659,7 +2671,12 @@ enum emulation_result kvm_mips_handle_tlbmiss(u32 cause, | |||
2659 | * OK we have a Guest TLB entry, now inject it into the | 2671 | * OK we have a Guest TLB entry, now inject it into the |
2660 | * shadow host TLB | 2672 | * shadow host TLB |
2661 | */ | 2673 | */ |
2662 | kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb); | 2674 | if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb)) { |
2675 | kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n", | ||
2676 | __func__, va, index, vcpu, | ||
2677 | read_c0_entryhi()); | ||
2678 | er = EMULATE_FAIL; | ||
2679 | } | ||
2663 | } | 2680 | } |
2664 | } | 2681 | } |
2665 | 2682 | ||
diff --git a/arch/mips/kvm/mmu.c b/arch/mips/kvm/mmu.c index 57319ee57c4f..121008c0fcc9 100644 --- a/arch/mips/kvm/mmu.c +++ b/arch/mips/kvm/mmu.c | |||
@@ -40,7 +40,7 @@ static int kvm_mips_map_page(struct kvm *kvm, gfn_t gfn) | |||
40 | srcu_idx = srcu_read_lock(&kvm->srcu); | 40 | srcu_idx = srcu_read_lock(&kvm->srcu); |
41 | pfn = gfn_to_pfn(kvm, gfn); | 41 | pfn = gfn_to_pfn(kvm, gfn); |
42 | 42 | ||
43 | if (is_error_pfn(pfn)) { | 43 | if (is_error_noslot_pfn(pfn)) { |
44 | kvm_err("Couldn't get pfn for gfn %#llx!\n", gfn); | 44 | kvm_err("Couldn't get pfn for gfn %#llx!\n", gfn); |
45 | err = -EFAULT; | 45 | err = -EFAULT; |
46 | goto out; | 46 | goto out; |
@@ -99,7 +99,7 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr, | |||
99 | } | 99 | } |
100 | 100 | ||
101 | gfn = (KVM_GUEST_CPHYSADDR(badvaddr) >> PAGE_SHIFT); | 101 | gfn = (KVM_GUEST_CPHYSADDR(badvaddr) >> PAGE_SHIFT); |
102 | if (gfn >= kvm->arch.guest_pmap_npages) { | 102 | if ((gfn | 1) >= kvm->arch.guest_pmap_npages) { |
103 | kvm_err("%s: Invalid gfn: %#llx, BadVaddr: %#lx\n", __func__, | 103 | kvm_err("%s: Invalid gfn: %#llx, BadVaddr: %#lx\n", __func__, |
104 | gfn, badvaddr); | 104 | gfn, badvaddr); |
105 | kvm_mips_dump_host_tlbs(); | 105 | kvm_mips_dump_host_tlbs(); |
@@ -138,35 +138,49 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu, | |||
138 | unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0; | 138 | unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0; |
139 | struct kvm *kvm = vcpu->kvm; | 139 | struct kvm *kvm = vcpu->kvm; |
140 | kvm_pfn_t pfn0, pfn1; | 140 | kvm_pfn_t pfn0, pfn1; |
141 | gfn_t gfn0, gfn1; | ||
142 | long tlb_lo[2]; | ||
141 | int ret; | 143 | int ret; |
142 | 144 | ||
143 | if ((tlb->tlb_hi & VPN2_MASK) == 0) { | 145 | tlb_lo[0] = tlb->tlb_lo[0]; |
144 | pfn0 = 0; | 146 | tlb_lo[1] = tlb->tlb_lo[1]; |
145 | pfn1 = 0; | 147 | |
146 | } else { | 148 | /* |
147 | if (kvm_mips_map_page(kvm, mips3_tlbpfn_to_paddr(tlb->tlb_lo[0]) | 149 | * The commpage address must not be mapped to anything else if the guest |
148 | >> PAGE_SHIFT) < 0) | 150 | * TLB contains entries nearby, or commpage accesses will break. |
149 | return -1; | 151 | */ |
150 | 152 | if (!((tlb->tlb_hi ^ KVM_GUEST_COMMPAGE_ADDR) & | |
151 | if (kvm_mips_map_page(kvm, mips3_tlbpfn_to_paddr(tlb->tlb_lo[1]) | 153 | VPN2_MASK & (PAGE_MASK << 1))) |
152 | >> PAGE_SHIFT) < 0) | 154 | tlb_lo[(KVM_GUEST_COMMPAGE_ADDR >> PAGE_SHIFT) & 1] = 0; |
153 | return -1; | 155 | |
154 | 156 | gfn0 = mips3_tlbpfn_to_paddr(tlb_lo[0]) >> PAGE_SHIFT; | |
155 | pfn0 = kvm->arch.guest_pmap[ | 157 | gfn1 = mips3_tlbpfn_to_paddr(tlb_lo[1]) >> PAGE_SHIFT; |
156 | mips3_tlbpfn_to_paddr(tlb->tlb_lo[0]) >> PAGE_SHIFT]; | 158 | if (gfn0 >= kvm->arch.guest_pmap_npages || |
157 | pfn1 = kvm->arch.guest_pmap[ | 159 | gfn1 >= kvm->arch.guest_pmap_npages) { |
158 | mips3_tlbpfn_to_paddr(tlb->tlb_lo[1]) >> PAGE_SHIFT]; | 160 | kvm_err("%s: Invalid gfn: [%#llx, %#llx], EHi: %#lx\n", |
161 | __func__, gfn0, gfn1, tlb->tlb_hi); | ||
162 | kvm_mips_dump_guest_tlbs(vcpu); | ||
163 | return -1; | ||
159 | } | 164 | } |
160 | 165 | ||
166 | if (kvm_mips_map_page(kvm, gfn0) < 0) | ||
167 | return -1; | ||
168 | |||
169 | if (kvm_mips_map_page(kvm, gfn1) < 0) | ||
170 | return -1; | ||
171 | |||
172 | pfn0 = kvm->arch.guest_pmap[gfn0]; | ||
173 | pfn1 = kvm->arch.guest_pmap[gfn1]; | ||
174 | |||
161 | /* Get attributes from the Guest TLB */ | 175 | /* Get attributes from the Guest TLB */ |
162 | entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | | 176 | entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | |
163 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | | 177 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | |
164 | (tlb->tlb_lo[0] & ENTRYLO_D) | | 178 | (tlb_lo[0] & ENTRYLO_D) | |
165 | (tlb->tlb_lo[0] & ENTRYLO_V); | 179 | (tlb_lo[0] & ENTRYLO_V); |
166 | entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | | 180 | entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | |
167 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | | 181 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | |
168 | (tlb->tlb_lo[1] & ENTRYLO_D) | | 182 | (tlb_lo[1] & ENTRYLO_D) | |
169 | (tlb->tlb_lo[1] & ENTRYLO_V); | 183 | (tlb_lo[1] & ENTRYLO_V); |
170 | 184 | ||
171 | kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc, | 185 | kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc, |
172 | tlb->tlb_lo[0], tlb->tlb_lo[1]); | 186 | tlb->tlb_lo[0], tlb->tlb_lo[1]); |
@@ -354,9 +368,15 @@ u32 kvm_get_inst(u32 *opc, struct kvm_vcpu *vcpu) | |||
354 | local_irq_restore(flags); | 368 | local_irq_restore(flags); |
355 | return KVM_INVALID_INST; | 369 | return KVM_INVALID_INST; |
356 | } | 370 | } |
357 | kvm_mips_handle_mapped_seg_tlb_fault(vcpu, | 371 | if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, |
358 | &vcpu->arch. | 372 | &vcpu->arch.guest_tlb[index])) { |
359 | guest_tlb[index]); | 373 | kvm_err("%s: handling mapped seg tlb fault failed for %p, index: %u, vcpu: %p, ASID: %#lx\n", |
374 | __func__, opc, index, vcpu, | ||
375 | read_c0_entryhi()); | ||
376 | kvm_mips_dump_guest_tlbs(vcpu); | ||
377 | local_irq_restore(flags); | ||
378 | return KVM_INVALID_INST; | ||
379 | } | ||
360 | inst = *(opc); | 380 | inst = *(opc); |
361 | } | 381 | } |
362 | local_irq_restore(flags); | 382 | local_irq_restore(flags); |
diff --git a/arch/parisc/include/uapi/asm/errno.h b/arch/parisc/include/uapi/asm/errno.h index c0ae62520d15..274d5bc6ecce 100644 --- a/arch/parisc/include/uapi/asm/errno.h +++ b/arch/parisc/include/uapi/asm/errno.h | |||
@@ -97,10 +97,10 @@ | |||
97 | #define ENOTCONN 235 /* Transport endpoint is not connected */ | 97 | #define ENOTCONN 235 /* Transport endpoint is not connected */ |
98 | #define ESHUTDOWN 236 /* Cannot send after transport endpoint shutdown */ | 98 | #define ESHUTDOWN 236 /* Cannot send after transport endpoint shutdown */ |
99 | #define ETOOMANYREFS 237 /* Too many references: cannot splice */ | 99 | #define ETOOMANYREFS 237 /* Too many references: cannot splice */ |
100 | #define EREFUSED ECONNREFUSED /* for HP's NFS apparently */ | ||
101 | #define ETIMEDOUT 238 /* Connection timed out */ | 100 | #define ETIMEDOUT 238 /* Connection timed out */ |
102 | #define ECONNREFUSED 239 /* Connection refused */ | 101 | #define ECONNREFUSED 239 /* Connection refused */ |
103 | #define EREMOTERELEASE 240 /* Remote peer released connection */ | 102 | #define EREFUSED ECONNREFUSED /* for HP's NFS apparently */ |
103 | #define EREMOTERELEASE 240 /* Remote peer released connection */ | ||
104 | #define EHOSTDOWN 241 /* Host is down */ | 104 | #define EHOSTDOWN 241 /* Host is down */ |
105 | #define EHOSTUNREACH 242 /* No route to host */ | 105 | #define EHOSTUNREACH 242 /* No route to host */ |
106 | 106 | ||
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index 5adc339eb7c8..0c2a94a0f751 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c | |||
@@ -51,8 +51,6 @@ EXPORT_SYMBOL(_parisc_requires_coherency); | |||
51 | 51 | ||
52 | DEFINE_PER_CPU(struct cpuinfo_parisc, cpu_data); | 52 | DEFINE_PER_CPU(struct cpuinfo_parisc, cpu_data); |
53 | 53 | ||
54 | extern int update_cr16_clocksource(void); /* from time.c */ | ||
55 | |||
56 | /* | 54 | /* |
57 | ** PARISC CPU driver - claim "device" and initialize CPU data structures. | 55 | ** PARISC CPU driver - claim "device" and initialize CPU data structures. |
58 | ** | 56 | ** |
@@ -228,12 +226,6 @@ static int processor_probe(struct parisc_device *dev) | |||
228 | } | 226 | } |
229 | #endif | 227 | #endif |
230 | 228 | ||
231 | /* If we've registered more than one cpu, | ||
232 | * we'll use the jiffies clocksource since cr16 | ||
233 | * is not synchronized between CPUs. | ||
234 | */ | ||
235 | update_cr16_clocksource(); | ||
236 | |||
237 | return 0; | 229 | return 0; |
238 | } | 230 | } |
239 | 231 | ||
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 505cf1ac5af2..4b0b963d52a7 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
@@ -221,18 +221,6 @@ static struct clocksource clocksource_cr16 = { | |||
221 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 221 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
222 | }; | 222 | }; |
223 | 223 | ||
224 | int update_cr16_clocksource(void) | ||
225 | { | ||
226 | /* since the cr16 cycle counters are not synchronized across CPUs, | ||
227 | we'll check if we should switch to a safe clocksource: */ | ||
228 | if (clocksource_cr16.rating != 0 && num_online_cpus() > 1) { | ||
229 | clocksource_change_rating(&clocksource_cr16, 0); | ||
230 | return 1; | ||
231 | } | ||
232 | |||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | void __init start_cpu_itimer(void) | 224 | void __init start_cpu_itimer(void) |
237 | { | 225 | { |
238 | unsigned int cpu = smp_processor_id(); | 226 | unsigned int cpu = smp_processor_id(); |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index ca254546cd05..1934707bf321 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -66,29 +66,28 @@ endif | |||
66 | UTS_MACHINE := $(OLDARCH) | 66 | UTS_MACHINE := $(OLDARCH) |
67 | 67 | ||
68 | ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) | 68 | ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) |
69 | override CC += -mlittle-endian | ||
70 | ifneq ($(cc-name),clang) | ||
71 | override CC += -mno-strict-align | ||
72 | endif | ||
73 | override AS += -mlittle-endian | ||
74 | override LD += -EL | 69 | override LD += -EL |
75 | override CROSS32CC += -mlittle-endian | ||
76 | override CROSS32AS += -mlittle-endian | 70 | override CROSS32AS += -mlittle-endian |
77 | LDEMULATION := lppc | 71 | LDEMULATION := lppc |
78 | GNUTARGET := powerpcle | 72 | GNUTARGET := powerpcle |
79 | MULTIPLEWORD := -mno-multiple | 73 | MULTIPLEWORD := -mno-multiple |
80 | KBUILD_CFLAGS_MODULE += $(call cc-option,-mno-save-toc-indirect) | 74 | KBUILD_CFLAGS_MODULE += $(call cc-option,-mno-save-toc-indirect) |
81 | else | 75 | else |
82 | ifeq ($(call cc-option-yn,-mbig-endian),y) | ||
83 | override CC += -mbig-endian | ||
84 | override AS += -mbig-endian | ||
85 | endif | ||
86 | override LD += -EB | 76 | override LD += -EB |
87 | LDEMULATION := ppc | 77 | LDEMULATION := ppc |
88 | GNUTARGET := powerpc | 78 | GNUTARGET := powerpc |
89 | MULTIPLEWORD := -mmultiple | 79 | MULTIPLEWORD := -mmultiple |
90 | endif | 80 | endif |
91 | 81 | ||
82 | cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian) | ||
83 | cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian | ||
84 | ifneq ($(cc-name),clang) | ||
85 | cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mno-strict-align | ||
86 | endif | ||
87 | |||
88 | aflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian) | ||
89 | aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian | ||
90 | |||
92 | ifeq ($(HAS_BIARCH),y) | 91 | ifeq ($(HAS_BIARCH),y) |
93 | override AS += -a$(CONFIG_WORD_SIZE) | 92 | override AS += -a$(CONFIG_WORD_SIZE) |
94 | override LD += -m elf$(CONFIG_WORD_SIZE)$(LDEMULATION) | 93 | override LD += -m elf$(CONFIG_WORD_SIZE)$(LDEMULATION) |
@@ -232,6 +231,9 @@ cpu-as-$(CONFIG_E200) += -Wa,-me200 | |||
232 | KBUILD_AFLAGS += $(cpu-as-y) | 231 | KBUILD_AFLAGS += $(cpu-as-y) |
233 | KBUILD_CFLAGS += $(cpu-as-y) | 232 | KBUILD_CFLAGS += $(cpu-as-y) |
234 | 233 | ||
234 | KBUILD_AFLAGS += $(aflags-y) | ||
235 | KBUILD_CFLAGS += $(cflags-y) | ||
236 | |||
235 | head-y := arch/powerpc/kernel/head_$(CONFIG_WORD_SIZE).o | 237 | head-y := arch/powerpc/kernel/head_$(CONFIG_WORD_SIZE).o |
236 | head-$(CONFIG_8xx) := arch/powerpc/kernel/head_8xx.o | 238 | head-$(CONFIG_8xx) := arch/powerpc/kernel/head_8xx.o |
237 | head-$(CONFIG_40x) := arch/powerpc/kernel/head_40x.o | 239 | head-$(CONFIG_40x) := arch/powerpc/kernel/head_40x.o |
diff --git a/arch/powerpc/crypto/crc32c-vpmsum_glue.c b/arch/powerpc/crypto/crc32c-vpmsum_glue.c index bfe3d37a24ef..9fa046d56eba 100644 --- a/arch/powerpc/crypto/crc32c-vpmsum_glue.c +++ b/arch/powerpc/crypto/crc32c-vpmsum_glue.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/module.h> | 4 | #include <linux/module.h> |
5 | #include <linux/string.h> | 5 | #include <linux/string.h> |
6 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
7 | #include <linux/cpufeature.h> | ||
7 | #include <asm/switch_to.h> | 8 | #include <asm/switch_to.h> |
8 | 9 | ||
9 | #define CHKSUM_BLOCK_SIZE 1 | 10 | #define CHKSUM_BLOCK_SIZE 1 |
@@ -157,7 +158,7 @@ static void __exit crc32c_vpmsum_mod_fini(void) | |||
157 | crypto_unregister_shash(&alg); | 158 | crypto_unregister_shash(&alg); |
158 | } | 159 | } |
159 | 160 | ||
160 | module_init(crc32c_vpmsum_mod_init); | 161 | module_cpu_feature_match(PPC_MODULE_FEATURE_VEC_CRYPTO, crc32c_vpmsum_mod_init); |
161 | module_exit(crc32c_vpmsum_mod_fini); | 162 | module_exit(crc32c_vpmsum_mod_fini); |
162 | 163 | ||
163 | MODULE_AUTHOR("Anton Blanchard <anton@samba.org>"); | 164 | MODULE_AUTHOR("Anton Blanchard <anton@samba.org>"); |
diff --git a/arch/powerpc/include/asm/cpuidle.h b/arch/powerpc/include/asm/cpuidle.h index 3d7fc06532a1..01b8a13f0224 100644 --- a/arch/powerpc/include/asm/cpuidle.h +++ b/arch/powerpc/include/asm/cpuidle.h | |||
@@ -19,4 +19,17 @@ extern u64 pnv_first_deep_stop_state; | |||
19 | 19 | ||
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | /* Idle state entry routines */ | ||
23 | #ifdef CONFIG_PPC_P7_NAP | ||
24 | #define IDLE_STATE_ENTER_SEQ(IDLE_INST) \ | ||
25 | /* Magic NAP/SLEEP/WINKLE mode enter sequence */ \ | ||
26 | std r0,0(r1); \ | ||
27 | ptesync; \ | ||
28 | ld r0,0(r1); \ | ||
29 | 1: cmp cr0,r0,r0; \ | ||
30 | bne 1b; \ | ||
31 | IDLE_INST; \ | ||
32 | b . | ||
33 | #endif /* CONFIG_PPC_P7_NAP */ | ||
34 | |||
22 | #endif | 35 | #endif |
diff --git a/arch/powerpc/include/asm/feature-fixups.h b/arch/powerpc/include/asm/feature-fixups.h index 57fec8ac7b92..ddf54f5bbdd1 100644 --- a/arch/powerpc/include/asm/feature-fixups.h +++ b/arch/powerpc/include/asm/feature-fixups.h | |||
@@ -186,6 +186,7 @@ label##3: \ | |||
186 | 186 | ||
187 | #ifndef __ASSEMBLY__ | 187 | #ifndef __ASSEMBLY__ |
188 | void apply_feature_fixups(void); | 188 | void apply_feature_fixups(void); |
189 | void setup_feature_keys(void); | ||
189 | #endif | 190 | #endif |
190 | 191 | ||
191 | #endif /* __ASM_POWERPC_FEATURE_FIXUPS_H */ | 192 | #endif /* __ASM_POWERPC_FEATURE_FIXUPS_H */ |
diff --git a/arch/powerpc/include/asm/switch_to.h b/arch/powerpc/include/asm/switch_to.h index 0a74ebe934e1..17c8380673a6 100644 --- a/arch/powerpc/include/asm/switch_to.h +++ b/arch/powerpc/include/asm/switch_to.h | |||
@@ -75,14 +75,6 @@ static inline void disable_kernel_spe(void) | |||
75 | static inline void __giveup_spe(struct task_struct *t) { } | 75 | static inline void __giveup_spe(struct task_struct *t) { } |
76 | #endif | 76 | #endif |
77 | 77 | ||
78 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
79 | extern void flush_tmregs_to_thread(struct task_struct *); | ||
80 | #else | ||
81 | static inline void flush_tmregs_to_thread(struct task_struct *t) | ||
82 | { | ||
83 | } | ||
84 | #endif | ||
85 | |||
86 | static inline void clear_task_ebb(struct task_struct *t) | 78 | static inline void clear_task_ebb(struct task_struct *t) |
87 | { | 79 | { |
88 | #ifdef CONFIG_PPC_BOOK3S_64 | 80 | #ifdef CONFIG_PPC_BOOK3S_64 |
diff --git a/arch/powerpc/include/asm/xics.h b/arch/powerpc/include/asm/xics.h index f5f729c11578..f0b238516e9b 100644 --- a/arch/powerpc/include/asm/xics.h +++ b/arch/powerpc/include/asm/xics.h | |||
@@ -159,6 +159,8 @@ extern void xics_teardown_cpu(void); | |||
159 | extern void xics_kexec_teardown_cpu(int secondary); | 159 | extern void xics_kexec_teardown_cpu(int secondary); |
160 | extern void xics_migrate_irqs_away(void); | 160 | extern void xics_migrate_irqs_away(void); |
161 | extern void icp_native_eoi(struct irq_data *d); | 161 | extern void icp_native_eoi(struct irq_data *d); |
162 | extern int xics_set_irq_type(struct irq_data *d, unsigned int flow_type); | ||
163 | extern int xics_retrigger(struct irq_data *data); | ||
162 | #ifdef CONFIG_SMP | 164 | #ifdef CONFIG_SMP |
163 | extern int xics_get_irq_server(unsigned int virq, const struct cpumask *cpumask, | 165 | extern int xics_get_irq_server(unsigned int virq, const struct cpumask *cpumask, |
164 | unsigned int strict_check); | 166 | unsigned int strict_check); |
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index c9bc78e9c610..7429556eb8df 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c | |||
@@ -168,10 +168,10 @@ static size_t eeh_dump_dev_log(struct eeh_dev *edev, char *buf, size_t len) | |||
168 | int n = 0, l = 0; | 168 | int n = 0, l = 0; |
169 | char buffer[128]; | 169 | char buffer[128]; |
170 | 170 | ||
171 | n += scnprintf(buf+n, len-n, "%04x:%02x:%02x:%01x\n", | 171 | n += scnprintf(buf+n, len-n, "%04x:%02x:%02x.%01x\n", |
172 | edev->phb->global_number, pdn->busno, | 172 | edev->phb->global_number, pdn->busno, |
173 | PCI_SLOT(pdn->devfn), PCI_FUNC(pdn->devfn)); | 173 | PCI_SLOT(pdn->devfn), PCI_FUNC(pdn->devfn)); |
174 | pr_warn("EEH: of node=%04x:%02x:%02x:%01x\n", | 174 | pr_warn("EEH: of node=%04x:%02x:%02x.%01x\n", |
175 | edev->phb->global_number, pdn->busno, | 175 | edev->phb->global_number, pdn->busno, |
176 | PCI_SLOT(pdn->devfn), PCI_FUNC(pdn->devfn)); | 176 | PCI_SLOT(pdn->devfn), PCI_FUNC(pdn->devfn)); |
177 | 177 | ||
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 41091fdf9bd8..df6d45eb4115 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -144,29 +144,14 @@ machine_check_pSeries_1: | |||
144 | * vector | 144 | * vector |
145 | */ | 145 | */ |
146 | SET_SCRATCH0(r13) /* save r13 */ | 146 | SET_SCRATCH0(r13) /* save r13 */ |
147 | #ifdef CONFIG_PPC_P7_NAP | 147 | /* |
148 | BEGIN_FTR_SECTION | 148 | * Running native on arch 2.06 or later, we may wakeup from winkle |
149 | /* Running native on arch 2.06 or later, check if we are | 149 | * inside machine check. If yes, then last bit of HSPGR0 would be set |
150 | * waking up from nap. We only handle no state loss and | 150 | * to 1. Hence clear it unconditionally. |
151 | * supervisor state loss. We do -not- handle hypervisor | ||
152 | * state loss at this time. | ||
153 | */ | 151 | */ |
154 | mfspr r13,SPRN_SRR1 | 152 | GET_PACA(r13) |
155 | rlwinm. r13,r13,47-31,30,31 | 153 | clrrdi r13,r13,1 |
156 | OPT_GET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR) | 154 | SET_PACA(r13) |
157 | beq 9f | ||
158 | |||
159 | mfspr r13,SPRN_SRR1 | ||
160 | rlwinm. r13,r13,47-31,30,31 | ||
161 | /* waking up from powersave (nap) state */ | ||
162 | cmpwi cr1,r13,2 | ||
163 | /* Total loss of HV state is fatal. let's just stay stuck here */ | ||
164 | OPT_GET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR) | ||
165 | bgt cr1,. | ||
166 | 9: | ||
167 | OPT_SET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR) | ||
168 | END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206) | ||
169 | #endif /* CONFIG_PPC_P7_NAP */ | ||
170 | EXCEPTION_PROLOG_0(PACA_EXMC) | 155 | EXCEPTION_PROLOG_0(PACA_EXMC) |
171 | BEGIN_FTR_SECTION | 156 | BEGIN_FTR_SECTION |
172 | b machine_check_powernv_early | 157 | b machine_check_powernv_early |
@@ -1273,25 +1258,51 @@ machine_check_handle_early: | |||
1273 | * Check if thread was in power saving mode. We come here when any | 1258 | * Check if thread was in power saving mode. We come here when any |
1274 | * of the following is true: | 1259 | * of the following is true: |
1275 | * a. thread wasn't in power saving mode | 1260 | * a. thread wasn't in power saving mode |
1276 | * b. thread was in power saving mode with no state loss or | 1261 | * b. thread was in power saving mode with no state loss, |
1277 | * supervisor state loss | 1262 | * supervisor state loss or hypervisor state loss. |
1278 | * | 1263 | * |
1279 | * Go back to nap again if (b) is true. | 1264 | * Go back to nap/sleep/winkle mode again if (b) is true. |
1280 | */ | 1265 | */ |
1281 | rlwinm. r11,r12,47-31,30,31 /* Was it in power saving mode? */ | 1266 | rlwinm. r11,r12,47-31,30,31 /* Was it in power saving mode? */ |
1282 | beq 4f /* No, it wasn;t */ | 1267 | beq 4f /* No, it wasn;t */ |
1283 | /* Thread was in power saving mode. Go back to nap again. */ | 1268 | /* Thread was in power saving mode. Go back to nap again. */ |
1284 | cmpwi r11,2 | 1269 | cmpwi r11,2 |
1285 | bne 3f | 1270 | blt 3f |
1286 | /* Supervisor state loss */ | 1271 | /* Supervisor/Hypervisor state loss */ |
1287 | li r0,1 | 1272 | li r0,1 |
1288 | stb r0,PACA_NAPSTATELOST(r13) | 1273 | stb r0,PACA_NAPSTATELOST(r13) |
1289 | 3: bl machine_check_queue_event | 1274 | 3: bl machine_check_queue_event |
1290 | MACHINE_CHECK_HANDLER_WINDUP | 1275 | MACHINE_CHECK_HANDLER_WINDUP |
1291 | GET_PACA(r13) | 1276 | GET_PACA(r13) |
1292 | ld r1,PACAR1(r13) | 1277 | ld r1,PACAR1(r13) |
1293 | li r3,PNV_THREAD_NAP | 1278 | /* |
1294 | b pnv_enter_arch207_idle_mode | 1279 | * Check what idle state this CPU was in and go back to same mode |
1280 | * again. | ||
1281 | */ | ||
1282 | lbz r3,PACA_THREAD_IDLE_STATE(r13) | ||
1283 | cmpwi r3,PNV_THREAD_NAP | ||
1284 | bgt 10f | ||
1285 | IDLE_STATE_ENTER_SEQ(PPC_NAP) | ||
1286 | /* No return */ | ||
1287 | 10: | ||
1288 | cmpwi r3,PNV_THREAD_SLEEP | ||
1289 | bgt 2f | ||
1290 | IDLE_STATE_ENTER_SEQ(PPC_SLEEP) | ||
1291 | /* No return */ | ||
1292 | |||
1293 | 2: | ||
1294 | /* | ||
1295 | * Go back to winkle. Please note that this thread was woken up in | ||
1296 | * machine check from winkle and have not restored the per-subcore | ||
1297 | * state. Hence before going back to winkle, set last bit of HSPGR0 | ||
1298 | * to 1. This will make sure that if this thread gets woken up | ||
1299 | * again at reset vector 0x100 then it will get chance to restore | ||
1300 | * the subcore state. | ||
1301 | */ | ||
1302 | ori r13,r13,1 | ||
1303 | SET_PACA(r13) | ||
1304 | IDLE_STATE_ENTER_SEQ(PPC_WINKLE) | ||
1305 | /* No return */ | ||
1295 | 4: | 1306 | 4: |
1296 | #endif | 1307 | #endif |
1297 | /* | 1308 | /* |
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index ba79d15f4ddd..2265c6398a17 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S | |||
@@ -44,18 +44,6 @@ | |||
44 | PSSCR_PSLL_MASK | PSSCR_TR_MASK | \ | 44 | PSSCR_PSLL_MASK | PSSCR_TR_MASK | \ |
45 | PSSCR_MTL_MASK | 45 | PSSCR_MTL_MASK |
46 | 46 | ||
47 | /* Idle state entry routines */ | ||
48 | |||
49 | #define IDLE_STATE_ENTER_SEQ(IDLE_INST) \ | ||
50 | /* Magic NAP/SLEEP/WINKLE mode enter sequence */ \ | ||
51 | std r0,0(r1); \ | ||
52 | ptesync; \ | ||
53 | ld r0,0(r1); \ | ||
54 | 1: cmp cr0,r0,r0; \ | ||
55 | bne 1b; \ | ||
56 | IDLE_INST; \ | ||
57 | b . | ||
58 | |||
59 | .text | 47 | .text |
60 | 48 | ||
61 | /* | 49 | /* |
@@ -363,8 +351,8 @@ _GLOBAL(power9_idle_stop) | |||
363 | * cr3 - set to gt if waking up with partial/complete hypervisor state loss | 351 | * cr3 - set to gt if waking up with partial/complete hypervisor state loss |
364 | */ | 352 | */ |
365 | _GLOBAL(pnv_restore_hyp_resource) | 353 | _GLOBAL(pnv_restore_hyp_resource) |
366 | ld r2,PACATOC(r13); | ||
367 | BEGIN_FTR_SECTION | 354 | BEGIN_FTR_SECTION |
355 | ld r2,PACATOC(r13); | ||
368 | /* | 356 | /* |
369 | * POWER ISA 3. Use PSSCR to determine if we | 357 | * POWER ISA 3. Use PSSCR to determine if we |
370 | * are waking up from deep idle state | 358 | * are waking up from deep idle state |
@@ -395,6 +383,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) | |||
395 | */ | 383 | */ |
396 | clrldi r5,r13,63 | 384 | clrldi r5,r13,63 |
397 | clrrdi r13,r13,1 | 385 | clrrdi r13,r13,1 |
386 | |||
387 | /* Now that we are sure r13 is corrected, load TOC */ | ||
388 | ld r2,PACATOC(r13); | ||
398 | cmpwi cr4,r5,1 | 389 | cmpwi cr4,r5,1 |
399 | mtspr SPRN_HSPRG0,r13 | 390 | mtspr SPRN_HSPRG0,r13 |
400 | 391 | ||
diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c index ef267fd9dd22..5e7ece0fda9f 100644 --- a/arch/powerpc/kernel/mce.c +++ b/arch/powerpc/kernel/mce.c | |||
@@ -92,7 +92,8 @@ void save_mce_event(struct pt_regs *regs, long handled, | |||
92 | mce->in_use = 1; | 92 | mce->in_use = 1; |
93 | 93 | ||
94 | mce->initiator = MCE_INITIATOR_CPU; | 94 | mce->initiator = MCE_INITIATOR_CPU; |
95 | if (handled) | 95 | /* Mark it recovered if we have handled it and MSR(RI=1). */ |
96 | if (handled && (regs->msr & MSR_RI)) | ||
96 | mce->disposition = MCE_DISPOSITION_RECOVERED; | 97 | mce->disposition = MCE_DISPOSITION_RECOVERED; |
97 | else | 98 | else |
98 | mce->disposition = MCE_DISPOSITION_NOT_RECOVERED; | 99 | mce->disposition = MCE_DISPOSITION_NOT_RECOVERED; |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index a5c0153ede37..7fdf324d5b51 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -78,6 +78,7 @@ EXPORT_SYMBOL(get_pci_dma_ops); | |||
78 | static int get_phb_number(struct device_node *dn) | 78 | static int get_phb_number(struct device_node *dn) |
79 | { | 79 | { |
80 | int ret, phb_id = -1; | 80 | int ret, phb_id = -1; |
81 | u32 prop_32; | ||
81 | u64 prop; | 82 | u64 prop; |
82 | 83 | ||
83 | /* | 84 | /* |
@@ -86,8 +87,10 @@ static int get_phb_number(struct device_node *dn) | |||
86 | * reading "ibm,opal-phbid", only present in OPAL environment. | 87 | * reading "ibm,opal-phbid", only present in OPAL environment. |
87 | */ | 88 | */ |
88 | ret = of_property_read_u64(dn, "ibm,opal-phbid", &prop); | 89 | ret = of_property_read_u64(dn, "ibm,opal-phbid", &prop); |
89 | if (ret) | 90 | if (ret) { |
90 | ret = of_property_read_u32_index(dn, "reg", 1, (u32 *)&prop); | 91 | ret = of_property_read_u32_index(dn, "reg", 1, &prop_32); |
92 | prop = prop_32; | ||
93 | } | ||
91 | 94 | ||
92 | if (!ret) | 95 | if (!ret) |
93 | phb_id = (int)(prop & (MAX_PHBS - 1)); | 96 | phb_id = (int)(prop & (MAX_PHBS - 1)); |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 58ccf86415b4..9ee2623e0f67 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -1074,26 +1074,6 @@ static inline void restore_sprs(struct thread_struct *old_thread, | |||
1074 | #endif | 1074 | #endif |
1075 | } | 1075 | } |
1076 | 1076 | ||
1077 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1078 | void flush_tmregs_to_thread(struct task_struct *tsk) | ||
1079 | { | ||
1080 | /* | ||
1081 | * Process self tracing is not yet supported through | ||
1082 | * ptrace interface. Ptrace generic code should have | ||
1083 | * prevented this from happening in the first place. | ||
1084 | * Warn once here with the message, if some how it | ||
1085 | * is attempted. | ||
1086 | */ | ||
1087 | WARN_ONCE(tsk == current, | ||
1088 | "Not expecting ptrace on self: TM regs may be incorrect\n"); | ||
1089 | |||
1090 | /* | ||
1091 | * If task is not current, it should have been flushed | ||
1092 | * already to it's thread_struct during __switch_to(). | ||
1093 | */ | ||
1094 | } | ||
1095 | #endif | ||
1096 | |||
1097 | struct task_struct *__switch_to(struct task_struct *prev, | 1077 | struct task_struct *__switch_to(struct task_struct *prev, |
1098 | struct task_struct *new) | 1078 | struct task_struct *new) |
1099 | { | 1079 | { |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 6ee4b72cda42..4e74fc588a3f 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -2940,7 +2940,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2940 | 2940 | ||
2941 | /* Don't print anything after quiesce under OPAL, it crashes OFW */ | 2941 | /* Don't print anything after quiesce under OPAL, it crashes OFW */ |
2942 | if (of_platform != PLATFORM_OPAL) { | 2942 | if (of_platform != PLATFORM_OPAL) { |
2943 | prom_printf("Booting Linux via __start() ...\n"); | 2943 | prom_printf("Booting Linux via __start() @ 0x%lx ...\n", kbase); |
2944 | prom_debug("->dt_header_start=0x%x\n", hdr); | 2944 | prom_debug("->dt_header_start=0x%x\n", hdr); |
2945 | } | 2945 | } |
2946 | 2946 | ||
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 4f3c5756cc09..bf91658a8a40 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/page.h> | 38 | #include <asm/page.h> |
39 | #include <asm/pgtable.h> | 39 | #include <asm/pgtable.h> |
40 | #include <asm/switch_to.h> | 40 | #include <asm/switch_to.h> |
41 | #include <asm/tm.h> | ||
41 | 42 | ||
42 | #define CREATE_TRACE_POINTS | 43 | #define CREATE_TRACE_POINTS |
43 | #include <trace/events/syscalls.h> | 44 | #include <trace/events/syscalls.h> |
@@ -118,6 +119,24 @@ static const struct pt_regs_offset regoffset_table[] = { | |||
118 | REG_OFFSET_END, | 119 | REG_OFFSET_END, |
119 | }; | 120 | }; |
120 | 121 | ||
122 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
123 | static void flush_tmregs_to_thread(struct task_struct *tsk) | ||
124 | { | ||
125 | /* | ||
126 | * If task is not current, it will have been flushed already to | ||
127 | * it's thread_struct during __switch_to(). | ||
128 | * | ||
129 | * A reclaim flushes ALL the state. | ||
130 | */ | ||
131 | |||
132 | if (tsk == current && MSR_TM_SUSPENDED(mfmsr())) | ||
133 | tm_reclaim_current(TM_CAUSE_SIGNAL); | ||
134 | |||
135 | } | ||
136 | #else | ||
137 | static inline void flush_tmregs_to_thread(struct task_struct *tsk) { } | ||
138 | #endif | ||
139 | |||
121 | /** | 140 | /** |
122 | * regs_query_register_offset() - query register offset from its name | 141 | * regs_query_register_offset() - query register offset from its name |
123 | * @name: the name of a register | 142 | * @name: the name of a register |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index c3e861df4b20..24ec3ea4b3a2 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
@@ -93,15 +93,16 @@ notrace unsigned long __init early_init(unsigned long dt_ptr) | |||
93 | * and we are running with enough of the MMU enabled to have our | 93 | * and we are running with enough of the MMU enabled to have our |
94 | * proper kernel virtual addresses | 94 | * proper kernel virtual addresses |
95 | * | 95 | * |
96 | * Find out what kind of machine we're on and save any data we need | 96 | * We do the initial parsing of the flat device-tree and prepares |
97 | * from the early boot process (devtree is copied on pmac by prom_init()). | 97 | * for the MMU to be fully initialized. |
98 | * This is called very early on the boot process, after a minimal | ||
99 | * MMU environment has been set up but before MMU_init is called. | ||
100 | */ | 98 | */ |
101 | extern unsigned int memset_nocache_branch; /* Insn to be replaced by NOP */ | 99 | extern unsigned int memset_nocache_branch; /* Insn to be replaced by NOP */ |
102 | 100 | ||
103 | notrace void __init machine_init(u64 dt_ptr) | 101 | notrace void __init machine_init(u64 dt_ptr) |
104 | { | 102 | { |
103 | /* Configure static keys first, now that we're relocated. */ | ||
104 | setup_feature_keys(); | ||
105 | |||
105 | /* Enable early debugging if any specified (see udbg.h) */ | 106 | /* Enable early debugging if any specified (see udbg.h) */ |
106 | udbg_early_init(); | 107 | udbg_early_init(); |
107 | 108 | ||
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index eafb9a79e011..7ac8e6eaab5b 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -300,6 +300,7 @@ void __init early_setup(unsigned long dt_ptr) | |||
300 | 300 | ||
301 | /* Apply all the dynamic patching */ | 301 | /* Apply all the dynamic patching */ |
302 | apply_feature_fixups(); | 302 | apply_feature_fixups(); |
303 | setup_feature_keys(); | ||
303 | 304 | ||
304 | /* Initialize the hash table or TLB handling */ | 305 | /* Initialize the hash table or TLB handling */ |
305 | early_init_mmu(); | 306 | early_init_mmu(); |
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index 6767605ea8da..4111d30badfa 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/security.h> | 22 | #include <linux/security.h> |
23 | #include <linux/memblock.h> | 23 | #include <linux/memblock.h> |
24 | 24 | ||
25 | #include <asm/cpu_has_feature.h> | ||
25 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
26 | #include <asm/processor.h> | 27 | #include <asm/processor.h> |
27 | #include <asm/mmu.h> | 28 | #include <asm/mmu.h> |
diff --git a/arch/powerpc/kernel/vdso32/Makefile b/arch/powerpc/kernel/vdso32/Makefile index cbabd143acae..78a7449bf489 100644 --- a/arch/powerpc/kernel/vdso32/Makefile +++ b/arch/powerpc/kernel/vdso32/Makefile | |||
@@ -30,7 +30,7 @@ CPPFLAGS_vdso32.lds += -P -C -Upowerpc | |||
30 | $(obj)/vdso32_wrapper.o : $(obj)/vdso32.so | 30 | $(obj)/vdso32_wrapper.o : $(obj)/vdso32.so |
31 | 31 | ||
32 | # link rule for the .so file, .lds has to be first | 32 | # link rule for the .so file, .lds has to be first |
33 | $(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) | 33 | $(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) FORCE |
34 | $(call if_changed,vdso32ld) | 34 | $(call if_changed,vdso32ld) |
35 | 35 | ||
36 | # strip rule for the .so file | 36 | # strip rule for the .so file |
@@ -39,12 +39,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE | |||
39 | $(call if_changed,objcopy) | 39 | $(call if_changed,objcopy) |
40 | 40 | ||
41 | # assembly rules for the .S files | 41 | # assembly rules for the .S files |
42 | $(obj-vdso32): %.o: %.S | 42 | $(obj-vdso32): %.o: %.S FORCE |
43 | $(call if_changed_dep,vdso32as) | 43 | $(call if_changed_dep,vdso32as) |
44 | 44 | ||
45 | # actual build commands | 45 | # actual build commands |
46 | quiet_cmd_vdso32ld = VDSO32L $@ | 46 | quiet_cmd_vdso32ld = VDSO32L $@ |
47 | cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $^ -o $@ | 47 | cmd_vdso32ld = $(CROSS32CC) $(c_flags) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^) |
48 | quiet_cmd_vdso32as = VDSO32A $@ | 48 | quiet_cmd_vdso32as = VDSO32A $@ |
49 | cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $< | 49 | cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $< |
50 | 50 | ||
diff --git a/arch/powerpc/kernel/vdso64/Makefile b/arch/powerpc/kernel/vdso64/Makefile index c710802b8fb6..366ae09b14c1 100644 --- a/arch/powerpc/kernel/vdso64/Makefile +++ b/arch/powerpc/kernel/vdso64/Makefile | |||
@@ -23,7 +23,7 @@ CPPFLAGS_vdso64.lds += -P -C -U$(ARCH) | |||
23 | $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so | 23 | $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so |
24 | 24 | ||
25 | # link rule for the .so file, .lds has to be first | 25 | # link rule for the .so file, .lds has to be first |
26 | $(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) | 26 | $(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) FORCE |
27 | $(call if_changed,vdso64ld) | 27 | $(call if_changed,vdso64ld) |
28 | 28 | ||
29 | # strip rule for the .so file | 29 | # strip rule for the .so file |
@@ -32,12 +32,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE | |||
32 | $(call if_changed,objcopy) | 32 | $(call if_changed,objcopy) |
33 | 33 | ||
34 | # assembly rules for the .S files | 34 | # assembly rules for the .S files |
35 | $(obj-vdso64): %.o: %.S | 35 | $(obj-vdso64): %.o: %.S FORCE |
36 | $(call if_changed_dep,vdso64as) | 36 | $(call if_changed_dep,vdso64as) |
37 | 37 | ||
38 | # actual build commands | 38 | # actual build commands |
39 | quiet_cmd_vdso64ld = VDSO64L $@ | 39 | quiet_cmd_vdso64ld = VDSO64L $@ |
40 | cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@ | 40 | cmd_vdso64ld = $(CC) $(c_flags) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^) |
41 | quiet_cmd_vdso64as = VDSO64A $@ | 41 | quiet_cmd_vdso64as = VDSO64A $@ |
42 | cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $< | 42 | cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $< |
43 | 43 | ||
diff --git a/arch/powerpc/kvm/book3s_xics.c b/arch/powerpc/kvm/book3s_xics.c index a75ba38a2d81..05aa11399a78 100644 --- a/arch/powerpc/kvm/book3s_xics.c +++ b/arch/powerpc/kvm/book3s_xics.c | |||
@@ -1329,20 +1329,16 @@ static int kvmppc_xics_create(struct kvm_device *dev, u32 type) | |||
1329 | xics->kvm = kvm; | 1329 | xics->kvm = kvm; |
1330 | 1330 | ||
1331 | /* Already there ? */ | 1331 | /* Already there ? */ |
1332 | mutex_lock(&kvm->lock); | ||
1333 | if (kvm->arch.xics) | 1332 | if (kvm->arch.xics) |
1334 | ret = -EEXIST; | 1333 | ret = -EEXIST; |
1335 | else | 1334 | else |
1336 | kvm->arch.xics = xics; | 1335 | kvm->arch.xics = xics; |
1337 | mutex_unlock(&kvm->lock); | ||
1338 | 1336 | ||
1339 | if (ret) { | 1337 | if (ret) { |
1340 | kfree(xics); | 1338 | kfree(xics); |
1341 | return ret; | 1339 | return ret; |
1342 | } | 1340 | } |
1343 | 1341 | ||
1344 | xics_debugfs_init(xics); | ||
1345 | |||
1346 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 1342 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
1347 | if (cpu_has_feature(CPU_FTR_ARCH_206)) { | 1343 | if (cpu_has_feature(CPU_FTR_ARCH_206)) { |
1348 | /* Enable real mode support */ | 1344 | /* Enable real mode support */ |
@@ -1354,9 +1350,17 @@ static int kvmppc_xics_create(struct kvm_device *dev, u32 type) | |||
1354 | return 0; | 1350 | return 0; |
1355 | } | 1351 | } |
1356 | 1352 | ||
1353 | static void kvmppc_xics_init(struct kvm_device *dev) | ||
1354 | { | ||
1355 | struct kvmppc_xics *xics = (struct kvmppc_xics *)dev->private; | ||
1356 | |||
1357 | xics_debugfs_init(xics); | ||
1358 | } | ||
1359 | |||
1357 | struct kvm_device_ops kvm_xics_ops = { | 1360 | struct kvm_device_ops kvm_xics_ops = { |
1358 | .name = "kvm-xics", | 1361 | .name = "kvm-xics", |
1359 | .create = kvmppc_xics_create, | 1362 | .create = kvmppc_xics_create, |
1363 | .init = kvmppc_xics_init, | ||
1360 | .destroy = kvmppc_xics_free, | 1364 | .destroy = kvmppc_xics_free, |
1361 | .set_attr = xics_set_attr, | 1365 | .set_attr = xics_set_attr, |
1362 | .get_attr = xics_get_attr, | 1366 | .get_attr = xics_get_attr, |
diff --git a/arch/powerpc/lib/checksum_32.S b/arch/powerpc/lib/checksum_32.S index d90870a66b60..0a57fe6d49cc 100644 --- a/arch/powerpc/lib/checksum_32.S +++ b/arch/powerpc/lib/checksum_32.S | |||
@@ -127,8 +127,9 @@ _GLOBAL(csum_partial_copy_generic) | |||
127 | stw r7,12(r1) | 127 | stw r7,12(r1) |
128 | stw r8,8(r1) | 128 | stw r8,8(r1) |
129 | 129 | ||
130 | andi. r0,r4,1 /* is destination address even ? */ | 130 | rlwinm r0,r4,3,0x8 |
131 | cmplwi cr7,r0,0 | 131 | rlwnm r6,r6,r0,0,31 /* odd destination address: rotate one byte */ |
132 | cmplwi cr7,r0,0 /* is destination address even ? */ | ||
132 | addic r12,r6,0 | 133 | addic r12,r6,0 |
133 | addi r6,r4,-4 | 134 | addi r6,r4,-4 |
134 | neg r0,r4 | 135 | neg r0,r4 |
@@ -237,7 +238,7 @@ _GLOBAL(csum_partial_copy_generic) | |||
237 | 66: addze r3,r12 | 238 | 66: addze r3,r12 |
238 | addi r1,r1,16 | 239 | addi r1,r1,16 |
239 | beqlr+ cr7 | 240 | beqlr+ cr7 |
240 | rlwinm r3,r3,8,0,31 /* swap bytes for odd destination */ | 241 | rlwinm r3,r3,8,0,31 /* odd destination address: rotate one byte */ |
241 | blr | 242 | blr |
242 | 243 | ||
243 | /* read fault */ | 244 | /* read fault */ |
diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c index 74145f02ad41..043415f0bdb1 100644 --- a/arch/powerpc/lib/feature-fixups.c +++ b/arch/powerpc/lib/feature-fixups.c | |||
@@ -188,7 +188,10 @@ void __init apply_feature_fixups(void) | |||
188 | &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup); | 188 | &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup); |
189 | #endif | 189 | #endif |
190 | do_final_fixups(); | 190 | do_final_fixups(); |
191 | } | ||
191 | 192 | ||
193 | void __init setup_feature_keys(void) | ||
194 | { | ||
192 | /* | 195 | /* |
193 | * Initialise jump label. This causes all the cpu/mmu_has_feature() | 196 | * Initialise jump label. This causes all the cpu/mmu_has_feature() |
194 | * checks to take on their correct polarity based on the current set of | 197 | * checks to take on their correct polarity based on the current set of |
diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c index 5be15cff758d..2975754c65ea 100644 --- a/arch/powerpc/platforms/cell/spufs/inode.c +++ b/arch/powerpc/platforms/cell/spufs/inode.c | |||
@@ -496,8 +496,10 @@ spufs_mkgang(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
496 | gang = alloc_spu_gang(); | 496 | gang = alloc_spu_gang(); |
497 | SPUFS_I(inode)->i_ctx = NULL; | 497 | SPUFS_I(inode)->i_ctx = NULL; |
498 | SPUFS_I(inode)->i_gang = gang; | 498 | SPUFS_I(inode)->i_gang = gang; |
499 | if (!gang) | 499 | if (!gang) { |
500 | ret = -ENOMEM; | ||
500 | goto out_iput; | 501 | goto out_iput; |
502 | } | ||
501 | 503 | ||
502 | inode->i_op = &simple_dir_inode_operations; | 504 | inode->i_op = &simple_dir_inode_operations; |
503 | inode->i_fop = &simple_dir_operations; | 505 | inode->i_fop = &simple_dir_operations; |
diff --git a/arch/powerpc/platforms/pasemi/iommu.c b/arch/powerpc/platforms/pasemi/iommu.c index 309d9ccccd50..c61667e8bb06 100644 --- a/arch/powerpc/platforms/pasemi/iommu.c +++ b/arch/powerpc/platforms/pasemi/iommu.c | |||
@@ -187,6 +187,11 @@ static void pci_dma_dev_setup_pasemi(struct pci_dev *dev) | |||
187 | if (dev->vendor == 0x1959 && dev->device == 0xa007 && | 187 | if (dev->vendor == 0x1959 && dev->device == 0xa007 && |
188 | !firmware_has_feature(FW_FEATURE_LPAR)) { | 188 | !firmware_has_feature(FW_FEATURE_LPAR)) { |
189 | dev->dev.archdata.dma_ops = &dma_direct_ops; | 189 | dev->dev.archdata.dma_ops = &dma_direct_ops; |
190 | /* | ||
191 | * Set the coherent DMA mask to prevent the iommu | ||
192 | * being used unnecessarily | ||
193 | */ | ||
194 | dev->dev.coherent_dma_mask = DMA_BIT_MASK(44); | ||
190 | return; | 195 | return; |
191 | } | 196 | } |
192 | #endif | 197 | #endif |
diff --git a/arch/powerpc/platforms/powernv/opal-irqchip.c b/arch/powerpc/platforms/powernv/opal-irqchip.c index e505223b4ec5..ed8bba68a162 100644 --- a/arch/powerpc/platforms/powernv/opal-irqchip.c +++ b/arch/powerpc/platforms/powernv/opal-irqchip.c | |||
@@ -228,7 +228,8 @@ int __init opal_event_init(void) | |||
228 | } | 228 | } |
229 | 229 | ||
230 | /* Install interrupt handler */ | 230 | /* Install interrupt handler */ |
231 | rc = request_irq(virq, opal_interrupt, 0, "opal", NULL); | 231 | rc = request_irq(virq, opal_interrupt, IRQF_TRIGGER_LOW, |
232 | "opal", NULL); | ||
232 | if (rc) { | 233 | if (rc) { |
233 | irq_dispose_mapping(virq); | 234 | irq_dispose_mapping(virq); |
234 | pr_warn("Error %d requesting irq %d (0x%x)\n", | 235 | pr_warn("Error %d requesting irq %d (0x%x)\n", |
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 8b4fc68cebcb..6c9a65b52e63 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c | |||
@@ -399,6 +399,7 @@ static int opal_recover_mce(struct pt_regs *regs, | |||
399 | 399 | ||
400 | if (!(regs->msr & MSR_RI)) { | 400 | if (!(regs->msr & MSR_RI)) { |
401 | /* If MSR_RI isn't set, we cannot recover */ | 401 | /* If MSR_RI isn't set, we cannot recover */ |
402 | pr_err("Machine check interrupt unrecoverable: MSR(RI=0)\n"); | ||
402 | recovered = 0; | 403 | recovered = 0; |
403 | } else if (evt->disposition == MCE_DISPOSITION_RECOVERED) { | 404 | } else if (evt->disposition == MCE_DISPOSITION_RECOVERED) { |
404 | /* Platform corrected itself */ | 405 | /* Platform corrected itself */ |
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 6b9528307f62..fd9444f9fb0c 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
@@ -111,10 +111,17 @@ static int __init iommu_setup(char *str) | |||
111 | } | 111 | } |
112 | early_param("iommu", iommu_setup); | 112 | early_param("iommu", iommu_setup); |
113 | 113 | ||
114 | static inline bool pnv_pci_is_mem_pref_64(unsigned long flags) | 114 | static inline bool pnv_pci_is_m64(struct pnv_phb *phb, struct resource *r) |
115 | { | 115 | { |
116 | return ((flags & (IORESOURCE_MEM_64 | IORESOURCE_PREFETCH)) == | 116 | /* |
117 | (IORESOURCE_MEM_64 | IORESOURCE_PREFETCH)); | 117 | * WARNING: We cannot rely on the resource flags. The Linux PCI |
118 | * allocation code sometimes decides to put a 64-bit prefetchable | ||
119 | * BAR in the 32-bit window, so we have to compare the addresses. | ||
120 | * | ||
121 | * For simplicity we only test resource start. | ||
122 | */ | ||
123 | return (r->start >= phb->ioda.m64_base && | ||
124 | r->start < (phb->ioda.m64_base + phb->ioda.m64_size)); | ||
118 | } | 125 | } |
119 | 126 | ||
120 | static struct pnv_ioda_pe *pnv_ioda_init_pe(struct pnv_phb *phb, int pe_no) | 127 | static struct pnv_ioda_pe *pnv_ioda_init_pe(struct pnv_phb *phb, int pe_no) |
@@ -229,7 +236,7 @@ static void pnv_ioda_reserve_dev_m64_pe(struct pci_dev *pdev, | |||
229 | sgsz = phb->ioda.m64_segsize; | 236 | sgsz = phb->ioda.m64_segsize; |
230 | for (i = 0; i <= PCI_ROM_RESOURCE; i++) { | 237 | for (i = 0; i <= PCI_ROM_RESOURCE; i++) { |
231 | r = &pdev->resource[i]; | 238 | r = &pdev->resource[i]; |
232 | if (!r->parent || !pnv_pci_is_mem_pref_64(r->flags)) | 239 | if (!r->parent || !pnv_pci_is_m64(phb, r)) |
233 | continue; | 240 | continue; |
234 | 241 | ||
235 | start = _ALIGN_DOWN(r->start - base, sgsz); | 242 | start = _ALIGN_DOWN(r->start - base, sgsz); |
@@ -1877,7 +1884,7 @@ static void pnv_pci_phb3_tce_invalidate(struct pnv_ioda_pe *pe, bool rm, | |||
1877 | unsigned shift, unsigned long index, | 1884 | unsigned shift, unsigned long index, |
1878 | unsigned long npages) | 1885 | unsigned long npages) |
1879 | { | 1886 | { |
1880 | __be64 __iomem *invalidate = pnv_ioda_get_inval_reg(pe->phb, false); | 1887 | __be64 __iomem *invalidate = pnv_ioda_get_inval_reg(pe->phb, rm); |
1881 | unsigned long start, end, inc; | 1888 | unsigned long start, end, inc; |
1882 | 1889 | ||
1883 | /* We'll invalidate DMA address in PE scope */ | 1890 | /* We'll invalidate DMA address in PE scope */ |
@@ -2863,7 +2870,7 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev) | |||
2863 | res = &pdev->resource[i + PCI_IOV_RESOURCES]; | 2870 | res = &pdev->resource[i + PCI_IOV_RESOURCES]; |
2864 | if (!res->flags || res->parent) | 2871 | if (!res->flags || res->parent) |
2865 | continue; | 2872 | continue; |
2866 | if (!pnv_pci_is_mem_pref_64(res->flags)) { | 2873 | if (!pnv_pci_is_m64(phb, res)) { |
2867 | dev_warn(&pdev->dev, "Don't support SR-IOV with" | 2874 | dev_warn(&pdev->dev, "Don't support SR-IOV with" |
2868 | " non M64 VF BAR%d: %pR. \n", | 2875 | " non M64 VF BAR%d: %pR. \n", |
2869 | i, res); | 2876 | i, res); |
@@ -2958,7 +2965,7 @@ static void pnv_ioda_setup_pe_res(struct pnv_ioda_pe *pe, | |||
2958 | index++; | 2965 | index++; |
2959 | } | 2966 | } |
2960 | } else if ((res->flags & IORESOURCE_MEM) && | 2967 | } else if ((res->flags & IORESOURCE_MEM) && |
2961 | !pnv_pci_is_mem_pref_64(res->flags)) { | 2968 | !pnv_pci_is_m64(phb, res)) { |
2962 | region.start = res->start - | 2969 | region.start = res->start - |
2963 | phb->hose->mem_offset[0] - | 2970 | phb->hose->mem_offset[0] - |
2964 | phb->ioda.m32_pci_base; | 2971 | phb->ioda.m32_pci_base; |
@@ -3083,9 +3090,12 @@ static resource_size_t pnv_pci_window_alignment(struct pci_bus *bus, | |||
3083 | bridge = bridge->bus->self; | 3090 | bridge = bridge->bus->self; |
3084 | } | 3091 | } |
3085 | 3092 | ||
3086 | /* We fail back to M32 if M64 isn't supported */ | 3093 | /* |
3087 | if (phb->ioda.m64_segsize && | 3094 | * We fall back to M32 if M64 isn't supported. We enforce the M64 |
3088 | pnv_pci_is_mem_pref_64(type)) | 3095 | * alignment for any 64-bit resource, PCIe doesn't care and |
3096 | * bridges only do 64-bit prefetchable anyway. | ||
3097 | */ | ||
3098 | if (phb->ioda.m64_segsize && (type & IORESOURCE_MEM_64)) | ||
3089 | return phb->ioda.m64_segsize; | 3099 | return phb->ioda.m64_segsize; |
3090 | if (type & IORESOURCE_MEM) | 3100 | if (type & IORESOURCE_MEM) |
3091 | return phb->ioda.m32_segsize; | 3101 | return phb->ioda.m32_segsize; |
@@ -3125,7 +3135,7 @@ static void pnv_pci_fixup_bridge_resources(struct pci_bus *bus, | |||
3125 | w = NULL; | 3135 | w = NULL; |
3126 | if (r->flags & type & IORESOURCE_IO) | 3136 | if (r->flags & type & IORESOURCE_IO) |
3127 | w = &hose->io_resource; | 3137 | w = &hose->io_resource; |
3128 | else if (pnv_pci_is_mem_pref_64(r->flags) && | 3138 | else if (pnv_pci_is_m64(phb, r) && |
3129 | (type & IORESOURCE_PREFETCH) && | 3139 | (type & IORESOURCE_PREFETCH) && |
3130 | phb->ioda.m64_segsize) | 3140 | phb->ioda.m64_segsize) |
3131 | w = &hose->mem_resources[1]; | 3141 | w = &hose->mem_resources[1]; |
diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c index 43f7beb2902d..76ec104e88be 100644 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c | |||
@@ -320,19 +320,6 @@ static int dlpar_remove_device_tree_lmb(struct of_drconf_cell *lmb) | |||
320 | return dlpar_update_device_tree_lmb(lmb); | 320 | return dlpar_update_device_tree_lmb(lmb); |
321 | } | 321 | } |
322 | 322 | ||
323 | static struct memory_block *lmb_to_memblock(struct of_drconf_cell *lmb) | ||
324 | { | ||
325 | unsigned long section_nr; | ||
326 | struct mem_section *mem_sect; | ||
327 | struct memory_block *mem_block; | ||
328 | |||
329 | section_nr = pfn_to_section_nr(PFN_DOWN(lmb->base_addr)); | ||
330 | mem_sect = __nr_to_section(section_nr); | ||
331 | |||
332 | mem_block = find_memory_block(mem_sect); | ||
333 | return mem_block; | ||
334 | } | ||
335 | |||
336 | #ifdef CONFIG_MEMORY_HOTREMOVE | 323 | #ifdef CONFIG_MEMORY_HOTREMOVE |
337 | static int pseries_remove_memblock(unsigned long base, unsigned int memblock_size) | 324 | static int pseries_remove_memblock(unsigned long base, unsigned int memblock_size) |
338 | { | 325 | { |
@@ -420,6 +407,19 @@ static bool lmb_is_removable(struct of_drconf_cell *lmb) | |||
420 | 407 | ||
421 | static int dlpar_add_lmb(struct of_drconf_cell *); | 408 | static int dlpar_add_lmb(struct of_drconf_cell *); |
422 | 409 | ||
410 | static struct memory_block *lmb_to_memblock(struct of_drconf_cell *lmb) | ||
411 | { | ||
412 | unsigned long section_nr; | ||
413 | struct mem_section *mem_sect; | ||
414 | struct memory_block *mem_block; | ||
415 | |||
416 | section_nr = pfn_to_section_nr(PFN_DOWN(lmb->base_addr)); | ||
417 | mem_sect = __nr_to_section(section_nr); | ||
418 | |||
419 | mem_block = find_memory_block(mem_sect); | ||
420 | return mem_block; | ||
421 | } | ||
422 | |||
423 | static int dlpar_remove_lmb(struct of_drconf_cell *lmb) | 423 | static int dlpar_remove_lmb(struct of_drconf_cell *lmb) |
424 | { | 424 | { |
425 | struct memory_block *mem_block; | 425 | struct memory_block *mem_block; |
diff --git a/arch/powerpc/sysdev/xics/Kconfig b/arch/powerpc/sysdev/xics/Kconfig index 0031eda320c3..385e7aa9e273 100644 --- a/arch/powerpc/sysdev/xics/Kconfig +++ b/arch/powerpc/sysdev/xics/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config PPC_XICS | 1 | config PPC_XICS |
2 | def_bool n | 2 | def_bool n |
3 | select PPC_SMP_MUXED_IPI | 3 | select PPC_SMP_MUXED_IPI |
4 | select HARDIRQS_SW_RESEND | ||
4 | 5 | ||
5 | config PPC_ICP_NATIVE | 6 | config PPC_ICP_NATIVE |
6 | def_bool n | 7 | def_bool n |
diff --git a/arch/powerpc/sysdev/xics/ics-opal.c b/arch/powerpc/sysdev/xics/ics-opal.c index 27c936c080a6..1c6bf4b66f56 100644 --- a/arch/powerpc/sysdev/xics/ics-opal.c +++ b/arch/powerpc/sysdev/xics/ics-opal.c | |||
@@ -156,7 +156,9 @@ static struct irq_chip ics_opal_irq_chip = { | |||
156 | .irq_mask = ics_opal_mask_irq, | 156 | .irq_mask = ics_opal_mask_irq, |
157 | .irq_unmask = ics_opal_unmask_irq, | 157 | .irq_unmask = ics_opal_unmask_irq, |
158 | .irq_eoi = NULL, /* Patched at init time */ | 158 | .irq_eoi = NULL, /* Patched at init time */ |
159 | .irq_set_affinity = ics_opal_set_affinity | 159 | .irq_set_affinity = ics_opal_set_affinity, |
160 | .irq_set_type = xics_set_irq_type, | ||
161 | .irq_retrigger = xics_retrigger, | ||
160 | }; | 162 | }; |
161 | 163 | ||
162 | static int ics_opal_map(struct ics *ics, unsigned int virq); | 164 | static int ics_opal_map(struct ics *ics, unsigned int virq); |
diff --git a/arch/powerpc/sysdev/xics/ics-rtas.c b/arch/powerpc/sysdev/xics/ics-rtas.c index 3854dd41558d..78ee5c778ef8 100644 --- a/arch/powerpc/sysdev/xics/ics-rtas.c +++ b/arch/powerpc/sysdev/xics/ics-rtas.c | |||
@@ -163,7 +163,9 @@ static struct irq_chip ics_rtas_irq_chip = { | |||
163 | .irq_mask = ics_rtas_mask_irq, | 163 | .irq_mask = ics_rtas_mask_irq, |
164 | .irq_unmask = ics_rtas_unmask_irq, | 164 | .irq_unmask = ics_rtas_unmask_irq, |
165 | .irq_eoi = NULL, /* Patched at init time */ | 165 | .irq_eoi = NULL, /* Patched at init time */ |
166 | .irq_set_affinity = ics_rtas_set_affinity | 166 | .irq_set_affinity = ics_rtas_set_affinity, |
167 | .irq_set_type = xics_set_irq_type, | ||
168 | .irq_retrigger = xics_retrigger, | ||
167 | }; | 169 | }; |
168 | 170 | ||
169 | static int ics_rtas_map(struct ics *ics, unsigned int virq) | 171 | static int ics_rtas_map(struct ics *ics, unsigned int virq) |
diff --git a/arch/powerpc/sysdev/xics/xics-common.c b/arch/powerpc/sysdev/xics/xics-common.c index a795a5f0301c..9d530f479588 100644 --- a/arch/powerpc/sysdev/xics/xics-common.c +++ b/arch/powerpc/sysdev/xics/xics-common.c | |||
@@ -328,8 +328,12 @@ static int xics_host_map(struct irq_domain *h, unsigned int virq, | |||
328 | 328 | ||
329 | pr_devel("xics: map virq %d, hwirq 0x%lx\n", virq, hw); | 329 | pr_devel("xics: map virq %d, hwirq 0x%lx\n", virq, hw); |
330 | 330 | ||
331 | /* They aren't all level sensitive but we just don't really know */ | 331 | /* |
332 | irq_set_status_flags(virq, IRQ_LEVEL); | 332 | * Mark interrupts as edge sensitive by default so that resend |
333 | * actually works. The device-tree parsing will turn the LSIs | ||
334 | * back to level. | ||
335 | */ | ||
336 | irq_clear_status_flags(virq, IRQ_LEVEL); | ||
333 | 337 | ||
334 | /* Don't call into ICS for IPIs */ | 338 | /* Don't call into ICS for IPIs */ |
335 | if (hw == XICS_IPI) { | 339 | if (hw == XICS_IPI) { |
@@ -351,13 +355,54 @@ static int xics_host_xlate(struct irq_domain *h, struct device_node *ct, | |||
351 | irq_hw_number_t *out_hwirq, unsigned int *out_flags) | 355 | irq_hw_number_t *out_hwirq, unsigned int *out_flags) |
352 | 356 | ||
353 | { | 357 | { |
354 | /* Current xics implementation translates everything | ||
355 | * to level. It is not technically right for MSIs but this | ||
356 | * is irrelevant at this point. We might get smarter in the future | ||
357 | */ | ||
358 | *out_hwirq = intspec[0]; | 358 | *out_hwirq = intspec[0]; |
359 | *out_flags = IRQ_TYPE_LEVEL_LOW; | ||
360 | 359 | ||
360 | /* | ||
361 | * If intsize is at least 2, we look for the type in the second cell, | ||
362 | * we assume the LSB indicates a level interrupt. | ||
363 | */ | ||
364 | if (intsize > 1) { | ||
365 | if (intspec[1] & 1) | ||
366 | *out_flags = IRQ_TYPE_LEVEL_LOW; | ||
367 | else | ||
368 | *out_flags = IRQ_TYPE_EDGE_RISING; | ||
369 | } else | ||
370 | *out_flags = IRQ_TYPE_LEVEL_LOW; | ||
371 | |||
372 | return 0; | ||
373 | } | ||
374 | |||
375 | int xics_set_irq_type(struct irq_data *d, unsigned int flow_type) | ||
376 | { | ||
377 | /* | ||
378 | * We only support these. This has really no effect other than setting | ||
379 | * the corresponding descriptor bits mind you but those will in turn | ||
380 | * affect the resend function when re-enabling an edge interrupt. | ||
381 | * | ||
382 | * Set set the default to edge as explained in map(). | ||
383 | */ | ||
384 | if (flow_type == IRQ_TYPE_DEFAULT || flow_type == IRQ_TYPE_NONE) | ||
385 | flow_type = IRQ_TYPE_EDGE_RISING; | ||
386 | |||
387 | if (flow_type != IRQ_TYPE_EDGE_RISING && | ||
388 | flow_type != IRQ_TYPE_LEVEL_LOW) | ||
389 | return -EINVAL; | ||
390 | |||
391 | irqd_set_trigger_type(d, flow_type); | ||
392 | |||
393 | return IRQ_SET_MASK_OK_NOCOPY; | ||
394 | } | ||
395 | |||
396 | int xics_retrigger(struct irq_data *data) | ||
397 | { | ||
398 | /* | ||
399 | * We need to push a dummy CPPR when retriggering, since the subsequent | ||
400 | * EOI will try to pop it. Passing 0 works, as the function hard codes | ||
401 | * the priority value anyway. | ||
402 | */ | ||
403 | xics_push_cppr(0); | ||
404 | |||
405 | /* Tell the core to do a soft retrigger */ | ||
361 | return 0; | 406 | return 0; |
362 | } | 407 | } |
363 | 408 | ||
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 0e348781327b..e751fe25d6ab 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -872,4 +872,17 @@ config S390_GUEST | |||
872 | Select this option if you want to run the kernel as a guest under | 872 | Select this option if you want to run the kernel as a guest under |
873 | the KVM hypervisor. | 873 | the KVM hypervisor. |
874 | 874 | ||
875 | config S390_GUEST_OLD_TRANSPORT | ||
876 | def_bool y | ||
877 | prompt "Guest support for old s390 virtio transport (DEPRECATED)" | ||
878 | depends on S390_GUEST | ||
879 | help | ||
880 | Enable this option to add support for the old s390-virtio | ||
881 | transport (i.e. virtio devices NOT based on virtio-ccw). This | ||
882 | type of virtio devices is only available on the experimental | ||
883 | kuli userspace or with old (< 2.6) qemu. If you are running | ||
884 | with a modern version of qemu (which supports virtio-ccw since | ||
885 | 1.4 and uses it by default since version 2.4), you probably won't | ||
886 | need this. | ||
887 | |||
875 | endmenu | 888 | endmenu |
diff --git a/arch/s390/boot/compressed/head.S b/arch/s390/boot/compressed/head.S index f86a4eef28a9..28c4f96a2d9c 100644 --- a/arch/s390/boot/compressed/head.S +++ b/arch/s390/boot/compressed/head.S | |||
@@ -21,16 +21,21 @@ ENTRY(startup_continue) | |||
21 | lg %r15,.Lstack-.LPG1(%r13) | 21 | lg %r15,.Lstack-.LPG1(%r13) |
22 | aghi %r15,-160 | 22 | aghi %r15,-160 |
23 | brasl %r14,decompress_kernel | 23 | brasl %r14,decompress_kernel |
24 | # setup registers for memory mover & branch to target | 24 | # Set up registers for memory mover. We move the decompressed image to |
25 | # 0x11000, starting at offset 0x11000 in the decompressed image so | ||
26 | # that code living at 0x11000 in the image will end up at 0x11000 in | ||
27 | # memory. | ||
25 | lgr %r4,%r2 | 28 | lgr %r4,%r2 |
26 | lg %r2,.Loffset-.LPG1(%r13) | 29 | lg %r2,.Loffset-.LPG1(%r13) |
27 | la %r4,0(%r2,%r4) | 30 | la %r4,0(%r2,%r4) |
28 | lg %r3,.Lmvsize-.LPG1(%r13) | 31 | lg %r3,.Lmvsize-.LPG1(%r13) |
29 | lgr %r5,%r3 | 32 | lgr %r5,%r3 |
30 | # move the memory mover someplace safe | 33 | # Move the memory mover someplace safe so it doesn't overwrite itself. |
31 | la %r1,0x200 | 34 | la %r1,0x200 |
32 | mvc 0(mover_end-mover,%r1),mover-.LPG1(%r13) | 35 | mvc 0(mover_end-mover,%r1),mover-.LPG1(%r13) |
33 | # decompress image is started at 0x11000 | 36 | # When the memory mover is done we pass control to |
37 | # arch/s390/kernel/head64.S:startup_continue which lives at 0x11000 in | ||
38 | # the decompressed image. | ||
34 | lgr %r6,%r2 | 39 | lgr %r6,%r2 |
35 | br %r1 | 40 | br %r1 |
36 | mover: | 41 | mover: |
diff --git a/arch/s390/configs/default_defconfig b/arch/s390/configs/default_defconfig index 889ea3450210..26e0c7f08814 100644 --- a/arch/s390/configs/default_defconfig +++ b/arch/s390/configs/default_defconfig | |||
@@ -678,7 +678,7 @@ CONFIG_CRYPTO_SHA512_S390=m | |||
678 | CONFIG_CRYPTO_DES_S390=m | 678 | CONFIG_CRYPTO_DES_S390=m |
679 | CONFIG_CRYPTO_AES_S390=m | 679 | CONFIG_CRYPTO_AES_S390=m |
680 | CONFIG_CRYPTO_GHASH_S390=m | 680 | CONFIG_CRYPTO_GHASH_S390=m |
681 | CONFIG_CRYPTO_CRC32_S390=m | 681 | CONFIG_CRYPTO_CRC32_S390=y |
682 | CONFIG_ASYMMETRIC_KEY_TYPE=y | 682 | CONFIG_ASYMMETRIC_KEY_TYPE=y |
683 | CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m | 683 | CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m |
684 | CONFIG_X509_CERTIFICATE_PARSER=m | 684 | CONFIG_X509_CERTIFICATE_PARSER=m |
diff --git a/arch/s390/configs/gcov_defconfig b/arch/s390/configs/gcov_defconfig index 1bcfd764910a..24879dab47bc 100644 --- a/arch/s390/configs/gcov_defconfig +++ b/arch/s390/configs/gcov_defconfig | |||
@@ -616,7 +616,7 @@ CONFIG_CRYPTO_SHA512_S390=m | |||
616 | CONFIG_CRYPTO_DES_S390=m | 616 | CONFIG_CRYPTO_DES_S390=m |
617 | CONFIG_CRYPTO_AES_S390=m | 617 | CONFIG_CRYPTO_AES_S390=m |
618 | CONFIG_CRYPTO_GHASH_S390=m | 618 | CONFIG_CRYPTO_GHASH_S390=m |
619 | CONFIG_CRYPTO_CRC32_S390=m | 619 | CONFIG_CRYPTO_CRC32_S390=y |
620 | CONFIG_ASYMMETRIC_KEY_TYPE=y | 620 | CONFIG_ASYMMETRIC_KEY_TYPE=y |
621 | CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m | 621 | CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m |
622 | CONFIG_X509_CERTIFICATE_PARSER=m | 622 | CONFIG_X509_CERTIFICATE_PARSER=m |
diff --git a/arch/s390/configs/performance_defconfig b/arch/s390/configs/performance_defconfig index 13ff090139c8..a5c1e5f2a0ca 100644 --- a/arch/s390/configs/performance_defconfig +++ b/arch/s390/configs/performance_defconfig | |||
@@ -615,7 +615,7 @@ CONFIG_CRYPTO_SHA512_S390=m | |||
615 | CONFIG_CRYPTO_DES_S390=m | 615 | CONFIG_CRYPTO_DES_S390=m |
616 | CONFIG_CRYPTO_AES_S390=m | 616 | CONFIG_CRYPTO_AES_S390=m |
617 | CONFIG_CRYPTO_GHASH_S390=m | 617 | CONFIG_CRYPTO_GHASH_S390=m |
618 | CONFIG_CRYPTO_CRC32_S390=m | 618 | CONFIG_CRYPTO_CRC32_S390=y |
619 | CONFIG_ASYMMETRIC_KEY_TYPE=y | 619 | CONFIG_ASYMMETRIC_KEY_TYPE=y |
620 | CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m | 620 | CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m |
621 | CONFIG_X509_CERTIFICATE_PARSER=m | 621 | CONFIG_X509_CERTIFICATE_PARSER=m |
diff --git a/arch/s390/crypto/crc32-vx.c b/arch/s390/crypto/crc32-vx.c index 577ae1d4ae89..2bad9d837029 100644 --- a/arch/s390/crypto/crc32-vx.c +++ b/arch/s390/crypto/crc32-vx.c | |||
@@ -51,6 +51,9 @@ u32 crc32c_le_vgfm_16(u32 crc, unsigned char const *buf, size_t size); | |||
51 | struct kernel_fpu vxstate; \ | 51 | struct kernel_fpu vxstate; \ |
52 | unsigned long prealign, aligned, remaining; \ | 52 | unsigned long prealign, aligned, remaining; \ |
53 | \ | 53 | \ |
54 | if (datalen < VX_MIN_LEN + VX_ALIGN_MASK) \ | ||
55 | return ___crc32_sw(crc, data, datalen); \ | ||
56 | \ | ||
54 | if ((unsigned long)data & VX_ALIGN_MASK) { \ | 57 | if ((unsigned long)data & VX_ALIGN_MASK) { \ |
55 | prealign = VX_ALIGNMENT - \ | 58 | prealign = VX_ALIGNMENT - \ |
56 | ((unsigned long)data & VX_ALIGN_MASK); \ | 59 | ((unsigned long)data & VX_ALIGN_MASK); \ |
@@ -59,9 +62,6 @@ u32 crc32c_le_vgfm_16(u32 crc, unsigned char const *buf, size_t size); | |||
59 | data = (void *)((unsigned long)data + prealign); \ | 62 | data = (void *)((unsigned long)data + prealign); \ |
60 | } \ | 63 | } \ |
61 | \ | 64 | \ |
62 | if (datalen < VX_MIN_LEN) \ | ||
63 | return ___crc32_sw(crc, data, datalen); \ | ||
64 | \ | ||
65 | aligned = datalen & ~VX_ALIGN_MASK; \ | 65 | aligned = datalen & ~VX_ALIGN_MASK; \ |
66 | remaining = datalen & VX_ALIGN_MASK; \ | 66 | remaining = datalen & VX_ALIGN_MASK; \ |
67 | \ | 67 | \ |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index ccccebeeaaf6..73610f2e3b4f 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -234,7 +234,7 @@ CONFIG_CRYPTO_SHA256_S390=m | |||
234 | CONFIG_CRYPTO_SHA512_S390=m | 234 | CONFIG_CRYPTO_SHA512_S390=m |
235 | CONFIG_CRYPTO_DES_S390=m | 235 | CONFIG_CRYPTO_DES_S390=m |
236 | CONFIG_CRYPTO_AES_S390=m | 236 | CONFIG_CRYPTO_AES_S390=m |
237 | CONFIG_CRYPTO_CRC32_S390=m | 237 | CONFIG_CRYPTO_CRC32_S390=y |
238 | CONFIG_CRC7=m | 238 | CONFIG_CRC7=m |
239 | # CONFIG_XZ_DEC_X86 is not set | 239 | # CONFIG_XZ_DEC_X86 is not set |
240 | # CONFIG_XZ_DEC_POWERPC is not set | 240 | # CONFIG_XZ_DEC_POWERPC is not set |
diff --git a/arch/s390/kernel/head.S b/arch/s390/kernel/head.S index 56e4d8234ef2..4431905f8cfa 100644 --- a/arch/s390/kernel/head.S +++ b/arch/s390/kernel/head.S | |||
@@ -309,7 +309,9 @@ ENTRY(startup_kdump) | |||
309 | l %r15,.Lstack-.LPG0(%r13) | 309 | l %r15,.Lstack-.LPG0(%r13) |
310 | ahi %r15,-STACK_FRAME_OVERHEAD | 310 | ahi %r15,-STACK_FRAME_OVERHEAD |
311 | brasl %r14,verify_facilities | 311 | brasl %r14,verify_facilities |
312 | /* Continue with startup code in head64.S */ | 312 | # For uncompressed images, continue in |
313 | # arch/s390/kernel/head64.S. For compressed images, continue in | ||
314 | # arch/s390/boot/compressed/head.S. | ||
313 | jg startup_continue | 315 | jg startup_continue |
314 | 316 | ||
315 | .Lstack: | 317 | .Lstack: |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index ba5f456edaa9..7f7ba5f23f13 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -204,11 +204,9 @@ static void __init conmode_default(void) | |||
204 | #endif | 204 | #endif |
205 | } | 205 | } |
206 | } else if (MACHINE_IS_KVM) { | 206 | } else if (MACHINE_IS_KVM) { |
207 | if (sclp.has_vt220 && | 207 | if (sclp.has_vt220 && IS_ENABLED(CONFIG_SCLP_VT220_CONSOLE)) |
208 | config_enabled(CONFIG_SCLP_VT220_CONSOLE)) | ||
209 | SET_CONSOLE_VT220; | 208 | SET_CONSOLE_VT220; |
210 | else if (sclp.has_linemode && | 209 | else if (sclp.has_linemode && IS_ENABLED(CONFIG_SCLP_CONSOLE)) |
211 | config_enabled(CONFIG_SCLP_CONSOLE)) | ||
212 | SET_CONSOLE_SCLP; | 210 | SET_CONSOLE_SCLP; |
213 | else | 211 | else |
214 | SET_CONSOLE_HVC; | 212 | SET_CONSOLE_HVC; |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 3f3ae4865d57..f142215ed30d 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -1672,6 +1672,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) | |||
1672 | KVM_SYNC_CRS | | 1672 | KVM_SYNC_CRS | |
1673 | KVM_SYNC_ARCH0 | | 1673 | KVM_SYNC_ARCH0 | |
1674 | KVM_SYNC_PFAULT; | 1674 | KVM_SYNC_PFAULT; |
1675 | kvm_s390_set_prefix(vcpu, 0); | ||
1675 | if (test_kvm_facility(vcpu->kvm, 64)) | 1676 | if (test_kvm_facility(vcpu->kvm, 64)) |
1676 | vcpu->run->kvm_valid_regs |= KVM_SYNC_RICCB; | 1677 | vcpu->run->kvm_valid_regs |= KVM_SYNC_RICCB; |
1677 | /* fprs can be synchronized via vrs, even if the guest has no vx. With | 1678 | /* fprs can be synchronized via vrs, even if the guest has no vx. With |
@@ -2361,8 +2362,10 @@ retry: | |||
2361 | rc = gmap_mprotect_notify(vcpu->arch.gmap, | 2362 | rc = gmap_mprotect_notify(vcpu->arch.gmap, |
2362 | kvm_s390_get_prefix(vcpu), | 2363 | kvm_s390_get_prefix(vcpu), |
2363 | PAGE_SIZE * 2, PROT_WRITE); | 2364 | PAGE_SIZE * 2, PROT_WRITE); |
2364 | if (rc) | 2365 | if (rc) { |
2366 | kvm_make_request(KVM_REQ_MMU_RELOAD, vcpu); | ||
2365 | return rc; | 2367 | return rc; |
2368 | } | ||
2366 | goto retry; | 2369 | goto retry; |
2367 | } | 2370 | } |
2368 | 2371 | ||
diff --git a/arch/s390/lib/string.c b/arch/s390/lib/string.c index e390bbb16443..48352bffbc92 100644 --- a/arch/s390/lib/string.c +++ b/arch/s390/lib/string.c | |||
@@ -237,11 +237,10 @@ char * strrchr(const char * s, int c) | |||
237 | EXPORT_SYMBOL(strrchr); | 237 | EXPORT_SYMBOL(strrchr); |
238 | 238 | ||
239 | static inline int clcle(const char *s1, unsigned long l1, | 239 | static inline int clcle(const char *s1, unsigned long l1, |
240 | const char *s2, unsigned long l2, | 240 | const char *s2, unsigned long l2) |
241 | int *diff) | ||
242 | { | 241 | { |
243 | register unsigned long r2 asm("2") = (unsigned long) s1; | 242 | register unsigned long r2 asm("2") = (unsigned long) s1; |
244 | register unsigned long r3 asm("3") = (unsigned long) l2; | 243 | register unsigned long r3 asm("3") = (unsigned long) l1; |
245 | register unsigned long r4 asm("4") = (unsigned long) s2; | 244 | register unsigned long r4 asm("4") = (unsigned long) s2; |
246 | register unsigned long r5 asm("5") = (unsigned long) l2; | 245 | register unsigned long r5 asm("5") = (unsigned long) l2; |
247 | int cc; | 246 | int cc; |
@@ -252,7 +251,6 @@ static inline int clcle(const char *s1, unsigned long l1, | |||
252 | " srl %0,28" | 251 | " srl %0,28" |
253 | : "=&d" (cc), "+a" (r2), "+a" (r3), | 252 | : "=&d" (cc), "+a" (r2), "+a" (r3), |
254 | "+a" (r4), "+a" (r5) : : "cc"); | 253 | "+a" (r4), "+a" (r5) : : "cc"); |
255 | *diff = *(char *)r2 - *(char *)r4; | ||
256 | return cc; | 254 | return cc; |
257 | } | 255 | } |
258 | 256 | ||
@@ -270,9 +268,9 @@ char * strstr(const char * s1,const char * s2) | |||
270 | return (char *) s1; | 268 | return (char *) s1; |
271 | l1 = __strend(s1) - s1; | 269 | l1 = __strend(s1) - s1; |
272 | while (l1-- >= l2) { | 270 | while (l1-- >= l2) { |
273 | int cc, dummy; | 271 | int cc; |
274 | 272 | ||
275 | cc = clcle(s1, l1, s2, l2, &dummy); | 273 | cc = clcle(s1, l2, s2, l2); |
276 | if (!cc) | 274 | if (!cc) |
277 | return (char *) s1; | 275 | return (char *) s1; |
278 | s1++; | 276 | s1++; |
@@ -313,11 +311,11 @@ EXPORT_SYMBOL(memchr); | |||
313 | */ | 311 | */ |
314 | int memcmp(const void *cs, const void *ct, size_t n) | 312 | int memcmp(const void *cs, const void *ct, size_t n) |
315 | { | 313 | { |
316 | int ret, diff; | 314 | int ret; |
317 | 315 | ||
318 | ret = clcle(cs, n, ct, n, &diff); | 316 | ret = clcle(cs, n, ct, n); |
319 | if (ret) | 317 | if (ret) |
320 | ret = diff; | 318 | ret = ret == 1 ? -1 : 1; |
321 | return ret; | 319 | return ret; |
322 | } | 320 | } |
323 | EXPORT_SYMBOL(memcmp); | 321 | EXPORT_SYMBOL(memcmp); |
diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c index 7104ffb5a67f..af7cf28cf97e 100644 --- a/arch/s390/mm/pageattr.c +++ b/arch/s390/mm/pageattr.c | |||
@@ -252,6 +252,8 @@ static int change_page_attr(unsigned long addr, unsigned long end, | |||
252 | int rc = -EINVAL; | 252 | int rc = -EINVAL; |
253 | pgd_t *pgdp; | 253 | pgd_t *pgdp; |
254 | 254 | ||
255 | if (addr == end) | ||
256 | return 0; | ||
255 | if (end >= MODULES_END) | 257 | if (end >= MODULES_END) |
256 | return -EINVAL; | 258 | return -EINVAL; |
257 | mutex_lock(&cpa_mutex); | 259 | mutex_lock(&cpa_mutex); |
diff --git a/arch/um/include/asm/common.lds.S b/arch/um/include/asm/common.lds.S index 1dd5bd8a8c59..133055311dce 100644 --- a/arch/um/include/asm/common.lds.S +++ b/arch/um/include/asm/common.lds.S | |||
@@ -81,7 +81,7 @@ | |||
81 | .altinstr_replacement : { *(.altinstr_replacement) } | 81 | .altinstr_replacement : { *(.altinstr_replacement) } |
82 | /* .exit.text is discard at runtime, not link time, to deal with references | 82 | /* .exit.text is discard at runtime, not link time, to deal with references |
83 | from .altinstructions and .eh_frame */ | 83 | from .altinstructions and .eh_frame */ |
84 | .exit.text : { *(.exit.text) } | 84 | .exit.text : { EXIT_TEXT } |
85 | .exit.data : { *(.exit.data) } | 85 | .exit.data : { *(.exit.data) } |
86 | 86 | ||
87 | .preinit_array : { | 87 | .preinit_array : { |
diff --git a/arch/unicore32/include/asm/mmu_context.h b/arch/unicore32/include/asm/mmu_context.h index e35632ef23c7..62dfc644c908 100644 --- a/arch/unicore32/include/asm/mmu_context.h +++ b/arch/unicore32/include/asm/mmu_context.h | |||
@@ -98,7 +98,7 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, | |||
98 | } | 98 | } |
99 | 99 | ||
100 | static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, | 100 | static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, |
101 | bool write, bool foreign) | 101 | bool write, bool execute, bool foreign) |
102 | { | 102 | { |
103 | /* by default, allow everything */ | 103 | /* by default, allow everything */ |
104 | return true; | 104 | return true; |
diff --git a/arch/x86/crypto/sha256-mb/sha256_mb.c b/arch/x86/crypto/sha256-mb/sha256_mb.c index 89fa85e8b10c..6f97fb33ae21 100644 --- a/arch/x86/crypto/sha256-mb/sha256_mb.c +++ b/arch/x86/crypto/sha256-mb/sha256_mb.c | |||
@@ -485,10 +485,10 @@ static int sha_complete_job(struct mcryptd_hash_request_ctx *rctx, | |||
485 | 485 | ||
486 | req = cast_mcryptd_ctx_to_req(req_ctx); | 486 | req = cast_mcryptd_ctx_to_req(req_ctx); |
487 | if (irqs_disabled()) | 487 | if (irqs_disabled()) |
488 | rctx->complete(&req->base, ret); | 488 | req_ctx->complete(&req->base, ret); |
489 | else { | 489 | else { |
490 | local_bh_disable(); | 490 | local_bh_disable(); |
491 | rctx->complete(&req->base, ret); | 491 | req_ctx->complete(&req->base, ret); |
492 | local_bh_enable(); | 492 | local_bh_enable(); |
493 | } | 493 | } |
494 | } | 494 | } |
diff --git a/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S b/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S index b691da981cd9..a78a0694ddef 100644 --- a/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S +++ b/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S | |||
@@ -265,13 +265,14 @@ ENTRY(sha256_mb_mgr_get_comp_job_avx2) | |||
265 | vpinsrd $1, _args_digest+1*32(state, idx, 4), %xmm0, %xmm0 | 265 | vpinsrd $1, _args_digest+1*32(state, idx, 4), %xmm0, %xmm0 |
266 | vpinsrd $2, _args_digest+2*32(state, idx, 4), %xmm0, %xmm0 | 266 | vpinsrd $2, _args_digest+2*32(state, idx, 4), %xmm0, %xmm0 |
267 | vpinsrd $3, _args_digest+3*32(state, idx, 4), %xmm0, %xmm0 | 267 | vpinsrd $3, _args_digest+3*32(state, idx, 4), %xmm0, %xmm0 |
268 | movl _args_digest+4*32(state, idx, 4), tmp2_w | 268 | vmovd _args_digest(state , idx, 4) , %xmm0 |
269 | vpinsrd $1, _args_digest+5*32(state, idx, 4), %xmm1, %xmm1 | 269 | vpinsrd $1, _args_digest+5*32(state, idx, 4), %xmm1, %xmm1 |
270 | vpinsrd $2, _args_digest+6*32(state, idx, 4), %xmm1, %xmm1 | 270 | vpinsrd $2, _args_digest+6*32(state, idx, 4), %xmm1, %xmm1 |
271 | vpinsrd $3, _args_digest+7*32(state, idx, 4), %xmm1, %xmm1 | 271 | vpinsrd $3, _args_digest+7*32(state, idx, 4), %xmm1, %xmm1 |
272 | 272 | ||
273 | vmovdqu %xmm0, _result_digest(job_rax) | 273 | vmovdqu %xmm0, _result_digest(job_rax) |
274 | movl tmp2_w, _result_digest+1*16(job_rax) | 274 | offset = (_result_digest + 1*16) |
275 | vmovdqu %xmm1, offset(job_rax) | ||
275 | 276 | ||
276 | pop %rbx | 277 | pop %rbx |
277 | 278 | ||
diff --git a/arch/x86/crypto/sha512-mb/sha512_mb.c b/arch/x86/crypto/sha512-mb/sha512_mb.c index f4cf5b78fd36..d210174a52b0 100644 --- a/arch/x86/crypto/sha512-mb/sha512_mb.c +++ b/arch/x86/crypto/sha512-mb/sha512_mb.c | |||
@@ -497,10 +497,10 @@ static int sha_complete_job(struct mcryptd_hash_request_ctx *rctx, | |||
497 | 497 | ||
498 | req = cast_mcryptd_ctx_to_req(req_ctx); | 498 | req = cast_mcryptd_ctx_to_req(req_ctx); |
499 | if (irqs_disabled()) | 499 | if (irqs_disabled()) |
500 | rctx->complete(&req->base, ret); | 500 | req_ctx->complete(&req->base, ret); |
501 | else { | 501 | else { |
502 | local_bh_disable(); | 502 | local_bh_disable(); |
503 | rctx->complete(&req->base, ret); | 503 | req_ctx->complete(&req->base, ret); |
504 | local_bh_enable(); | 504 | local_bh_enable(); |
505 | } | 505 | } |
506 | } | 506 | } |
diff --git a/arch/x86/entry/Makefile b/arch/x86/entry/Makefile index fe91c25092da..77f28ce9c646 100644 --- a/arch/x86/entry/Makefile +++ b/arch/x86/entry/Makefile | |||
@@ -5,6 +5,8 @@ | |||
5 | OBJECT_FILES_NON_STANDARD_entry_$(BITS).o := y | 5 | OBJECT_FILES_NON_STANDARD_entry_$(BITS).o := y |
6 | OBJECT_FILES_NON_STANDARD_entry_64_compat.o := y | 6 | OBJECT_FILES_NON_STANDARD_entry_64_compat.o := y |
7 | 7 | ||
8 | CFLAGS_syscall_64.o += -Wno-override-init | ||
9 | CFLAGS_syscall_32.o += -Wno-override-init | ||
8 | obj-y := entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o | 10 | obj-y := entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o |
9 | obj-y += common.o | 11 | obj-y += common.o |
10 | 12 | ||
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index b846875aeea6..d172c619c449 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S | |||
@@ -288,11 +288,15 @@ return_from_SYSCALL_64: | |||
288 | jne opportunistic_sysret_failed | 288 | jne opportunistic_sysret_failed |
289 | 289 | ||
290 | /* | 290 | /* |
291 | * SYSRET can't restore RF. SYSRET can restore TF, but unlike IRET, | 291 | * SYSCALL clears RF when it saves RFLAGS in R11 and SYSRET cannot |
292 | * restoring TF results in a trap from userspace immediately after | 292 | * restore RF properly. If the slowpath sets it for whatever reason, we |
293 | * SYSRET. This would cause an infinite loop whenever #DB happens | 293 | * need to restore it correctly. |
294 | * with register state that satisfies the opportunistic SYSRET | 294 | * |
295 | * conditions. For example, single-stepping this user code: | 295 | * SYSRET can restore TF, but unlike IRET, restoring TF results in a |
296 | * trap from userspace immediately after SYSRET. This would cause an | ||
297 | * infinite loop whenever #DB happens with register state that satisfies | ||
298 | * the opportunistic SYSRET conditions. For example, single-stepping | ||
299 | * this user code: | ||
296 | * | 300 | * |
297 | * movq $stuck_here, %rcx | 301 | * movq $stuck_here, %rcx |
298 | * pushfq | 302 | * pushfq |
@@ -601,9 +605,20 @@ apicinterrupt3 \num trace(\sym) smp_trace(\sym) | |||
601 | .endm | 605 | .endm |
602 | #endif | 606 | #endif |
603 | 607 | ||
608 | /* Make sure APIC interrupt handlers end up in the irqentry section: */ | ||
609 | #if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN) | ||
610 | # define PUSH_SECTION_IRQENTRY .pushsection .irqentry.text, "ax" | ||
611 | # define POP_SECTION_IRQENTRY .popsection | ||
612 | #else | ||
613 | # define PUSH_SECTION_IRQENTRY | ||
614 | # define POP_SECTION_IRQENTRY | ||
615 | #endif | ||
616 | |||
604 | .macro apicinterrupt num sym do_sym | 617 | .macro apicinterrupt num sym do_sym |
618 | PUSH_SECTION_IRQENTRY | ||
605 | apicinterrupt3 \num \sym \do_sym | 619 | apicinterrupt3 \num \sym \do_sym |
606 | trace_apicinterrupt \num \sym | 620 | trace_apicinterrupt \num \sym |
621 | POP_SECTION_IRQENTRY | ||
607 | .endm | 622 | .endm |
608 | 623 | ||
609 | #ifdef CONFIG_SMP | 624 | #ifdef CONFIG_SMP |
diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c index 97a69dbba649..9d35ec0cb8fc 100644 --- a/arch/x86/events/intel/uncore_snb.c +++ b/arch/x86/events/intel/uncore_snb.c | |||
@@ -100,6 +100,12 @@ static void snb_uncore_msr_init_box(struct intel_uncore_box *box) | |||
100 | } | 100 | } |
101 | } | 101 | } |
102 | 102 | ||
103 | static void snb_uncore_msr_enable_box(struct intel_uncore_box *box) | ||
104 | { | ||
105 | wrmsrl(SNB_UNC_PERF_GLOBAL_CTL, | ||
106 | SNB_UNC_GLOBAL_CTL_EN | SNB_UNC_GLOBAL_CTL_CORE_ALL); | ||
107 | } | ||
108 | |||
103 | static void snb_uncore_msr_exit_box(struct intel_uncore_box *box) | 109 | static void snb_uncore_msr_exit_box(struct intel_uncore_box *box) |
104 | { | 110 | { |
105 | if (box->pmu->pmu_idx == 0) | 111 | if (box->pmu->pmu_idx == 0) |
@@ -127,6 +133,7 @@ static struct attribute_group snb_uncore_format_group = { | |||
127 | 133 | ||
128 | static struct intel_uncore_ops snb_uncore_msr_ops = { | 134 | static struct intel_uncore_ops snb_uncore_msr_ops = { |
129 | .init_box = snb_uncore_msr_init_box, | 135 | .init_box = snb_uncore_msr_init_box, |
136 | .enable_box = snb_uncore_msr_enable_box, | ||
130 | .exit_box = snb_uncore_msr_exit_box, | 137 | .exit_box = snb_uncore_msr_exit_box, |
131 | .disable_event = snb_uncore_msr_disable_event, | 138 | .disable_event = snb_uncore_msr_disable_event, |
132 | .enable_event = snb_uncore_msr_enable_event, | 139 | .enable_event = snb_uncore_msr_enable_event, |
@@ -192,6 +199,12 @@ static void skl_uncore_msr_init_box(struct intel_uncore_box *box) | |||
192 | } | 199 | } |
193 | } | 200 | } |
194 | 201 | ||
202 | static void skl_uncore_msr_enable_box(struct intel_uncore_box *box) | ||
203 | { | ||
204 | wrmsrl(SKL_UNC_PERF_GLOBAL_CTL, | ||
205 | SNB_UNC_GLOBAL_CTL_EN | SKL_UNC_GLOBAL_CTL_CORE_ALL); | ||
206 | } | ||
207 | |||
195 | static void skl_uncore_msr_exit_box(struct intel_uncore_box *box) | 208 | static void skl_uncore_msr_exit_box(struct intel_uncore_box *box) |
196 | { | 209 | { |
197 | if (box->pmu->pmu_idx == 0) | 210 | if (box->pmu->pmu_idx == 0) |
@@ -200,6 +213,7 @@ static void skl_uncore_msr_exit_box(struct intel_uncore_box *box) | |||
200 | 213 | ||
201 | static struct intel_uncore_ops skl_uncore_msr_ops = { | 214 | static struct intel_uncore_ops skl_uncore_msr_ops = { |
202 | .init_box = skl_uncore_msr_init_box, | 215 | .init_box = skl_uncore_msr_init_box, |
216 | .enable_box = skl_uncore_msr_enable_box, | ||
203 | .exit_box = skl_uncore_msr_exit_box, | 217 | .exit_box = skl_uncore_msr_exit_box, |
204 | .disable_event = snb_uncore_msr_disable_event, | 218 | .disable_event = snb_uncore_msr_disable_event, |
205 | .enable_event = snb_uncore_msr_enable_event, | 219 | .enable_event = snb_uncore_msr_enable_event, |
diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c index 824e54086e07..8aee83bcf71f 100644 --- a/arch/x86/events/intel/uncore_snbep.c +++ b/arch/x86/events/intel/uncore_snbep.c | |||
@@ -2626,7 +2626,7 @@ void hswep_uncore_cpu_init(void) | |||
2626 | 2626 | ||
2627 | static struct intel_uncore_type hswep_uncore_ha = { | 2627 | static struct intel_uncore_type hswep_uncore_ha = { |
2628 | .name = "ha", | 2628 | .name = "ha", |
2629 | .num_counters = 5, | 2629 | .num_counters = 4, |
2630 | .num_boxes = 2, | 2630 | .num_boxes = 2, |
2631 | .perf_ctr_bits = 48, | 2631 | .perf_ctr_bits = 48, |
2632 | SNBEP_UNCORE_PCI_COMMON_INIT(), | 2632 | SNBEP_UNCORE_PCI_COMMON_INIT(), |
@@ -2645,7 +2645,7 @@ static struct uncore_event_desc hswep_uncore_imc_events[] = { | |||
2645 | 2645 | ||
2646 | static struct intel_uncore_type hswep_uncore_imc = { | 2646 | static struct intel_uncore_type hswep_uncore_imc = { |
2647 | .name = "imc", | 2647 | .name = "imc", |
2648 | .num_counters = 5, | 2648 | .num_counters = 4, |
2649 | .num_boxes = 8, | 2649 | .num_boxes = 8, |
2650 | .perf_ctr_bits = 48, | 2650 | .perf_ctr_bits = 48, |
2651 | .fixed_ctr_bits = 48, | 2651 | .fixed_ctr_bits = 48, |
@@ -2691,7 +2691,7 @@ static struct intel_uncore_type hswep_uncore_irp = { | |||
2691 | 2691 | ||
2692 | static struct intel_uncore_type hswep_uncore_qpi = { | 2692 | static struct intel_uncore_type hswep_uncore_qpi = { |
2693 | .name = "qpi", | 2693 | .name = "qpi", |
2694 | .num_counters = 5, | 2694 | .num_counters = 4, |
2695 | .num_boxes = 3, | 2695 | .num_boxes = 3, |
2696 | .perf_ctr_bits = 48, | 2696 | .perf_ctr_bits = 48, |
2697 | .perf_ctr = SNBEP_PCI_PMON_CTR0, | 2697 | .perf_ctr = SNBEP_PCI_PMON_CTR0, |
@@ -2773,7 +2773,7 @@ static struct event_constraint hswep_uncore_r3qpi_constraints[] = { | |||
2773 | 2773 | ||
2774 | static struct intel_uncore_type hswep_uncore_r3qpi = { | 2774 | static struct intel_uncore_type hswep_uncore_r3qpi = { |
2775 | .name = "r3qpi", | 2775 | .name = "r3qpi", |
2776 | .num_counters = 4, | 2776 | .num_counters = 3, |
2777 | .num_boxes = 3, | 2777 | .num_boxes = 3, |
2778 | .perf_ctr_bits = 44, | 2778 | .perf_ctr_bits = 44, |
2779 | .constraints = hswep_uncore_r3qpi_constraints, | 2779 | .constraints = hswep_uncore_r3qpi_constraints, |
@@ -2972,7 +2972,7 @@ static struct intel_uncore_type bdx_uncore_ha = { | |||
2972 | 2972 | ||
2973 | static struct intel_uncore_type bdx_uncore_imc = { | 2973 | static struct intel_uncore_type bdx_uncore_imc = { |
2974 | .name = "imc", | 2974 | .name = "imc", |
2975 | .num_counters = 5, | 2975 | .num_counters = 4, |
2976 | .num_boxes = 8, | 2976 | .num_boxes = 8, |
2977 | .perf_ctr_bits = 48, | 2977 | .perf_ctr_bits = 48, |
2978 | .fixed_ctr_bits = 48, | 2978 | .fixed_ctr_bits = 48, |
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index f5befd4945f2..124357773ffa 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
@@ -135,6 +135,7 @@ extern void init_apic_mappings(void); | |||
135 | void register_lapic_address(unsigned long address); | 135 | void register_lapic_address(unsigned long address); |
136 | extern void setup_boot_APIC_clock(void); | 136 | extern void setup_boot_APIC_clock(void); |
137 | extern void setup_secondary_APIC_clock(void); | 137 | extern void setup_secondary_APIC_clock(void); |
138 | extern void lapic_update_tsc_freq(void); | ||
138 | extern int APIC_init_uniprocessor(void); | 139 | extern int APIC_init_uniprocessor(void); |
139 | 140 | ||
140 | #ifdef CONFIG_X86_64 | 141 | #ifdef CONFIG_X86_64 |
@@ -170,6 +171,7 @@ static inline void init_apic_mappings(void) { } | |||
170 | static inline void disable_local_APIC(void) { } | 171 | static inline void disable_local_APIC(void) { } |
171 | # define setup_boot_APIC_clock x86_init_noop | 172 | # define setup_boot_APIC_clock x86_init_noop |
172 | # define setup_secondary_APIC_clock x86_init_noop | 173 | # define setup_secondary_APIC_clock x86_init_noop |
174 | static inline void lapic_update_tsc_freq(void) { } | ||
173 | #endif /* !CONFIG_X86_LOCAL_APIC */ | 175 | #endif /* !CONFIG_X86_LOCAL_APIC */ |
174 | 176 | ||
175 | #ifdef CONFIG_X86_X2APIC | 177 | #ifdef CONFIG_X86_X2APIC |
diff --git a/arch/x86/include/asm/hardirq.h b/arch/x86/include/asm/hardirq.h index 7178043b0e1d..59405a248fc2 100644 --- a/arch/x86/include/asm/hardirq.h +++ b/arch/x86/include/asm/hardirq.h | |||
@@ -22,10 +22,6 @@ typedef struct { | |||
22 | #ifdef CONFIG_SMP | 22 | #ifdef CONFIG_SMP |
23 | unsigned int irq_resched_count; | 23 | unsigned int irq_resched_count; |
24 | unsigned int irq_call_count; | 24 | unsigned int irq_call_count; |
25 | /* | ||
26 | * irq_tlb_count is double-counted in irq_call_count, so it must be | ||
27 | * subtracted from irq_call_count when displaying irq_call_count | ||
28 | */ | ||
29 | unsigned int irq_tlb_count; | 25 | unsigned int irq_tlb_count; |
30 | #endif | 26 | #endif |
31 | #ifdef CONFIG_X86_THERMAL_VECTOR | 27 | #ifdef CONFIG_X86_THERMAL_VECTOR |
diff --git a/arch/x86/include/asm/init.h b/arch/x86/include/asm/init.h index 223042086f4e..737da62bfeb0 100644 --- a/arch/x86/include/asm/init.h +++ b/arch/x86/include/asm/init.h | |||
@@ -5,10 +5,10 @@ struct x86_mapping_info { | |||
5 | void *(*alloc_pgt_page)(void *); /* allocate buf for page table */ | 5 | void *(*alloc_pgt_page)(void *); /* allocate buf for page table */ |
6 | void *context; /* context for alloc_pgt_page */ | 6 | void *context; /* context for alloc_pgt_page */ |
7 | unsigned long pmd_flag; /* page flag for PMD entry */ | 7 | unsigned long pmd_flag; /* page flag for PMD entry */ |
8 | bool kernel_mapping; /* kernel mapping or ident mapping */ | 8 | unsigned long offset; /* ident mapping offset */ |
9 | }; | 9 | }; |
10 | 10 | ||
11 | int kernel_ident_mapping_init(struct x86_mapping_info *info, pgd_t *pgd_page, | 11 | int kernel_ident_mapping_init(struct x86_mapping_info *info, pgd_t *pgd_page, |
12 | unsigned long addr, unsigned long end); | 12 | unsigned long pstart, unsigned long pend); |
13 | 13 | ||
14 | #endif /* _ASM_X86_INIT_H */ | 14 | #endif /* _ASM_X86_INIT_H */ |
diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h index 7e8ec7ae10fa..1cc82ece9ac1 100644 --- a/arch/x86/include/asm/pgtable_64.h +++ b/arch/x86/include/asm/pgtable_64.h | |||
@@ -145,7 +145,7 @@ static inline int pgd_large(pgd_t pgd) { return 0; } | |||
145 | * | 145 | * |
146 | * | ... | 11| 10| 9|8|7|6|5| 4| 3|2|1|0| <- bit number | 146 | * | ... | 11| 10| 9|8|7|6|5| 4| 3|2|1|0| <- bit number |
147 | * | ... |SW3|SW2|SW1|G|L|D|A|CD|WT|U|W|P| <- bit names | 147 | * | ... |SW3|SW2|SW1|G|L|D|A|CD|WT|U|W|P| <- bit names |
148 | * | OFFSET (14->63) | TYPE (10-13) |0|X|X|X| X| X|X|X|0| <- swp entry | 148 | * | OFFSET (14->63) | TYPE (9-13) |0|X|X|X| X| X|X|X|0| <- swp entry |
149 | * | 149 | * |
150 | * G (8) is aliased and used as a PROT_NONE indicator for | 150 | * G (8) is aliased and used as a PROT_NONE indicator for |
151 | * !present ptes. We need to start storing swap entries above | 151 | * !present ptes. We need to start storing swap entries above |
@@ -156,7 +156,7 @@ static inline int pgd_large(pgd_t pgd) { return 0; } | |||
156 | #define SWP_TYPE_FIRST_BIT (_PAGE_BIT_PROTNONE + 1) | 156 | #define SWP_TYPE_FIRST_BIT (_PAGE_BIT_PROTNONE + 1) |
157 | #define SWP_TYPE_BITS 5 | 157 | #define SWP_TYPE_BITS 5 |
158 | /* Place the offset above the type: */ | 158 | /* Place the offset above the type: */ |
159 | #define SWP_OFFSET_FIRST_BIT (SWP_TYPE_FIRST_BIT + SWP_TYPE_BITS + 1) | 159 | #define SWP_OFFSET_FIRST_BIT (SWP_TYPE_FIRST_BIT + SWP_TYPE_BITS) |
160 | 160 | ||
161 | #define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS) | 161 | #define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS) |
162 | 162 | ||
diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h index 9c6b890d5e7a..b2988c0ed829 100644 --- a/arch/x86/include/asm/realmode.h +++ b/arch/x86/include/asm/realmode.h | |||
@@ -58,7 +58,15 @@ extern unsigned char boot_gdt[]; | |||
58 | extern unsigned char secondary_startup_64[]; | 58 | extern unsigned char secondary_startup_64[]; |
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | static inline size_t real_mode_size_needed(void) | ||
62 | { | ||
63 | if (real_mode_header) | ||
64 | return 0; /* already allocated. */ | ||
65 | |||
66 | return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE); | ||
67 | } | ||
68 | |||
69 | void set_real_mode_mem(phys_addr_t mem, size_t size); | ||
61 | void reserve_real_mode(void); | 70 | void reserve_real_mode(void); |
62 | void setup_real_mode(void); | ||
63 | 71 | ||
64 | #endif /* _ARCH_X86_REALMODE_H */ | 72 | #endif /* _ARCH_X86_REALMODE_H */ |
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 4e5be94e079a..6fa85944af83 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h | |||
@@ -135,7 +135,14 @@ static inline void cr4_set_bits_and_update_boot(unsigned long mask) | |||
135 | 135 | ||
136 | static inline void __native_flush_tlb(void) | 136 | static inline void __native_flush_tlb(void) |
137 | { | 137 | { |
138 | /* | ||
139 | * If current->mm == NULL then we borrow a mm which may change during a | ||
140 | * task switch and therefore we must not be preempted while we write CR3 | ||
141 | * back: | ||
142 | */ | ||
143 | preempt_disable(); | ||
138 | native_write_cr3(native_read_cr3()); | 144 | native_write_cr3(native_read_cr3()); |
145 | preempt_enable(); | ||
139 | } | 146 | } |
140 | 147 | ||
141 | static inline void __native_flush_tlb_global_irq_disabled(void) | 148 | static inline void __native_flush_tlb_global_irq_disabled(void) |
diff --git a/arch/x86/include/asm/uv/bios.h b/arch/x86/include/asm/uv/bios.h index c852590254d5..e652a7cc6186 100644 --- a/arch/x86/include/asm/uv/bios.h +++ b/arch/x86/include/asm/uv/bios.h | |||
@@ -79,7 +79,7 @@ struct uv_gam_range_entry { | |||
79 | u16 nasid; /* HNasid */ | 79 | u16 nasid; /* HNasid */ |
80 | u16 sockid; /* Socket ID, high bits of APIC ID */ | 80 | u16 sockid; /* Socket ID, high bits of APIC ID */ |
81 | u16 pnode; /* Index to MMR and GRU spaces */ | 81 | u16 pnode; /* Index to MMR and GRU spaces */ |
82 | u32 pxm; /* ACPI proximity domain number */ | 82 | u32 unused2; |
83 | u32 limit; /* PA bits 56:26 (UV_GAM_RANGE_SHFT) */ | 83 | u32 limit; /* PA bits 56:26 (UV_GAM_RANGE_SHFT) */ |
84 | }; | 84 | }; |
85 | 85 | ||
@@ -88,7 +88,8 @@ struct uv_gam_range_entry { | |||
88 | #define UV_SYSTAB_VERSION_UV4 0x400 /* UV4 BIOS base version */ | 88 | #define UV_SYSTAB_VERSION_UV4 0x400 /* UV4 BIOS base version */ |
89 | #define UV_SYSTAB_VERSION_UV4_1 0x401 /* + gpa_shift */ | 89 | #define UV_SYSTAB_VERSION_UV4_1 0x401 /* + gpa_shift */ |
90 | #define UV_SYSTAB_VERSION_UV4_2 0x402 /* + TYPE_NVRAM/WINDOW/MBOX */ | 90 | #define UV_SYSTAB_VERSION_UV4_2 0x402 /* + TYPE_NVRAM/WINDOW/MBOX */ |
91 | #define UV_SYSTAB_VERSION_UV4_LATEST UV_SYSTAB_VERSION_UV4_2 | 91 | #define UV_SYSTAB_VERSION_UV4_3 0x403 /* - GAM Range PXM Value */ |
92 | #define UV_SYSTAB_VERSION_UV4_LATEST UV_SYSTAB_VERSION_UV4_3 | ||
92 | 93 | ||
93 | #define UV_SYSTAB_TYPE_UNUSED 0 /* End of table (offset == 0) */ | 94 | #define UV_SYSTAB_TYPE_UNUSED 0 /* End of table (offset == 0) */ |
94 | #define UV_SYSTAB_TYPE_GAM_PARAMS 1 /* GAM PARAM conversions */ | 95 | #define UV_SYSTAB_TYPE_GAM_PARAMS 1 /* GAM PARAM conversions */ |
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 20abd912f0e4..50c95af0f017 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -313,7 +313,7 @@ int lapic_get_maxlvt(void) | |||
313 | 313 | ||
314 | /* Clock divisor */ | 314 | /* Clock divisor */ |
315 | #define APIC_DIVISOR 16 | 315 | #define APIC_DIVISOR 16 |
316 | #define TSC_DIVISOR 32 | 316 | #define TSC_DIVISOR 8 |
317 | 317 | ||
318 | /* | 318 | /* |
319 | * This function sets up the local APIC timer, with a timeout of | 319 | * This function sets up the local APIC timer, with a timeout of |
@@ -565,13 +565,37 @@ static void setup_APIC_timer(void) | |||
565 | CLOCK_EVT_FEAT_DUMMY); | 565 | CLOCK_EVT_FEAT_DUMMY); |
566 | levt->set_next_event = lapic_next_deadline; | 566 | levt->set_next_event = lapic_next_deadline; |
567 | clockevents_config_and_register(levt, | 567 | clockevents_config_and_register(levt, |
568 | (tsc_khz / TSC_DIVISOR) * 1000, | 568 | tsc_khz * (1000 / TSC_DIVISOR), |
569 | 0xF, ~0UL); | 569 | 0xF, ~0UL); |
570 | } else | 570 | } else |
571 | clockevents_register_device(levt); | 571 | clockevents_register_device(levt); |
572 | } | 572 | } |
573 | 573 | ||
574 | /* | 574 | /* |
575 | * Install the updated TSC frequency from recalibration at the TSC | ||
576 | * deadline clockevent devices. | ||
577 | */ | ||
578 | static void __lapic_update_tsc_freq(void *info) | ||
579 | { | ||
580 | struct clock_event_device *levt = this_cpu_ptr(&lapic_events); | ||
581 | |||
582 | if (!this_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER)) | ||
583 | return; | ||
584 | |||
585 | clockevents_update_freq(levt, tsc_khz * (1000 / TSC_DIVISOR)); | ||
586 | } | ||
587 | |||
588 | void lapic_update_tsc_freq(void) | ||
589 | { | ||
590 | /* | ||
591 | * The clockevent device's ->mult and ->shift can both be | ||
592 | * changed. In order to avoid races, schedule the frequency | ||
593 | * update code on each CPU. | ||
594 | */ | ||
595 | on_each_cpu(__lapic_update_tsc_freq, NULL, 0); | ||
596 | } | ||
597 | |||
598 | /* | ||
575 | * In this functions we calibrate APIC bus clocks to the external timer. | 599 | * In this functions we calibrate APIC bus clocks to the external timer. |
576 | * | 600 | * |
577 | * We want to do the calibration only once since we want to have local timer | 601 | * We want to do the calibration only once since we want to have local timer |
@@ -1599,6 +1623,9 @@ void __init enable_IR_x2apic(void) | |||
1599 | unsigned long flags; | 1623 | unsigned long flags; |
1600 | int ret, ir_stat; | 1624 | int ret, ir_stat; |
1601 | 1625 | ||
1626 | if (skip_ioapic_setup) | ||
1627 | return; | ||
1628 | |||
1602 | ir_stat = irq_remapping_prepare(); | 1629 | ir_stat = irq_remapping_prepare(); |
1603 | if (ir_stat < 0 && !x2apic_supported()) | 1630 | if (ir_stat < 0 && !x2apic_supported()) |
1604 | return; | 1631 | return; |
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 6368fa69d2af..54f35d988025 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
@@ -155,7 +155,7 @@ static void init_x2apic_ldr(void) | |||
155 | /* | 155 | /* |
156 | * At CPU state changes, update the x2apic cluster sibling info. | 156 | * At CPU state changes, update the x2apic cluster sibling info. |
157 | */ | 157 | */ |
158 | int x2apic_prepare_cpu(unsigned int cpu) | 158 | static int x2apic_prepare_cpu(unsigned int cpu) |
159 | { | 159 | { |
160 | if (!zalloc_cpumask_var(&per_cpu(cpus_in_cluster, cpu), GFP_KERNEL)) | 160 | if (!zalloc_cpumask_var(&per_cpu(cpus_in_cluster, cpu), GFP_KERNEL)) |
161 | return -ENOMEM; | 161 | return -ENOMEM; |
@@ -168,7 +168,7 @@ int x2apic_prepare_cpu(unsigned int cpu) | |||
168 | return 0; | 168 | return 0; |
169 | } | 169 | } |
170 | 170 | ||
171 | int x2apic_dead_cpu(unsigned int this_cpu) | 171 | static int x2apic_dead_cpu(unsigned int this_cpu) |
172 | { | 172 | { |
173 | int cpu; | 173 | int cpu; |
174 | 174 | ||
@@ -186,13 +186,18 @@ int x2apic_dead_cpu(unsigned int this_cpu) | |||
186 | static int x2apic_cluster_probe(void) | 186 | static int x2apic_cluster_probe(void) |
187 | { | 187 | { |
188 | int cpu = smp_processor_id(); | 188 | int cpu = smp_processor_id(); |
189 | int ret; | ||
189 | 190 | ||
190 | if (!x2apic_mode) | 191 | if (!x2apic_mode) |
191 | return 0; | 192 | return 0; |
192 | 193 | ||
194 | ret = cpuhp_setup_state(CPUHP_X2APIC_PREPARE, "X2APIC_PREPARE", | ||
195 | x2apic_prepare_cpu, x2apic_dead_cpu); | ||
196 | if (ret < 0) { | ||
197 | pr_err("Failed to register X2APIC_PREPARE\n"); | ||
198 | return 0; | ||
199 | } | ||
193 | cpumask_set_cpu(cpu, per_cpu(cpus_in_cluster, cpu)); | 200 | cpumask_set_cpu(cpu, per_cpu(cpus_in_cluster, cpu)); |
194 | cpuhp_setup_state(CPUHP_X2APIC_PREPARE, "X2APIC_PREPARE", | ||
195 | x2apic_prepare_cpu, x2apic_dead_cpu); | ||
196 | return 1; | 201 | return 1; |
197 | } | 202 | } |
198 | 203 | ||
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 09b59adaea3f..cb0673c1e940 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -223,6 +223,11 @@ static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
223 | if (strncmp(oem_id, "SGI", 3) != 0) | 223 | if (strncmp(oem_id, "SGI", 3) != 0) |
224 | return 0; | 224 | return 0; |
225 | 225 | ||
226 | if (numa_off) { | ||
227 | pr_err("UV: NUMA is off, disabling UV support\n"); | ||
228 | return 0; | ||
229 | } | ||
230 | |||
226 | /* Setup early hub type field in uv_hub_info for Node 0 */ | 231 | /* Setup early hub type field in uv_hub_info for Node 0 */ |
227 | uv_cpu_info->p_uv_hub_info = &uv_hub_info_node0; | 232 | uv_cpu_info->p_uv_hub_info = &uv_hub_info_node0; |
228 | 233 | ||
@@ -325,7 +330,7 @@ static __init void build_uv_gr_table(void) | |||
325 | struct uv_gam_range_entry *gre = uv_gre_table; | 330 | struct uv_gam_range_entry *gre = uv_gre_table; |
326 | struct uv_gam_range_s *grt; | 331 | struct uv_gam_range_s *grt; |
327 | unsigned long last_limit = 0, ram_limit = 0; | 332 | unsigned long last_limit = 0, ram_limit = 0; |
328 | int bytes, i, sid, lsid = -1; | 333 | int bytes, i, sid, lsid = -1, indx = 0, lindx = -1; |
329 | 334 | ||
330 | if (!gre) | 335 | if (!gre) |
331 | return; | 336 | return; |
@@ -356,11 +361,12 @@ static __init void build_uv_gr_table(void) | |||
356 | } | 361 | } |
357 | sid = gre->sockid - _min_socket; | 362 | sid = gre->sockid - _min_socket; |
358 | if (lsid < sid) { /* new range */ | 363 | if (lsid < sid) { /* new range */ |
359 | grt = &_gr_table[sid]; | 364 | grt = &_gr_table[indx]; |
360 | grt->base = lsid; | 365 | grt->base = lindx; |
361 | grt->nasid = gre->nasid; | 366 | grt->nasid = gre->nasid; |
362 | grt->limit = last_limit = gre->limit; | 367 | grt->limit = last_limit = gre->limit; |
363 | lsid = sid; | 368 | lsid = sid; |
369 | lindx = indx++; | ||
364 | continue; | 370 | continue; |
365 | } | 371 | } |
366 | if (lsid == sid && !ram_limit) { /* update range */ | 372 | if (lsid == sid && !ram_limit) { /* update range */ |
@@ -371,7 +377,7 @@ static __init void build_uv_gr_table(void) | |||
371 | } | 377 | } |
372 | if (!ram_limit) { /* non-contiguous ram range */ | 378 | if (!ram_limit) { /* non-contiguous ram range */ |
373 | grt++; | 379 | grt++; |
374 | grt->base = sid - 1; | 380 | grt->base = lindx; |
375 | grt->nasid = gre->nasid; | 381 | grt->nasid = gre->nasid; |
376 | grt->limit = last_limit = gre->limit; | 382 | grt->limit = last_limit = gre->limit; |
377 | continue; | 383 | continue; |
@@ -1155,19 +1161,18 @@ static void __init decode_gam_rng_tbl(unsigned long ptr) | |||
1155 | for (; gre->type != UV_GAM_RANGE_TYPE_UNUSED; gre++) { | 1161 | for (; gre->type != UV_GAM_RANGE_TYPE_UNUSED; gre++) { |
1156 | if (!index) { | 1162 | if (!index) { |
1157 | pr_info("UV: GAM Range Table...\n"); | 1163 | pr_info("UV: GAM Range Table...\n"); |
1158 | pr_info("UV: # %20s %14s %5s %4s %5s %3s %2s %3s\n", | 1164 | pr_info("UV: # %20s %14s %5s %4s %5s %3s %2s\n", |
1159 | "Range", "", "Size", "Type", "NASID", | 1165 | "Range", "", "Size", "Type", "NASID", |
1160 | "SID", "PN", "PXM"); | 1166 | "SID", "PN"); |
1161 | } | 1167 | } |
1162 | pr_info( | 1168 | pr_info( |
1163 | "UV: %2d: 0x%014lx-0x%014lx %5luG %3d %04x %02x %02x %3d\n", | 1169 | "UV: %2d: 0x%014lx-0x%014lx %5luG %3d %04x %02x %02x\n", |
1164 | index++, | 1170 | index++, |
1165 | (unsigned long)lgre << UV_GAM_RANGE_SHFT, | 1171 | (unsigned long)lgre << UV_GAM_RANGE_SHFT, |
1166 | (unsigned long)gre->limit << UV_GAM_RANGE_SHFT, | 1172 | (unsigned long)gre->limit << UV_GAM_RANGE_SHFT, |
1167 | ((unsigned long)(gre->limit - lgre)) >> | 1173 | ((unsigned long)(gre->limit - lgre)) >> |
1168 | (30 - UV_GAM_RANGE_SHFT), /* 64M -> 1G */ | 1174 | (30 - UV_GAM_RANGE_SHFT), /* 64M -> 1G */ |
1169 | gre->type, gre->nasid, gre->sockid, | 1175 | gre->type, gre->nasid, gre->sockid, gre->pnode); |
1170 | gre->pnode, gre->pxm); | ||
1171 | 1176 | ||
1172 | lgre = gre->limit; | 1177 | lgre = gre->limit; |
1173 | if (sock_min > gre->sockid) | 1178 | if (sock_min > gre->sockid) |
@@ -1286,7 +1291,7 @@ static void __init build_socket_tables(void) | |||
1286 | _pnode_to_socket[i] = SOCK_EMPTY; | 1291 | _pnode_to_socket[i] = SOCK_EMPTY; |
1287 | 1292 | ||
1288 | /* fill in pnode/node/addr conversion list values */ | 1293 | /* fill in pnode/node/addr conversion list values */ |
1289 | pr_info("UV: GAM Building socket/pnode/pxm conversion tables\n"); | 1294 | pr_info("UV: GAM Building socket/pnode conversion tables\n"); |
1290 | for (; gre->type != UV_GAM_RANGE_TYPE_UNUSED; gre++) { | 1295 | for (; gre->type != UV_GAM_RANGE_TYPE_UNUSED; gre++) { |
1291 | if (gre->type == UV_GAM_RANGE_TYPE_HOLE) | 1296 | if (gre->type == UV_GAM_RANGE_TYPE_HOLE) |
1292 | continue; | 1297 | continue; |
@@ -1294,20 +1299,18 @@ static void __init build_socket_tables(void) | |||
1294 | if (_socket_to_pnode[i] != SOCK_EMPTY) | 1299 | if (_socket_to_pnode[i] != SOCK_EMPTY) |
1295 | continue; /* duplicate */ | 1300 | continue; /* duplicate */ |
1296 | _socket_to_pnode[i] = gre->pnode; | 1301 | _socket_to_pnode[i] = gre->pnode; |
1297 | _socket_to_node[i] = gre->pxm; | ||
1298 | 1302 | ||
1299 | i = gre->pnode - minpnode; | 1303 | i = gre->pnode - minpnode; |
1300 | _pnode_to_socket[i] = gre->sockid; | 1304 | _pnode_to_socket[i] = gre->sockid; |
1301 | 1305 | ||
1302 | pr_info( | 1306 | pr_info( |
1303 | "UV: sid:%02x type:%d nasid:%04x pn:%02x pxm:%2d pn2s:%2x\n", | 1307 | "UV: sid:%02x type:%d nasid:%04x pn:%02x pn2s:%2x\n", |
1304 | gre->sockid, gre->type, gre->nasid, | 1308 | gre->sockid, gre->type, gre->nasid, |
1305 | _socket_to_pnode[gre->sockid - minsock], | 1309 | _socket_to_pnode[gre->sockid - minsock], |
1306 | _socket_to_node[gre->sockid - minsock], | ||
1307 | _pnode_to_socket[gre->pnode - minpnode]); | 1310 | _pnode_to_socket[gre->pnode - minpnode]); |
1308 | } | 1311 | } |
1309 | 1312 | ||
1310 | /* check socket -> node values */ | 1313 | /* Set socket -> node values */ |
1311 | lnid = -1; | 1314 | lnid = -1; |
1312 | for_each_present_cpu(cpu) { | 1315 | for_each_present_cpu(cpu) { |
1313 | int nid = cpu_to_node(cpu); | 1316 | int nid = cpu_to_node(cpu); |
@@ -1318,14 +1321,9 @@ static void __init build_socket_tables(void) | |||
1318 | lnid = nid; | 1321 | lnid = nid; |
1319 | apicid = per_cpu(x86_cpu_to_apicid, cpu); | 1322 | apicid = per_cpu(x86_cpu_to_apicid, cpu); |
1320 | sockid = apicid >> uv_cpuid.socketid_shift; | 1323 | sockid = apicid >> uv_cpuid.socketid_shift; |
1321 | i = sockid - minsock; | 1324 | _socket_to_node[sockid - minsock] = nid; |
1322 | 1325 | pr_info("UV: sid:%02x: apicid:%04x node:%2d\n", | |
1323 | if (nid != _socket_to_node[i]) { | 1326 | sockid, apicid, nid); |
1324 | pr_warn( | ||
1325 | "UV: %02x: type:%d socket:%02x PXM:%02x != node:%2d\n", | ||
1326 | i, sockid, gre->type, _socket_to_node[i], nid); | ||
1327 | _socket_to_node[i] = nid; | ||
1328 | } | ||
1329 | } | 1327 | } |
1330 | 1328 | ||
1331 | /* Setup physical blade to pnode translation from GAM Range Table */ | 1329 | /* Setup physical blade to pnode translation from GAM Range Table */ |
diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index 27a0228c9cae..b816971f5da4 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c | |||
@@ -355,6 +355,7 @@ void load_ucode_amd_ap(void) | |||
355 | unsigned int cpu = smp_processor_id(); | 355 | unsigned int cpu = smp_processor_id(); |
356 | struct equiv_cpu_entry *eq; | 356 | struct equiv_cpu_entry *eq; |
357 | struct microcode_amd *mc; | 357 | struct microcode_amd *mc; |
358 | u8 *cont = container; | ||
358 | u32 rev, eax; | 359 | u32 rev, eax; |
359 | u16 eq_id; | 360 | u16 eq_id; |
360 | 361 | ||
@@ -371,8 +372,11 @@ void load_ucode_amd_ap(void) | |||
371 | if (check_current_patch_level(&rev, false)) | 372 | if (check_current_patch_level(&rev, false)) |
372 | return; | 373 | return; |
373 | 374 | ||
375 | /* Add CONFIG_RANDOMIZE_MEMORY offset. */ | ||
376 | cont += PAGE_OFFSET - __PAGE_OFFSET_BASE; | ||
377 | |||
374 | eax = cpuid_eax(0x00000001); | 378 | eax = cpuid_eax(0x00000001); |
375 | eq = (struct equiv_cpu_entry *)(container + CONTAINER_HDR_SZ); | 379 | eq = (struct equiv_cpu_entry *)(cont + CONTAINER_HDR_SZ); |
376 | 380 | ||
377 | eq_id = find_equiv_id(eq, eax); | 381 | eq_id = find_equiv_id(eq, eax); |
378 | if (!eq_id) | 382 | if (!eq_id) |
@@ -434,6 +438,9 @@ int __init save_microcode_in_initrd_amd(void) | |||
434 | else | 438 | else |
435 | container = cont_va; | 439 | container = cont_va; |
436 | 440 | ||
441 | /* Add CONFIG_RANDOMIZE_MEMORY offset. */ | ||
442 | container += PAGE_OFFSET - __PAGE_OFFSET_BASE; | ||
443 | |||
437 | eax = cpuid_eax(0x00000001); | 444 | eax = cpuid_eax(0x00000001); |
438 | eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); | 445 | eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); |
439 | 446 | ||
diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c index 680049aa4593..01567aa87503 100644 --- a/arch/x86/kernel/fpu/xstate.c +++ b/arch/x86/kernel/fpu/xstate.c | |||
@@ -866,105 +866,17 @@ const void *get_xsave_field_ptr(int xsave_state) | |||
866 | return get_xsave_addr(&fpu->state.xsave, xsave_state); | 866 | return get_xsave_addr(&fpu->state.xsave, xsave_state); |
867 | } | 867 | } |
868 | 868 | ||
869 | |||
870 | /* | ||
871 | * Set xfeatures (aka XSTATE_BV) bit for a feature that we want | ||
872 | * to take out of its "init state". This will ensure that an | ||
873 | * XRSTOR actually restores the state. | ||
874 | */ | ||
875 | static void fpu__xfeature_set_non_init(struct xregs_state *xsave, | ||
876 | int xstate_feature_mask) | ||
877 | { | ||
878 | xsave->header.xfeatures |= xstate_feature_mask; | ||
879 | } | ||
880 | |||
881 | /* | ||
882 | * This function is safe to call whether the FPU is in use or not. | ||
883 | * | ||
884 | * Note that this only works on the current task. | ||
885 | * | ||
886 | * Inputs: | ||
887 | * @xsave_state: state which is defined in xsave.h (e.g. XFEATURE_MASK_FP, | ||
888 | * XFEATURE_MASK_SSE, etc...) | ||
889 | * @xsave_state_ptr: a pointer to a copy of the state that you would | ||
890 | * like written in to the current task's FPU xsave state. This pointer | ||
891 | * must not be located in the current tasks's xsave area. | ||
892 | * Output: | ||
893 | * address of the state in the xsave area or NULL if the state | ||
894 | * is not present or is in its 'init state'. | ||
895 | */ | ||
896 | static void fpu__xfeature_set_state(int xstate_feature_mask, | ||
897 | void *xstate_feature_src, size_t len) | ||
898 | { | ||
899 | struct xregs_state *xsave = ¤t->thread.fpu.state.xsave; | ||
900 | struct fpu *fpu = ¤t->thread.fpu; | ||
901 | void *dst; | ||
902 | |||
903 | if (!boot_cpu_has(X86_FEATURE_XSAVE)) { | ||
904 | WARN_ONCE(1, "%s() attempted with no xsave support", __func__); | ||
905 | return; | ||
906 | } | ||
907 | |||
908 | /* | ||
909 | * Tell the FPU code that we need the FPU state to be in | ||
910 | * 'fpu' (not in the registers), and that we need it to | ||
911 | * be stable while we write to it. | ||
912 | */ | ||
913 | fpu__current_fpstate_write_begin(); | ||
914 | |||
915 | /* | ||
916 | * This method *WILL* *NOT* work for compact-format | ||
917 | * buffers. If the 'xstate_feature_mask' is unset in | ||
918 | * xcomp_bv then we may need to move other feature state | ||
919 | * "up" in the buffer. | ||
920 | */ | ||
921 | if (xsave->header.xcomp_bv & xstate_feature_mask) { | ||
922 | WARN_ON_ONCE(1); | ||
923 | goto out; | ||
924 | } | ||
925 | |||
926 | /* find the location in the xsave buffer of the desired state */ | ||
927 | dst = __raw_xsave_addr(&fpu->state.xsave, xstate_feature_mask); | ||
928 | |||
929 | /* | ||
930 | * Make sure that the pointer being passed in did not | ||
931 | * come from the xsave buffer itself. | ||
932 | */ | ||
933 | WARN_ONCE(xstate_feature_src == dst, "set from xsave buffer itself"); | ||
934 | |||
935 | /* put the caller-provided data in the location */ | ||
936 | memcpy(dst, xstate_feature_src, len); | ||
937 | |||
938 | /* | ||
939 | * Mark the xfeature so that the CPU knows there is state | ||
940 | * in the buffer now. | ||
941 | */ | ||
942 | fpu__xfeature_set_non_init(xsave, xstate_feature_mask); | ||
943 | out: | ||
944 | /* | ||
945 | * We are done writing to the 'fpu'. Reenable preeption | ||
946 | * and (possibly) move the fpstate back in to the fpregs. | ||
947 | */ | ||
948 | fpu__current_fpstate_write_end(); | ||
949 | } | ||
950 | |||
951 | #define NR_VALID_PKRU_BITS (CONFIG_NR_PROTECTION_KEYS * 2) | 869 | #define NR_VALID_PKRU_BITS (CONFIG_NR_PROTECTION_KEYS * 2) |
952 | #define PKRU_VALID_MASK (NR_VALID_PKRU_BITS - 1) | 870 | #define PKRU_VALID_MASK (NR_VALID_PKRU_BITS - 1) |
953 | 871 | ||
954 | /* | 872 | /* |
955 | * This will go out and modify the XSAVE buffer so that PKRU is | 873 | * This will go out and modify PKRU register to set the access |
956 | * set to a particular state for access to 'pkey'. | 874 | * rights for @pkey to @init_val. |
957 | * | ||
958 | * PKRU state does affect kernel access to user memory. We do | ||
959 | * not modfiy PKRU *itself* here, only the XSAVE state that will | ||
960 | * be restored in to PKRU when we return back to userspace. | ||
961 | */ | 875 | */ |
962 | int arch_set_user_pkey_access(struct task_struct *tsk, int pkey, | 876 | int arch_set_user_pkey_access(struct task_struct *tsk, int pkey, |
963 | unsigned long init_val) | 877 | unsigned long init_val) |
964 | { | 878 | { |
965 | struct xregs_state *xsave = &tsk->thread.fpu.state.xsave; | 879 | u32 old_pkru; |
966 | struct pkru_state *old_pkru_state; | ||
967 | struct pkru_state new_pkru_state; | ||
968 | int pkey_shift = (pkey * PKRU_BITS_PER_PKEY); | 880 | int pkey_shift = (pkey * PKRU_BITS_PER_PKEY); |
969 | u32 new_pkru_bits = 0; | 881 | u32 new_pkru_bits = 0; |
970 | 882 | ||
@@ -974,6 +886,15 @@ int arch_set_user_pkey_access(struct task_struct *tsk, int pkey, | |||
974 | */ | 886 | */ |
975 | if (!boot_cpu_has(X86_FEATURE_OSPKE)) | 887 | if (!boot_cpu_has(X86_FEATURE_OSPKE)) |
976 | return -EINVAL; | 888 | return -EINVAL; |
889 | /* | ||
890 | * For most XSAVE components, this would be an arduous task: | ||
891 | * brining fpstate up to date with fpregs, updating fpstate, | ||
892 | * then re-populating fpregs. But, for components that are | ||
893 | * never lazily managed, we can just access the fpregs | ||
894 | * directly. PKRU is never managed lazily, so we can just | ||
895 | * manipulate it directly. Make sure it stays that way. | ||
896 | */ | ||
897 | WARN_ON_ONCE(!use_eager_fpu()); | ||
977 | 898 | ||
978 | /* Set the bits we need in PKRU: */ | 899 | /* Set the bits we need in PKRU: */ |
979 | if (init_val & PKEY_DISABLE_ACCESS) | 900 | if (init_val & PKEY_DISABLE_ACCESS) |
@@ -984,37 +905,12 @@ int arch_set_user_pkey_access(struct task_struct *tsk, int pkey, | |||
984 | /* Shift the bits in to the correct place in PKRU for pkey: */ | 905 | /* Shift the bits in to the correct place in PKRU for pkey: */ |
985 | new_pkru_bits <<= pkey_shift; | 906 | new_pkru_bits <<= pkey_shift; |
986 | 907 | ||
987 | /* Locate old copy of the state in the xsave buffer: */ | 908 | /* Get old PKRU and mask off any old bits in place: */ |
988 | old_pkru_state = get_xsave_addr(xsave, XFEATURE_MASK_PKRU); | 909 | old_pkru = read_pkru(); |
989 | 910 | old_pkru &= ~((PKRU_AD_BIT|PKRU_WD_BIT) << pkey_shift); | |
990 | /* | ||
991 | * When state is not in the buffer, it is in the init | ||
992 | * state, set it manually. Otherwise, copy out the old | ||
993 | * state. | ||
994 | */ | ||
995 | if (!old_pkru_state) | ||
996 | new_pkru_state.pkru = 0; | ||
997 | else | ||
998 | new_pkru_state.pkru = old_pkru_state->pkru; | ||
999 | |||
1000 | /* Mask off any old bits in place: */ | ||
1001 | new_pkru_state.pkru &= ~((PKRU_AD_BIT|PKRU_WD_BIT) << pkey_shift); | ||
1002 | |||
1003 | /* Set the newly-requested bits: */ | ||
1004 | new_pkru_state.pkru |= new_pkru_bits; | ||
1005 | |||
1006 | /* | ||
1007 | * We could theoretically live without zeroing pkru.pad. | ||
1008 | * The current XSAVE feature state definition says that | ||
1009 | * only bytes 0->3 are used. But we do not want to | ||
1010 | * chance leaking kernel stack out to userspace in case a | ||
1011 | * memcpy() of the whole xsave buffer was done. | ||
1012 | * | ||
1013 | * They're in the same cacheline anyway. | ||
1014 | */ | ||
1015 | new_pkru_state.pad = 0; | ||
1016 | 911 | ||
1017 | fpu__xfeature_set_state(XFEATURE_MASK_PKRU, &new_pkru_state, sizeof(new_pkru_state)); | 912 | /* Write old part along with new part: */ |
913 | write_pkru(old_pkru | new_pkru_bits); | ||
1018 | 914 | ||
1019 | return 0; | 915 | return 0; |
1020 | } | 916 | } |
diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c index 2dda0bc4576e..f16c55bfc090 100644 --- a/arch/x86/kernel/head32.c +++ b/arch/x86/kernel/head32.c | |||
@@ -25,8 +25,6 @@ static void __init i386_default_early_setup(void) | |||
25 | /* Initialize 32bit specific setup functions */ | 25 | /* Initialize 32bit specific setup functions */ |
26 | x86_init.resources.reserve_resources = i386_reserve_resources; | 26 | x86_init.resources.reserve_resources = i386_reserve_resources; |
27 | x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc; | 27 | x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc; |
28 | |||
29 | reserve_bios_regions(); | ||
30 | } | 28 | } |
31 | 29 | ||
32 | asmlinkage __visible void __init i386_start_kernel(void) | 30 | asmlinkage __visible void __init i386_start_kernel(void) |
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 99d48e7d2974..54a2372f5dbb 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c | |||
@@ -183,7 +183,6 @@ void __init x86_64_start_reservations(char *real_mode_data) | |||
183 | copy_bootdata(__va(real_mode_data)); | 183 | copy_bootdata(__va(real_mode_data)); |
184 | 184 | ||
185 | x86_early_init_platform_quirks(); | 185 | x86_early_init_platform_quirks(); |
186 | reserve_bios_regions(); | ||
187 | 186 | ||
188 | switch (boot_params.hdr.hardware_subarch) { | 187 | switch (boot_params.hdr.hardware_subarch) { |
189 | case X86_SUBARCH_INTEL_MID: | 188 | case X86_SUBARCH_INTEL_MID: |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index ed16e58658a4..c6dfd801df97 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
@@ -1242,7 +1242,7 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id) | |||
1242 | memset(&curr_time, 0, sizeof(struct rtc_time)); | 1242 | memset(&curr_time, 0, sizeof(struct rtc_time)); |
1243 | 1243 | ||
1244 | if (hpet_rtc_flags & (RTC_UIE | RTC_AIE)) | 1244 | if (hpet_rtc_flags & (RTC_UIE | RTC_AIE)) |
1245 | mc146818_set_time(&curr_time); | 1245 | mc146818_get_time(&curr_time); |
1246 | 1246 | ||
1247 | if (hpet_rtc_flags & RTC_UIE && | 1247 | if (hpet_rtc_flags & RTC_UIE && |
1248 | curr_time.tm_sec != hpet_prev_update_sec) { | 1248 | curr_time.tm_sec != hpet_prev_update_sec) { |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 61521dc19c10..9f669fdd2010 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -102,8 +102,7 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
102 | seq_puts(p, " Rescheduling interrupts\n"); | 102 | seq_puts(p, " Rescheduling interrupts\n"); |
103 | seq_printf(p, "%*s: ", prec, "CAL"); | 103 | seq_printf(p, "%*s: ", prec, "CAL"); |
104 | for_each_online_cpu(j) | 104 | for_each_online_cpu(j) |
105 | seq_printf(p, "%10u ", irq_stats(j)->irq_call_count - | 105 | seq_printf(p, "%10u ", irq_stats(j)->irq_call_count); |
106 | irq_stats(j)->irq_tlb_count); | ||
107 | seq_puts(p, " Function call interrupts\n"); | 106 | seq_puts(p, " Function call interrupts\n"); |
108 | seq_printf(p, "%*s: ", prec, "TLB"); | 107 | seq_printf(p, "%*s: ", prec, "TLB"); |
109 | for_each_online_cpu(j) | 108 | for_each_online_cpu(j) |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 991b77986d57..0fa60f5f5a16 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -936,8 +936,6 @@ void __init setup_arch(char **cmdline_p) | |||
936 | 936 | ||
937 | x86_init.oem.arch_setup(); | 937 | x86_init.oem.arch_setup(); |
938 | 938 | ||
939 | kernel_randomize_memory(); | ||
940 | |||
941 | iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1; | 939 | iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1; |
942 | setup_memory_map(); | 940 | setup_memory_map(); |
943 | parse_setup_data(); | 941 | parse_setup_data(); |
@@ -1055,6 +1053,12 @@ void __init setup_arch(char **cmdline_p) | |||
1055 | 1053 | ||
1056 | max_possible_pfn = max_pfn; | 1054 | max_possible_pfn = max_pfn; |
1057 | 1055 | ||
1056 | /* | ||
1057 | * Define random base addresses for memory sections after max_pfn is | ||
1058 | * defined and before each memory section base is used. | ||
1059 | */ | ||
1060 | kernel_randomize_memory(); | ||
1061 | |||
1058 | #ifdef CONFIG_X86_32 | 1062 | #ifdef CONFIG_X86_32 |
1059 | /* max_low_pfn get updated here */ | 1063 | /* max_low_pfn get updated here */ |
1060 | find_low_pfn_range(); | 1064 | find_low_pfn_range(); |
@@ -1097,6 +1101,8 @@ void __init setup_arch(char **cmdline_p) | |||
1097 | efi_find_mirror(); | 1101 | efi_find_mirror(); |
1098 | } | 1102 | } |
1099 | 1103 | ||
1104 | reserve_bios_regions(); | ||
1105 | |||
1100 | /* | 1106 | /* |
1101 | * The EFI specification says that boot service code won't be called | 1107 | * The EFI specification says that boot service code won't be called |
1102 | * after ExitBootServices(). This is, in fact, a lie. | 1108 | * after ExitBootServices(). This is, in fact, a lie. |
@@ -1125,7 +1131,15 @@ void __init setup_arch(char **cmdline_p) | |||
1125 | 1131 | ||
1126 | early_trap_pf_init(); | 1132 | early_trap_pf_init(); |
1127 | 1133 | ||
1128 | setup_real_mode(); | 1134 | /* |
1135 | * Update mmu_cr4_features (and, indirectly, trampoline_cr4_features) | ||
1136 | * with the current CR4 value. This may not be necessary, but | ||
1137 | * auditing all the early-boot CR4 manipulation would be needed to | ||
1138 | * rule it out. | ||
1139 | */ | ||
1140 | if (boot_cpu_data.cpuid_level >= 0) | ||
1141 | /* A CPU has %cr4 if and only if it has CPUID. */ | ||
1142 | mmu_cr4_features = __read_cr4(); | ||
1129 | 1143 | ||
1130 | memblock_set_current_limit(get_max_mapped()); | 1144 | memblock_set_current_limit(get_max_mapped()); |
1131 | 1145 | ||
@@ -1174,13 +1188,6 @@ void __init setup_arch(char **cmdline_p) | |||
1174 | 1188 | ||
1175 | kasan_init(); | 1189 | kasan_init(); |
1176 | 1190 | ||
1177 | if (boot_cpu_data.cpuid_level >= 0) { | ||
1178 | /* A CPU has %cr4 if and only if it has CPUID */ | ||
1179 | mmu_cr4_features = __read_cr4(); | ||
1180 | if (trampoline_cr4_features) | ||
1181 | *trampoline_cr4_features = mmu_cr4_features; | ||
1182 | } | ||
1183 | |||
1184 | #ifdef CONFIG_X86_32 | 1191 | #ifdef CONFIG_X86_32 |
1185 | /* sync back kernel address range */ | 1192 | /* sync back kernel address range */ |
1186 | clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY, | 1193 | clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY, |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 067de612d3fa..26b473dc3f82 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -100,10 +100,11 @@ EXPORT_PER_CPU_SYMBOL(cpu_info); | |||
100 | /* Logical package management. We might want to allocate that dynamically */ | 100 | /* Logical package management. We might want to allocate that dynamically */ |
101 | static int *physical_to_logical_pkg __read_mostly; | 101 | static int *physical_to_logical_pkg __read_mostly; |
102 | static unsigned long *physical_package_map __read_mostly;; | 102 | static unsigned long *physical_package_map __read_mostly;; |
103 | static unsigned long *logical_package_map __read_mostly; | ||
104 | static unsigned int max_physical_pkg_id __read_mostly; | 103 | static unsigned int max_physical_pkg_id __read_mostly; |
105 | unsigned int __max_logical_packages __read_mostly; | 104 | unsigned int __max_logical_packages __read_mostly; |
106 | EXPORT_SYMBOL(__max_logical_packages); | 105 | EXPORT_SYMBOL(__max_logical_packages); |
106 | static unsigned int logical_packages __read_mostly; | ||
107 | static bool logical_packages_frozen __read_mostly; | ||
107 | 108 | ||
108 | /* Maximum number of SMT threads on any online core */ | 109 | /* Maximum number of SMT threads on any online core */ |
109 | int __max_smt_threads __read_mostly; | 110 | int __max_smt_threads __read_mostly; |
@@ -277,14 +278,14 @@ int topology_update_package_map(unsigned int apicid, unsigned int cpu) | |||
277 | if (test_and_set_bit(pkg, physical_package_map)) | 278 | if (test_and_set_bit(pkg, physical_package_map)) |
278 | goto found; | 279 | goto found; |
279 | 280 | ||
280 | new = find_first_zero_bit(logical_package_map, __max_logical_packages); | 281 | if (logical_packages_frozen) { |
281 | if (new >= __max_logical_packages) { | ||
282 | physical_to_logical_pkg[pkg] = -1; | 282 | physical_to_logical_pkg[pkg] = -1; |
283 | pr_warn("APIC(%x) Package %u exceeds logical package map\n", | 283 | pr_warn("APIC(%x) Package %u exceeds logical package max\n", |
284 | apicid, pkg); | 284 | apicid, pkg); |
285 | return -ENOSPC; | 285 | return -ENOSPC; |
286 | } | 286 | } |
287 | set_bit(new, logical_package_map); | 287 | |
288 | new = logical_packages++; | ||
288 | pr_info("APIC(%x) Converting physical %u to logical package %u\n", | 289 | pr_info("APIC(%x) Converting physical %u to logical package %u\n", |
289 | apicid, pkg, new); | 290 | apicid, pkg, new); |
290 | physical_to_logical_pkg[pkg] = new; | 291 | physical_to_logical_pkg[pkg] = new; |
@@ -341,6 +342,7 @@ static void __init smp_init_package_map(void) | |||
341 | } | 342 | } |
342 | 343 | ||
343 | __max_logical_packages = DIV_ROUND_UP(total_cpus, ncpus); | 344 | __max_logical_packages = DIV_ROUND_UP(total_cpus, ncpus); |
345 | logical_packages = 0; | ||
344 | 346 | ||
345 | /* | 347 | /* |
346 | * Possibly larger than what we need as the number of apic ids per | 348 | * Possibly larger than what we need as the number of apic ids per |
@@ -352,10 +354,6 @@ static void __init smp_init_package_map(void) | |||
352 | memset(physical_to_logical_pkg, 0xff, size); | 354 | memset(physical_to_logical_pkg, 0xff, size); |
353 | size = BITS_TO_LONGS(max_physical_pkg_id) * sizeof(unsigned long); | 355 | size = BITS_TO_LONGS(max_physical_pkg_id) * sizeof(unsigned long); |
354 | physical_package_map = kzalloc(size, GFP_KERNEL); | 356 | physical_package_map = kzalloc(size, GFP_KERNEL); |
355 | size = BITS_TO_LONGS(__max_logical_packages) * sizeof(unsigned long); | ||
356 | logical_package_map = kzalloc(size, GFP_KERNEL); | ||
357 | |||
358 | pr_info("Max logical packages: %u\n", __max_logical_packages); | ||
359 | 357 | ||
360 | for_each_present_cpu(cpu) { | 358 | for_each_present_cpu(cpu) { |
361 | unsigned int apicid = apic->cpu_present_to_apicid(cpu); | 359 | unsigned int apicid = apic->cpu_present_to_apicid(cpu); |
@@ -369,6 +367,15 @@ static void __init smp_init_package_map(void) | |||
369 | set_cpu_possible(cpu, false); | 367 | set_cpu_possible(cpu, false); |
370 | set_cpu_present(cpu, false); | 368 | set_cpu_present(cpu, false); |
371 | } | 369 | } |
370 | |||
371 | if (logical_packages > __max_logical_packages) { | ||
372 | pr_warn("Detected more packages (%u), then computed by BIOS data (%u).\n", | ||
373 | logical_packages, __max_logical_packages); | ||
374 | logical_packages_frozen = true; | ||
375 | __max_logical_packages = logical_packages; | ||
376 | } | ||
377 | |||
378 | pr_info("Max logical packages: %u\n", __max_logical_packages); | ||
372 | } | 379 | } |
373 | 380 | ||
374 | void __init smp_store_boot_cpu_info(void) | 381 | void __init smp_store_boot_cpu_info(void) |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 1ef87e887051..78b9cb5a26af 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/nmi.h> | 22 | #include <asm/nmi.h> |
23 | #include <asm/x86_init.h> | 23 | #include <asm/x86_init.h> |
24 | #include <asm/geode.h> | 24 | #include <asm/geode.h> |
25 | #include <asm/apic.h> | ||
25 | 26 | ||
26 | unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */ | 27 | unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */ |
27 | EXPORT_SYMBOL(cpu_khz); | 28 | EXPORT_SYMBOL(cpu_khz); |
@@ -1249,6 +1250,9 @@ static void tsc_refine_calibration_work(struct work_struct *work) | |||
1249 | (unsigned long)tsc_khz / 1000, | 1250 | (unsigned long)tsc_khz / 1000, |
1250 | (unsigned long)tsc_khz % 1000); | 1251 | (unsigned long)tsc_khz % 1000); |
1251 | 1252 | ||
1253 | /* Inform the TSC deadline clockevent devices about the recalibration */ | ||
1254 | lapic_update_tsc_freq(); | ||
1255 | |||
1252 | out: | 1256 | out: |
1253 | if (boot_cpu_has(X86_FEATURE_ART)) | 1257 | if (boot_cpu_has(X86_FEATURE_ART)) |
1254 | art_related_clocksource = &clocksource_tsc; | 1258 | art_related_clocksource = &clocksource_tsc; |
diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c index 6c1ff31d99ff..495c776de4b4 100644 --- a/arch/x86/kernel/uprobes.c +++ b/arch/x86/kernel/uprobes.c | |||
@@ -357,20 +357,22 @@ static void riprel_analyze(struct arch_uprobe *auprobe, struct insn *insn) | |||
357 | *cursor &= 0xfe; | 357 | *cursor &= 0xfe; |
358 | } | 358 | } |
359 | /* | 359 | /* |
360 | * Similar treatment for VEX3 prefix. | 360 | * Similar treatment for VEX3/EVEX prefix. |
361 | * TODO: add XOP/EVEX treatment when insn decoder supports them | 361 | * TODO: add XOP treatment when insn decoder supports them |
362 | */ | 362 | */ |
363 | if (insn->vex_prefix.nbytes == 3) { | 363 | if (insn->vex_prefix.nbytes >= 3) { |
364 | /* | 364 | /* |
365 | * vex2: c5 rvvvvLpp (has no b bit) | 365 | * vex2: c5 rvvvvLpp (has no b bit) |
366 | * vex3/xop: c4/8f rxbmmmmm wvvvvLpp | 366 | * vex3/xop: c4/8f rxbmmmmm wvvvvLpp |
367 | * evex: 62 rxbR00mm wvvvv1pp zllBVaaa | 367 | * evex: 62 rxbR00mm wvvvv1pp zllBVaaa |
368 | * (evex will need setting of both b and x since | 368 | * Setting VEX3.b (setting because it has inverted meaning). |
369 | * in non-sib encoding evex.x is 4th bit of MODRM.rm) | 369 | * Setting EVEX.x since (in non-SIB encoding) EVEX.x |
370 | * Setting VEX3.b (setting because it has inverted meaning): | 370 | * is the 4th bit of MODRM.rm, and needs the same treatment. |
371 | * For VEX3-encoded insns, VEX3.x value has no effect in | ||
372 | * non-SIB encoding, the change is superfluous but harmless. | ||
371 | */ | 373 | */ |
372 | cursor = auprobe->insn + insn_offset_vex_prefix(insn) + 1; | 374 | cursor = auprobe->insn + insn_offset_vex_prefix(insn) + 1; |
373 | *cursor |= 0x20; | 375 | *cursor |= 0x60; |
374 | } | 376 | } |
375 | 377 | ||
376 | /* | 378 | /* |
@@ -415,12 +417,10 @@ static void riprel_analyze(struct arch_uprobe *auprobe, struct insn *insn) | |||
415 | 417 | ||
416 | reg = MODRM_REG(insn); /* Fetch modrm.reg */ | 418 | reg = MODRM_REG(insn); /* Fetch modrm.reg */ |
417 | reg2 = 0xff; /* Fetch vex.vvvv */ | 419 | reg2 = 0xff; /* Fetch vex.vvvv */ |
418 | if (insn->vex_prefix.nbytes == 2) | 420 | if (insn->vex_prefix.nbytes) |
419 | reg2 = insn->vex_prefix.bytes[1]; | ||
420 | else if (insn->vex_prefix.nbytes == 3) | ||
421 | reg2 = insn->vex_prefix.bytes[2]; | 421 | reg2 = insn->vex_prefix.bytes[2]; |
422 | /* | 422 | /* |
423 | * TODO: add XOP, EXEV vvvv reading. | 423 | * TODO: add XOP vvvv reading. |
424 | * | 424 | * |
425 | * vex.vvvv field is in bits 6-3, bits are inverted. | 425 | * vex.vvvv field is in bits 6-3, bits are inverted. |
426 | * But in 32-bit mode, high-order bit may be ignored. | 426 | * But in 32-bit mode, high-order bit may be ignored. |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index a45d8580f91e..5cede40e2552 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -422,6 +422,7 @@ struct nested_vmx { | |||
422 | struct list_head vmcs02_pool; | 422 | struct list_head vmcs02_pool; |
423 | int vmcs02_num; | 423 | int vmcs02_num; |
424 | u64 vmcs01_tsc_offset; | 424 | u64 vmcs01_tsc_offset; |
425 | bool change_vmcs01_virtual_x2apic_mode; | ||
425 | /* L2 must run next, and mustn't decide to exit to L1. */ | 426 | /* L2 must run next, and mustn't decide to exit to L1. */ |
426 | bool nested_run_pending; | 427 | bool nested_run_pending; |
427 | /* | 428 | /* |
@@ -435,6 +436,8 @@ struct nested_vmx { | |||
435 | bool pi_pending; | 436 | bool pi_pending; |
436 | u16 posted_intr_nv; | 437 | u16 posted_intr_nv; |
437 | 438 | ||
439 | unsigned long *msr_bitmap; | ||
440 | |||
438 | struct hrtimer preemption_timer; | 441 | struct hrtimer preemption_timer; |
439 | bool preemption_timer_expired; | 442 | bool preemption_timer_expired; |
440 | 443 | ||
@@ -924,7 +927,6 @@ static unsigned long *vmx_msr_bitmap_legacy; | |||
924 | static unsigned long *vmx_msr_bitmap_longmode; | 927 | static unsigned long *vmx_msr_bitmap_longmode; |
925 | static unsigned long *vmx_msr_bitmap_legacy_x2apic; | 928 | static unsigned long *vmx_msr_bitmap_legacy_x2apic; |
926 | static unsigned long *vmx_msr_bitmap_longmode_x2apic; | 929 | static unsigned long *vmx_msr_bitmap_longmode_x2apic; |
927 | static unsigned long *vmx_msr_bitmap_nested; | ||
928 | static unsigned long *vmx_vmread_bitmap; | 930 | static unsigned long *vmx_vmread_bitmap; |
929 | static unsigned long *vmx_vmwrite_bitmap; | 931 | static unsigned long *vmx_vmwrite_bitmap; |
930 | 932 | ||
@@ -2198,6 +2200,12 @@ static void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu) | |||
2198 | new.control) != old.control); | 2200 | new.control) != old.control); |
2199 | } | 2201 | } |
2200 | 2202 | ||
2203 | static void decache_tsc_multiplier(struct vcpu_vmx *vmx) | ||
2204 | { | ||
2205 | vmx->current_tsc_ratio = vmx->vcpu.arch.tsc_scaling_ratio; | ||
2206 | vmcs_write64(TSC_MULTIPLIER, vmx->current_tsc_ratio); | ||
2207 | } | ||
2208 | |||
2201 | /* | 2209 | /* |
2202 | * Switches to specified vcpu, until a matching vcpu_put(), but assumes | 2210 | * Switches to specified vcpu, until a matching vcpu_put(), but assumes |
2203 | * vcpu mutex is already taken. | 2211 | * vcpu mutex is already taken. |
@@ -2256,10 +2264,8 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | |||
2256 | 2264 | ||
2257 | /* Setup TSC multiplier */ | 2265 | /* Setup TSC multiplier */ |
2258 | if (kvm_has_tsc_control && | 2266 | if (kvm_has_tsc_control && |
2259 | vmx->current_tsc_ratio != vcpu->arch.tsc_scaling_ratio) { | 2267 | vmx->current_tsc_ratio != vcpu->arch.tsc_scaling_ratio) |
2260 | vmx->current_tsc_ratio = vcpu->arch.tsc_scaling_ratio; | 2268 | decache_tsc_multiplier(vmx); |
2261 | vmcs_write64(TSC_MULTIPLIER, vmx->current_tsc_ratio); | ||
2262 | } | ||
2263 | 2269 | ||
2264 | vmx_vcpu_pi_load(vcpu, cpu); | 2270 | vmx_vcpu_pi_load(vcpu, cpu); |
2265 | vmx->host_pkru = read_pkru(); | 2271 | vmx->host_pkru = read_pkru(); |
@@ -2508,7 +2514,7 @@ static void vmx_set_msr_bitmap(struct kvm_vcpu *vcpu) | |||
2508 | unsigned long *msr_bitmap; | 2514 | unsigned long *msr_bitmap; |
2509 | 2515 | ||
2510 | if (is_guest_mode(vcpu)) | 2516 | if (is_guest_mode(vcpu)) |
2511 | msr_bitmap = vmx_msr_bitmap_nested; | 2517 | msr_bitmap = to_vmx(vcpu)->nested.msr_bitmap; |
2512 | else if (cpu_has_secondary_exec_ctrls() && | 2518 | else if (cpu_has_secondary_exec_ctrls() && |
2513 | (vmcs_read32(SECONDARY_VM_EXEC_CONTROL) & | 2519 | (vmcs_read32(SECONDARY_VM_EXEC_CONTROL) & |
2514 | SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE)) { | 2520 | SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE)) { |
@@ -6363,13 +6369,6 @@ static __init int hardware_setup(void) | |||
6363 | if (!vmx_msr_bitmap_longmode_x2apic) | 6369 | if (!vmx_msr_bitmap_longmode_x2apic) |
6364 | goto out4; | 6370 | goto out4; |
6365 | 6371 | ||
6366 | if (nested) { | ||
6367 | vmx_msr_bitmap_nested = | ||
6368 | (unsigned long *)__get_free_page(GFP_KERNEL); | ||
6369 | if (!vmx_msr_bitmap_nested) | ||
6370 | goto out5; | ||
6371 | } | ||
6372 | |||
6373 | vmx_vmread_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL); | 6372 | vmx_vmread_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL); |
6374 | if (!vmx_vmread_bitmap) | 6373 | if (!vmx_vmread_bitmap) |
6375 | goto out6; | 6374 | goto out6; |
@@ -6392,8 +6391,6 @@ static __init int hardware_setup(void) | |||
6392 | 6391 | ||
6393 | memset(vmx_msr_bitmap_legacy, 0xff, PAGE_SIZE); | 6392 | memset(vmx_msr_bitmap_legacy, 0xff, PAGE_SIZE); |
6394 | memset(vmx_msr_bitmap_longmode, 0xff, PAGE_SIZE); | 6393 | memset(vmx_msr_bitmap_longmode, 0xff, PAGE_SIZE); |
6395 | if (nested) | ||
6396 | memset(vmx_msr_bitmap_nested, 0xff, PAGE_SIZE); | ||
6397 | 6394 | ||
6398 | if (setup_vmcs_config(&vmcs_config) < 0) { | 6395 | if (setup_vmcs_config(&vmcs_config) < 0) { |
6399 | r = -EIO; | 6396 | r = -EIO; |
@@ -6529,9 +6526,6 @@ out8: | |||
6529 | out7: | 6526 | out7: |
6530 | free_page((unsigned long)vmx_vmread_bitmap); | 6527 | free_page((unsigned long)vmx_vmread_bitmap); |
6531 | out6: | 6528 | out6: |
6532 | if (nested) | ||
6533 | free_page((unsigned long)vmx_msr_bitmap_nested); | ||
6534 | out5: | ||
6535 | free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic); | 6529 | free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic); |
6536 | out4: | 6530 | out4: |
6537 | free_page((unsigned long)vmx_msr_bitmap_longmode); | 6531 | free_page((unsigned long)vmx_msr_bitmap_longmode); |
@@ -6557,8 +6551,6 @@ static __exit void hardware_unsetup(void) | |||
6557 | free_page((unsigned long)vmx_io_bitmap_a); | 6551 | free_page((unsigned long)vmx_io_bitmap_a); |
6558 | free_page((unsigned long)vmx_vmwrite_bitmap); | 6552 | free_page((unsigned long)vmx_vmwrite_bitmap); |
6559 | free_page((unsigned long)vmx_vmread_bitmap); | 6553 | free_page((unsigned long)vmx_vmread_bitmap); |
6560 | if (nested) | ||
6561 | free_page((unsigned long)vmx_msr_bitmap_nested); | ||
6562 | 6554 | ||
6563 | free_kvm_area(); | 6555 | free_kvm_area(); |
6564 | } | 6556 | } |
@@ -6995,16 +6987,21 @@ static int handle_vmon(struct kvm_vcpu *vcpu) | |||
6995 | return 1; | 6987 | return 1; |
6996 | } | 6988 | } |
6997 | 6989 | ||
6990 | if (cpu_has_vmx_msr_bitmap()) { | ||
6991 | vmx->nested.msr_bitmap = | ||
6992 | (unsigned long *)__get_free_page(GFP_KERNEL); | ||
6993 | if (!vmx->nested.msr_bitmap) | ||
6994 | goto out_msr_bitmap; | ||
6995 | } | ||
6996 | |||
6998 | vmx->nested.cached_vmcs12 = kmalloc(VMCS12_SIZE, GFP_KERNEL); | 6997 | vmx->nested.cached_vmcs12 = kmalloc(VMCS12_SIZE, GFP_KERNEL); |
6999 | if (!vmx->nested.cached_vmcs12) | 6998 | if (!vmx->nested.cached_vmcs12) |
7000 | return -ENOMEM; | 6999 | goto out_cached_vmcs12; |
7001 | 7000 | ||
7002 | if (enable_shadow_vmcs) { | 7001 | if (enable_shadow_vmcs) { |
7003 | shadow_vmcs = alloc_vmcs(); | 7002 | shadow_vmcs = alloc_vmcs(); |
7004 | if (!shadow_vmcs) { | 7003 | if (!shadow_vmcs) |
7005 | kfree(vmx->nested.cached_vmcs12); | 7004 | goto out_shadow_vmcs; |
7006 | return -ENOMEM; | ||
7007 | } | ||
7008 | /* mark vmcs as shadow */ | 7005 | /* mark vmcs as shadow */ |
7009 | shadow_vmcs->revision_id |= (1u << 31); | 7006 | shadow_vmcs->revision_id |= (1u << 31); |
7010 | /* init shadow vmcs */ | 7007 | /* init shadow vmcs */ |
@@ -7024,6 +7021,15 @@ static int handle_vmon(struct kvm_vcpu *vcpu) | |||
7024 | skip_emulated_instruction(vcpu); | 7021 | skip_emulated_instruction(vcpu); |
7025 | nested_vmx_succeed(vcpu); | 7022 | nested_vmx_succeed(vcpu); |
7026 | return 1; | 7023 | return 1; |
7024 | |||
7025 | out_shadow_vmcs: | ||
7026 | kfree(vmx->nested.cached_vmcs12); | ||
7027 | |||
7028 | out_cached_vmcs12: | ||
7029 | free_page((unsigned long)vmx->nested.msr_bitmap); | ||
7030 | |||
7031 | out_msr_bitmap: | ||
7032 | return -ENOMEM; | ||
7027 | } | 7033 | } |
7028 | 7034 | ||
7029 | /* | 7035 | /* |
@@ -7098,6 +7104,10 @@ static void free_nested(struct vcpu_vmx *vmx) | |||
7098 | vmx->nested.vmxon = false; | 7104 | vmx->nested.vmxon = false; |
7099 | free_vpid(vmx->nested.vpid02); | 7105 | free_vpid(vmx->nested.vpid02); |
7100 | nested_release_vmcs12(vmx); | 7106 | nested_release_vmcs12(vmx); |
7107 | if (vmx->nested.msr_bitmap) { | ||
7108 | free_page((unsigned long)vmx->nested.msr_bitmap); | ||
7109 | vmx->nested.msr_bitmap = NULL; | ||
7110 | } | ||
7101 | if (enable_shadow_vmcs) | 7111 | if (enable_shadow_vmcs) |
7102 | free_vmcs(vmx->nested.current_shadow_vmcs); | 7112 | free_vmcs(vmx->nested.current_shadow_vmcs); |
7103 | kfree(vmx->nested.cached_vmcs12); | 7113 | kfree(vmx->nested.cached_vmcs12); |
@@ -8419,6 +8429,12 @@ static void vmx_set_virtual_x2apic_mode(struct kvm_vcpu *vcpu, bool set) | |||
8419 | { | 8429 | { |
8420 | u32 sec_exec_control; | 8430 | u32 sec_exec_control; |
8421 | 8431 | ||
8432 | /* Postpone execution until vmcs01 is the current VMCS. */ | ||
8433 | if (is_guest_mode(vcpu)) { | ||
8434 | to_vmx(vcpu)->nested.change_vmcs01_virtual_x2apic_mode = true; | ||
8435 | return; | ||
8436 | } | ||
8437 | |||
8422 | /* | 8438 | /* |
8423 | * There is not point to enable virtualize x2apic without enable | 8439 | * There is not point to enable virtualize x2apic without enable |
8424 | * apicv | 8440 | * apicv |
@@ -9472,8 +9488,10 @@ static inline bool nested_vmx_merge_msr_bitmap(struct kvm_vcpu *vcpu, | |||
9472 | { | 9488 | { |
9473 | int msr; | 9489 | int msr; |
9474 | struct page *page; | 9490 | struct page *page; |
9475 | unsigned long *msr_bitmap; | 9491 | unsigned long *msr_bitmap_l1; |
9492 | unsigned long *msr_bitmap_l0 = to_vmx(vcpu)->nested.msr_bitmap; | ||
9476 | 9493 | ||
9494 | /* This shortcut is ok because we support only x2APIC MSRs so far. */ | ||
9477 | if (!nested_cpu_has_virt_x2apic_mode(vmcs12)) | 9495 | if (!nested_cpu_has_virt_x2apic_mode(vmcs12)) |
9478 | return false; | 9496 | return false; |
9479 | 9497 | ||
@@ -9482,63 +9500,37 @@ static inline bool nested_vmx_merge_msr_bitmap(struct kvm_vcpu *vcpu, | |||
9482 | WARN_ON(1); | 9500 | WARN_ON(1); |
9483 | return false; | 9501 | return false; |
9484 | } | 9502 | } |
9485 | msr_bitmap = (unsigned long *)kmap(page); | 9503 | msr_bitmap_l1 = (unsigned long *)kmap(page); |
9486 | if (!msr_bitmap) { | 9504 | if (!msr_bitmap_l1) { |
9487 | nested_release_page_clean(page); | 9505 | nested_release_page_clean(page); |
9488 | WARN_ON(1); | 9506 | WARN_ON(1); |
9489 | return false; | 9507 | return false; |
9490 | } | 9508 | } |
9491 | 9509 | ||
9510 | memset(msr_bitmap_l0, 0xff, PAGE_SIZE); | ||
9511 | |||
9492 | if (nested_cpu_has_virt_x2apic_mode(vmcs12)) { | 9512 | if (nested_cpu_has_virt_x2apic_mode(vmcs12)) { |
9493 | if (nested_cpu_has_apic_reg_virt(vmcs12)) | 9513 | if (nested_cpu_has_apic_reg_virt(vmcs12)) |
9494 | for (msr = 0x800; msr <= 0x8ff; msr++) | 9514 | for (msr = 0x800; msr <= 0x8ff; msr++) |
9495 | nested_vmx_disable_intercept_for_msr( | 9515 | nested_vmx_disable_intercept_for_msr( |
9496 | msr_bitmap, | 9516 | msr_bitmap_l1, msr_bitmap_l0, |
9497 | vmx_msr_bitmap_nested, | ||
9498 | msr, MSR_TYPE_R); | 9517 | msr, MSR_TYPE_R); |
9499 | /* TPR is allowed */ | 9518 | |
9500 | nested_vmx_disable_intercept_for_msr(msr_bitmap, | 9519 | nested_vmx_disable_intercept_for_msr( |
9501 | vmx_msr_bitmap_nested, | 9520 | msr_bitmap_l1, msr_bitmap_l0, |
9502 | APIC_BASE_MSR + (APIC_TASKPRI >> 4), | 9521 | APIC_BASE_MSR + (APIC_TASKPRI >> 4), |
9503 | MSR_TYPE_R | MSR_TYPE_W); | 9522 | MSR_TYPE_R | MSR_TYPE_W); |
9523 | |||
9504 | if (nested_cpu_has_vid(vmcs12)) { | 9524 | if (nested_cpu_has_vid(vmcs12)) { |
9505 | /* EOI and self-IPI are allowed */ | ||
9506 | nested_vmx_disable_intercept_for_msr( | 9525 | nested_vmx_disable_intercept_for_msr( |
9507 | msr_bitmap, | 9526 | msr_bitmap_l1, msr_bitmap_l0, |
9508 | vmx_msr_bitmap_nested, | ||
9509 | APIC_BASE_MSR + (APIC_EOI >> 4), | 9527 | APIC_BASE_MSR + (APIC_EOI >> 4), |
9510 | MSR_TYPE_W); | 9528 | MSR_TYPE_W); |
9511 | nested_vmx_disable_intercept_for_msr( | 9529 | nested_vmx_disable_intercept_for_msr( |
9512 | msr_bitmap, | 9530 | msr_bitmap_l1, msr_bitmap_l0, |
9513 | vmx_msr_bitmap_nested, | ||
9514 | APIC_BASE_MSR + (APIC_SELF_IPI >> 4), | 9531 | APIC_BASE_MSR + (APIC_SELF_IPI >> 4), |
9515 | MSR_TYPE_W); | 9532 | MSR_TYPE_W); |
9516 | } | 9533 | } |
9517 | } else { | ||
9518 | /* | ||
9519 | * Enable reading intercept of all the x2apic | ||
9520 | * MSRs. We should not rely on vmcs12 to do any | ||
9521 | * optimizations here, it may have been modified | ||
9522 | * by L1. | ||
9523 | */ | ||
9524 | for (msr = 0x800; msr <= 0x8ff; msr++) | ||
9525 | __vmx_enable_intercept_for_msr( | ||
9526 | vmx_msr_bitmap_nested, | ||
9527 | msr, | ||
9528 | MSR_TYPE_R); | ||
9529 | |||
9530 | __vmx_enable_intercept_for_msr( | ||
9531 | vmx_msr_bitmap_nested, | ||
9532 | APIC_BASE_MSR + (APIC_TASKPRI >> 4), | ||
9533 | MSR_TYPE_W); | ||
9534 | __vmx_enable_intercept_for_msr( | ||
9535 | vmx_msr_bitmap_nested, | ||
9536 | APIC_BASE_MSR + (APIC_EOI >> 4), | ||
9537 | MSR_TYPE_W); | ||
9538 | __vmx_enable_intercept_for_msr( | ||
9539 | vmx_msr_bitmap_nested, | ||
9540 | APIC_BASE_MSR + (APIC_SELF_IPI >> 4), | ||
9541 | MSR_TYPE_W); | ||
9542 | } | 9534 | } |
9543 | kunmap(page); | 9535 | kunmap(page); |
9544 | nested_release_page_clean(page); | 9536 | nested_release_page_clean(page); |
@@ -9957,10 +9949,10 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
9957 | } | 9949 | } |
9958 | 9950 | ||
9959 | if (cpu_has_vmx_msr_bitmap() && | 9951 | if (cpu_has_vmx_msr_bitmap() && |
9960 | exec_control & CPU_BASED_USE_MSR_BITMAPS) { | 9952 | exec_control & CPU_BASED_USE_MSR_BITMAPS && |
9961 | nested_vmx_merge_msr_bitmap(vcpu, vmcs12); | 9953 | nested_vmx_merge_msr_bitmap(vcpu, vmcs12)) |
9962 | /* MSR_BITMAP will be set by following vmx_set_efer. */ | 9954 | ; /* MSR_BITMAP will be set by following vmx_set_efer. */ |
9963 | } else | 9955 | else |
9964 | exec_control &= ~CPU_BASED_USE_MSR_BITMAPS; | 9956 | exec_control &= ~CPU_BASED_USE_MSR_BITMAPS; |
9965 | 9957 | ||
9966 | /* | 9958 | /* |
@@ -10011,6 +10003,8 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
10011 | vmx->nested.vmcs01_tsc_offset + vmcs12->tsc_offset); | 10003 | vmx->nested.vmcs01_tsc_offset + vmcs12->tsc_offset); |
10012 | else | 10004 | else |
10013 | vmcs_write64(TSC_OFFSET, vmx->nested.vmcs01_tsc_offset); | 10005 | vmcs_write64(TSC_OFFSET, vmx->nested.vmcs01_tsc_offset); |
10006 | if (kvm_has_tsc_control) | ||
10007 | decache_tsc_multiplier(vmx); | ||
10014 | 10008 | ||
10015 | if (enable_vpid) { | 10009 | if (enable_vpid) { |
10016 | /* | 10010 | /* |
@@ -10767,6 +10761,14 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, | |||
10767 | else | 10761 | else |
10768 | vmcs_set_bits(PIN_BASED_VM_EXEC_CONTROL, | 10762 | vmcs_set_bits(PIN_BASED_VM_EXEC_CONTROL, |
10769 | PIN_BASED_VMX_PREEMPTION_TIMER); | 10763 | PIN_BASED_VMX_PREEMPTION_TIMER); |
10764 | if (kvm_has_tsc_control) | ||
10765 | decache_tsc_multiplier(vmx); | ||
10766 | |||
10767 | if (vmx->nested.change_vmcs01_virtual_x2apic_mode) { | ||
10768 | vmx->nested.change_vmcs01_virtual_x2apic_mode = false; | ||
10769 | vmx_set_virtual_x2apic_mode(vcpu, | ||
10770 | vcpu->arch.apic_base & X2APIC_ENABLE); | ||
10771 | } | ||
10770 | 10772 | ||
10771 | /* This is needed for same reason as it was needed in prepare_vmcs02 */ | 10773 | /* This is needed for same reason as it was needed in prepare_vmcs02 */ |
10772 | vmx->host_rsp = 0; | 10774 | vmx->host_rsp = 0; |
diff --git a/arch/x86/lib/kaslr.c b/arch/x86/lib/kaslr.c index f7dfeda83e5c..121f59c6ee54 100644 --- a/arch/x86/lib/kaslr.c +++ b/arch/x86/lib/kaslr.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <asm/cpufeature.h> | 19 | #include <asm/cpufeature.h> |
20 | #include <asm/setup.h> | 20 | #include <asm/setup.h> |
21 | 21 | ||
22 | #define debug_putstr(v) early_printk(v) | 22 | #define debug_putstr(v) early_printk("%s", v) |
23 | #define has_cpuflag(f) boot_cpu_has(f) | 23 | #define has_cpuflag(f) boot_cpu_has(f) |
24 | #define get_boot_seed() kaslr_offset() | 24 | #define get_boot_seed() kaslr_offset() |
25 | #endif | 25 | #endif |
diff --git a/arch/x86/mm/ident_map.c b/arch/x86/mm/ident_map.c index ec21796ac5fd..4473cb4f8b90 100644 --- a/arch/x86/mm/ident_map.c +++ b/arch/x86/mm/ident_map.c | |||
@@ -3,15 +3,17 @@ | |||
3 | * included by both the compressed kernel and the regular kernel. | 3 | * included by both the compressed kernel and the regular kernel. |
4 | */ | 4 | */ |
5 | 5 | ||
6 | static void ident_pmd_init(unsigned long pmd_flag, pmd_t *pmd_page, | 6 | static void ident_pmd_init(struct x86_mapping_info *info, pmd_t *pmd_page, |
7 | unsigned long addr, unsigned long end) | 7 | unsigned long addr, unsigned long end) |
8 | { | 8 | { |
9 | addr &= PMD_MASK; | 9 | addr &= PMD_MASK; |
10 | for (; addr < end; addr += PMD_SIZE) { | 10 | for (; addr < end; addr += PMD_SIZE) { |
11 | pmd_t *pmd = pmd_page + pmd_index(addr); | 11 | pmd_t *pmd = pmd_page + pmd_index(addr); |
12 | 12 | ||
13 | if (!pmd_present(*pmd)) | 13 | if (pmd_present(*pmd)) |
14 | set_pmd(pmd, __pmd(addr | pmd_flag)); | 14 | continue; |
15 | |||
16 | set_pmd(pmd, __pmd((addr - info->offset) | info->pmd_flag)); | ||
15 | } | 17 | } |
16 | } | 18 | } |
17 | 19 | ||
@@ -30,13 +32,13 @@ static int ident_pud_init(struct x86_mapping_info *info, pud_t *pud_page, | |||
30 | 32 | ||
31 | if (pud_present(*pud)) { | 33 | if (pud_present(*pud)) { |
32 | pmd = pmd_offset(pud, 0); | 34 | pmd = pmd_offset(pud, 0); |
33 | ident_pmd_init(info->pmd_flag, pmd, addr, next); | 35 | ident_pmd_init(info, pmd, addr, next); |
34 | continue; | 36 | continue; |
35 | } | 37 | } |
36 | pmd = (pmd_t *)info->alloc_pgt_page(info->context); | 38 | pmd = (pmd_t *)info->alloc_pgt_page(info->context); |
37 | if (!pmd) | 39 | if (!pmd) |
38 | return -ENOMEM; | 40 | return -ENOMEM; |
39 | ident_pmd_init(info->pmd_flag, pmd, addr, next); | 41 | ident_pmd_init(info, pmd, addr, next); |
40 | set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE)); | 42 | set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE)); |
41 | } | 43 | } |
42 | 44 | ||
@@ -44,14 +46,15 @@ static int ident_pud_init(struct x86_mapping_info *info, pud_t *pud_page, | |||
44 | } | 46 | } |
45 | 47 | ||
46 | int kernel_ident_mapping_init(struct x86_mapping_info *info, pgd_t *pgd_page, | 48 | int kernel_ident_mapping_init(struct x86_mapping_info *info, pgd_t *pgd_page, |
47 | unsigned long addr, unsigned long end) | 49 | unsigned long pstart, unsigned long pend) |
48 | { | 50 | { |
51 | unsigned long addr = pstart + info->offset; | ||
52 | unsigned long end = pend + info->offset; | ||
49 | unsigned long next; | 53 | unsigned long next; |
50 | int result; | 54 | int result; |
51 | int off = info->kernel_mapping ? pgd_index(__PAGE_OFFSET) : 0; | ||
52 | 55 | ||
53 | for (; addr < end; addr = next) { | 56 | for (; addr < end; addr = next) { |
54 | pgd_t *pgd = pgd_page + pgd_index(addr) + off; | 57 | pgd_t *pgd = pgd_page + pgd_index(addr); |
55 | pud_t *pud; | 58 | pud_t *pud; |
56 | 59 | ||
57 | next = (addr & PGDIR_MASK) + PGDIR_SIZE; | 60 | next = (addr & PGDIR_MASK) + PGDIR_SIZE; |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 620928903be3..d28a2d741f9e 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
@@ -122,8 +122,18 @@ __ref void *alloc_low_pages(unsigned int num) | |||
122 | return __va(pfn << PAGE_SHIFT); | 122 | return __va(pfn << PAGE_SHIFT); |
123 | } | 123 | } |
124 | 124 | ||
125 | /* need 3 4k for initial PMD_SIZE, 3 4k for 0-ISA_END_ADDRESS */ | 125 | /* |
126 | #define INIT_PGT_BUF_SIZE (6 * PAGE_SIZE) | 126 | * By default need 3 4k for initial PMD_SIZE, 3 4k for 0-ISA_END_ADDRESS. |
127 | * With KASLR memory randomization, depending on the machine e820 memory | ||
128 | * and the PUD alignment. We may need twice more pages when KASLR memory | ||
129 | * randomization is enabled. | ||
130 | */ | ||
131 | #ifndef CONFIG_RANDOMIZE_MEMORY | ||
132 | #define INIT_PGD_PAGE_COUNT 6 | ||
133 | #else | ||
134 | #define INIT_PGD_PAGE_COUNT 12 | ||
135 | #endif | ||
136 | #define INIT_PGT_BUF_SIZE (INIT_PGD_PAGE_COUNT * PAGE_SIZE) | ||
127 | RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE); | 137 | RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE); |
128 | void __init early_alloc_pgt_buf(void) | 138 | void __init early_alloc_pgt_buf(void) |
129 | { | 139 | { |
diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c index 26dccd6c0df1..bda8d5eef04d 100644 --- a/arch/x86/mm/kaslr.c +++ b/arch/x86/mm/kaslr.c | |||
@@ -77,7 +77,7 @@ static inline unsigned long get_padding(struct kaslr_memory_region *region) | |||
77 | */ | 77 | */ |
78 | static inline bool kaslr_memory_enabled(void) | 78 | static inline bool kaslr_memory_enabled(void) |
79 | { | 79 | { |
80 | return kaslr_enabled() && !config_enabled(CONFIG_KASAN); | 80 | return kaslr_enabled() && !IS_ENABLED(CONFIG_KASAN); |
81 | } | 81 | } |
82 | 82 | ||
83 | /* Initialize base and padding for each memory region randomized with KASLR */ | 83 | /* Initialize base and padding for each memory region randomized with KASLR */ |
@@ -97,7 +97,7 @@ void __init kernel_randomize_memory(void) | |||
97 | * add padding if needed (especially for memory hotplug support). | 97 | * add padding if needed (especially for memory hotplug support). |
98 | */ | 98 | */ |
99 | BUG_ON(kaslr_regions[0].base != &page_offset_base); | 99 | BUG_ON(kaslr_regions[0].base != &page_offset_base); |
100 | memory_tb = ((max_pfn << PAGE_SHIFT) >> TB_SHIFT) + | 100 | memory_tb = DIV_ROUND_UP(max_pfn << PAGE_SHIFT, 1UL << TB_SHIFT) + |
101 | CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING; | 101 | CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING; |
102 | 102 | ||
103 | /* Adapt phyiscal memory region size based on available memory */ | 103 | /* Adapt phyiscal memory region size based on available memory */ |
diff --git a/arch/x86/pci/vmd.c b/arch/x86/pci/vmd.c index b814ca675131..7948be342ee9 100644 --- a/arch/x86/pci/vmd.c +++ b/arch/x86/pci/vmd.c | |||
@@ -41,6 +41,7 @@ static DEFINE_RAW_SPINLOCK(list_lock); | |||
41 | * @node: list item for parent traversal. | 41 | * @node: list item for parent traversal. |
42 | * @rcu: RCU callback item for freeing. | 42 | * @rcu: RCU callback item for freeing. |
43 | * @irq: back pointer to parent. | 43 | * @irq: back pointer to parent. |
44 | * @enabled: true if driver enabled IRQ | ||
44 | * @virq: the virtual IRQ value provided to the requesting driver. | 45 | * @virq: the virtual IRQ value provided to the requesting driver. |
45 | * | 46 | * |
46 | * Every MSI/MSI-X IRQ requested for a device in a VMD domain will be mapped to | 47 | * Every MSI/MSI-X IRQ requested for a device in a VMD domain will be mapped to |
@@ -50,6 +51,7 @@ struct vmd_irq { | |||
50 | struct list_head node; | 51 | struct list_head node; |
51 | struct rcu_head rcu; | 52 | struct rcu_head rcu; |
52 | struct vmd_irq_list *irq; | 53 | struct vmd_irq_list *irq; |
54 | bool enabled; | ||
53 | unsigned int virq; | 55 | unsigned int virq; |
54 | }; | 56 | }; |
55 | 57 | ||
@@ -122,7 +124,9 @@ static void vmd_irq_enable(struct irq_data *data) | |||
122 | unsigned long flags; | 124 | unsigned long flags; |
123 | 125 | ||
124 | raw_spin_lock_irqsave(&list_lock, flags); | 126 | raw_spin_lock_irqsave(&list_lock, flags); |
127 | WARN_ON(vmdirq->enabled); | ||
125 | list_add_tail_rcu(&vmdirq->node, &vmdirq->irq->irq_list); | 128 | list_add_tail_rcu(&vmdirq->node, &vmdirq->irq->irq_list); |
129 | vmdirq->enabled = true; | ||
126 | raw_spin_unlock_irqrestore(&list_lock, flags); | 130 | raw_spin_unlock_irqrestore(&list_lock, flags); |
127 | 131 | ||
128 | data->chip->irq_unmask(data); | 132 | data->chip->irq_unmask(data); |
@@ -136,8 +140,10 @@ static void vmd_irq_disable(struct irq_data *data) | |||
136 | data->chip->irq_mask(data); | 140 | data->chip->irq_mask(data); |
137 | 141 | ||
138 | raw_spin_lock_irqsave(&list_lock, flags); | 142 | raw_spin_lock_irqsave(&list_lock, flags); |
139 | list_del_rcu(&vmdirq->node); | 143 | if (vmdirq->enabled) { |
140 | INIT_LIST_HEAD_RCU(&vmdirq->node); | 144 | list_del_rcu(&vmdirq->node); |
145 | vmdirq->enabled = false; | ||
146 | } | ||
141 | raw_spin_unlock_irqrestore(&list_lock, flags); | 147 | raw_spin_unlock_irqrestore(&list_lock, flags); |
142 | } | 148 | } |
143 | 149 | ||
diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c index 4480c06cade7..89d1146f5a6f 100644 --- a/arch/x86/platform/efi/quirks.c +++ b/arch/x86/platform/efi/quirks.c | |||
@@ -254,6 +254,7 @@ void __init efi_free_boot_services(void) | |||
254 | for_each_efi_memory_desc(md) { | 254 | for_each_efi_memory_desc(md) { |
255 | unsigned long long start = md->phys_addr; | 255 | unsigned long long start = md->phys_addr; |
256 | unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; | 256 | unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; |
257 | size_t rm_size; | ||
257 | 258 | ||
258 | if (md->type != EFI_BOOT_SERVICES_CODE && | 259 | if (md->type != EFI_BOOT_SERVICES_CODE && |
259 | md->type != EFI_BOOT_SERVICES_DATA) | 260 | md->type != EFI_BOOT_SERVICES_DATA) |
@@ -263,6 +264,26 @@ void __init efi_free_boot_services(void) | |||
263 | if (md->attribute & EFI_MEMORY_RUNTIME) | 264 | if (md->attribute & EFI_MEMORY_RUNTIME) |
264 | continue; | 265 | continue; |
265 | 266 | ||
267 | /* | ||
268 | * Nasty quirk: if all sub-1MB memory is used for boot | ||
269 | * services, we can get here without having allocated the | ||
270 | * real mode trampoline. It's too late to hand boot services | ||
271 | * memory back to the memblock allocator, so instead | ||
272 | * try to manually allocate the trampoline if needed. | ||
273 | * | ||
274 | * I've seen this on a Dell XPS 13 9350 with firmware | ||
275 | * 1.4.4 with SGX enabled booting Linux via Fedora 24's | ||
276 | * grub2-efi on a hard disk. (And no, I don't know why | ||
277 | * this happened, but Linux should still try to boot rather | ||
278 | * panicing early.) | ||
279 | */ | ||
280 | rm_size = real_mode_size_needed(); | ||
281 | if (rm_size && (start + rm_size) < (1<<20) && size >= rm_size) { | ||
282 | set_real_mode_mem(start, rm_size); | ||
283 | start += rm_size; | ||
284 | size -= rm_size; | ||
285 | } | ||
286 | |||
266 | free_bootmem_late(start, size); | 287 | free_bootmem_late(start, size); |
267 | } | 288 | } |
268 | 289 | ||
diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c index 66b2166ea4a1..23f2f3e41c7f 100644 --- a/arch/x86/platform/uv/bios_uv.c +++ b/arch/x86/platform/uv/bios_uv.c | |||
@@ -187,7 +187,8 @@ EXPORT_SYMBOL_GPL(uv_bios_set_legacy_vga_target); | |||
187 | void uv_bios_init(void) | 187 | void uv_bios_init(void) |
188 | { | 188 | { |
189 | uv_systab = NULL; | 189 | uv_systab = NULL; |
190 | if ((efi.uv_systab == EFI_INVALID_TABLE_ADDR) || !efi.uv_systab) { | 190 | if ((efi.uv_systab == EFI_INVALID_TABLE_ADDR) || |
191 | !efi.uv_systab || efi_runtime_disabled()) { | ||
191 | pr_crit("UV: UVsystab: missing\n"); | 192 | pr_crit("UV: UVsystab: missing\n"); |
192 | return; | 193 | return; |
193 | } | 194 | } |
@@ -199,12 +200,14 @@ void uv_bios_init(void) | |||
199 | return; | 200 | return; |
200 | } | 201 | } |
201 | 202 | ||
203 | /* Starting with UV4 the UV systab size is variable */ | ||
202 | if (uv_systab->revision >= UV_SYSTAB_VERSION_UV4) { | 204 | if (uv_systab->revision >= UV_SYSTAB_VERSION_UV4) { |
205 | int size = uv_systab->size; | ||
206 | |||
203 | iounmap(uv_systab); | 207 | iounmap(uv_systab); |
204 | uv_systab = ioremap(efi.uv_systab, uv_systab->size); | 208 | uv_systab = ioremap(efi.uv_systab, size); |
205 | if (!uv_systab) { | 209 | if (!uv_systab) { |
206 | pr_err("UV: UVsystab: ioremap(%d) failed!\n", | 210 | pr_err("UV: UVsystab: ioremap(%d) failed!\n", size); |
207 | uv_systab->size); | ||
208 | return; | 211 | return; |
209 | } | 212 | } |
210 | } | 213 | } |
diff --git a/arch/x86/power/hibernate_64.c b/arch/x86/power/hibernate_64.c index f0b5f2d402af..9634557a5444 100644 --- a/arch/x86/power/hibernate_64.c +++ b/arch/x86/power/hibernate_64.c | |||
@@ -87,7 +87,7 @@ static int set_up_temporary_mappings(void) | |||
87 | struct x86_mapping_info info = { | 87 | struct x86_mapping_info info = { |
88 | .alloc_pgt_page = alloc_pgt_page, | 88 | .alloc_pgt_page = alloc_pgt_page, |
89 | .pmd_flag = __PAGE_KERNEL_LARGE_EXEC, | 89 | .pmd_flag = __PAGE_KERNEL_LARGE_EXEC, |
90 | .kernel_mapping = true, | 90 | .offset = __PAGE_OFFSET, |
91 | }; | 91 | }; |
92 | unsigned long mstart, mend; | 92 | unsigned long mstart, mend; |
93 | pgd_t *pgd; | 93 | pgd_t *pgd; |
@@ -113,7 +113,7 @@ static int set_up_temporary_mappings(void) | |||
113 | return result; | 113 | return result; |
114 | } | 114 | } |
115 | 115 | ||
116 | temp_level4_pgt = (unsigned long)pgd - __PAGE_OFFSET; | 116 | temp_level4_pgt = __pa(pgd); |
117 | return 0; | 117 | return 0; |
118 | } | 118 | } |
119 | 119 | ||
diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c index 705e3fffb4a1..5db706f14111 100644 --- a/arch/x86/realmode/init.c +++ b/arch/x86/realmode/init.c | |||
@@ -1,9 +1,11 @@ | |||
1 | #include <linux/io.h> | 1 | #include <linux/io.h> |
2 | #include <linux/slab.h> | ||
2 | #include <linux/memblock.h> | 3 | #include <linux/memblock.h> |
3 | 4 | ||
4 | #include <asm/cacheflush.h> | 5 | #include <asm/cacheflush.h> |
5 | #include <asm/pgtable.h> | 6 | #include <asm/pgtable.h> |
6 | #include <asm/realmode.h> | 7 | #include <asm/realmode.h> |
8 | #include <asm/tlbflush.h> | ||
7 | 9 | ||
8 | struct real_mode_header *real_mode_header; | 10 | struct real_mode_header *real_mode_header; |
9 | u32 *trampoline_cr4_features; | 11 | u32 *trampoline_cr4_features; |
@@ -11,25 +13,37 @@ u32 *trampoline_cr4_features; | |||
11 | /* Hold the pgd entry used on booting additional CPUs */ | 13 | /* Hold the pgd entry used on booting additional CPUs */ |
12 | pgd_t trampoline_pgd_entry; | 14 | pgd_t trampoline_pgd_entry; |
13 | 15 | ||
16 | void __init set_real_mode_mem(phys_addr_t mem, size_t size) | ||
17 | { | ||
18 | void *base = __va(mem); | ||
19 | |||
20 | real_mode_header = (struct real_mode_header *) base; | ||
21 | printk(KERN_DEBUG "Base memory trampoline at [%p] %llx size %zu\n", | ||
22 | base, (unsigned long long)mem, size); | ||
23 | } | ||
24 | |||
14 | void __init reserve_real_mode(void) | 25 | void __init reserve_real_mode(void) |
15 | { | 26 | { |
16 | phys_addr_t mem; | 27 | phys_addr_t mem; |
17 | unsigned char *base; | 28 | size_t size = real_mode_size_needed(); |
18 | size_t size = PAGE_ALIGN(real_mode_blob_end - real_mode_blob); | 29 | |
30 | if (!size) | ||
31 | return; | ||
32 | |||
33 | WARN_ON(slab_is_available()); | ||
19 | 34 | ||
20 | /* Has to be under 1M so we can execute real-mode AP code. */ | 35 | /* Has to be under 1M so we can execute real-mode AP code. */ |
21 | mem = memblock_find_in_range(0, 1<<20, size, PAGE_SIZE); | 36 | mem = memblock_find_in_range(0, 1<<20, size, PAGE_SIZE); |
22 | if (!mem) | 37 | if (!mem) { |
23 | panic("Cannot allocate trampoline\n"); | 38 | pr_info("No sub-1M memory is available for the trampoline\n"); |
39 | return; | ||
40 | } | ||
24 | 41 | ||
25 | base = __va(mem); | ||
26 | memblock_reserve(mem, size); | 42 | memblock_reserve(mem, size); |
27 | real_mode_header = (struct real_mode_header *) base; | 43 | set_real_mode_mem(mem, size); |
28 | printk(KERN_DEBUG "Base memory trampoline at [%p] %llx size %zu\n", | ||
29 | base, (unsigned long long)mem, size); | ||
30 | } | 44 | } |
31 | 45 | ||
32 | void __init setup_real_mode(void) | 46 | static void __init setup_real_mode(void) |
33 | { | 47 | { |
34 | u16 real_mode_seg; | 48 | u16 real_mode_seg; |
35 | const u32 *rel; | 49 | const u32 *rel; |
@@ -84,7 +98,7 @@ void __init setup_real_mode(void) | |||
84 | 98 | ||
85 | trampoline_header->start = (u64) secondary_startup_64; | 99 | trampoline_header->start = (u64) secondary_startup_64; |
86 | trampoline_cr4_features = &trampoline_header->cr4; | 100 | trampoline_cr4_features = &trampoline_header->cr4; |
87 | *trampoline_cr4_features = __read_cr4(); | 101 | *trampoline_cr4_features = mmu_cr4_features; |
88 | 102 | ||
89 | trampoline_pgd = (u64 *) __va(real_mode_header->trampoline_pgd); | 103 | trampoline_pgd = (u64 *) __va(real_mode_header->trampoline_pgd); |
90 | trampoline_pgd[0] = trampoline_pgd_entry.pgd; | 104 | trampoline_pgd[0] = trampoline_pgd_entry.pgd; |
@@ -100,7 +114,7 @@ void __init setup_real_mode(void) | |||
100 | * need to mark it executable at do_pre_smp_initcalls() at least, | 114 | * need to mark it executable at do_pre_smp_initcalls() at least, |
101 | * thus run it as a early_initcall(). | 115 | * thus run it as a early_initcall(). |
102 | */ | 116 | */ |
103 | static int __init set_real_mode_permissions(void) | 117 | static void __init set_real_mode_permissions(void) |
104 | { | 118 | { |
105 | unsigned char *base = (unsigned char *) real_mode_header; | 119 | unsigned char *base = (unsigned char *) real_mode_header; |
106 | size_t size = PAGE_ALIGN(real_mode_blob_end - real_mode_blob); | 120 | size_t size = PAGE_ALIGN(real_mode_blob_end - real_mode_blob); |
@@ -119,7 +133,16 @@ static int __init set_real_mode_permissions(void) | |||
119 | set_memory_nx((unsigned long) base, size >> PAGE_SHIFT); | 133 | set_memory_nx((unsigned long) base, size >> PAGE_SHIFT); |
120 | set_memory_ro((unsigned long) base, ro_size >> PAGE_SHIFT); | 134 | set_memory_ro((unsigned long) base, ro_size >> PAGE_SHIFT); |
121 | set_memory_x((unsigned long) text_start, text_size >> PAGE_SHIFT); | 135 | set_memory_x((unsigned long) text_start, text_size >> PAGE_SHIFT); |
136 | } | ||
137 | |||
138 | static int __init init_real_mode(void) | ||
139 | { | ||
140 | if (!real_mode_header) | ||
141 | panic("Real mode trampoline was not allocated"); | ||
142 | |||
143 | setup_real_mode(); | ||
144 | set_real_mode_permissions(); | ||
122 | 145 | ||
123 | return 0; | 146 | return 0; |
124 | } | 147 | } |
125 | early_initcall(set_real_mode_permissions); | 148 | early_initcall(init_real_mode); |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 8ffb089b19a5..b86ebb1a9a7f 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -118,7 +118,7 @@ DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); | |||
118 | DEFINE_PER_CPU(struct vcpu_info, xen_vcpu_info); | 118 | DEFINE_PER_CPU(struct vcpu_info, xen_vcpu_info); |
119 | 119 | ||
120 | /* Linux <-> Xen vCPU id mapping */ | 120 | /* Linux <-> Xen vCPU id mapping */ |
121 | DEFINE_PER_CPU(int, xen_vcpu_id) = -1; | 121 | DEFINE_PER_CPU(uint32_t, xen_vcpu_id); |
122 | EXPORT_PER_CPU_SYMBOL(xen_vcpu_id); | 122 | EXPORT_PER_CPU_SYMBOL(xen_vcpu_id); |
123 | 123 | ||
124 | enum xen_domain_type xen_domain_type = XEN_NATIVE; | 124 | enum xen_domain_type xen_domain_type = XEN_NATIVE; |