|
@@ -132,7 +132,10 @@ static void fix_processor_context(void)
|
|
|
{
|
|
|
int cpu = smp_processor_id();
|
|
|
struct tss_struct *t = &per_cpu(init_tss, cpu);
|
|
|
-
|
|
|
+#ifdef CONFIG_X86_64
|
|
|
+ struct desc_struct *desc = get_cpu_gdt_table(cpu);
|
|
|
+ tss_desc tss;
|
|
|
+#endif
|
|
|
set_tss_desc(cpu, t); /*
|
|
|
* This just modifies memory; should not be
|
|
|
* necessary. But... This is necessary, because
|
|
@@ -141,7 +144,9 @@ static void fix_processor_context(void)
|
|
|
*/
|
|
|
|
|
|
#ifdef CONFIG_X86_64
|
|
|
- get_cpu_gdt_table(cpu)[GDT_ENTRY_TSS].type = 9;
|
|
|
+ memcpy(&tss, &desc[GDT_ENTRY_TSS], sizeof(tss_desc));
|
|
|
+ tss.type = 0x9; /* The available 64-bit TSS (see AMD vol 2, pg 91 */
|
|
|
+ write_gdt_entry(desc, GDT_ENTRY_TSS, &tss, DESC_TSS);
|
|
|
|
|
|
syscall_init(); /* This sets MSR_*STAR and related */
|
|
|
#endif
|