diff options
Diffstat (limited to 'arch/x86/kernel/vsyscall_64.c')
-rw-r--r-- | arch/x86/kernel/vsyscall_64.c | 51 |
1 files changed, 5 insertions, 46 deletions
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index 1f96f9347ed9..8b3b3eb3cead 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
@@ -47,14 +47,12 @@ | |||
47 | #include <asm/segment.h> | 47 | #include <asm/segment.h> |
48 | #include <asm/desc.h> | 48 | #include <asm/desc.h> |
49 | #include <asm/topology.h> | 49 | #include <asm/topology.h> |
50 | #include <asm/vgtod.h> | ||
51 | #include <asm/traps.h> | 50 | #include <asm/traps.h> |
52 | 51 | ||
53 | #define CREATE_TRACE_POINTS | 52 | #define CREATE_TRACE_POINTS |
54 | #include "vsyscall_trace.h" | 53 | #include "vsyscall_trace.h" |
55 | 54 | ||
56 | DEFINE_VVAR(int, vgetcpu_mode); | 55 | DEFINE_VVAR(int, vgetcpu_mode); |
57 | DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data); | ||
58 | 56 | ||
59 | static enum { EMULATE, NATIVE, NONE } vsyscall_mode = EMULATE; | 57 | static enum { EMULATE, NATIVE, NONE } vsyscall_mode = EMULATE; |
60 | 58 | ||
@@ -77,48 +75,6 @@ static int __init vsyscall_setup(char *str) | |||
77 | } | 75 | } |
78 | early_param("vsyscall", vsyscall_setup); | 76 | early_param("vsyscall", vsyscall_setup); |
79 | 77 | ||
80 | void update_vsyscall_tz(void) | ||
81 | { | ||
82 | vsyscall_gtod_data.sys_tz = sys_tz; | ||
83 | } | ||
84 | |||
85 | void update_vsyscall(struct timekeeper *tk) | ||
86 | { | ||
87 | struct vsyscall_gtod_data *vdata = &vsyscall_gtod_data; | ||
88 | |||
89 | write_seqcount_begin(&vdata->seq); | ||
90 | |||
91 | /* copy vsyscall data */ | ||
92 | vdata->clock.vclock_mode = tk->clock->archdata.vclock_mode; | ||
93 | vdata->clock.cycle_last = tk->clock->cycle_last; | ||
94 | vdata->clock.mask = tk->clock->mask; | ||
95 | vdata->clock.mult = tk->mult; | ||
96 | vdata->clock.shift = tk->shift; | ||
97 | |||
98 | vdata->wall_time_sec = tk->xtime_sec; | ||
99 | vdata->wall_time_snsec = tk->xtime_nsec; | ||
100 | |||
101 | vdata->monotonic_time_sec = tk->xtime_sec | ||
102 | + tk->wall_to_monotonic.tv_sec; | ||
103 | vdata->monotonic_time_snsec = tk->xtime_nsec | ||
104 | + (tk->wall_to_monotonic.tv_nsec | ||
105 | << tk->shift); | ||
106 | while (vdata->monotonic_time_snsec >= | ||
107 | (((u64)NSEC_PER_SEC) << tk->shift)) { | ||
108 | vdata->monotonic_time_snsec -= | ||
109 | ((u64)NSEC_PER_SEC) << tk->shift; | ||
110 | vdata->monotonic_time_sec++; | ||
111 | } | ||
112 | |||
113 | vdata->wall_time_coarse.tv_sec = tk->xtime_sec; | ||
114 | vdata->wall_time_coarse.tv_nsec = (long)(tk->xtime_nsec >> tk->shift); | ||
115 | |||
116 | vdata->monotonic_time_coarse = timespec_add(vdata->wall_time_coarse, | ||
117 | tk->wall_to_monotonic); | ||
118 | |||
119 | write_seqcount_end(&vdata->seq); | ||
120 | } | ||
121 | |||
122 | static void warn_bad_vsyscall(const char *level, struct pt_regs *regs, | 78 | static void warn_bad_vsyscall(const char *level, struct pt_regs *regs, |
123 | const char *message) | 79 | const char *message) |
124 | { | 80 | { |
@@ -374,7 +330,6 @@ void __init map_vsyscall(void) | |||
374 | { | 330 | { |
375 | extern char __vsyscall_page; | 331 | extern char __vsyscall_page; |
376 | unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page); | 332 | unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page); |
377 | extern char __vvar_page; | ||
378 | unsigned long physaddr_vvar_page = __pa_symbol(&__vvar_page); | 333 | unsigned long physaddr_vvar_page = __pa_symbol(&__vvar_page); |
379 | 334 | ||
380 | __set_fixmap(VSYSCALL_FIRST_PAGE, physaddr_vsyscall, | 335 | __set_fixmap(VSYSCALL_FIRST_PAGE, physaddr_vsyscall, |
@@ -393,9 +348,13 @@ static int __init vsyscall_init(void) | |||
393 | { | 348 | { |
394 | BUG_ON(VSYSCALL_ADDR(0) != __fix_to_virt(VSYSCALL_FIRST_PAGE)); | 349 | BUG_ON(VSYSCALL_ADDR(0) != __fix_to_virt(VSYSCALL_FIRST_PAGE)); |
395 | 350 | ||
351 | cpu_notifier_register_begin(); | ||
352 | |||
396 | on_each_cpu(cpu_vsyscall_init, NULL, 1); | 353 | on_each_cpu(cpu_vsyscall_init, NULL, 1); |
397 | /* notifier priority > KVM */ | 354 | /* notifier priority > KVM */ |
398 | hotcpu_notifier(cpu_vsyscall_notifier, 30); | 355 | __hotcpu_notifier(cpu_vsyscall_notifier, 30); |
356 | |||
357 | cpu_notifier_register_done(); | ||
399 | 358 | ||
400 | return 0; | 359 | return 0; |
401 | } | 360 | } |