1 /* Convex stuff for GDB.
2 Copyright (C) 1990, 1991 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
32 #include <sys/param.h>
35 #include <sys/ioctl.h>
36 #include <sys/pcntl.h>
37 #include <sys/thread.h>
45 exec_file_command (filename
, from_tty
)
53 /* Eliminate all traces of old exec file.
54 Mark text segment as empty. */
71 /* Now open and digest the file the user requested, if any. */
75 filename
= tilde_expand (filename
);
76 make_cleanup (free
, filename
);
78 execchan
= openp (getenv ("PATH"), 1, filename
, O_RDONLY
, 0,
81 perror_with_name (filename
);
83 if (myread (execchan
, &filehdr
, sizeof filehdr
) < 0)
84 perror_with_name (filename
);
86 if (! IS_SOFF_MAGIC (filehdr
.h_magic
))
87 error ("%s: not an executable file.", filename
);
89 if (myread (execchan
, &opthdr
, filehdr
.h_opthdr
) <= 0)
90 perror_with_name (filename
);
92 /* Read through the section headers.
93 For text, data, etc, record an entry in the exec file map.
94 Record text_start and text_end. */
96 lseek (execchan
, (long) filehdr
.h_scnptr
, 0);
98 for (n
= 0; n
< filehdr
.h_nscns
; n
++)
100 if (myread (execchan
, &scnhdr
, sizeof scnhdr
) < 0)
101 perror_with_name (filename
);
103 if ((scnhdr
.s_flags
& S_TYPMASK
) >= S_TEXT
104 && (scnhdr
.s_flags
& S_TYPMASK
) <= S_COMON
)
106 exec_map
[n_exec
].mem_addr
= scnhdr
.s_vaddr
;
107 exec_map
[n_exec
].mem_end
= scnhdr
.s_vaddr
+ scnhdr
.s_size
;
108 exec_map
[n_exec
].file_addr
= scnhdr
.s_scnptr
;
109 exec_map
[n_exec
].type
= scnhdr
.s_flags
& S_TYPMASK
;
112 if ((scnhdr
.s_flags
& S_TYPMASK
) == S_TEXT
)
114 text_start
= scnhdr
.s_vaddr
;
115 text_end
= scnhdr
.s_vaddr
+ scnhdr
.s_size
;
120 fstat (execchan
, &st_exec
);
121 exec_mtime
= st_exec
.st_mtime
;
126 printf_filtered ("No exec file now.\n");
128 /* Tell display code (if any) about the changed file name. */
129 if (exec_file_display_hook
)
130 (*exec_file_display_hook
) (filename
);
133 /* Read data from SOFF exec or core file.
134 Return 0 on success, EIO if address out of bounds. */
137 xfer_core_file (memaddr
, myaddr
, len
)
155 /* Determine which file the next bunch of addresses reside in,
156 and where in the file. Set the file's read/write pointer
157 to point at the proper place for the desired address
158 and set xferfile and xferchan for the correct file.
159 If desired address is nonexistent, leave them zero.
160 i is set to the number of bytes that can be handled
161 along with the next address. */
165 for (n
= 0; n
< n_core
; n
++)
167 if (memaddr
>= core_map
[n
].mem_addr
&& memaddr
< core_map
[n
].mem_end
168 && (core_map
[n
].thread
== -1
169 || core_map
[n
].thread
== inferior_thread
))
171 i
= min (len
, core_map
[n
].mem_end
- memaddr
);
172 fileptr
= core_map
[n
].file_addr
+ memaddr
- core_map
[n
].mem_addr
;
173 if (core_map
[n
].file_addr
)
175 xferfile
= &corefile
;
180 else if (core_map
[n
].mem_addr
>= memaddr
181 && core_map
[n
].mem_addr
< memaddr
+ i
)
182 i
= core_map
[n
].mem_addr
- memaddr
;
186 for (n
= 0; n
< n_exec
; n
++)
188 if (memaddr
>= exec_map
[n
].mem_addr
189 && memaddr
< exec_map
[n
].mem_end
)
191 i
= min (len
, exec_map
[n
].mem_end
- memaddr
);
192 fileptr
= exec_map
[n
].file_addr
+ memaddr
193 - exec_map
[n
].mem_addr
;
194 if (exec_map
[n
].file_addr
)
196 xferfile
= &execfile
;
201 else if (exec_map
[n
].mem_addr
>= memaddr
202 && exec_map
[n
].mem_addr
< memaddr
+ i
)
203 i
= exec_map
[n
].mem_addr
- memaddr
;
206 /* Now we know which file to use.
207 Set up its pointer and transfer the data. */
211 if (xferfile
== &execfile
)
212 error ("No program file to examine.");
214 error ("No core dump file or running program to examine.");
215 val
= lseek (xferchan
, fileptr
, 0);
217 perror_with_name (*xferfile
);
218 val
= myread (xferchan
, myaddr
, i
);
220 perror_with_name (*xferfile
);
222 /* If this address is for nonexistent memory,
223 read zeros if reading, or do nothing if writing. */
238 /* Here from info files command to print an address map. */
242 struct pmap ptrs
[200];
245 /* ID strings for core and executable file sections */
247 static char *idstr
[] =
249 "0", "text", "data", "tdata", "bss", "tbss",
250 "common", "ttext", "ctx", "tctx", "10", "11", "12",
253 for (n
= 0; n
< n_core
; n
++)
255 core_map
[n
].which
= 0;
256 ptrs
[n
] = core_map
[n
];
258 for (n
= 0; n
< n_exec
; n
++)
260 exec_map
[n
].which
= 1;
261 ptrs
[n_core
+n
] = exec_map
[n
];
264 qsort (ptrs
, n_core
+ n_exec
, sizeof *ptrs
, ptr_cmp
);
266 for (n
= 0; n
< n_core
+ n_exec
; n
++)
268 struct pmap
*p
= &ptrs
[n
];
271 if (p
->mem_addr
< ptrs
[n
-1].mem_end
)
272 p
->mem_addr
= ptrs
[n
-1].mem_end
;
273 if (p
->mem_addr
>= p
->mem_end
)
276 printf_filtered ("%08x .. %08x %-6s %s\n",
277 p
->mem_addr
, p
->mem_end
, idstr
[p
->type
],
278 p
->which
? execfile
: corefile
);
282 /* Compare routine to put file sections in order.
283 Sort into increasing order on address, and put core file sections
284 before exec file sections if both files contain the same addresses. */
286 static ptr_cmp (a
, b
)
289 if (a
->mem_addr
!= b
->mem_addr
) return a
->mem_addr
- b
->mem_addr
;
290 return a
->which
- b
->which
;
293 /* Trapped internal variables are used to handle special registers.
294 A trapped i.v. calls a hook here every time it is dereferenced,
295 to provide a new value for the variable, and it calls a hook here
296 when a new value is assigned, to do something with the value.
298 The vector registers are $vl, $vs, $vm, $vN, $VN (N in 0..7).
299 The communication registers are $cN, $CN (N in 0..63).
300 They not handled as regular registers because it's expensive to
301 read them, and their size varies, and they have too many names. */
304 /* Return 1 if NAME is a trapped internal variable, else 0. */
307 is_trapped_internalvar (name
)
310 if ((name
[0] == 'c' || name
[0] == 'C')
311 && name
[1] >= '0' && name
[1] <= '9'
313 || (name
[2] >= '0' && name
[2] <= '9'
314 && name
[3] == '\0' && name
[1] != '0'))
315 && atoi (&name
[1]) < 64) return 1;
317 if ((name
[0] == 'v' || name
[0] == 'V')
318 && (((name
[1] & -8) == '0' && name
[2] == '\0')
319 || STREQ (name
, "vl")
320 || STREQ (name
, "vs")
321 || STREQ (name
, "vm")))
326 /* Return the value of trapped internal variable VAR */
329 value_of_trapped_internalvar (var
)
330 struct internalvar
*var
;
332 char *name
= var
->name
;
335 struct type
*range_type
;
336 long len
= *read_vector_register (VL_REGNUM
);
337 if (len
<= 0 || len
> 128) len
= 128;
339 if (STREQ (name
, "vl"))
341 val
= value_from_longest (builtin_type_int
,
342 (LONGEST
) *read_vector_register_1 (VL_REGNUM
));
344 else if (STREQ (name
, "vs"))
346 val
= value_from_longest (builtin_type_int
,
347 (LONGEST
) *read_vector_register_1 (VS_REGNUM
));
349 else if (STREQ (name
, "vm"))
353 bcopy (read_vector_register_1 (VM_REGNUM
), vm
, sizeof vm
);
355 create_range_type ((struct type
*) NULL
, builtin_type_int
, 0, len
- 1);
357 create_array_type ((struct type
*) NULL
, builtin_type_int
, range_type
);
358 val
= allocate_value (type
);
359 p
= (long *) VALUE_CONTENTS (val
);
360 for (i
= 0; i
< len
; i
++)
361 *p
++ = !! (vm
[3 - (i
>> 5)] & (1 << (i
& 037)));
363 else if (name
[0] == 'V')
366 create_range_type ((struct type
*) NULL
, builtin_type_int
0, len
- 1);
368 create_array_type ((struct type
*) NULL
, builtin_type_long_long
,
370 val
= allocate_value (type
);
371 bcopy (read_vector_register_1 (name
[1] - '0'),
372 VALUE_CONTENTS (val
), TYPE_LENGTH (type
));
374 else if (name
[0] == 'v')
378 create_range_type ((struct type
*) NULL
, builtin_type_int
0, len
- 1);
380 create_array_type ((struct type
*) NULL
, builtin_type_long
,
382 val
= allocate_value (type
);
383 p1
= read_vector_register_1 (name
[1] - '0');
384 p2
= (long *) VALUE_CONTENTS (val
);
385 while (--len
>= 0) {p1
++; *p2
++ = *p1
++;}
388 else if (name
[0] == 'c')
389 val
= value_from_longest (builtin_type_int
,
390 read_comm_register (atoi (&name
[1])));
391 else if (name
[0] == 'C')
392 val
= value_from_longest (builtin_type_long_long
,
393 read_comm_register (atoi (&name
[1])));
395 VALUE_LVAL (val
) = lval_internalvar
;
396 VALUE_INTERNALVAR (val
) = var
;
400 /* Handle a new value assigned to a trapped internal variable */
403 set_trapped_internalvar (var
, val
, bitpos
, bitsize
, offset
)
404 struct internalvar
*var
;
406 int bitpos
, bitsize
, offset
;
408 char *name
= var
->name
;
409 long long newval
= value_as_long (val
);
411 if (STREQ (name
, "vl"))
412 write_vector_register (VL_REGNUM
, 0, newval
);
413 else if (STREQ (name
, "vs"))
414 write_vector_register (VS_REGNUM
, 0, newval
);
415 else if (name
[0] == 'c' || name
[0] == 'C')
416 write_comm_register (atoi (&name
[1]), newval
);
417 else if (STREQ (name
, "vm"))
418 error ("can't assign to $vm");
421 offset
/= bitsize
/ 8;
422 write_vector_register (name
[1] - '0', offset
, newval
);
426 /* Print an integer value when no format was specified. gdb normally
427 prints these values in decimal, but the the leading 0x80000000 of
428 pointers produces intolerable 10-digit negative numbers.
429 If it looks like an address, print it in hex instead. */
431 decout (stream
, type
, val
)
438 switch (output_radix
)
441 if ((lv
== val
|| (unsigned) lv
== val
)
442 && ((lv
& 0xf0000000) == 0x80000000
443 || ((lv
& 0xf0000000) == 0xf0000000 && lv
< STACK_END_ADDR
)))
445 fprintf_filtered (stream
, "%#x", lv
);
450 fprintf_filtered (stream
, TYPE_UNSIGNED (type
) ? "%llu" : "%lld", val
);
454 if (TYPE_LENGTH (type
) <= sizeof lv
)
455 fprintf_filtered (stream
, "%#o", lv
);
457 fprintf_filtered (stream
, "%#llo", val
);
461 if (TYPE_LENGTH (type
) <= sizeof lv
)
462 fprintf_filtered (stream
, "%#x", lv
);
464 fprintf_filtered (stream
, "%#llx", val
);
469 /* Change the default output radix to 10 or 16, or set it to 0 (heuristic).
470 This command is mostly obsolete now that the print command allows
471 formats to apply to aggregates, but is still handy occasionally. */
474 set_base_command (arg
)
483 new_radix
= atoi (arg
);
484 if (new_radix
!= 10 && new_radix
!= 16 && new_radix
!= 8)
485 error ("base must be 8, 10 or 16, or null");
486 else output_radix
= new_radix
;
490 /* Turn pipelining on or off in the inferior. */
493 set_pipelining_command (arg
)
498 sequential
= !sequential
;
499 printf_filtered ("%s\n", sequential
? "off" : "on");
501 else if (STREQ (arg
, "on"))
503 else if (STREQ (arg
, "off"))
505 else error ("valid args are `on', to allow instructions to overlap, or\n\
506 `off', to prevent it and thereby pinpoint exceptions.");
509 /* Enable, disable, or force parallel execution in the inferior. */
512 set_parallel_command (arg
)
516 int prevparallel
= parallel
;
518 if (!strncmp (arg
, "fixed", strlen (arg
)))
520 else if (STREQ (arg
, "on"))
522 else if (STREQ (arg
, "off"))
524 else error ("valid args are `on', to allow multiple threads, or\n\
525 `fixed', to force multiple threads, or\n\
526 `off', to run with one thread only.");
528 if ((prevparallel
== 0) != (parallel
== 0) && inferior_pid
)
529 printf_filtered ("will take effect at next run.\n");
531 getrlimit (RLIMIT_CONCUR
, &rl
);
532 rl
.rlim_cur
= parallel
? rl
.rlim_max
: 1;
533 setrlimit (RLIMIT_CONCUR
, &rl
);
536 set_fixed_scheduling (inferior_pid
, parallel
== 2);
539 /* Add a new name for an existing command. */
545 static char *aliaserr
= "usage is `alias NEW OLD', no args allowed";
547 struct cmd_list_element
*new, *old
;
550 error_no_arg ("newname oldname");
552 new = lookup_cmd (&arg
, cmdlist
, "", -1);
553 if (new && !strncmp (newname
, new->name
, strlen (new->name
)))
557 || (*arg
>= 'a' && *arg
<= 'z')
558 || (*arg
>= 'A' && *arg
<= 'Z')
559 || (*arg
>= '0' && *arg
<= '9')))
566 || (*arg
>= 'a' && *arg
<= 'z')
567 || (*arg
>= 'A' && *arg
<= 'Z')
568 || (*arg
>= '0' && *arg
<= '9'))
570 if (*arg
!= ' ' && *arg
!= '\t')
576 old
= lookup_cmd (&arg
, cmdlist
, "", 0);
581 if (new && !strncmp (newname
, new->name
, strlen (new->name
)))
584 if (new->class == (int) class_user
|| new->class == (int) class_alias
)
585 tem
= "Redefine command \"%s\"? ";
587 tem
= "Really redefine built-in command \"%s\"? ";
588 if (!query (tem
, new->name
))
589 error ("Command \"%s\" not redefined.", new->name
);
592 add_com (newname
, class_alias
, old
->function
, old
->doc
);
597 /* Print the current thread number, and any threads with signals in the
604 if (have_inferior_p ())
606 ps
.pi_buffer
= (char *) &comm_registers
;
607 ps
.pi_nbytes
= sizeof comm_registers
;
609 ps
.pi_thread
= inferior_thread
;
610 ioctl (inferior_fd
, PIXRDCREGS
, &ps
);
613 printf_filtered ("Current thread %d stopped with signal %d.%d (%s).\n",
614 inferior_thread
, stop_signal
, stop_sigcode
,
615 subsig_name (stop_signal
, stop_sigcode
));
617 for (p
= signal_stack
; p
->pid
; p
--)
618 printf_filtered ("Thread %d stopped with signal %d.%d (%s).\n",
619 p
->thread
, p
->signo
, p
->subsig
,
620 subsig_name (p
->signo
, p
->subsig
));
622 if (iscrlbit (comm_registers
.crctl
.lbits
.cc
, 64+13))
623 printf_filtered ("New thread start pc %#x\n",
624 (long) (comm_registers
.crreg
.pcpsw
>> 32));
627 /* Return string describing a signal.subcode number */
630 subsig_name (signo
, subcode
)
633 static char *subsig4
[] = {
634 "error exit", "privileged instruction", "unknown",
635 "unknown", "undefined opcode",
637 static char *subsig5
[] = {0,
638 "breakpoint", "single step", "fork trap", "exec trap", "pfork trap",
639 "join trap", "idle trap", "last thread", "wfork trap",
640 "process breakpoint", "trap instruction",
642 static char *subsig8
[] = {0,
643 "int overflow", "int divide check", "float overflow",
644 "float divide check", "float underflow", "reserved operand",
645 "sqrt error", "exp error", "ln error", "sin error", "cos error",
647 static char *subsig10
[] = {0,
648 "invalid inward ring address", "invalid outward ring call",
649 "invalid inward ring return", "invalid syscall gate",
650 "invalid rtn frame length", "invalid comm reg address",
653 static char *subsig11
[] = {0,
654 "read access denied", "write access denied", "execute access denied",
655 "segment descriptor fault", "page table fault", "data reference fault",
656 "i/o access denied", "levt pte invalid",
659 static char **subsig_list
[] =
660 {0, 0, 0, 0, subsig4
, subsig5
, 0, 0, subsig8
, 0, subsig10
, subsig11
, 0};
665 if ((p
= strsignal (signo
)) == NULL
)
667 if (signo
>= (sizeof subsig_list
/ sizeof *subsig_list
)
668 || !subsig_list
[signo
])
670 for (i
= 1; subsig_list
[signo
][i
]; i
++)
672 return subsig_list
[signo
][subcode
];
677 /* Print a compact display of thread status, essentially x/i $pc
678 for all active threads. */
685 for (t
= 0; t
< n_threads
; t
++)
686 if (thread_state
[t
] == PI_TALIVE
)
688 printf_filtered ("%d%c %08x%c %d.%d ", t
,
689 (t
== inferior_thread
? '*' : ' '), thread_pc
[t
],
690 (thread_is_in_kernel
[t
] ? '#' : ' '),
691 thread_signal
[t
], thread_sigcode
[t
]);
692 print_insn (thread_pc
[t
], stdout
);
693 printf_filtered ("\n");
697 /* Change the current thread to ARG. */
699 set_thread_command (arg
)
710 thread
= parse_and_eval_address (arg
);
712 if (thread
< 0 || thread
> n_threads
|| thread_state
[thread
] != PI_TALIVE
)
713 error ("no such thread.");
715 select_thread (thread
);
717 stop_pc
= read_pc ();
718 flush_cached_frames ();
719 set_current_frame (create_new_frame (read_register (FP_REGNUM
),
721 select_frame (get_current_frame (), 0);
722 print_stack_frame (selected_frame
, selected_frame_level
, -1);
725 /* Here on CONT command; gdb's dispatch address is changed to come here.
726 Set global variable ALL_CONTINUE to tell resume() that it should
727 start up all threads, and that a thread switch will not blow gdb's
731 convex_cont_command (proc_count_exp
, from_tty
)
732 char *proc_count_exp
;
736 cont_command (proc_count_exp
, from_tty
);
739 /* Here on 1CONT command. Resume only the current thread. */
741 one_cont_command (proc_count_exp
, from_tty
)
742 char *proc_count_exp
;
745 cont_command (proc_count_exp
, from_tty
);
748 /* Print the contents and lock bits of all communication registers,
749 or just register ARG if ARG is a communication register,
750 or the 3-word resource structure in memory at address ARG. */
752 comm_registers_info (arg
)
759 if (sscanf (arg
, "$c%d", ®num
) == 1) {
761 } else if (sscanf (arg
, "$C%d", ®num
) == 1) {
764 regnum
= parse_and_eval_address (arg
);
770 error ("%s: invalid register name.", arg
);
772 /* if we got a (user) address, examine the resource struct there */
777 read_memory (regnum
, buf
, sizeof buf
);
778 printf_filtered ("%08x %08x%08x%s\n", regnum
, buf
[1], buf
[2],
779 buf
[0] & 0xff ? " locked" : "");
784 ps
.pi_buffer
= (char *) &comm_registers
;
785 ps
.pi_nbytes
= sizeof comm_registers
;
787 ps
.pi_thread
= inferior_thread
;
788 ioctl (inferior_fd
, PIXRDCREGS
, &ps
);
790 for (i
= 0; i
< 64; i
++)
791 if (!arg
|| i
== regnum
)
792 printf_filtered ("%2d 0x8%03x %016llx%s\n", i
, i
,
793 comm_registers
.crreg
.r4
[i
],
794 (iscrlbit (comm_registers
.crctl
.lbits
.cc
, i
)
811 static struct pswbit pswbit
[] =
813 { 0x80000000, -1, "A carry" },
814 { 0x40000000, -1, "A integer overflow" },
815 { 0x20000000, -1, "A zero divide" },
816 { 0x10000000, -1, "Integer overflow enable" },
817 { 0x08000000, -1, "Trace" },
818 { 0x06000000, 25, "Frame length" },
819 { 0x01000000, -1, "Sequential" },
820 { 0x00800000, -1, "S carry" },
821 { 0x00400000, -1, "S integer overflow" },
822 { 0x00200000, -1, "S zero divide" },
823 { 0x00100000, -1, "Zero divide enable" },
824 { 0x00080000, -1, "Floating underflow" },
825 { 0x00040000, -1, "Floating overflow" },
826 { 0x00020000, -1, "Floating reserved operand" },
827 { 0x00010000, -1, "Floating zero divide" },
828 { 0x00008000, -1, "Floating error enable" },
829 { 0x00004000, -1, "Floating underflow enable" },
830 { 0x00002000, -1, "IEEE" },
831 { 0x00001000, -1, "Sequential stores" },
832 { 0x00000800, -1, "Intrinsic error" },
833 { 0x00000400, -1, "Intrinsic error enable" },
834 { 0x00000200, -1, "Trace thread creates" },
835 { 0x00000100, -1, "Thread init trap" },
836 { 0x000000e0, 5, "Reserved" },
837 { 0x0000001f, 0, "Intrinsic error code" },
845 psw
= parse_and_eval_address (arg
);
847 psw
= read_register (PS_REGNUM
);
849 for (p
= pswbit
; p
->bit
; p
++)
852 printf_filtered ("%08x %s %s\n", p
->bit
,
853 (psw
& p
->bit
) ? "yes" : "no ", p
->text
);
855 printf_filtered ("%08x %3d %s\n", p
->bit
,
856 (psw
& p
->bit
) >> p
->pos
, p
->text
);
860 _initialize_convex_dep ()
862 add_com ("alias", class_support
, alias_command
,
863 "Add a new name for an existing command.");
865 add_cmd ("base", class_vars
, set_base_command
,
866 "Change the integer output radix to 8, 10 or 16\n\
867 or use just `set base' with no args to return to the ad-hoc default,\n\
868 which is 16 for integers that look like addresses, 10 otherwise.",
871 add_cmd ("pipeline", class_run
, set_pipelining_command
,
872 "Enable or disable overlapped execution of instructions.\n\
873 With `set pipe off', exceptions are reported with\n\
874 $pc pointing at the instruction after the faulting one.\n\
875 The default is `set pipe on', which runs faster.",
878 add_cmd ("parallel", class_run
, set_parallel_command
,
879 "Enable or disable multi-threaded execution of parallel code.\n\
880 `set parallel off' means run the program on a single CPU.\n\
881 `set parallel fixed' means run the program with all CPUs assigned to it.\n\
882 `set parallel on' means run the program on any CPUs that are available.",
885 add_com ("1cont", class_run
, one_cont_command
,
886 "Continue the program, activating only the current thread.\n\
887 Args are the same as the `cont' command.");
889 add_com ("thread", class_run
, set_thread_command
,
890 "Change the current thread, the one under scrutiny and control.\n\
891 With no arg, show the active threads, the current one marked with *.");
893 add_info ("threads", thread_info
,
894 "List status of active threads.");
896 add_info ("comm-registers", comm_registers_info
,
897 "List communication registers and their contents.\n\
898 A communication register name as argument means describe only that register.\n\
899 An address as argument means describe the resource structure at that address.\n\
900 `Locked' means that the register has been sent to but not yet received from.");
902 add_info ("psw", psw_info
,
903 "Display $ps, the processor status word, bit by bit.\n\
904 An argument means display that value's interpretation as a psw.");
906 add_cmd ("convex", no_class
, 0, "Convex-specific commands.\n\
907 32-bit registers $pc $ps $sp $ap $fp $a1-5 $s0-7 $v0-7 $vl $vs $vm $c0-63\n\
908 64-bit registers $S0-7 $V0-7 $C0-63\n\
910 info threads display info on stopped threads waiting to signal\n\
911 thread display list of active threads\n\
912 thread N select thread N (its registers, stack, memory, etc.)\n\
913 step, next, etc step selected thread only\n\
914 1cont continue selected thread only\n\
915 cont continue all threads\n\
916 info comm-registers display contents of comm register(s) or a resource struct\n\
917 info psw display processor status word $ps\n\
918 set base N change integer radix used by `print' without a format\n\
919 set pipeline off exceptions are precise, $pc points after the faulting insn\n\
920 set pipeline on normal mode, $pc is somewhere ahead of faulting insn\n\
921 set parallel off program runs on a single CPU\n\
922 set parallel fixed all CPUs are assigned to the program\n\
923 set parallel on normal mode, parallel execution on random available CPUs\n\
This page took 0.047676 seconds and 4 git commands to generate.