+static void
+low_level_interrupt_handle_now(int signal, siginfo_t *info, void *void_context)
+{
+ os_context_t *context = (os_context_t*)void_context;
+ struct thread *thread=arch_os_get_current_thread();
+
+#ifdef LISP_FEATURE_LINUX
+ os_restore_fp_control(context);
+#endif
+ check_blockables_blocked_or_lose();
+ check_interrupts_enabled_or_lose(context);
+ (*thread->interrupt_data->interrupt_low_level_handlers[signal])
+ (signal, info, void_context);
+#ifdef LISP_FEATURE_DARWIN
+ /* Work around G5 bug */
+ DARWIN_FIX_CONTEXT(context);
+#endif
+}
+
+static void
+low_level_maybe_now_maybe_later(int signal, siginfo_t *info, void *void_context)
+{
+ os_context_t *context = arch_os_get_context(&void_context);
+ struct thread *thread=arch_os_get_current_thread();
+ struct interrupt_data *data=thread->interrupt_data;
+#ifdef LISP_FEATURE_LINUX
+ os_restore_fp_control(context);
+#endif
+ if(maybe_defer_handler(low_level_interrupt_handle_now,data,
+ signal,info,context))
+ return;
+ low_level_interrupt_handle_now(signal, info, context);
+#ifdef LISP_FEATURE_DARWIN
+ /* Work around G5 bug */
+ DARWIN_FIX_CONTEXT(context);
+#endif
+}
+