extern void uml_idle_timer(void);
 extern unsigned int do_IRQ(int irq, union uml_pt_regs *regs);
 extern int external_pid(void *t);
-extern void boot_timer_handler(int sig);
 extern void interrupt_end(void);
 extern void initial_thread_cb(void (*proc)(void *), void *arg);
 extern int debugger_signal(int status, int pid);
 
        }
 }
 
-
-void time_init_kern(void)
-{
-       long long nsecs;
-
-       nsecs = os_nsecs();
-       set_normalized_timespec(&wall_to_monotonic, -nsecs / BILLION,
-                               -nsecs % BILLION);
-}
-
-void do_boot_timer_handler(struct sigcontext * sc)
-{
-       unsigned long flags;
-       struct pt_regs regs;
-
-       CHOOSE_MODE((void) (UPT_SC(®s.regs) = sc),
-                   (void) (regs.regs.skas.is_user = 0));
-
-       write_seqlock_irqsave(&xtime_lock, flags);
-       do_timer(®s);
-       write_sequnlock_irqrestore(&xtime_lock, flags);
-}
-
 static DEFINE_SPINLOCK(timer_spinlock);
 
 static unsigned long long local_offset = 0;
        return IRQ_HANDLED;
 }
 
+static void register_timer(void)
+{
+       int err;
+
+       err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL);
+       if(err != 0)
+               printk(KERN_ERR "timer_init : request_irq failed - "
+                      "errno = %d\n", -err);
+
+       timer_irq_inited = 1;
+
+       user_time_init();
+}
+
+extern void (*late_time_init)(void);
+
+void time_init(void)
+{
+       long long nsecs;
+
+       nsecs = os_nsecs();
+       set_normalized_timespec(&wall_to_monotonic, -nsecs / BILLION,
+                               -nsecs % BILLION);
+       late_time_init = register_timer;
+}
+
 void do_gettimeofday(struct timeval *tv)
 {
        unsigned long long nsecs = get_time();
        if(current_thread->cpu == 0)
                timer_irq(regs);
 }
-
-int __init timer_init(void)
-{
-       int err;
-
-       user_time_init();
-       err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL);
-       if(err != 0)
-               printk(KERN_ERR "timer_init : request_irq failed - "
-                      "errno = %d\n", -err);
-       timer_irq_inited = 1;
-       return(0);
-}
-
-arch_initcall(timer_init);
 
 
 void init_irq_signals(int on_sigstack)
 {
-       __sighandler_t h;
        int flags;
 
        flags = on_sigstack ? SA_ONSTACK : 0;
-       if (timer_irq_inited)
-               h = (__sighandler_t)alarm_handler;
-       else
-               h = boot_timer_handler;
 
-       set_handler(SIGVTALRM, h, flags | SA_RESTART,
-                   SIGUSR1, SIGIO, SIGWINCH, SIGALRM, -1);
+       set_handler(SIGVTALRM, (__sighandler_t) alarm_handler,
+                   flags | SA_RESTART, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, -1);
+       set_handler(SIGALRM, (__sighandler_t) alarm_handler,
+                   flags | SA_RESTART, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, -1);
        set_handler(SIGIO, (__sighandler_t) sig_handler, flags | SA_RESTART,
                    SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
        signal(SIGWINCH, SIG_IGN);
 
        set_signals(enabled);
 }
 
-extern void do_boot_timer_handler(struct sigcontext * sc);
-
-void boot_timer_handler(ARCH_SIGHDLR_PARAM)
-{
-       struct sigcontext *sc;
-       int enabled;
-
-       ARCH_GET_SIGCONTEXT(sc, sig);
-
-       enabled = signals_enabled;
-       if(!enabled){
-               if(sig == SIGVTALRM)
-                       pending |= SIGVTALRM_MASK;
-               else pending |= SIGALRM_MASK;
-               return;
-       }
-
-       block_signals();
-
-       do_boot_timer_handler(sc);
-       set_signals(enabled);
-}
-
 void set_sigstack(void *sig_stack, int size)
 {
        stack_t stack = ((stack_t) { .ss_flags  = 0,
 
        set_interval(ITIMER_REAL);
 }
 
-void time_init(void)
-{
-       if(signal(SIGVTALRM, boot_timer_handler) == SIG_ERR)
-               panic("Couldn't set SIGVTALRM handler");
-       set_interval(ITIMER_VIRTUAL);
-       time_init_kern();
-}
-
 unsigned long long os_nsecs(void)
 {
        struct timeval tv;
        nanosleep(&ts, NULL);
 }
 
-/* XXX This partly duplicates init_irq_signals */
-
 void user_time_init(void)
 {
-       set_handler(SIGVTALRM, (__sighandler_t) alarm_handler,
-                   SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGWINCH,
-                   SIGALRM, SIGUSR2, -1);
-       set_handler(SIGALRM, (__sighandler_t) alarm_handler,
-                   SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGWINCH,
-                   SIGVTALRM, SIGUSR2, -1);
        set_interval(ITIMER_VIRTUAL);
 }