[PATCH 4/12] tls-unnecessary-init

zach@vmware.com
Wed, 18 Apr 2007 13:02:11 -0000

The per-CPU initialization code is copying in bogus data into
thread->tls_array.  Note that it copies &per_cpu(cpu_gdt_table, cpu),
not &per_cpu(cpu_gdt_table, cpu)[GDT_ENTRY_TLS_MIN).  That is totally
broken and unnecessary.  Make the initialization explicitly NULL.

Signed-off-by: Zachary Amsden <zach@vmware.com
Index: linux-2.6.13/include/asm-i386/processor.h
==================================================================---
linux-2.6.13.orig/include/asm-i386/processor.h	2005-08-08 15:27:25.000000000
-0700
+++ linux-2.6.13/include/asm-i386/processor.h	2005-08-08 17:57:17.000000000
-0700
@@ -463,6 +463,7 @@
 };

 #define INIT_THREAD  {							\
+	.tls_array = { [ 0 ... GDT_ENTRY_TLS_ENTRIES-1 ] = { 0,0 } },	\
 	.vm86_info = NULL,						\
 	.sysenter_cs = __KERNEL_CS,					\
 	.io_bitmap_ptr = NULL,						\
Index: linux-2.6.13/arch/i386/kernel/cpu/common.c
==================================================================---
linux-2.6.13.orig/arch/i386/kernel/cpu/common.c	2005-08-08 17:09:57.000000000
-0700
+++ linux-2.6.13/arch/i386/kernel/cpu/common.c	2005-08-08 17:50:09.000000000
-0700
@@ -607,12 +607,6 @@
 	cpu_gdt_descr[cpu].address  	    (unsigned long)&per_cpu(cpu_gdt_table,
cpu);

-	/*
-	 * Set up the per-thread TLS descriptor cache:
-	 */
-	memcpy(thread->tls_array, &per_cpu(cpu_gdt_table, cpu),
-		GDT_ENTRY_TLS_ENTRIES * 8);
-
 	load_gdt(&cpu_gdt_descr[cpu]);
 	load_idt(&idt_descr);