aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-12-31 16:13:56 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2017-12-31 16:13:56 -0500
commitf39d7d78b70e0f39facb1e4fab77ad3df5c52a35 (patch)
treeb5d2aa0746b70300ebbca82a8132af386cc5986d
parent52c90f2d32bfa7d6eccd66a56c44ace1f78fbadd (diff)
parenta31e58e129f73ab5b04016330b13ed51fde7a961 (diff)
Merge branch 'x86/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Thomas Gleixner: "A couple of fixlets for x86: - Fix the ESPFIX double fault handling for 5-level pagetables - Fix the commandline parsing for 'apic=' on 32bit systems and update documentation - Make zombie stack traces reliable - Fix kexec with stack canary - Fix the delivery mode for APICs which was missed when the x86 vector management was converted to single target delivery. Caused a regression due to the broken hardware which ignores affinity settings in lowest prio delivery mode. - Unbreak modules when AMD memory encryption is enabled - Remove an unused parameter of prepare_switch_to" * 'x86/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/apic: Switch all APICs to Fixed delivery mode x86/apic: Update the 'apic=' description of setting APIC driver x86/apic: Avoid wrong warning when parsing 'apic=' in X86-32 case x86-32: Fix kexec with stack canary (CONFIG_CC_STACKPROTECTOR) x86: Remove unused parameter of prepare_switch_to x86/stacktrace: Make zombie stack traces reliable x86/mm: Unbreak modules that use the DMA API x86/build: Make isoimage work on Debian x86/espfix/64: Fix espfix double-fault handling on 5-level systems
-rw-r--r--Documentation/admin-guide/kernel-parameters.txt6
-rw-r--r--arch/x86/boot/genimage.sh28
-rw-r--r--arch/x86/include/asm/switch_to.h5
-rw-r--r--arch/x86/kernel/apic/apic.c2
-rw-r--r--arch/x86/kernel/apic/apic_flat_64.c2
-rw-r--r--arch/x86/kernel/apic/apic_noop.c2
-rw-r--r--arch/x86/kernel/apic/msi.c8
-rw-r--r--arch/x86/kernel/apic/probe_32.c2
-rw-r--r--arch/x86/kernel/apic/x2apic_cluster.c2
-rw-r--r--arch/x86/kernel/machine_kexec_32.c4
-rw-r--r--arch/x86/kernel/stacktrace.c6
-rw-r--r--arch/x86/kernel/traps.c2
-rw-r--r--arch/x86/mm/mem_encrypt.c4
-rw-r--r--drivers/pci/host/pci-hyperv.c8
14 files changed, 42 insertions, 39 deletions
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 7041c6710f22..af7104aaffd9 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -328,11 +328,15 @@
328 not play well with APC CPU idle - disable it if you have 328 not play well with APC CPU idle - disable it if you have
329 APC and your system crashes randomly. 329 APC and your system crashes randomly.
330 330
331 apic= [APIC,X86-32] Advanced Programmable Interrupt Controller 331 apic= [APIC,X86] Advanced Programmable Interrupt Controller
332 Change the output verbosity whilst booting 332 Change the output verbosity whilst booting
333 Format: { quiet (default) | verbose | debug } 333 Format: { quiet (default) | verbose | debug }
334 Change the amount of debugging information output 334 Change the amount of debugging information output
335 when initialising the APIC and IO-APIC components. 335 when initialising the APIC and IO-APIC components.
336 For X86-32, this can also be used to specify an APIC
337 driver name.
338 Format: apic=driver_name
339 Examples: apic=bigsmp
336 340
337 apic_extnmi= [APIC,X86] External NMI delivery setting 341 apic_extnmi= [APIC,X86] External NMI delivery setting
338 Format: { bsp (default) | all | none } 342 Format: { bsp (default) | all | none }
diff --git a/arch/x86/boot/genimage.sh b/arch/x86/boot/genimage.sh
index c9e8499fbfe7..6a10d52a4145 100644
--- a/arch/x86/boot/genimage.sh
+++ b/arch/x86/boot/genimage.sh
@@ -80,39 +80,43 @@ genfdimage288() {
80 mcopy $FBZIMAGE w:linux 80 mcopy $FBZIMAGE w:linux
81} 81}
82 82
83genisoimage() { 83geniso() {
84 tmp_dir=`dirname $FIMAGE`/isoimage 84 tmp_dir=`dirname $FIMAGE`/isoimage
85 rm -rf $tmp_dir 85 rm -rf $tmp_dir
86 mkdir $tmp_dir 86 mkdir $tmp_dir
87 for i in lib lib64 share end ; do 87 for i in lib lib64 share ; do
88 for j in syslinux ISOLINUX ; do 88 for j in syslinux ISOLINUX ; do
89 if [ -f /usr/$i/$j/isolinux.bin ] ; then 89 if [ -f /usr/$i/$j/isolinux.bin ] ; then
90 isolinux=/usr/$i/$j/isolinux.bin 90 isolinux=/usr/$i/$j/isolinux.bin
91 cp $isolinux $tmp_dir
92 fi 91 fi
93 done 92 done
94 for j in syslinux syslinux/modules/bios ; do 93 for j in syslinux syslinux/modules/bios ; do
95 if [ -f /usr/$i/$j/ldlinux.c32 ]; then 94 if [ -f /usr/$i/$j/ldlinux.c32 ]; then
96 ldlinux=/usr/$i/$j/ldlinux.c32 95 ldlinux=/usr/$i/$j/ldlinux.c32
97 cp $ldlinux $tmp_dir
98 fi 96 fi
99 done 97 done
100 if [ -n "$isolinux" -a -n "$ldlinux" ] ; then 98 if [ -n "$isolinux" -a -n "$ldlinux" ] ; then
101 break 99 break
102 fi 100 fi
103 if [ $i = end -a -z "$isolinux" ] ; then
104 echo 'Need an isolinux.bin file, please install syslinux/isolinux.'
105 exit 1
106 fi
107 done 101 done
102 if [ -z "$isolinux" ] ; then
103 echo 'Need an isolinux.bin file, please install syslinux/isolinux.'
104 exit 1
105 fi
106 if [ -z "$ldlinux" ] ; then
107 echo 'Need an ldlinux.c32 file, please install syslinux/isolinux.'
108 exit 1
109 fi
110 cp $isolinux $tmp_dir
111 cp $ldlinux $tmp_dir
108 cp $FBZIMAGE $tmp_dir/linux 112 cp $FBZIMAGE $tmp_dir/linux
109 echo "$KCMDLINE" > $tmp_dir/isolinux.cfg 113 echo "$KCMDLINE" > $tmp_dir/isolinux.cfg
110 if [ -f "$FDINITRD" ] ; then 114 if [ -f "$FDINITRD" ] ; then
111 cp "$FDINITRD" $tmp_dir/initrd.img 115 cp "$FDINITRD" $tmp_dir/initrd.img
112 fi 116 fi
113 mkisofs -J -r -input-charset=utf-8 -quiet -o $FIMAGE -b isolinux.bin \ 117 genisoimage -J -r -input-charset=utf-8 -quiet -o $FIMAGE \
114 -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table \ 118 -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 \
115 $tmp_dir 119 -boot-info-table $tmp_dir
116 isohybrid $FIMAGE 2>/dev/null || true 120 isohybrid $FIMAGE 2>/dev/null || true
117 rm -rf $tmp_dir 121 rm -rf $tmp_dir
118} 122}
@@ -121,6 +125,6 @@ case $1 in
121 bzdisk) genbzdisk;; 125 bzdisk) genbzdisk;;
122 fdimage144) genfdimage144;; 126 fdimage144) genfdimage144;;
123 fdimage288) genfdimage288;; 127 fdimage288) genfdimage288;;
124 isoimage) genisoimage;; 128 isoimage) geniso;;
125 *) echo 'Unknown image format'; exit 1; 129 *) echo 'Unknown image format'; exit 1;
126esac 130esac
diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h
index 9b6df68d8fd1..eb5f7999a893 100644
--- a/arch/x86/include/asm/switch_to.h
+++ b/arch/x86/include/asm/switch_to.h
@@ -16,8 +16,7 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
16 struct tss_struct *tss); 16 struct tss_struct *tss);
17 17
18/* This runs runs on the previous thread's stack. */ 18/* This runs runs on the previous thread's stack. */
19static inline void prepare_switch_to(struct task_struct *prev, 19static inline void prepare_switch_to(struct task_struct *next)
20 struct task_struct *next)
21{ 20{
22#ifdef CONFIG_VMAP_STACK 21#ifdef CONFIG_VMAP_STACK
23 /* 22 /*
@@ -70,7 +69,7 @@ struct fork_frame {
70 69
71#define switch_to(prev, next, last) \ 70#define switch_to(prev, next, last) \
72do { \ 71do { \
73 prepare_switch_to(prev, next); \ 72 prepare_switch_to(next); \
74 \ 73 \
75 ((last) = __switch_to_asm((prev), (next))); \ 74 ((last) = __switch_to_asm((prev), (next))); \
76} while (0) 75} while (0)
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 6e272f3ea984..880441f24146 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2626,11 +2626,13 @@ static int __init apic_set_verbosity(char *arg)
2626 apic_verbosity = APIC_DEBUG; 2626 apic_verbosity = APIC_DEBUG;
2627 else if (strcmp("verbose", arg) == 0) 2627 else if (strcmp("verbose", arg) == 0)
2628 apic_verbosity = APIC_VERBOSE; 2628 apic_verbosity = APIC_VERBOSE;
2629#ifdef CONFIG_X86_64
2629 else { 2630 else {
2630 pr_warning("APIC Verbosity level %s not recognised" 2631 pr_warning("APIC Verbosity level %s not recognised"
2631 " use apic=verbose or apic=debug\n", arg); 2632 " use apic=verbose or apic=debug\n", arg);
2632 return -EINVAL; 2633 return -EINVAL;
2633 } 2634 }
2635#endif
2634 2636
2635 return 0; 2637 return 0;
2636} 2638}
diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c
index aa85690e9b64..25a87028cb3f 100644
--- a/arch/x86/kernel/apic/apic_flat_64.c
+++ b/arch/x86/kernel/apic/apic_flat_64.c
@@ -151,7 +151,7 @@ static struct apic apic_flat __ro_after_init = {
151 .apic_id_valid = default_apic_id_valid, 151 .apic_id_valid = default_apic_id_valid,
152 .apic_id_registered = flat_apic_id_registered, 152 .apic_id_registered = flat_apic_id_registered,
153 153
154 .irq_delivery_mode = dest_LowestPrio, 154 .irq_delivery_mode = dest_Fixed,
155 .irq_dest_mode = 1, /* logical */ 155 .irq_dest_mode = 1, /* logical */
156 156
157 .disable_esr = 0, 157 .disable_esr = 0,
diff --git a/arch/x86/kernel/apic/apic_noop.c b/arch/x86/kernel/apic/apic_noop.c
index 7b659c4480c9..5078b5ce63a7 100644
--- a/arch/x86/kernel/apic/apic_noop.c
+++ b/arch/x86/kernel/apic/apic_noop.c
@@ -110,7 +110,7 @@ struct apic apic_noop __ro_after_init = {
110 .apic_id_valid = default_apic_id_valid, 110 .apic_id_valid = default_apic_id_valid,
111 .apic_id_registered = noop_apic_id_registered, 111 .apic_id_registered = noop_apic_id_registered,
112 112
113 .irq_delivery_mode = dest_LowestPrio, 113 .irq_delivery_mode = dest_Fixed,
114 /* logical delivery broadcast to all CPUs: */ 114 /* logical delivery broadcast to all CPUs: */
115 .irq_dest_mode = 1, 115 .irq_dest_mode = 1,
116 116
diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index 9b18be764422..ce503c99f5c4 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -39,17 +39,13 @@ static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg)
39 ((apic->irq_dest_mode == 0) ? 39 ((apic->irq_dest_mode == 0) ?
40 MSI_ADDR_DEST_MODE_PHYSICAL : 40 MSI_ADDR_DEST_MODE_PHYSICAL :
41 MSI_ADDR_DEST_MODE_LOGICAL) | 41 MSI_ADDR_DEST_MODE_LOGICAL) |
42 ((apic->irq_delivery_mode != dest_LowestPrio) ? 42 MSI_ADDR_REDIRECTION_CPU |
43 MSI_ADDR_REDIRECTION_CPU :
44 MSI_ADDR_REDIRECTION_LOWPRI) |
45 MSI_ADDR_DEST_ID(cfg->dest_apicid); 43 MSI_ADDR_DEST_ID(cfg->dest_apicid);
46 44
47 msg->data = 45 msg->data =
48 MSI_DATA_TRIGGER_EDGE | 46 MSI_DATA_TRIGGER_EDGE |
49 MSI_DATA_LEVEL_ASSERT | 47 MSI_DATA_LEVEL_ASSERT |
50 ((apic->irq_delivery_mode != dest_LowestPrio) ? 48 MSI_DATA_DELIVERY_FIXED |
51 MSI_DATA_DELIVERY_FIXED :
52 MSI_DATA_DELIVERY_LOWPRI) |
53 MSI_DATA_VECTOR(cfg->vector); 49 MSI_DATA_VECTOR(cfg->vector);
54} 50}
55 51
diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c
index fa22017de806..02e8acb134f8 100644
--- a/arch/x86/kernel/apic/probe_32.c
+++ b/arch/x86/kernel/apic/probe_32.c
@@ -105,7 +105,7 @@ static struct apic apic_default __ro_after_init = {
105 .apic_id_valid = default_apic_id_valid, 105 .apic_id_valid = default_apic_id_valid,
106 .apic_id_registered = default_apic_id_registered, 106 .apic_id_registered = default_apic_id_registered,
107 107
108 .irq_delivery_mode = dest_LowestPrio, 108 .irq_delivery_mode = dest_Fixed,
109 /* logical delivery broadcast to all CPUs: */ 109 /* logical delivery broadcast to all CPUs: */
110 .irq_dest_mode = 1, 110 .irq_dest_mode = 1,
111 111
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c
index 622f13ca8a94..8b04234e010b 100644
--- a/arch/x86/kernel/apic/x2apic_cluster.c
+++ b/arch/x86/kernel/apic/x2apic_cluster.c
@@ -184,7 +184,7 @@ static struct apic apic_x2apic_cluster __ro_after_init = {
184 .apic_id_valid = x2apic_apic_id_valid, 184 .apic_id_valid = x2apic_apic_id_valid,
185 .apic_id_registered = x2apic_apic_id_registered, 185 .apic_id_registered = x2apic_apic_id_registered,
186 186
187 .irq_delivery_mode = dest_LowestPrio, 187 .irq_delivery_mode = dest_Fixed,
188 .irq_dest_mode = 1, /* logical */ 188 .irq_dest_mode = 1, /* logical */
189 189
190 .disable_esr = 0, 190 .disable_esr = 0,
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
index 00bc751c861c..edfede768688 100644
--- a/arch/x86/kernel/machine_kexec_32.c
+++ b/arch/x86/kernel/machine_kexec_32.c
@@ -48,8 +48,6 @@ static void load_segments(void)
48 "\tmovl $"STR(__KERNEL_DS)",%%eax\n" 48 "\tmovl $"STR(__KERNEL_DS)",%%eax\n"
49 "\tmovl %%eax,%%ds\n" 49 "\tmovl %%eax,%%ds\n"
50 "\tmovl %%eax,%%es\n" 50 "\tmovl %%eax,%%es\n"
51 "\tmovl %%eax,%%fs\n"
52 "\tmovl %%eax,%%gs\n"
53 "\tmovl %%eax,%%ss\n" 51 "\tmovl %%eax,%%ss\n"
54 : : : "eax", "memory"); 52 : : : "eax", "memory");
55#undef STR 53#undef STR
@@ -232,8 +230,8 @@ void machine_kexec(struct kimage *image)
232 * The gdt & idt are now invalid. 230 * The gdt & idt are now invalid.
233 * If you want to load them you must set up your own idt & gdt. 231 * If you want to load them you must set up your own idt & gdt.
234 */ 232 */
235 set_gdt(phys_to_virt(0), 0);
236 idt_invalidate(phys_to_virt(0)); 233 idt_invalidate(phys_to_virt(0));
234 set_gdt(phys_to_virt(0), 0);
237 235
238 /* now call it */ 236 /* now call it */
239 image->start = relocate_kernel_ptr((unsigned long)image->head, 237 image->start = relocate_kernel_ptr((unsigned long)image->head,
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c
index 77835bc021c7..20161ef53537 100644
--- a/arch/x86/kernel/stacktrace.c
+++ b/arch/x86/kernel/stacktrace.c
@@ -164,8 +164,12 @@ int save_stack_trace_tsk_reliable(struct task_struct *tsk,
164{ 164{
165 int ret; 165 int ret;
166 166
167 /*
168 * If the task doesn't have a stack (e.g., a zombie), the stack is
169 * "reliably" empty.
170 */
167 if (!try_get_task_stack(tsk)) 171 if (!try_get_task_stack(tsk))
168 return -EINVAL; 172 return 0;
169 173
170 ret = __save_stack_trace_reliable(trace, tsk); 174 ret = __save_stack_trace_reliable(trace, tsk);
171 175
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index f69dbd47d733..446c9ef8cfc3 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -361,7 +361,7 @@ dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
361 * 361 *
362 * No need for ist_enter here because we don't use RCU. 362 * No need for ist_enter here because we don't use RCU.
363 */ 363 */
364 if (((long)regs->sp >> PGDIR_SHIFT) == ESPFIX_PGD_ENTRY && 364 if (((long)regs->sp >> P4D_SHIFT) == ESPFIX_PGD_ENTRY &&
365 regs->cs == __KERNEL_CS && 365 regs->cs == __KERNEL_CS &&
366 regs->ip == (unsigned long)native_irq_return_iret) 366 regs->ip == (unsigned long)native_irq_return_iret)
367 { 367 {
diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c
index d9a9e9fc75dd..391b13402e40 100644
--- a/arch/x86/mm/mem_encrypt.c
+++ b/arch/x86/mm/mem_encrypt.c
@@ -405,13 +405,13 @@ bool sme_active(void)
405{ 405{
406 return sme_me_mask && !sev_enabled; 406 return sme_me_mask && !sev_enabled;
407} 407}
408EXPORT_SYMBOL_GPL(sme_active); 408EXPORT_SYMBOL(sme_active);
409 409
410bool sev_active(void) 410bool sev_active(void)
411{ 411{
412 return sme_me_mask && sev_enabled; 412 return sme_me_mask && sev_enabled;
413} 413}
414EXPORT_SYMBOL_GPL(sev_active); 414EXPORT_SYMBOL(sev_active);
415 415
416static const struct dma_map_ops sev_dma_ops = { 416static const struct dma_map_ops sev_dma_ops = {
417 .alloc = sev_alloc, 417 .alloc = sev_alloc,
diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c
index 04dac6a42c9f..6b8d060d07de 100644
--- a/drivers/pci/host/pci-hyperv.c
+++ b/drivers/pci/host/pci-hyperv.c
@@ -985,9 +985,7 @@ static u32 hv_compose_msi_req_v1(
985 int_pkt->wslot.slot = slot; 985 int_pkt->wslot.slot = slot;
986 int_pkt->int_desc.vector = vector; 986 int_pkt->int_desc.vector = vector;
987 int_pkt->int_desc.vector_count = 1; 987 int_pkt->int_desc.vector_count = 1;
988 int_pkt->int_desc.delivery_mode = 988 int_pkt->int_desc.delivery_mode = dest_Fixed;
989 (apic->irq_delivery_mode == dest_LowestPrio) ?
990 dest_LowestPrio : dest_Fixed;
991 989
992 /* 990 /*
993 * Create MSI w/ dummy vCPU set, overwritten by subsequent retarget in 991 * Create MSI w/ dummy vCPU set, overwritten by subsequent retarget in
@@ -1008,9 +1006,7 @@ static u32 hv_compose_msi_req_v2(
1008 int_pkt->wslot.slot = slot; 1006 int_pkt->wslot.slot = slot;
1009 int_pkt->int_desc.vector = vector; 1007 int_pkt->int_desc.vector = vector;
1010 int_pkt->int_desc.vector_count = 1; 1008 int_pkt->int_desc.vector_count = 1;
1011 int_pkt->int_desc.delivery_mode = 1009 int_pkt->int_desc.delivery_mode = dest_Fixed;
1012 (apic->irq_delivery_mode == dest_LowestPrio) ?
1013 dest_LowestPrio : dest_Fixed;
1014 1010
1015 /* 1011 /*
1016 * Create MSI w/ dummy vCPU set targeting just one vCPU, overwritten 1012 * Create MSI w/ dummy vCPU set targeting just one vCPU, overwritten