/*
- * This is 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". */
/*
* This software is part of the SBCL system. See the README file for
#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"
-#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)
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" );
}