* zach@vmware.com (zach@vmware.com) wrote:> 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);
> -
Heh, yeah that cleanup is in Xen:
- memcpy(thread->tls_array, &per_cpu(cpu_gdt_table, cpu),
- GDT_ENTRY_TLS_ENTRIES * 8);
+ memcpy(thread->tls_array,
&get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN],
+ GDT_ENTRY_TLS_ENTRIES * 8);
I recall considering removing that stuff since it looked redundant,
but there's mention of reload, and barrier so I left it alone...