1.0.25.24: x86/x86-64 runtime pseudo atomic fixes
[sbcl.git] / src / runtime / parse.c
index 4538a1b..beedc29 100644 (file)
@@ -1,3 +1,5 @@
+/* parsing for LDB monitor */
+
 /*
  * This software is part of the SBCL system. See the README file for
  * more information.
  * files for more information.
  */
 
-/*
- * $Header$
- */
-
 #include <stdio.h>
+#include <stdlib.h>
 #include <ctype.h>
 #include <signal.h>
 
-#include "runtime.h"
 #include "sbcl.h"
+#include "runtime.h"
+
+#if defined(LISP_FEATURE_SB_LDB)
+
 #include "globals.h"
 #include "vars.h"
 #include "parse.h"
 #include "interrupt.h"
 #include "lispregs.h"
 #include "monitor.h"
+#include "validate.h"
 #include "arch.h"
 #include "search.h"
+#include "thread.h"
+#include "pseudo-atomic.h"
+
+#include "genesis/simple-fun.h"
+#include "genesis/fdefn.h"
+#include "genesis/symbol.h"
+#include "genesis/static-symbols.h"
 
 static void skip_ws(char **ptr)
 {
@@ -205,29 +215,30 @@ char *parse_addr(ptr)
 char **ptr;
 {
     char *token = parse_token(ptr);
-    long result;
+    lispobj result;
 
     if (token == NULL) {
         printf("expected an address\n");
         throw_to_monitor();
     }
     else if (token[0] == '$') {
-        if (!lookup_variable(token+1, (lispobj *)&result)) {
+        if (!lookup_variable(token+1, &result)) {
             printf("unknown variable: ``%s''\n", token);
             throw_to_monitor();
         }
         result &= ~7;
     }
     else {
-        if (!string_to_long(token, &result)) {
+        long value;
+        if (!string_to_long(token, &value)) {
             printf("invalid number: ``%s''\n", token);
             throw_to_monitor();
         }
-        result &= ~3;
+        result = (value & ~3);
     }
 
     if (!is_valid_lisp_addr((os_vm_address_t)result)) {
-        printf("invalid Lisp-level address: 0x%lx\n", result);
+        printf("invalid Lisp-level address: %p\n", (void *)result);
         throw_to_monitor();
     }
 
@@ -240,23 +251,26 @@ static boolean lookup_symbol(char *name, lispobj *result)
     lispobj *headerptr;
 
     /* Search static space. */
-    headerptr = static_space;
-    count = ((lispobj *) SymbolValue(STATIC_SPACE_FREE_POINTER) -
-            static_space);
+    headerptr = (lispobj *)STATIC_SPACE_START;
+    count =
+        (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER,0) -
+        (lispobj *)STATIC_SPACE_START;
     if (search_for_symbol(name, &headerptr, &count)) {
-        *result = (lispobj)headerptr | type_OtherPointer;
+        *result = make_lispobj(headerptr,OTHER_POINTER_LOWTAG);
         return 1;
     }
 
     /* Search dynamic space. */
-    headerptr = DYNAMIC_SPACE_START;
-#if !defined(ibmrt) && !defined(__i386__)
-    count = dynamic_space_free_pointer - DYNAMIC_SPACE_START;
+#if defined(LISP_FEATURE_GENCGC)
+    headerptr = (lispobj *)DYNAMIC_SPACE_START;
+    count = (lispobj *)get_alloc_pointer() - headerptr;
 #else
-    count = (lispobj *)SymbolValue(ALLOCATION_POINTER) - DYNAMIC_SPACE_START;
+    headerptr = (lispobj *)current_dynamic_space;
+    count = dynamic_space_free_pointer - headerptr;
 #endif
+
     if (search_for_symbol(name, &headerptr, &count)) {
-        *result = (lispobj)headerptr | type_OtherPointer;
+        *result = make_lispobj(headerptr, OTHER_POINTER_LOWTAG);
         return 1;
     }
 
@@ -266,66 +280,68 @@ static boolean lookup_symbol(char *name, lispobj *result)
 static int
 parse_regnum(char *s)
 {
-       if ((s[1] == 'R') || (s[1] == 'r')) {
-               int regnum;
-
-               if (s[2] == '\0')
-                       return -1;
-
-               /* skip the $R part and call atoi on the number */
-               regnum = atoi(s + 2);
-               if ((regnum >= 0) && (regnum < NREGS))
-                       return regnum;
-               else
-                       return -1;
-       } else {
-               int i;
-
-               for (i = 0; i < NREGS ; i++)
-                       if (strcasecmp(s + 1, lisp_register_names[i]) == 0)
-#ifdef __i386__
-                               return i*2;
+    if ((s[1] == 'R') || (s[1] == 'r')) {
+        int regnum;
+
+        if (s[2] == '\0')
+            return -1;
+
+        /* skip the $R part and call atoi on the number */
+        regnum = atoi(s + 2);
+        if ((regnum >= 0) && (regnum < NREGS))
+            return regnum;
+        else
+            return -1;
+    } else {
+        int i;
+
+        for (i = 0; i < NREGS ; i++)
+            if (strcasecmp(s + 1, lisp_register_names[i]) == 0)
+#ifdef LISP_FEATURE_X86
+                return i*2;
 #else
-                               return i;
+        return i;
 #endif
-               
-               return -1;
-       }
+
+        return -1;
+    }
 }
 
 lispobj parse_lispobj(ptr)
 char **ptr;
 {
+    struct thread *thread=arch_os_get_current_thread();
     char *token = parse_token(ptr);
     long pointer;
     lispobj result;
+    long value;
 
     if (token == NULL) {
         printf("expected an object\n");
         throw_to_monitor();
     } else if (token[0] == '$') {
-       if (isalpha(token[1])) {
-               int free;
-               int regnum;
-               os_context_t *context;
+        if (isalpha(token[1])) {
+            int free_ici;
+            int regnum;
+            os_context_t *context;
 
-               free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX)>>2;
+            free_ici = fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread));
 
-               if (free == 0) {
-                       printf("Variable ``%s'' is not valid -- there is no current interrupt context.\n", token);
-                       throw_to_monitor();
-               }
+            if (free_ici == 0) {
+                printf("Variable ``%s'' is not valid -- there is no current interrupt context.\n", token);
+                throw_to_monitor();
+            }
 
-               context = lisp_interrupt_contexts[free - 1];
+            context = thread->interrupt_contexts[free_ici - 1];
 
-               regnum = parse_regnum(token);
-               if (regnum < 0) {
-                       printf("bogus register: ``%s''\n", token);
-                       throw_to_monitor();
-               }
+            regnum = parse_regnum(token);
+            if (regnum < 0) {
+                printf("bogus register: ``%s''\n", token);
+                throw_to_monitor();
+            }
 
-               result = *os_context_register_addr(context, regnum);
-       } else if (!lookup_variable(token+1, &result)) {
+            result = *os_context_register_addr(context, regnum);
+        } else if (!lookup_variable(token+1, &result)) {
             printf("unknown variable: ``%s''\n", token);
             throw_to_monitor();
         }
@@ -344,8 +360,8 @@ char **ptr;
             throw_to_monitor();
         }
     }
-    else if (string_to_long(token, (long *)&result))
-        ;
+    else if (string_to_long(token, &value))
+        result = value;
     else if (lookup_symbol(token, &result))
         ;
     else {
@@ -355,3 +371,5 @@ char **ptr;
 
     return result;
 }
+
+#endif /* defined(LISP_FEATURE_SB_LDB) */