提交 fc8b8a60 编写于 作者: J Jeremy Fitzhardinge 提交者: Ingo Molnar

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: NJeremy 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: NIngo Molnar <mingo@elte.hu>
上级 ada85708
...@@ -249,7 +249,7 @@ static ctl_table kernel_root_table2[] = { ...@@ -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) ...@@ -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 = 0x0f40000000000ULL; d |= cpu;
*d |= cpu; d |= (node & 0xf) << 12;
*d |= (node & 0xf) << 12; d |= (node >> 4) << 48;
*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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册