Skip to content
Snippets Groups Projects
Commit f85e38e0 authored by dtc's avatar dtc
Browse files

Implement a pseudo-atomic macro for the x86 backend.

parent 88571c63
No related branches found
No related tags found
No related merge requests found
......@@ -5,7 +5,7 @@
;;; Carnegie Mellon University, and has been placed in the public domain.
;;;
(ext:file-comment
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/lispinit.lisp,v 1.51 1997/11/04 09:10:45 dtc Exp $")
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/lispinit.lisp,v 1.52 1997/11/18 16:55:57 dtc Exp $")
;;;
;;; **********************************************************************
;;;
......@@ -47,6 +47,8 @@
(special *gc-inhibit* *already-maybe-gcing*
*need-to-collect-garbage* *gc-verbose*
*before-gc-hooks* *after-gc-hooks*
#+x86 *pseudo-atomic-atomic*
#+x86 *pseudo-atomic-interrupted*
unix::*interrupts-enabled*
unix::*interrupt-pending*
*type-system-initialized*)
......
......@@ -7,7 +7,7 @@
;;; Scott Fahlman or slisp-group@cs.cmu.edu.
;;;
(ext:file-comment
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/macros.lisp,v 1.6 1997/11/05 14:59:58 dtc Exp $")
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/macros.lisp,v 1.7 1997/11/18 16:55:52 dtc Exp $")
;;;
;;; **********************************************************************
;;;
......@@ -279,6 +279,31 @@
,error)))
;;;; PSEUDO-ATOMIC.
;;; PSEUDO-ATOMIC -- Internal Interface.
;;;
(defmacro pseudo-atomic (&rest forms)
(let ((label (gensym "LABEL-")))
`(let ((,label (gen-label)))
(store-symbol-value 0 lisp::*pseudo-atomic-interrupted*)
;; Note: we just use cfp as some not-zero value.
(store-symbol-value ebp-tn lisp::*pseudo-atomic-atomic*)
,@forms
(store-symbol-value 0 lisp::*pseudo-atomic-atomic*)
(inst cmp (make-ea :dword
:disp (+ nil-value
(static-symbol-offset
'lisp::*pseudo-atomic-interrupted*)
(ash symbol-value-slot word-shift)
(- other-pointer-type)))
0)
(inst jmp :eq ,label)
(inst int 3)
(inst byte pending-interrupt-trap)
(emit-label ,label))))
;;;; Indexed references:
......
......@@ -7,7 +7,7 @@
;;; Scott Fahlman or slisp-group@cs.cmu.edu.
;;;
(ext:file-comment
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/parms.lisp,v 1.8 1997/11/04 09:11:13 dtc Exp $")
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/parms.lisp,v 1.9 1997/11/18 16:55:53 dtc Exp $")
;;;
;;; **********************************************************************
;;;
......@@ -243,9 +243,11 @@
*alien-stack*
;; Interrupt Handling
lisp::*free-interrupt-context-index*
lisp::*pseudo-atomic-atomic*
lisp::*pseudo-atomic-interrupted*
unix::*interrupts-enabled*
unix::*interrupt-pending*
lisp::*free-interrupt-context-index*
*allocation-pointer*
*binding-stack-pointer*
......@@ -264,8 +266,6 @@
*control-stacks*
;; Spare symbols
spare-13
spare-12
spare-11
spare-10
spare-9
......
/*
* main() entry point for a stand alone lisp image.
*
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/lisp.c,v 1.11 1997/01/21 00:28:13 ram Exp $
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/lisp.c,v 1.12 1997/11/18 16:56:01 dtc Exp $
*
*/
......@@ -184,7 +184,7 @@ void main(int argc, char *argv[], char *envp[])
SetSymbolValue(BINDING_STACK_POINTER, (lispobj)binding_stack);
#endif
#if defined INTERNAL_GC_TRIGGER && !defined i386
SetSymbolValue(INTERNAL_GC_TRIGGER, fixnum(-1));
SetSymbolValue(INTERNAL_GC_TRIGGER, make_fixnum(-1));
#endif
interrupt_init();
......@@ -197,9 +197,15 @@ void main(int argc, char *argv[], char *envp[])
SetSymbolValue(LISP_ENVIRONMENT_LIST, alloc_str_list(envp));
#ifdef PSEUDO_ATOMIC_ATOMIC
#ifdef i386
/* Turn on pseudo atomic for when we call into lisp. */
SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, fixnum(1));
SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, fixnum(0));
SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0));
SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0));
#else
/* Turn on pseudo atomic for when we call into lisp. */
SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1));
SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0));
#endif
#endif
/* Pick off sigint until the lisp system gets far enough along to */
......
......@@ -110,22 +110,15 @@ arch_internal_error_arguments(struct sigcontext *context)
boolean
arch_pseudo_atomic_atomic(struct sigcontext *context)
{
#ifdef fixme
return (context->sc_regs[reg_ALLOC] & 1);
#else
return 0;
#endif
return SymbolValue(PSEUDO_ATOMIC_ATOMIC);
}
#define PSEUDO_ATOMIC_INTERRUPTED_BIAS 0x7f000000
void
arch_set_pseudo_atomic_interrupted(struct sigcontext *context)
{
#ifdef fixme
context->sc_regs[reg_ALLOC] |= 2;
#endif
SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1));
}
/* This stuff seems to get called for TRACE and debug activity */
unsigned long
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment