Browse Source

x86, 64-bit: use write_gdt_entry in vsyscall_set_cpu

Use write_gdt_entry to generate the special vgetcpu descriptor in the
vsyscall page.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Stephen Tweedie <sct@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Jeremy Fitzhardinge 17 years ago
parent
commit
fc8b8a60ff
1 changed files with 6 additions and 6 deletions
  1. 6 6
      arch/x86/kernel/vsyscall_64.c

+ 6 - 6
arch/x86/kernel/vsyscall_64.c

@@ -249,7 +249,7 @@ static ctl_table kernel_root_table2[] = {
    doesn't violate that. We'll find out if it does. */
    doesn't violate that. We'll find out if it does. */
 static void __cpuinit vsyscall_set_cpu(int cpu)
 static void __cpuinit vsyscall_set_cpu(int cpu)
 {
 {
-	unsigned long *d;
+	unsigned long d;
 	unsigned long node = 0;
 	unsigned long node = 0;
 #ifdef CONFIG_NUMA
 #ifdef CONFIG_NUMA
 	node = cpu_to_node(cpu);
 	node = cpu_to_node(cpu);
@@ -260,11 +260,11 @@ static void __cpuinit vsyscall_set_cpu(int cpu)
 	/* Store cpu number in limit so that it can be loaded quickly
 	/* Store cpu number in limit so that it can be loaded quickly
 	   in user space in vgetcpu.
 	   in user space in vgetcpu.
 	   12 bits for the CPU and 8 bits for the node. */
 	   12 bits for the CPU and 8 bits for the node. */
-	d = (unsigned long *)(get_cpu_gdt_table(cpu) + GDT_ENTRY_PER_CPU);
-	*d = 0x0f40000000000ULL;
-	*d |= cpu;
-	*d |= (node & 0xf) << 12;
-	*d |= (node >> 4) << 48;
+	d = 0x0f40000000000ULL;
+	d |= cpu;
+	d |= (node & 0xf) << 12;
+	d |= (node >> 4) << 48;
+	write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_PER_CPU, &d, DESCTYPE_S);
 }
 }
 
 
 static void __cpuinit cpu_vsyscall_init(void *arg)
 static void __cpuinit cpu_vsyscall_init(void *arg)