1 /* parsing for LDB monitor */
4 * This software is part of the SBCL system. See the README file for
7 * This software is derived from the CMU CL system, which was
8 * written at Carnegie Mellon University and released into the
9 * public domain. The software is in the public domain and is
10 * provided with absolutely no warranty. See the COPYING and CREDITS
11 * files for more information.
19 #if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD)
20 #include "pthreads_win32.h"
26 #if defined(LISP_FEATURE_SB_LDB)
32 #include "interrupt.h"
39 #include "pseudo-atomic.h"
41 #include "genesis/simple-fun.h"
42 #include "genesis/fdefn.h"
43 #include "genesis/symbol.h"
44 #include "genesis/static-symbols.h"
46 static void skip_ws(char **ptr
)
48 while (**ptr
<= ' ' && **ptr
!= '\0')
52 static boolean
string_to_long(char *token
, uword_t
*value
)
62 if (token
[1] == 'x') {
70 else if (token
[0] == '#') {
91 while (*ptr
!= '\0') {
92 if (*ptr
>= 'a' && *ptr
<= 'f')
93 digit
= *ptr
+ 10 - 'a';
94 else if (*ptr
>= 'A' && *ptr
<= 'F')
95 digit
= *ptr
+ 10 - 'A';
96 else if (*ptr
>= '0' && *ptr
<= '9')
100 if (digit
< 0 || digit
>= base
)
104 num
= num
* base
+ digit
;
111 static boolean
lookup_variable(char *name
, lispobj
*result
)
113 struct var
*var
= lookup_by_name(name
);
118 *result
= var_value(var
);
124 boolean
more_p(char **ptr
)
134 char *parse_token(char **ptr
)
156 uword_t
parse_number(char **ptr
)
158 char *token
= parse_token(ptr
);
162 printf("expected a number\n");
165 else if (string_to_long(token
, &result
))
168 printf("invalid number: ``%s''\n", token
);
174 char *parse_addr(char **ptr
, boolean safely
)
176 char *token
= parse_token(ptr
);
180 printf("expected an address\n");
183 else if (token
[0] == '$') {
184 if (!lookup_variable(token
+1, &result
)) {
185 printf("unknown variable: ``%s''\n", token
);
192 if (!string_to_long(token
, &value
)) {
193 printf("invalid number: ``%s''\n", token
);
196 result
= (value
& ~3);
199 if (safely
&& !gc_managed_addr_p(result
)) {
200 printf("invalid Lisp-level address: %p\n", (void *)result
);
204 return (char *)result
;
207 static lispobj
lookup_symbol(char *name
)
211 /* Search static space. */
212 if ((headerptr
= search_for_symbol(name
,
214 (uword_t
)static_space_free_pointer
)))
215 return make_lispobj(headerptr
, OTHER_POINTER_LOWTAG
);
217 #ifdef LISP_FEATURE_IMMOBILE_SPACE
218 /* Search immobile space. */
219 if ((headerptr
= search_for_symbol(name
,
220 IMMOBILE_SPACE_START
,
221 SymbolValue(IMMOBILE_FIXEDOBJ_FREE_POINTER
,0))))
222 return make_lispobj(headerptr
, OTHER_POINTER_LOWTAG
);
225 /* Search dynamic space. */
226 #if defined(LISP_FEATURE_GENCGC)
227 uword_t start
= DYNAMIC_SPACE_START
;
228 uword_t end
= (uword_t
)get_alloc_pointer();
230 uword_t start
= (uword_t
)current_dynamic_space
;
231 uword_t end
= (uword_t
)dynamic_space_free_pointer
;
233 if ((headerptr
= search_for_symbol(name
, start
, end
)))
234 return make_lispobj(headerptr
, OTHER_POINTER_LOWTAG
);
239 static int parse_regnum(char *s
)
241 if ((s
[1] == 'R') || (s
[1] == 'r')) {
247 /* skip the $R part and call atoi on the number */
248 regnum
= atoi(s
+ 2);
249 if ((regnum
>= 0) && (regnum
< NREGS
))
256 for (i
= 0; i
< NREGS
; i
++)
257 if (strcasecmp(s
+ 1, lisp_register_names
[i
]) == 0)
258 #ifdef LISP_FEATURE_X86
268 lispobj
parse_lispobj(char **ptr
)
270 struct thread
*thread
=arch_os_get_current_thread();
271 char *token
= parse_token(ptr
);
277 printf("expected an object\n");
279 } else if (token
[0] == '$') {
280 if (isalpha(token
[1])) {
283 os_context_t
*context
;
285 free_ici
= fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX
,thread
));
288 printf("Variable ``%s'' is not valid -- there is no current interrupt context.\n", token
);
292 context
= thread
->interrupt_contexts
[free_ici
- 1];
294 regnum
= parse_regnum(token
);
296 printf("bogus register: ``%s''\n", token
);
300 result
= *os_context_register_addr(context
, regnum
);
301 } else if (!lookup_variable(token
+1, &result
)) {
302 printf("unknown variable: ``%s''\n", token
);
305 } else if (token
[0] == '@') {
306 if (string_to_long(token
+1, &pointer
)) {
308 if (gc_managed_addr_p(pointer
))
309 result
= *(lispobj
*)pointer
;
311 printf("invalid Lisp-level address: ``%s''\n", token
+1);
316 printf("invalid address: ``%s''\n", token
+1);
320 else if (string_to_long(token
, &value
))
322 else if ((result
= lookup_symbol(token
)) != 0)
325 printf("invalid Lisp object: ``%s''\n", token
);
332 #endif /* defined(LISP_FEATURE_SB_LDB) */