0.pre8.75
[sbcl.git] / src / runtime / alpha-linux-os.c
index 82d979a..e8e8ec0 100644 (file)
@@ -1,11 +1,20 @@
 /*
- * The x86 Linux incarnation of arch-dependent OS-dependent routines.
- * See also linux-os.c
- */
-
+ * This is the Compaq/Digital Alpha Linux incarnation of
+ * arch-dependent OS-dependent routines. See also "linux-os.c".  */
 
-/* header files lifted wholesale from linux-os.c, some may be redundant */
+/*
+ * This software is part of the SBCL system. See the README file for
+ * more information.
+ *
+ * This software is derived from the CMU CL system, which was
+ * written at Carnegie Mellon University and released into the
+ * public domain. The software is in the public domain and is
+ * provided with absolutely no warranty. See the COPYING and CREDITS
+ * files for more information.
+ */
 
+/* These header files were lifted wholesale from linux-os.c, some may
+ * be redundant. -- Dan Barlow ca. 2001-05-01 */
 #include <stdio.h>
 #include <sys/param.h>
 #include <sys/file.h>
 
 #include <sys/types.h>
 #include <signal.h>
-/* #include <sys/sysinfo.h> */
 #include <sys/time.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <asm/fpu.h>
 
 #include "validate.h"
 size_t os_vm_page_size;
 
-#if defined GENCGC             /* unlikely ... */
-#include "gencgc.h"
+#ifdef LISP_FEATURE_SB_THREAD
+#error "Define threading support functions"
+#else
+struct thread *arch_os_get_current_thread() {
+    return all_threads;
+}
+int arch_os_thread_init(struct thread *thread) {
+    return 1;                  /* success */
+}
+int arch_os_thread_cleanup(struct thread *thread) {
+    return 1;                  /* success */
+}
 #endif
 
-sigcontext_register_t   *
+
+os_context_register_t   *
 os_context_register_addr(os_context_t *context, int offset)
 {
     return &context->uc_mcontext.sc_regs[offset];
 }
 
-sigcontext_register_t *
-os_context_fpregister_addr(os_context_t *context, int offset)
+os_context_register_t *
+os_context_float_register_addr(os_context_t *context, int offset)
 {
     return &context->uc_mcontext.sc_fpregs[offset];
 }
 
-sigcontext_register_t *
+os_context_register_t *
 os_context_pc_addr(os_context_t *context)
 {
     return &((context->uc_mcontext).sc_pc);
 }
-sigcontext_register_t *
-os_context_sp_addr(os_context_t *context)
-{
-    lose("This was supposed to be an x86-only operation");
-    return 0;
-}
 
 sigset_t *
 os_context_sigmask_addr(os_context_t *context)
@@ -64,13 +78,30 @@ os_context_sigmask_addr(os_context_t *context)
     return &context->uc_sigmask;
 }
 
-void os_flush_icache(os_vm_address_t address, os_vm_size_t length)
+unsigned long
+os_context_fp_control(os_context_t *context)
+{
+    return ieee_fpcr_to_swcr((context->uc_mcontext).sc_fpcr);
+}
+
+void
+os_restore_fp_control(os_context_t *context)
 {
-    /* XXX this really shouldn't be empty
+    /* FIXME (in two parts):
+       Firstly, what happens in alpha linux inside the signal handler?
+       Does the floating point control state get cleared as in other
+       Linuxes?
+    
+       Secondly, how do we put it back if so? It will probably involve
+       something to do with
+    
+       context->uc_mcontext.sc_fpcr
 
-<dhd> dan_b: asm volatile ("call_pal imb")
-<dhd> or just "imb"
-<dhd> also : : "memory" 
+       (maybe a simple assembly statement will be enough)
+    */ 
+}
 
-     */
+void os_flush_icache(os_vm_address_t address, os_vm_size_t length)
+{
+    asm volatile ("imb" : : : "memory" );
 }