diff options
Diffstat (limited to 'arch/x86_64')
-rw-r--r-- | arch/x86_64/kernel/apic.c | 12 | ||||
-rw-r--r-- | arch/x86_64/kernel/irq.c | 7 | ||||
-rw-r--r-- | arch/x86_64/kernel/time.c | 20 |
3 files changed, 21 insertions, 18 deletions
diff --git a/arch/x86_64/kernel/apic.c b/arch/x86_64/kernel/apic.c index 6472e321cad7..af4a1c71a80d 100644 --- a/arch/x86_64/kernel/apic.c +++ b/arch/x86_64/kernel/apic.c | |||
@@ -885,14 +885,14 @@ void setup_APIC_extened_lvt(unsigned char lvt_off, unsigned char vector, | |||
885 | * value into /proc/profile. | 885 | * value into /proc/profile. |
886 | */ | 886 | */ |
887 | 887 | ||
888 | void smp_local_timer_interrupt(struct pt_regs *regs) | 888 | void smp_local_timer_interrupt(void) |
889 | { | 889 | { |
890 | profile_tick(CPU_PROFILING, regs); | 890 | profile_tick(CPU_PROFILING); |
891 | #ifdef CONFIG_SMP | 891 | #ifdef CONFIG_SMP |
892 | update_process_times(user_mode(regs)); | 892 | update_process_times(user_mode(get_irq_regs())); |
893 | #endif | 893 | #endif |
894 | if (apic_runs_main_timer > 1 && smp_processor_id() == boot_cpu_id) | 894 | if (apic_runs_main_timer > 1 && smp_processor_id() == boot_cpu_id) |
895 | main_timer_handler(regs); | 895 | main_timer_handler(); |
896 | /* | 896 | /* |
897 | * We take the 'long' return path, and there every subsystem | 897 | * We take the 'long' return path, and there every subsystem |
898 | * grabs the appropriate locks (kernel lock/ irq lock). | 898 | * grabs the appropriate locks (kernel lock/ irq lock). |
@@ -913,7 +913,7 @@ void smp_local_timer_interrupt(struct pt_regs *regs) | |||
913 | * [ if a single-CPU system runs an SMP kernel then we call the local | 913 | * [ if a single-CPU system runs an SMP kernel then we call the local |
914 | * interrupt as well. Thus we cannot inline the local irq ... ] | 914 | * interrupt as well. Thus we cannot inline the local irq ... ] |
915 | */ | 915 | */ |
916 | void smp_apic_timer_interrupt(struct pt_regs *regs) | 916 | void smp_apic_timer_interrupt(void) |
917 | { | 917 | { |
918 | /* | 918 | /* |
919 | * the NMI deadlock-detector uses this. | 919 | * the NMI deadlock-detector uses this. |
@@ -932,7 +932,7 @@ void smp_apic_timer_interrupt(struct pt_regs *regs) | |||
932 | */ | 932 | */ |
933 | exit_idle(); | 933 | exit_idle(); |
934 | irq_enter(); | 934 | irq_enter(); |
935 | smp_local_timer_interrupt(regs); | 935 | smp_local_timer_interrupt(); |
936 | irq_exit(); | 936 | irq_exit(); |
937 | } | 937 | } |
938 | 938 | ||
diff --git a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c index 506f27c85ca5..b8a407fcd5d5 100644 --- a/arch/x86_64/kernel/irq.c +++ b/arch/x86_64/kernel/irq.c | |||
@@ -103,7 +103,9 @@ skip: | |||
103 | * handlers). | 103 | * handlers). |
104 | */ | 104 | */ |
105 | asmlinkage unsigned int do_IRQ(struct pt_regs *regs) | 105 | asmlinkage unsigned int do_IRQ(struct pt_regs *regs) |
106 | { | 106 | { |
107 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
108 | |||
107 | /* high bit used in ret_from_ code */ | 109 | /* high bit used in ret_from_ code */ |
108 | unsigned vector = ~regs->orig_rax; | 110 | unsigned vector = ~regs->orig_rax; |
109 | unsigned irq; | 111 | unsigned irq; |
@@ -121,9 +123,10 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs) | |||
121 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | 123 | #ifdef CONFIG_DEBUG_STACKOVERFLOW |
122 | stack_overflow_check(regs); | 124 | stack_overflow_check(regs); |
123 | #endif | 125 | #endif |
124 | generic_handle_irq(irq, regs); | 126 | generic_handle_irq(irq); |
125 | irq_exit(); | 127 | irq_exit(); |
126 | 128 | ||
129 | set_irq_regs(old_regs); | ||
127 | return 1; | 130 | return 1; |
128 | } | 131 | } |
129 | 132 | ||
diff --git a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c index 557e92af7bea..1ba5a442ac32 100644 --- a/arch/x86_64/kernel/time.c +++ b/arch/x86_64/kernel/time.c | |||
@@ -302,20 +302,20 @@ unsigned long long monotonic_clock(void) | |||
302 | } | 302 | } |
303 | EXPORT_SYMBOL(monotonic_clock); | 303 | EXPORT_SYMBOL(monotonic_clock); |
304 | 304 | ||
305 | static noinline void handle_lost_ticks(int lost, struct pt_regs *regs) | 305 | static noinline void handle_lost_ticks(int lost) |
306 | { | 306 | { |
307 | static long lost_count; | 307 | static long lost_count; |
308 | static int warned; | 308 | static int warned; |
309 | if (report_lost_ticks) { | 309 | if (report_lost_ticks) { |
310 | printk(KERN_WARNING "time.c: Lost %d timer tick(s)! ", lost); | 310 | printk(KERN_WARNING "time.c: Lost %d timer tick(s)! ", lost); |
311 | print_symbol("rip %s)\n", regs->rip); | 311 | print_symbol("rip %s)\n", get_irq_regs()->rip); |
312 | } | 312 | } |
313 | 313 | ||
314 | if (lost_count == 1000 && !warned) { | 314 | if (lost_count == 1000 && !warned) { |
315 | printk(KERN_WARNING "warning: many lost ticks.\n" | 315 | printk(KERN_WARNING "warning: many lost ticks.\n" |
316 | KERN_WARNING "Your time source seems to be instable or " | 316 | KERN_WARNING "Your time source seems to be instable or " |
317 | "some driver is hogging interupts\n"); | 317 | "some driver is hogging interupts\n"); |
318 | print_symbol("rip %s\n", regs->rip); | 318 | print_symbol("rip %s\n", get_irq_regs()->rip); |
319 | if (vxtime.mode == VXTIME_TSC && vxtime.hpet_address) { | 319 | if (vxtime.mode == VXTIME_TSC && vxtime.hpet_address) { |
320 | printk(KERN_WARNING "Falling back to HPET\n"); | 320 | printk(KERN_WARNING "Falling back to HPET\n"); |
321 | if (hpet_use_timer) | 321 | if (hpet_use_timer) |
@@ -339,7 +339,7 @@ static noinline void handle_lost_ticks(int lost, struct pt_regs *regs) | |||
339 | #endif | 339 | #endif |
340 | } | 340 | } |
341 | 341 | ||
342 | void main_timer_handler(struct pt_regs *regs) | 342 | void main_timer_handler(void) |
343 | { | 343 | { |
344 | static unsigned long rtc_update = 0; | 344 | static unsigned long rtc_update = 0; |
345 | unsigned long tsc; | 345 | unsigned long tsc; |
@@ -411,7 +411,7 @@ void main_timer_handler(struct pt_regs *regs) | |||
411 | } | 411 | } |
412 | 412 | ||
413 | if (lost > 0) | 413 | if (lost > 0) |
414 | handle_lost_ticks(lost, regs); | 414 | handle_lost_ticks(lost); |
415 | else | 415 | else |
416 | lost = 0; | 416 | lost = 0; |
417 | 417 | ||
@@ -421,7 +421,7 @@ void main_timer_handler(struct pt_regs *regs) | |||
421 | 421 | ||
422 | do_timer(lost + 1); | 422 | do_timer(lost + 1); |
423 | #ifndef CONFIG_SMP | 423 | #ifndef CONFIG_SMP |
424 | update_process_times(user_mode(regs)); | 424 | update_process_times(user_mode(get_irq_regs())); |
425 | #endif | 425 | #endif |
426 | 426 | ||
427 | /* | 427 | /* |
@@ -431,7 +431,7 @@ void main_timer_handler(struct pt_regs *regs) | |||
431 | */ | 431 | */ |
432 | 432 | ||
433 | if (!using_apic_timer) | 433 | if (!using_apic_timer) |
434 | smp_local_timer_interrupt(regs); | 434 | smp_local_timer_interrupt(); |
435 | 435 | ||
436 | /* | 436 | /* |
437 | * If we have an externally synchronized Linux clock, then update CMOS clock | 437 | * If we have an externally synchronized Linux clock, then update CMOS clock |
@@ -450,11 +450,11 @@ void main_timer_handler(struct pt_regs *regs) | |||
450 | write_sequnlock(&xtime_lock); | 450 | write_sequnlock(&xtime_lock); |
451 | } | 451 | } |
452 | 452 | ||
453 | static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 453 | static irqreturn_t timer_interrupt(int irq, void *dev_id) |
454 | { | 454 | { |
455 | if (apic_runs_main_timer > 1) | 455 | if (apic_runs_main_timer > 1) |
456 | return IRQ_HANDLED; | 456 | return IRQ_HANDLED; |
457 | main_timer_handler(regs); | 457 | main_timer_handler(); |
458 | if (using_apic_timer) | 458 | if (using_apic_timer) |
459 | smp_send_timer_broadcast_ipi(); | 459 | smp_send_timer_broadcast_ipi(); |
460 | return IRQ_HANDLED; | 460 | return IRQ_HANDLED; |
@@ -1337,7 +1337,7 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
1337 | } | 1337 | } |
1338 | if (call_rtc_interrupt) { | 1338 | if (call_rtc_interrupt) { |
1339 | rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8)); | 1339 | rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8)); |
1340 | rtc_interrupt(rtc_int_flag, dev_id, regs); | 1340 | rtc_interrupt(rtc_int_flag, dev_id); |
1341 | } | 1341 | } |
1342 | return IRQ_HANDLED; | 1342 | return IRQ_HANDLED; |
1343 | } | 1343 | } |