diff options
Diffstat (limited to 'arch/x86/kernel/vsyscall_64.c')
-rw-r--r-- | arch/x86/kernel/vsyscall_64.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index 61efa2f7d564..0b8b6690a86d 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
@@ -42,7 +42,8 @@ | |||
42 | #include <asm/topology.h> | 42 | #include <asm/topology.h> |
43 | #include <asm/vgtod.h> | 43 | #include <asm/vgtod.h> |
44 | 44 | ||
45 | #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr))) | 45 | #define __vsyscall(nr) \ |
46 | __attribute__ ((unused, __section__(".vsyscall_" #nr))) notrace | ||
46 | #define __syscall_clobber "r11","cx","memory" | 47 | #define __syscall_clobber "r11","cx","memory" |
47 | 48 | ||
48 | /* | 49 | /* |
@@ -249,7 +250,7 @@ static ctl_table kernel_root_table2[] = { | |||
249 | doesn't violate that. We'll find out if it does. */ | 250 | doesn't violate that. We'll find out if it does. */ |
250 | static void __cpuinit vsyscall_set_cpu(int cpu) | 251 | static void __cpuinit vsyscall_set_cpu(int cpu) |
251 | { | 252 | { |
252 | unsigned long *d; | 253 | unsigned long d; |
253 | unsigned long node = 0; | 254 | unsigned long node = 0; |
254 | #ifdef CONFIG_NUMA | 255 | #ifdef CONFIG_NUMA |
255 | node = cpu_to_node(cpu); | 256 | node = cpu_to_node(cpu); |
@@ -260,11 +261,11 @@ static void __cpuinit vsyscall_set_cpu(int cpu) | |||
260 | /* Store cpu number in limit so that it can be loaded quickly | 261 | /* Store cpu number in limit so that it can be loaded quickly |
261 | in user space in vgetcpu. | 262 | in user space in vgetcpu. |
262 | 12 bits for the CPU and 8 bits for the node. */ | 263 | 12 bits for the CPU and 8 bits for the node. */ |
263 | d = (unsigned long *)(get_cpu_gdt_table(cpu) + GDT_ENTRY_PER_CPU); | 264 | d = 0x0f40000000000ULL; |
264 | *d = 0x0f40000000000ULL; | 265 | d |= cpu; |
265 | *d |= cpu; | 266 | d |= (node & 0xf) << 12; |
266 | *d |= (node & 0xf) << 12; | 267 | d |= (node >> 4) << 48; |
267 | *d |= (node >> 4) << 48; | 268 | write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_PER_CPU, &d, DESCTYPE_S); |
268 | } | 269 | } |
269 | 270 | ||
270 | static void __cpuinit cpu_vsyscall_init(void *arg) | 271 | static void __cpuinit cpu_vsyscall_init(void *arg) |
@@ -278,7 +279,7 @@ cpu_vsyscall_notifier(struct notifier_block *n, unsigned long action, void *arg) | |||
278 | { | 279 | { |
279 | long cpu = (long)arg; | 280 | long cpu = (long)arg; |
280 | if (action == CPU_ONLINE || action == CPU_ONLINE_FROZEN) | 281 | if (action == CPU_ONLINE || action == CPU_ONLINE_FROZEN) |
281 | smp_call_function_single(cpu, cpu_vsyscall_init, NULL, 0, 1); | 282 | smp_call_function_single(cpu, cpu_vsyscall_init, NULL, 1); |
282 | return NOTIFY_DONE; | 283 | return NOTIFY_DONE; |
283 | } | 284 | } |
284 | 285 | ||
@@ -301,7 +302,7 @@ static int __init vsyscall_init(void) | |||
301 | #ifdef CONFIG_SYSCTL | 302 | #ifdef CONFIG_SYSCTL |
302 | register_sysctl_table(kernel_root_table2); | 303 | register_sysctl_table(kernel_root_table2); |
303 | #endif | 304 | #endif |
304 | on_each_cpu(cpu_vsyscall_init, NULL, 0, 1); | 305 | on_each_cpu(cpu_vsyscall_init, NULL, 1); |
305 | hotcpu_notifier(cpu_vsyscall_notifier, 0); | 306 | hotcpu_notifier(cpu_vsyscall_notifier, 0); |
306 | return 0; | 307 | return 0; |
307 | } | 308 | } |