OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [ada/] [s-tasdeb-vms.adb] - Blame information for rev 706

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 706 jeremybenn
------------------------------------------------------------------------------
2
--                                                                          --
3
--                  GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                --
4
--                                                                          --
5
--                  S Y S T E M . T A S K I N G . D E B U G                 --
6
--                                                                          --
7
--                                  B o d y                                 --
8
--                                                                          --
9
--          Copyright (C) 2008-2010, Free Software Foundation, Inc.         --
10
--                                                                          --
11
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
12
-- terms of the  GNU General Public License as published  by the Free Soft- --
13
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16
-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
17
--                                                                          --
18
-- As a special exception under Section 7 of GPL version 3, you are granted --
19
-- additional permissions described in the GCC Runtime Library Exception,   --
20
-- version 3.1, as published by the Free Software Foundation.               --
21
--                                                                          --
22
-- You should have received a copy of the GNU General Public License and    --
23
-- a copy of the GCC Runtime Library Exception along with this program;     --
24
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
25
-- <http://www.gnu.org/licenses/>.                                          --
26
--                                                                          --
27
-- GNARL was developed by the GNARL team at Florida State University.       --
28
-- Extensive contributions were provided by Ada Core Technologies, Inc.     --
29
--                                                                          --
30
------------------------------------------------------------------------------
31
 
32
--  OpenVMS Version
33
 
34
with Ada.Unchecked_Conversion;
35
with Ada.Unchecked_Deallocation;
36
with System.Aux_DEC;
37
with System.CRTL;
38
with System.Task_Primitives.Operations;
39
package body System.Tasking.Debug is
40
 
41
   package OSI renames System.OS_Interface;
42
   package STPO renames System.Task_Primitives.Operations;
43
 
44
   use System.Aux_DEC;
45
 
46
   --  Condition value type
47
 
48
   subtype Cond_Value_Type is Unsigned_Longword;
49
 
50
   type Trace_Flag_Set is array (Character) of Boolean;
51
 
52
   Trace_On : Trace_Flag_Set := ('A' .. 'Z' => False, others => True);
53
 
54
   --  Print_Routine fuction codes
55
 
56
   type Print_Functions is
57
     (No_Print, Print_Newline, Print_Control,
58
      Print_String, Print_Symbol, Print_FAO);
59
   for Print_Functions use
60
     (No_Print => 0, Print_Newline => 1, Print_Control => 2,
61
      Print_String => 3, Print_Symbol => 4, Print_FAO => 5);
62
 
63
   --  Counted ascii type declarations
64
 
65
   subtype Count_Type is Natural range 0 .. 255;
66
   for Count_Type'Object_Size use 8;
67
 
68
   type ASCIC (Count : Count_Type) is record
69
      Text  : String (1 .. Count);
70
   end record;
71
 
72
   for ASCIC use record
73
      Count at 0 range 0 .. 7;
74
   end record;
75
   pragma Pack (ASCIC);
76
 
77
   type AASCIC is access ASCIC;
78
   for AASCIC'Size use 32;
79
 
80
   type AASCIC_Array is array (Positive range <>) of AASCIC;
81
 
82
   type ASCIC127 is record
83
      Count : Count_Type;
84
      Text  : String (1 .. 127);
85
   end record;
86
 
87
   for ASCIC127 use record
88
      Count at 0 range 0 .. 7;
89
      Text  at 1 range 0 .. 127 * 8 - 1;
90
   end record;
91
 
92
   --  DEBUG Event record types used to signal DEBUG about Ada events
93
 
94
   type Debug_Event_Record is record
95
      Code     : Unsigned_Word; --  Event code that uniquely identifies event
96
      Flags    : Bit_Array_8;   --  Flag bits
97
      --                            Bit 0: This event allows a parameter list
98
      --                            Bit 1: Parameters are address expressions
99
      Sentinal : Unsigned_Byte; --  Sentinal valuye: Always K_EVENT_SENT
100
      TS_Kind  : Unsigned_Byte; --  DST type specification: Always K_TS_TASK
101
      DType    : Unsigned_Byte; --  DTYPE of parameter if of atomic data type
102
      --                            Always K_DTYPE_TASK
103
      MBZ      : Unsigned_Byte; --  Unused (must be zero)
104
      Minchr   : Count_Type;    --  Minimum chars needed to identify event
105
      Name     : ASCIC (31);    --  Event name uppercase only
106
      Help     : AASCIC;        --  Event description
107
   end record;
108
 
109
   for Debug_Event_Record use record
110
      Code     at 0 range 0 .. 15;
111
      Flags    at 2 range 0 .. 7;
112
      Sentinal at 3 range 0 .. 7;
113
      TS_Kind  at 4 range 0 .. 7;
114
      Dtype    at 5 range 0 .. 7;
115
      MBZ      at 6 range 0 .. 7;
116
      Minchr   at 7 range 0 .. 7;
117
      Name     at 8 range 0 .. 32 * 8 - 1;
118
      Help     at 40 range 0 .. 31;
119
   end record;
120
 
121
   type Ada_Event_Control_Block_Type is record
122
      Code      : Unsigned_Word;     --  Reserved and defined by DEBUG
123
      Unused1   : Unsigned_Byte;     --  Reserved and defined by DEBUG
124
      Sentinal  : Unsigned_Byte;     --  Reserved and defined by DEBUG
125
      Facility  : Unsigned_Word;     --  Reserved and defined by DEBUG
126
      Flags     : Unsigned_Word;     --  Reserved and defined by DEBUG
127
      Value     : Unsigned_Longword; --  Reserved and defined by DEBUG
128
      Unused2   : Unsigned_Longword; --  Reserved and defined by DEBUG
129
      Sigargs   : Unsigned_Longword;
130
      P1        : Unsigned_Longword;
131
      Sub_Event : Unsigned_Longword;
132
   end record;
133
 
134
   for Ada_Event_Control_Block_Type use record
135
      Code      at 0 range 0 .. 15;
136
      Unused1   at 2 range 0 .. 7;
137
      Sentinal  at 3 range 0 .. 7;
138
      Facility  at 4 range 0 .. 15;
139
      Flags     at 6 range 0 .. 15;
140
      Value     at 8 range 0 .. 31;
141
      Unused2   at 12 range 0 .. 31;
142
      Sigargs   at 16 range 0 .. 31;
143
      P1        at 20 range 0 .. 31;
144
      Sub_Event at 24 range 0 .. 31;
145
   end record;
146
 
147
   type Ada_Event_Control_Block_Access is access Ada_Event_Control_Block_Type;
148
   for Ada_Event_Control_Block_Access'Size use 32;
149
 
150
   --  Print_Routine_Type with max optional parameters
151
 
152
   type Print_Routine_Type is access procedure
153
     (Print_Function    : Print_Functions;
154
      Print_Subfunction : Print_Functions;
155
      P1                : Unsigned_Longword := 0;
156
      P2                : Unsigned_Longword := 0;
157
      P3                : Unsigned_Longword := 0;
158
      P4                : Unsigned_Longword := 0;
159
      P5                : Unsigned_Longword := 0;
160
      P6                : Unsigned_Longword := 0);
161
   for Print_Routine_Type'Size use 32;
162
 
163
   ---------------
164
   -- Constants --
165
   ---------------
166
 
167
   --  These are used to obtain and convert task values
168
   K_CVT_VALUE_NUM  : constant := 1;
169
   K_CVT_NUM_VALUE  : constant := 2;
170
   K_NEXT_TASK      : constant := 3;
171
 
172
   --  These are used to ask ADA to display task information
173
   K_SHOW_TASK     : constant := 4;
174
   K_SHOW_STAT     : constant := 5;
175
   K_SHOW_DEADLOCK : constant := 6;
176
 
177
   --  These are used to get and set various attributes of one or more tasks
178
   --    Task state
179
   --  K_GET_STATE  : constant := 7;
180
   --  K_GET_ACTIVE : constant := 8;
181
   --  K_SET_ACTIVE : constant := 9;
182
   K_SET_ABORT  : constant := 10;
183
   --  K_SET_HOLD   : constant := 11;
184
 
185
   --    Task priority
186
   K_GET_PRIORITY      : constant := 12;
187
   K_SET_PRIORITY      : constant := 13;
188
   K_RESTORE_PRIORITY  : constant := 14;
189
 
190
   --    Task registers
191
   --  K_GET_REGISTERS     : constant := 15;
192
   --  K_SET_REGISTERS     : constant := 16;
193
 
194
   --  These are used to control definable events
195
   K_ENABLE_EVENT   : constant := 17;
196
   K_DISABLE_EVENT  : constant := 18;
197
   K_ANNOUNCE_EVENT : constant := 19;
198
 
199
   --  These are used to control time-slicing.
200
   --  K_SHOW_TIME_SLICE : constant := 20;
201
   --  K_SET_TIME_SLICE  : constant := 21;
202
 
203
   --  This is used to symbolize task stack addresses.
204
   --  K_SYMBOLIZE_ADDRESS : constant := 22;
205
 
206
   K_GET_CALLER : constant := 23;
207
   --  This is used to obtain the task value of the caller task
208
 
209
   --  Miscellaneous functions - see below for details
210
 
211
   K_CLEANUP_EVENT  : constant := 24;
212
   K_SHOW_EVENT_DEF : constant := 25;
213
   --  K_CHECK_TASK_STACK : constant := 26;  --  why commented out ???
214
 
215
   --  This is used to obtain the DBGEXT-interface revision level
216
   --  K_GET_DBGEXT_REV : constant := 27; -- why commented out ???
217
 
218
   K_GET_STATE_1 : constant := 28;
219
   --  This is used to obtain additional state info, primarily for PCA
220
 
221
   K_FIND_EVENT_BY_CODE : constant := 29;
222
   K_FIND_EVENT_BY_NAME : constant := 30;
223
   --  These are used to search for user-defined event entries
224
 
225
   --  This is used to stop task schedulding. Why commented out ???
226
   --  K_STOP_ALL_OTHER_TASKS : constant := 31;
227
 
228
   --  Debug event constants
229
 
230
   K_TASK_NOT_EXIST  : constant := 3;
231
   K_SUCCESS         : constant := 1;
232
   K_EVENT_SENT      : constant := 16#9A#;
233
   K_TS_TASK         : constant := 18;
234
   K_DTYPE_TASK      : constant := 44;
235
 
236
   --  Status signal constants
237
 
238
   SS_BADPARAM       : constant := 20;
239
   SS_NORMAL         : constant := 1;
240
 
241
   --  Miscellaneous mask constants
242
 
243
   V_EVNT_ALL        : constant := 0;
244
   V_Full_Display    : constant := 11;
245
   V_Suppress_Header : constant := 13;
246
 
247
   --  CMA constants (why are some commented out???)
248
 
249
   CMA_C_DEBGET_GUARDSIZE     : constant := 1;
250
   CMA_C_DEBGET_IS_HELD       : constant := 2;
251
--   CMA_C_DEBGET_IS_INITIAL    : constant := 3;
252
--   CMA_C_DEBGET_NUMBER        : constant := 4;
253
   CMA_C_DEBGET_STACKPTR      : constant := 5;
254
   CMA_C_DEBGET_STACK_BASE    : constant := 6;
255
   CMA_C_DEBGET_STACK_TOP     : constant := 7;
256
   CMA_C_DEBGET_SCHED_STATE   : constant := 8;
257
   CMA_C_DEBGET_YELLOWSIZE    : constant := 9;
258
--   CMA_C_DEBGET_BASE_PRIO     : constant := 10;
259
--   CMA_C_DEBGET_REGS          : constant := 11;
260
--   CMA_C_DEBGET_ALT_PENDING   : constant := 12;
261
--   CMA_C_DEBGET_ALT_A_ENABLE  : constant := 13;
262
--   CMA_C_DEBGET_ALT_G_ENABLE  : constant := 14;
263
--   CMA_C_DEBGET_SUBSTATE      : constant := 15;
264
--   CMA_C_DEBGET_OBJECT_ADDR   : constant := 16;
265
--   CMA_C_DEBGET_THKIND        : constant := 17;
266
--   CMA_C_DEBGET_DETACHED      : constant := 18;
267
   CMA_C_DEBGET_TCB_SIZE      : constant := 19;
268
--   CMA_C_DEBGET_START_PC      : constant := 20;
269
--   CMA_C_DEBGET_NEXT_PC       : constant := 22;
270
--   CMA_C_DEBGET_POLICY        : constant := 23;
271
--   CMA_C_DEBGET_STACK_YELLOW  : constant := 24;
272
--   CMA_C_DEBGET_STACK_DEFAULT : constant := 25;
273
 
274
   --  Miscellaneous counted ascii constants
275
 
276
   Star     : constant AASCIC := new ASCIC'(2, ("* "));
277
   NoStar   : constant AASCIC := new ASCIC'(2, ("  "));
278
   Hold     : constant AASCIC := new ASCIC'(4, ("HOLD"));
279
   NoHold   : constant AASCIC := new ASCIC'(4, ("    "));
280
   Header   : constant AASCIC := new ASCIC '
281
     (60, ("  task id     pri hold state   substate          task object"));
282
   Empty_Text : constant AASCIC := new ASCIC (0);
283
 
284
   --  DEBUG Ada tasking states equated to their GNAT tasking equivalents
285
 
286
   Ada_State_Invalid_State     : constant AASCIC :=
287
     new ASCIC'(17, "Invalid state    ");
288
--   Ada_State_Abnormal          : constant AASCIC :=
289
--     new ASCIC'(17, "Abnormal         ");
290
   Ada_State_Aborting          : constant AASCIC :=
291
     new ASCIC'(17, "Aborting         "); --  Aborting (new)
292
--   Ada_State_Completed_Abn     : constant AASCIC :=
293
--     new ASCIC'(17, "Completed  [abn] ");
294
--   Ada_State_Completed_Exc     : constant AASCIC :=
295
--     new ASCIC'(17, "Completed  [exc] ");
296
   Ada_State_Completed         : constant AASCIC :=
297
     new ASCIC'(17, "Completed        "); --  Master_Completion_Sleep
298
   Ada_State_Runnable          : constant AASCIC :=
299
     new ASCIC'(17, "Runnable         "); --  Runnable
300
   Ada_State_Activating        : constant AASCIC :=
301
     new ASCIC'(17, "Activating       ");
302
   Ada_State_Accept            : constant AASCIC :=
303
     new ASCIC'(17, "Accept           "); --  Acceptor_Sleep
304
   Ada_State_Select_or_Delay   : constant AASCIC :=
305
     new ASCIC'(17, "Select or delay  "); --  Acceptor_Delay_Sleep
306
   Ada_State_Select_or_Term    : constant AASCIC :=
307
     new ASCIC'(17, "Select or term.  "); -- Terminate_Alternative
308
   Ada_State_Select_or_Abort   : constant AASCIC :=
309
     new ASCIC'(17, "Select or abort  "); --  Async_Select_Sleep (new)
310
--   Ada_State_Select            : constant AASCIC :=
311
--     new ASCIC'(17, "Select           ");
312
   Ada_State_Activating_Tasks  : constant AASCIC :=
313
     new ASCIC'(17, "Activating tasks "); --  Activator_Sleep
314
   Ada_State_Delay             : constant AASCIC :=
315
     new ASCIC'(17, "Delay            "); --  AST_Pending
316
--   Ada_State_Dependents        : constant AASCIC :=
317
--     new ASCIC'(17, "Dependents       ");
318
   Ada_State_Entry_Call        : constant AASCIC :=
319
     new ASCIC'(17, "Entry call       "); --  Entry_Caller_Sleep
320
   Ada_State_Cond_Entry_Call   : constant AASCIC :=
321
     new ASCIC'(17, "Cond. entry call "); --  Call.Mode.Conditional_Call
322
   Ada_State_Timed_Entry_Call  : constant AASCIC :=
323
     new ASCIC'(17, "Timed entry call "); --  Call.Mode.Timed_Call
324
   Ada_State_Async_Entry_Call  : constant AASCIC :=
325
     new ASCIC'(17, "Async entry call "); --  Call.Mode.Asynchronous_Call (new)
326
--   Ada_State_Dependents_Exc    : constant AASCIC :=
327
--     new ASCIC'(17, "Dependents [exc] ");
328
   Ada_State_IO_or_AST         : constant AASCIC :=
329
     new ASCIC'(17, "I/O or AST       "); --  AST_Server_Sleep
330
--   Ada_State_Shared_Resource   : constant AASCIC :=
331
--     new ASCIC'(17, "Shared resource  ");
332
   Ada_State_Not_Yet_Activated : constant AASCIC :=
333
     new ASCIC'(17, "Not yet activated"); --  Unactivated
334
--   Ada_State_Terminated_Abn    : constant AASCIC :=
335
--     new ASCIC'(17, "Terminated [abn] ");
336
--   Ada_State_Terminated_Exc    : constant AASCIC :=
337
--     new ASCIC'(17, "Terminated [exc] ");
338
   Ada_State_Terminated        : constant AASCIC :=
339
     new ASCIC'(17, "Terminated       "); --  Terminated
340
   Ada_State_Server            : constant AASCIC :=
341
     new ASCIC'(17, "Server           "); --  Servers
342
   Ada_State_Async_Hold        : constant AASCIC :=
343
     new ASCIC'(17, "Async_Hold       "); --  Async_Hold
344
 
345
   --  Task state counted ascii constants
346
 
347
   Debug_State_Emp : constant AASCIC := new ASCIC'(5, "     ");
348
   Debug_State_Run : constant AASCIC := new ASCIC'(5, "RUN  ");
349
   Debug_State_Rea : constant AASCIC := new ASCIC'(5, "READY");
350
   Debug_State_Sus : constant AASCIC := new ASCIC'(5, "SUSP ");
351
   Debug_State_Ter : constant AASCIC := new ASCIC'(5, "TERM ");
352
 
353
   --  Priority order of event display
354
 
355
   Global_Event_Display_Order : constant array (Event_Kind_Type)
356
     of Event_Kind_Type := (
357
      Debug_Event_Abort_Terminated,
358
      Debug_Event_Activating,
359
      Debug_Event_Dependents_Exception,
360
      Debug_Event_Exception_Terminated,
361
      Debug_Event_Handled,
362
      Debug_Event_Handled_Others,
363
      Debug_Event_Preempted,
364
      Debug_Event_Rendezvous_Exception,
365
      Debug_Event_Run,
366
      Debug_Event_Suspended,
367
      Debug_Event_Terminated);
368
 
369
   --  Constant array defining all debug events
370
 
371
   Event_Directory : constant array (Event_Kind_Type)
372
     of Debug_Event_Record := (
373
      (Debug_Event_Activating,
374
       (False, False, False, False, False, False, False, True),
375
       K_EVENT_SENT,
376
       K_TS_TASK,
377
       K_DTYPE_TASK,
378
       0,
379
       2,
380
       (31, "ACTIVATING                     "),
381
       new ASCIC'(41, "!_a task is about to begin its activation")),
382
 
383
      (Debug_Event_Run,
384
       (False, False, False, False, False, False, False, True),
385
       K_EVENT_SENT,
386
       K_TS_TASK,
387
       K_DTYPE_TASK,
388
       0,
389
       2,
390
       (31, "RUN                            "),
391
       new ASCIC'(24, "!_a task is about to run")),
392
 
393
      (Debug_Event_Suspended,
394
       (False, False, False, False, False, False, False, True),
395
       K_EVENT_SENT,
396
       K_TS_TASK,
397
       K_DTYPE_TASK,
398
       0,
399
       1,
400
       (31, "SUSPENDED                      "),
401
       new ASCIC'(33, "!_a task is about to be suspended")),
402
 
403
      (Debug_Event_Preempted,
404
       (False, False, False, False, False, False, False, True),
405
       K_EVENT_SENT,
406
       K_TS_TASK,
407
       K_DTYPE_TASK,
408
       0,
409
       1,
410
       (31, "PREEMPTED                      "),
411
       new ASCIC'(33, "!_a task is about to be preempted")),
412
 
413
      (Debug_Event_Terminated,
414
       (False, False, False, False, False, False, False, True),
415
       K_EVENT_SENT,
416
       K_TS_TASK,
417
       K_DTYPE_TASK,
418
       0,
419
       1,
420
       (31, "TERMINATED                     "),
421
       new ASCIC'(57,
422
        "!_a task is terminating (including by abort or exception)")),
423
 
424
      (Debug_Event_Abort_Terminated,
425
       (False, False, False, False, False, False, False, True),
426
       K_EVENT_SENT,
427
       K_TS_TASK,
428
       K_DTYPE_TASK,
429
       0,
430
       2,
431
       (31, "ABORT_TERMINATED               "),
432
       new ASCIC'(40, "!_a task is terminating because of abort")),
433
 
434
      (Debug_Event_Exception_Terminated,
435
       (False, False, False, False, False, False, False, True),
436
       K_EVENT_SENT,
437
       K_TS_TASK,
438
       K_DTYPE_TASK,
439
       0,
440
       1,
441
       (31, "EXCEPTION_TERMINATED           "),
442
       new ASCIC'(47, "!_a task is terminating because of an exception")),
443
 
444
      (Debug_Event_Rendezvous_Exception,
445
       (False, False, False, False, False, False, False, True),
446
       K_EVENT_SENT,
447
       K_TS_TASK,
448
       K_DTYPE_TASK,
449
       0,
450
       3,
451
       (31, "RENDEZVOUS_EXCEPTION           "),
452
       new ASCIC'(49, "!_an exception is propagating out of a rendezvous")),
453
 
454
      (Debug_Event_Handled,
455
       (False, False, False, False, False, False, False, True),
456
       K_EVENT_SENT,
457
       K_TS_TASK,
458
       K_DTYPE_TASK,
459
       0,
460
       1,
461
       (31, "HANDLED                        "),
462
       new ASCIC'(37, "!_an exception is about to be handled")),
463
 
464
      (Debug_Event_Dependents_Exception,
465
       (False, False, False, False, False, False, False, True),
466
       K_EVENT_SENT,
467
       K_TS_TASK,
468
       K_DTYPE_TASK,
469
       0,
470
       1,
471
       (31, "DEPENDENTS_EXCEPTION           "),
472
       new ASCIC'(64,
473
        "!_an exception is about to cause a task to await dependent tasks")),
474
 
475
      (Debug_Event_Handled_Others,
476
       (False, False, False, False, False, False, False, True),
477
       K_EVENT_SENT,
478
       K_TS_TASK,
479
       K_DTYPE_TASK,
480
       0,
481
       1,
482
       (31, "HANDLED_OTHERS                 "),
483
       new ASCIC'(58,
484
        "!_an exception is about to be handled in an OTHERS handler")));
485
 
486
   --  Help on events displayed in DEBUG
487
 
488
   Event_Def_Help : constant AASCIC_Array := (
489
     new ASCIC'(0,  ""),
490
     new ASCIC'(65,
491
      "  The general forms of commands to set a breakpoint or tracepoint"),
492
     new ASCIC'(22, "  on an Ada event are:"),
493
     new ASCIC'(73, "    SET BREAK/EVENT=event [task[, ... ]] " &
494
                    "[WHEN(expr)] [DO(comnd[; ... ])]"),
495
     new ASCIC'(73, "    SET TRACE/EVENT=event [task[, ... ]] " &
496
                    "[WHEN(expr)] [DO(comnd[; ... ])]"),
497
     new ASCIC'(0,  ""),
498
     new ASCIC'(65,
499
      "  If tasks are specified, the breakpoint will trigger only if the"),
500
     new ASCIC'(40, "  event occurs for those specific tasks."),
501
     new ASCIC'(0,  ""),
502
     new ASCIC'(39, "  Ada event names and their definitions"),
503
     new ASCIC'(0,  ""));
504
 
505
   -----------------------
506
   -- Package Variables --
507
   -----------------------
508
 
509
   AC_Buffer : ASCIC127;
510
 
511
   Events_Enabled_Count : Integer := 0;
512
 
513
   Print_Routine_Bufsiz : constant := 132;
514
   Print_Routine_Bufcnt : Integer := 0;
515
   Print_Routine_Linbuf : String (1 .. Print_Routine_Bufsiz);
516
 
517
   Global_Task_Debug_Events : Debug_Event_Array :=
518
     (False, False, False, False, False, False, False, False,
519
      False, False, False, False, False, False, False, False);
520
   --  Global table of task debug events set by the debugger
521
 
522
   --------------------------
523
   -- Exported Subprograms --
524
   --------------------------
525
 
526
   procedure Default_Print_Routine
527
     (Print_Function    : Print_Functions;
528
      Print_Subfunction : Print_Functions;
529
      P1                : Unsigned_Longword := 0;
530
      P2                : Unsigned_Longword := 0;
531
      P3                : Unsigned_Longword := 0;
532
      P4                : Unsigned_Longword := 0;
533
      P5                : Unsigned_Longword := 0;
534
      P6                : Unsigned_Longword := 0);
535
   --  The default print routine if not overridden.
536
   --  Print_Function determines option argument formatting.
537
   --  Print_Subfunction buffers output if No_Print, calls Put_Output if
538
   --  Print_Newline
539
 
540
   pragma Export_Procedure
541
     (Default_Print_Routine,
542
      Mechanism => (Value, Value, Reference, Reference, Reference));
543
 
544
   --------------------------
545
   -- Imported Subprograms --
546
   --------------------------
547
 
548
   procedure Debug_Get
549
     (Thread_Id : OSI.Thread_Id;
550
      Item_Req  : Unsigned_Word;
551
      Out_Buff  : System.Address;
552
      Buff_Siz  : Unsigned_Word);
553
 
554
   procedure Debug_Get
555
     (Thread_Id : OSI.Thread_Id;
556
      Item_Req  : Unsigned_Word;
557
      Out_Buff  : Unsigned_Longword;
558
      Buff_Siz  : Unsigned_Word);
559
   pragma Interface (External, Debug_Get);
560
 
561
   pragma Import_Procedure (Debug_Get, "CMA$DEBUG_GET",
562
     (OSI.Thread_Id, Unsigned_Word, System.Address, Unsigned_Word),
563
     (Reference, Value, Reference, Value));
564
 
565
   pragma Import_Procedure (Debug_Get, "CMA$DEBUG_GET",
566
     (OSI.Thread_Id, Unsigned_Word, Unsigned_Longword, Unsigned_Word),
567
     (Reference, Value, Reference, Value));
568
 
569
   procedure FAOL
570
     (Status : out Cond_Value_Type;
571
      Ctrstr : String;
572
      Outlen : out Unsigned_Word;
573
      Outbuf : out String;
574
      Prmlst : Unsigned_Longword_Array);
575
   pragma Interface (External, FAOL);
576
 
577
   pragma Import_Valued_Procedure (FAOL, "SYS$FAOL",
578
     (Cond_Value_Type, String, Unsigned_Word, String, Unsigned_Longword_Array),
579
     (Value, Descriptor (S), Reference, Descriptor (S), Reference));
580
 
581
   procedure Put_Output (
582
     Status         : out Cond_Value_Type;
583
     Message_String : String);
584
 
585
   procedure Put_Output (Message_String : String);
586
   pragma Interface (External, Put_Output);
587
 
588
   pragma Import_Valued_Procedure (Put_Output, "LIB$PUT_OUTPUT",
589
     (Cond_Value_Type, String),
590
     (Value, Short_Descriptor (S)));
591
 
592
   pragma Import_Procedure (Put_Output, "LIB$PUT_OUTPUT",
593
     (String),
594
     (Short_Descriptor (S)));
595
 
596
   procedure Signal
597
     (Condition_Value     : Cond_Value_Type;
598
      Number_Of_Arguments : Integer := Integer'Null_Parameter;
599
      FAO_Argument_1      : Unsigned_Longword :=
600
                              Unsigned_Longword'Null_Parameter);
601
   pragma Interface (External, Signal);
602
 
603
   pragma Import_Procedure (Signal, "LIB$SIGNAL",
604
      (Cond_Value_Type, Integer, Unsigned_Longword),
605
      (Value, Value, Value),
606
       Number_Of_Arguments);
607
 
608
   ----------------------------
609
   -- Generic Instantiations --
610
   ----------------------------
611
 
612
   function Fetch is new Fetch_From_Address (Unsigned_Longword);
613
   pragma Unreferenced (Fetch);
614
 
615
   procedure Free is new Ada.Unchecked_Deallocation
616
     (Object => Ada_Event_Control_Block_Type,
617
      Name   => Ada_Event_Control_Block_Access);
618
 
619
   function To_AASCIC is new
620
     Ada.Unchecked_Conversion (Unsigned_Longword, AASCIC);
621
 
622
   function To_Addr is new
623
     Ada.Unchecked_Conversion (Task_Procedure_Access, Address);
624
   pragma Unreferenced (To_Addr);
625
 
626
   function To_EVCB is new
627
     Ada.Unchecked_Conversion
628
      (Unsigned_Longword, Ada_Event_Control_Block_Access);
629
 
630
   function To_Integer is new
631
     Ada.Unchecked_Conversion (Task_Id, System.Task_Primitives.Task_Address);
632
 
633
   function To_Print_Routine_Type is new
634
     Ada.Unchecked_Conversion (Short_Address, Print_Routine_Type);
635
 
636
   --  Optional argumements passed to Print_Routine have to be
637
   --  Unsigned_Longwords so define the required Unchecked_Conversions
638
 
639
   function To_UL is new
640
     Ada.Unchecked_Conversion (AASCIC, Unsigned_Longword);
641
 
642
   function To_UL is new
643
     Ada.Unchecked_Conversion (Integer, Unsigned_Longword);
644
 
645
   function To_UL is new
646
     Ada.Unchecked_Conversion (Task_Id, Unsigned_Longword);
647
 
648
   pragma Warnings (Off); --  Different sizes
649
   function To_UL is new
650
     Ada.Unchecked_Conversion (Task_Entry_Index, Unsigned_Longword);
651
   pragma Warnings (On);
652
 
653
   function To_UL is new
654
     Ada.Unchecked_Conversion (Short_Address, Unsigned_Longword);
655
 
656
   function To_UL is new
657
     Ada.Unchecked_Conversion
658
      (Ada_Event_Control_Block_Access, Unsigned_Longword);
659
 
660
   -----------------------
661
   -- Local Subprograms --
662
   -----------------------
663
 
664
   subtype Function_Codes is System.Aux_DEC.Unsigned_Word range 1 .. 31;
665
   --  The 31 function codes sent by the debugger needed to implement
666
   --  tasking support, enumerated below.
667
 
668
   type Register_Array is array (Natural range 0 .. 16) of
669
     System.Aux_DEC.Unsigned_Longword;
670
   --  The register array is a holdover from VAX and not used
671
   --  on Alpha or I64 but is kept as a filler below.
672
 
673
   type DBGEXT_Control_Block (Function_Code : Function_Codes) is record
674
      Facility_ID         : System.Aux_DEC.Unsigned_Word;
675
      --  For GNAT use the "Ada" facility ID
676
      Status              : System.Aux_DEC.Unsigned_Longword;
677
      --  Successful or otherwise returned status
678
      Flags               : System.Aux_DEC.Bit_Array_32;
679
      --   Used to flag event as global
680
      Print_Routine       : System.Aux_DEC.Short_Address;
681
      --  The print subprogram the caller wants to use for output
682
      Event_Code_or_EVCB  : System.Aux_DEC.Unsigned_Longword;
683
      --  Dual use Event Code or EVent Control Block
684
      Event_Value_or_Name : System.Aux_DEC.Unsigned_Longword;
685
      --  Dual use Event Value or Event Name string pointer
686
      Event_Entry         : System.Aux_DEC.Unsigned_Longword;
687
      Task_Value          : Task_Id;
688
      Task_Number         : Integer;
689
      Ada_Flags           : System.Aux_DEC.Bit_Array_32;
690
      Priority            : System.Aux_DEC.Bit_Array_32;
691
      Active_Registers    : System.Aux_DEC.Short_Address;
692
 
693
      case Function_Code is
694
         when K_GET_STATE_1 =>
695
            Base_Priority       : System.Aux_DEC.Bit_Array_32;
696
            Task_Type_Name      : System.Aux_DEC.Short_Address;
697
            Creation_PC         : System.Aux_DEC.Short_Address;
698
            Parent_Task_ID      : Task_Id;
699
 
700
         when others =>
701
            Ignored_Unused      : Register_Array;
702
 
703
      end case;
704
   end record;
705
 
706
   for DBGEXT_Control_Block use record
707
      Function_Code       at 0  range 0 .. 15;
708
      Facility_ID         at 2  range 0 .. 15;
709
      Status              at 4  range 0 .. 31;
710
      Flags               at 8  range 0 .. 31;
711
      Print_Routine       at 12 range 0 .. 31;
712
      Event_Code_or_EVCB  at 16 range 0 .. 31;
713
      Event_Value_or_Name at 20 range 0 .. 31;
714
      Event_Entry         at 24 range 0 .. 31;
715
      Task_Value          at 28 range 0 .. 31;
716
      Task_Number         at 32 range 0 .. 31;
717
      Ada_Flags           at 36 range 0 .. 31;
718
      Priority            at 40 range 0 .. 31;
719
      Active_Registers    at 44 range 0 .. 31;
720
      Ignored_Unused      at 48 range 0 .. 17 * 32 - 1;
721
      Base_Priority       at 48 range 0 .. 31;
722
      Task_Type_Name      at 52 range 0 .. 31;
723
      Creation_PC         at 56 range 0 .. 31;
724
      Parent_Task_ID      at 60 range 0 .. 31;
725
   end record;
726
 
727
   type DBGEXT_Control_Block_Access is access all DBGEXT_Control_Block;
728
 
729
   function DBGEXT (Control_Block : DBGEXT_Control_Block_Access)
730
     return System.Aux_DEC.Unsigned_Word;
731
   --  Exported to s-taprop.adb to avoid having a VMS specific s-tasdeb.ads
732
   pragma Convention (C, DBGEXT);
733
   pragma Export_Function (DBGEXT, "GNAT$DBGEXT");
734
   --  This routine is called by CMA when VMS DEBUG wants the Gnat RTL
735
   --  to give it some assistance (primarily when tasks are debugged).
736
   --
737
   --  The single parameter is an "external control block". On input to
738
   --  the Gnat RTL this control block determines the debugging function
739
   --  to be performed, and supplies parameters.  This routine cases on
740
   --  the function code, and calls the appropriate Gnat RTL routine,
741
   --  which returns values by modifying the external control block.
742
 
743
   procedure Announce_Event
744
      (Event_EVCB    : Unsigned_Longword;
745
       Print_Routine : Print_Routine_Type := Default_Print_Routine'Access);
746
   --  Announce the occurence of a DEBUG tasking event
747
 
748
   procedure Cleanup_Event (Event_EVCB : Unsigned_Longword);
749
   --  After DEBUG has processed an event that has signalled, the signaller
750
   --  must cleanup. Cleanup consists of freeing the event control block.
751
 
752
   procedure Disable_Event
753
      (Flags       : Bit_Array_32;
754
       Event_Value : Unsigned_Longword;
755
       Event_Code  : Unsigned_Longword;
756
       Status      : out Cond_Value_Type);
757
   --  Disable a DEBUG tasking event
758
 
759
   function DoAC (S : String) return Address;
760
   --  Convert a string to the address of an internal buffer containing
761
   --  the counted ASCII.
762
 
763
   procedure Enable_Event
764
      (Flags       : Bit_Array_32;
765
       Event_Value : Unsigned_Longword;
766
       Event_Code  : Unsigned_Longword;
767
       Status      : out Cond_Value_Type);
768
   --  Enable a requested DEBUG tasking event
769
 
770
   procedure Find_Event_By_Code
771
      (Event_Code  : Unsigned_Longword;
772
       Event_Entry : out Unsigned_Longword;
773
       Status      : out Cond_Value_Type);
774
   --  Convert an event code to the address of the event entry
775
 
776
   procedure Find_Event_By_Name
777
      (Event_Name  : Unsigned_Longword;
778
       Event_Entry : out Unsigned_Longword;
779
       Status      : out Cond_Value_Type);
780
   --  Find an event entry given the event name
781
 
782
   procedure List_Entry_Waiters
783
     (Task_Value      : Task_Id;
784
      Full_Display    : Boolean := False;
785
      Suppress_Header : Boolean := False;
786
      Print_Routine   : Print_Routine_Type := Default_Print_Routine'Access);
787
   --  List information about tasks waiting on an entry
788
 
789
   procedure Put (S : String);
790
   --  Display S on standard output
791
 
792
   procedure Put_Line (S : String := "");
793
   --  Display S on standard output with an additional line terminator
794
 
795
   procedure Show_Event
796
      (Print_Routine : Print_Routine_Type := Default_Print_Routine'Access);
797
   --  Show what events are available
798
 
799
   procedure Show_One_Task
800
     (Task_Value      : Task_Id;
801
      Full_Display    : Boolean := False;
802
      Suppress_Header : Boolean := False;
803
      Print_Routine   : Print_Routine_Type := Default_Print_Routine'Access);
804
   --  Display information about one task
805
 
806
   procedure Show_Rendezvous
807
     (Task_Value      : Task_Id;
808
      Ada_State       : AASCIC := Empty_Text;
809
      Full_Display    : Boolean := False;
810
      Suppress_Header : Boolean := False;
811
      Print_Routine   : Print_Routine_Type := Default_Print_Routine'Access);
812
   --  Display information about a task rendezvous
813
 
814
   procedure Trace_Output (Message_String : String);
815
   --  Call Put_Output if Trace_on ("VMS")
816
 
817
   procedure Write (Fd : Integer; S : String; Count : Integer);
818
 
819
   --------------------
820
   -- Announce_Event --
821
   --------------------
822
 
823
   procedure Announce_Event
824
      (Event_EVCB    : Unsigned_Longword;
825
       Print_Routine : Print_Routine_Type := Default_Print_Routine'Access)
826
   is
827
      EVCB : constant Ada_Event_Control_Block_Access := To_EVCB (Event_EVCB);
828
 
829
      Event_Kind : constant Event_Kind_Type :=
830
                     (if EVCB.Sub_Event /= 0
831
                      then Event_Kind_Type (EVCB.Sub_Event)
832
                      else Event_Kind_Type (EVCB.Code));
833
 
834
      TI : constant String := "   Task %TASK !UI is ";
835
      --  Announce prefix
836
 
837
   begin
838
      Trace_Output ("Announce called");
839
 
840
      case Event_Kind is
841
         when Debug_Event_Activating =>
842
            Print_Routine (Print_FAO, Print_Newline,
843
              To_UL (DoAC (TI & "about to begin its activation")),
844
              EVCB.Value);
845
         when Debug_Event_Exception_Terminated =>
846
            Print_Routine (Print_FAO, Print_Newline,
847
              To_UL (DoAC (TI & "terminating because of an exception")),
848
              EVCB.Value);
849
         when Debug_Event_Run =>
850
            Print_Routine (Print_FAO, Print_Newline,
851
              To_UL (DoAC (TI & "about to run")),
852
              EVCB.Value);
853
         when Debug_Event_Abort_Terminated =>
854
            Print_Routine (Print_FAO, Print_Newline,
855
              To_UL (DoAC (TI & "terminating because of abort")),
856
              EVCB.Value);
857
         when Debug_Event_Terminated =>
858
            Print_Routine (Print_FAO, Print_Newline,
859
              To_UL (DoAC (TI & "terminating normally")),
860
              EVCB.Value);
861
         when others => null;
862
      end case;
863
   end Announce_Event;
864
 
865
   -------------------
866
   -- Cleanup_Event --
867
   -------------------
868
 
869
   procedure Cleanup_Event (Event_EVCB  : Unsigned_Longword) is
870
      EVCB : Ada_Event_Control_Block_Access := To_EVCB (Event_EVCB);
871
   begin
872
      Free (EVCB);
873
   end Cleanup_Event;
874
 
875
   ------------------------
876
   -- Continue_All_Tasks --
877
   ------------------------
878
 
879
   procedure Continue_All_Tasks is
880
   begin
881
      null; --  VxWorks
882
   end Continue_All_Tasks;
883
 
884
   ------------
885
   -- DBGEXT --
886
   ------------
887
 
888
   function DBGEXT
889
     (Control_Block : DBGEXT_Control_Block_Access)
890
      return System.Aux_DEC.Unsigned_Word
891
   is
892
      Print_Routine : Print_Routine_Type := Default_Print_Routine'Access;
893
   begin
894
      Trace_Output ("DBGEXT called");
895
 
896
      if Control_Block.Print_Routine /= Address_Zero then
897
         Print_Routine := To_Print_Routine_Type (Control_Block.Print_Routine);
898
      end if;
899
 
900
      case Control_Block.Function_Code is
901
 
902
         --  Convert a task value to a task number.
903
         --  The output results are stored in the CONTROL_BLOCK.
904
 
905
         when K_CVT_VALUE_NUM =>
906
            Trace_Output ("DBGEXT param 1 - CVT Value to NUM");
907
            Control_Block.Task_Number :=
908
              Control_Block.Task_Value.Known_Tasks_Index + 1;
909
            Control_Block.Status := K_SUCCESS;
910
            Trace_Output ("Task Number: ");
911
            Trace_Output (Integer'Image (Control_Block.Task_Number));
912
            return SS_NORMAL;
913
 
914
         --  Convert a task number to a task value.
915
         --  The output results are stored in the CONTROL_BLOCK.
916
 
917
         when K_CVT_NUM_VALUE =>
918
            Trace_Output ("DBGEXT param 2 - CVT NUM to Value");
919
            Trace_Output ("Task Number: ");
920
            Trace_Output (Integer'Image (Control_Block.Task_Number));
921
            Control_Block.Task_Value :=
922
              Known_Tasks (Control_Block.Task_Number - 1);
923
            Control_Block.Status := K_SUCCESS;
924
            Trace_Output ("Task Value: ");
925
            Trace_Output (Unsigned_Longword'Image
926
              (To_UL (Control_Block.Task_Value)));
927
            return SS_NORMAL;
928
 
929
         --  Obtain the "next" task after a specified task.
930
         --  ??? To do: If specified check the PRIORITY, STATE, and HOLD
931
         --  fields to restrict the selection of the next task.
932
         --  The output results are stored in the CONTROL_BLOCK.
933
 
934
         when K_NEXT_TASK =>
935
            Trace_Output ("DBGEXT param 3 - Next Task");
936
            Trace_Output ("Task Value: ");
937
            Trace_Output (Unsigned_Longword'Image
938
              (To_UL (Control_Block.Task_Value)));
939
 
940
            if Control_Block.Task_Value = null then
941
               Control_Block.Task_Value := Known_Tasks (Known_Tasks'First);
942
            else
943
               Control_Block.Task_Value :=
944
                 Known_Tasks (Control_Block.Task_Value.Known_Tasks_Index + 1);
945
            end if;
946
 
947
            if Control_Block.Task_Value = null then
948
               Control_Block.Task_Value := Known_Tasks (Known_Tasks'First);
949
            end if;
950
 
951
            Control_Block.Status := K_SUCCESS;
952
            return SS_NORMAL;
953
 
954
         --  Display the state of a task. The FULL bit is checked to decide if
955
         --  a full or brief task display is desired. The output results are
956
         --  stored in the CONTROL_BLOCK.
957
 
958
         when K_SHOW_TASK =>
959
            Trace_Output ("DBGEXT param 4 - Show Task");
960
 
961
            if Control_Block.Task_Value = null then
962
               Control_Block.Status := K_TASK_NOT_EXIST;
963
            else
964
               Show_One_Task
965
                 (Control_Block.Task_Value,
966
                  Control_Block.Ada_Flags (V_Full_Display),
967
                  Control_Block.Ada_Flags (V_Suppress_Header),
968
                  Print_Routine);
969
 
970
               Control_Block.Status := K_SUCCESS;
971
            end if;
972
 
973
            return SS_NORMAL;
974
 
975
         --  Enable a requested DEBUG tasking event
976
 
977
         when K_ENABLE_EVENT =>
978
            Trace_Output ("DBGEXT param 17 - Enable Event");
979
            Enable_Event
980
              (Control_Block.Flags,
981
               Control_Block.Event_Value_or_Name,
982
               Control_Block.Event_Code_or_EVCB,
983
               Control_Block.Status);
984
 
985
            return SS_NORMAL;
986
 
987
         --  Disable a DEBUG tasking event
988
 
989
         when K_DISABLE_EVENT =>
990
            Trace_Output ("DBGEXT param 18 - Disable Event");
991
            Disable_Event
992
              (Control_Block.Flags,
993
               Control_Block.Event_Value_or_Name,
994
               Control_Block.Event_Code_or_EVCB,
995
               Control_Block.Status);
996
 
997
            return SS_NORMAL;
998
 
999
         --  Announce the occurence of a DEBUG tasking event
1000
 
1001
         when K_ANNOUNCE_EVENT =>
1002
            Trace_Output ("DBGEXT param 19 - Announce Event");
1003
            Announce_Event
1004
              (Control_Block.Event_Code_or_EVCB,
1005
               Print_Routine);
1006
 
1007
            Control_Block.Status := K_SUCCESS;
1008
            return SS_NORMAL;
1009
 
1010
         --  After DEBUG has processed an event that has signalled,
1011
         --  the signaller must cleanup.
1012
         --  Cleanup consists of freeing the event control block.
1013
 
1014
         when K_CLEANUP_EVENT =>
1015
            Trace_Output ("DBGEXT param 24 - Cleanup Event");
1016
            Cleanup_Event (Control_Block.Event_Code_or_EVCB);
1017
 
1018
            Control_Block.Status := K_SUCCESS;
1019
            return SS_NORMAL;
1020
 
1021
         --  Show what events are available
1022
 
1023
         when K_SHOW_EVENT_DEF =>
1024
            Trace_Output ("DBGEXT param 25 - Show Event Def");
1025
            Show_Event (Print_Routine);
1026
 
1027
            Control_Block.Status := K_SUCCESS;
1028
            return SS_NORMAL;
1029
 
1030
         --  Convert an event code to the address of the event entry
1031
 
1032
         when K_FIND_EVENT_BY_CODE =>
1033
            Trace_Output ("DBGEXT param 29 - Find Event by Code");
1034
            Find_Event_By_Code
1035
              (Control_Block.Event_Code_or_EVCB,
1036
               Control_Block.Event_Entry,
1037
               Control_Block.Status);
1038
 
1039
            return SS_NORMAL;
1040
 
1041
         --  Find an event entry given the event name
1042
 
1043
         when K_FIND_EVENT_BY_NAME =>
1044
            Trace_Output ("DBGEXT param 30 - Find Event by Name");
1045
            Find_Event_By_Name
1046
              (Control_Block.Event_Value_or_Name,
1047
               Control_Block.Event_Entry,
1048
               Control_Block.Status);
1049
            return SS_NORMAL;
1050
 
1051
         --  ??? To do: Implement priority events
1052
         --  Get, set or restore a task's priority
1053
 
1054
         when K_GET_PRIORITY or K_SET_PRIORITY or K_RESTORE_PRIORITY =>
1055
            Trace_Output ("DBGEXT priority param - Not yet implemented");
1056
            Trace_Output (Function_Codes'Image
1057
             (Control_Block.Function_Code));
1058
            return SS_BADPARAM;
1059
 
1060
         --  ??? To do: Implement show statistics event
1061
         --  Display task statistics
1062
 
1063
         when K_SHOW_STAT =>
1064
            Trace_Output ("DBGEXT show stat param - Not yet implemented");
1065
            Trace_Output (Function_Codes'Image
1066
             (Control_Block.Function_Code));
1067
            return SS_BADPARAM;
1068
 
1069
         --  ??? To do: Implement get caller event
1070
         --  Obtain the caller of a task in a rendezvous. If no rendezvous,
1071
         --  null is returned
1072
 
1073
         when K_GET_CALLER =>
1074
            Trace_Output ("DBGEXT get caller param - Not yet implemented");
1075
            Trace_Output (Function_Codes'Image
1076
             (Control_Block.Function_Code));
1077
            return SS_BADPARAM;
1078
 
1079
         --  ??? To do: Implement set terminate event
1080
         --  Terminate a task
1081
 
1082
         when K_SET_ABORT =>
1083
            Trace_Output ("DBGEXT set terminate param - Not yet implemented");
1084
            Trace_Output (Function_Codes'Image
1085
             (Control_Block.Function_Code));
1086
            return SS_BADPARAM;
1087
 
1088
         --  ??? To do: Implement show deadlock event
1089
         --  Detect a deadlock
1090
 
1091
         when K_SHOW_DEADLOCK =>
1092
            Trace_Output ("DBGEXT show deadlock param - Not yet implemented");
1093
            Trace_Output (Function_Codes'Image
1094
             (Control_Block.Function_Code));
1095
            return SS_BADPARAM;
1096
 
1097
         when others =>
1098
            Trace_Output ("DBGEXT bad param: ");
1099
            Trace_Output (Function_Codes'Image
1100
             (Control_Block.Function_Code));
1101
            return SS_BADPARAM;
1102
 
1103
      end case;
1104
   end DBGEXT;
1105
 
1106
   ---------------------------
1107
   -- Default_Print_Routine --
1108
   ---------------------------
1109
 
1110
   procedure Default_Print_Routine
1111
     (Print_Function    : Print_Functions;
1112
      Print_Subfunction : Print_Functions;
1113
      P1                : Unsigned_Longword := 0;
1114
      P2                : Unsigned_Longword := 0;
1115
      P3                : Unsigned_Longword := 0;
1116
      P4                : Unsigned_Longword := 0;
1117
      P5                : Unsigned_Longword := 0;
1118
      P6                : Unsigned_Longword := 0)
1119
   is
1120
      Status    : Cond_Value_Type;
1121
      Linlen    : Unsigned_Word;
1122
      Item_List : Unsigned_Longword_Array (1 .. 17) :=
1123
        (1 .. 17 => 0);
1124
   begin
1125
 
1126
      case Print_Function is
1127
         when Print_Control | Print_String =>
1128
            null;
1129
 
1130
         --  Formatted Ascii Output
1131
 
1132
         when Print_FAO =>
1133
            Item_List (1) := P2;
1134
            Item_List (2) := P3;
1135
            Item_List (3) := P4;
1136
            Item_List (4) := P5;
1137
            Item_List (5) := P6;
1138
            FAOL
1139
              (Status,
1140
               To_AASCIC (P1).Text,
1141
               Linlen,
1142
               Print_Routine_Linbuf
1143
                 (1 + Print_Routine_Bufcnt .. Print_Routine_Bufsiz),
1144
               Item_List);
1145
 
1146
            Print_Routine_Bufcnt := Print_Routine_Bufcnt + Integer (Linlen);
1147
 
1148
         --  Symbolic output
1149
 
1150
         when Print_Symbol =>
1151
            Item_List (1) := P1;
1152
            FAOL
1153
              (Status,
1154
               "!XI",
1155
               Linlen,
1156
               Print_Routine_Linbuf
1157
                 (1 + Print_Routine_Bufcnt .. Print_Routine_Bufsiz),
1158
               Item_List);
1159
 
1160
            Print_Routine_Bufcnt := Print_Routine_Bufcnt + Integer (Linlen);
1161
 
1162
         when others =>
1163
            null;
1164
      end case;
1165
 
1166
      case Print_Subfunction is
1167
 
1168
         --  Output buffer with a terminating newline
1169
 
1170
         when Print_Newline =>
1171
            Put_Output (Status,
1172
              Print_Routine_Linbuf (1 .. Print_Routine_Bufcnt));
1173
            Print_Routine_Bufcnt := 0;
1174
 
1175
         --  Buffer the output
1176
 
1177
         when No_Print =>
1178
            null;
1179
 
1180
         when others =>
1181
            null;
1182
      end case;
1183
 
1184
   end Default_Print_Routine;
1185
 
1186
   -------------------
1187
   -- Disable_Event --
1188
   -------------------
1189
 
1190
   procedure Disable_Event
1191
      (Flags       : Bit_Array_32;
1192
       Event_Value : Unsigned_Longword;
1193
       Event_Code  : Unsigned_Longword;
1194
       Status      : out Cond_Value_Type)
1195
   is
1196
      Task_Value : Task_Id;
1197
      Task_Index : constant Integer := Integer (Event_Value) - 1;
1198
   begin
1199
 
1200
      Events_Enabled_Count := Events_Enabled_Count - 1;
1201
 
1202
      if Flags (V_EVNT_ALL) then
1203
         Global_Task_Debug_Events (Integer (Event_Code)) := False;
1204
         Status := K_SUCCESS;
1205
      else
1206
         if Task_Index in Known_Tasks'Range then
1207
            Task_Value := Known_Tasks (Task_Index);
1208
            if Task_Value /= null then
1209
               Task_Value.Common.Debug_Events (Integer (Event_Code)) := False;
1210
               Status := K_SUCCESS;
1211
            else
1212
               Status := K_TASK_NOT_EXIST;
1213
            end if;
1214
         else
1215
            Status := K_TASK_NOT_EXIST;
1216
         end if;
1217
      end if;
1218
 
1219
      --  Keep count of events for efficiency
1220
 
1221
      if Events_Enabled_Count <= 0 then
1222
         Events_Enabled_Count := 0;
1223
         Global_Task_Debug_Event_Set := False;
1224
      end if;
1225
 
1226
   end Disable_Event;
1227
 
1228
   ----------
1229
   -- DoAC --
1230
   ----------
1231
 
1232
   function DoAC (S : String) return Address is
1233
   begin
1234
      AC_Buffer.Count := S'Length;
1235
      AC_Buffer.Text (1 .. AC_Buffer.Count) := S;
1236
      return AC_Buffer'Address;
1237
   end DoAC;
1238
 
1239
   ------------------
1240
   -- Enable_Event --
1241
   ------------------
1242
 
1243
   procedure Enable_Event
1244
      (Flags       : Bit_Array_32;
1245
       Event_Value : Unsigned_Longword;
1246
       Event_Code  : Unsigned_Longword;
1247
       Status      : out Cond_Value_Type)
1248
   is
1249
      Task_Value : Task_Id;
1250
      Task_Index : constant Integer := Integer (Event_Value) - 1;
1251
   begin
1252
 
1253
      --  At least one event enabled, any and all events will cause a
1254
      --  condition to be raised and checked. Major tasking slowdown!
1255
 
1256
      Global_Task_Debug_Event_Set := True;
1257
      Events_Enabled_Count := Events_Enabled_Count + 1;
1258
 
1259
      if Flags (V_EVNT_ALL) then
1260
         Global_Task_Debug_Events (Integer (Event_Code)) := True;
1261
         Status := K_SUCCESS;
1262
      else
1263
         if Task_Index in Known_Tasks'Range then
1264
            Task_Value := Known_Tasks (Task_Index);
1265
            if Task_Value /= null then
1266
               Task_Value.Common.Debug_Events (Integer (Event_Code)) := True;
1267
               Status := K_SUCCESS;
1268
            else
1269
               Status := K_TASK_NOT_EXIST;
1270
            end if;
1271
         else
1272
            Status := K_TASK_NOT_EXIST;
1273
         end if;
1274
      end if;
1275
 
1276
   end Enable_Event;
1277
 
1278
   ------------------------
1279
   -- Find_Event_By_Code --
1280
   ------------------------
1281
 
1282
   procedure Find_Event_By_Code
1283
      (Event_Code  : Unsigned_Longword;
1284
       Event_Entry : out Unsigned_Longword;
1285
       Status      : out Cond_Value_Type)
1286
   is
1287
      K_SUCCESS        : constant := 1;
1288
      K_NO_SUCH_EVENT  : constant := 9;
1289
 
1290
   begin
1291
      Trace_Output ("Looking for Event: ");
1292
      Trace_Output (Unsigned_Longword'Image (Event_Code));
1293
 
1294
      for I in Event_Kind_Type'Range loop
1295
         if Event_Code = Unsigned_Longword (Event_Directory (I).Code) then
1296
            Event_Entry := To_UL (Event_Directory (I)'Address);
1297
            Trace_Output ("Found Event # ");
1298
            Trace_Output (Integer'Image (I));
1299
            Status := K_SUCCESS;
1300
            return;
1301
         end if;
1302
      end loop;
1303
 
1304
      Status := K_NO_SUCH_EVENT;
1305
   end Find_Event_By_Code;
1306
 
1307
   ------------------------
1308
   -- Find_Event_By_Name --
1309
   ------------------------
1310
 
1311
   procedure Find_Event_By_Name
1312
      (Event_Name  : Unsigned_Longword;
1313
       Event_Entry : out Unsigned_Longword;
1314
       Status      : out Cond_Value_Type)
1315
   is
1316
      K_SUCCESS        : constant := 1;
1317
      K_NO_SUCH_EVENT  : constant := 9;
1318
 
1319
      Event_Name_Cstr : constant ASCIC := To_AASCIC (Event_Name).all;
1320
   begin
1321
      Trace_Output ("Looking for Event: ");
1322
      Trace_Output (Event_Name_Cstr.Text);
1323
 
1324
      for I in Event_Kind_Type'Range loop
1325
         if Event_Name_Cstr.Count >= Event_Directory (I).Minchr
1326
            and then Event_Name_Cstr.Count <= Event_Directory (I).Name.Count
1327
            and then Event_Name_Cstr.Text (1 .. Event_Directory (I).Minchr) =
1328
                Event_Directory (I).Name.Text (1 .. Event_Directory (I).Minchr)
1329
         then
1330
            Event_Entry := To_UL (Event_Directory (I)'Address);
1331
            Trace_Output ("Found Event # ");
1332
            Trace_Output (Integer'Image (I));
1333
            Status := K_SUCCESS;
1334
            return;
1335
         end if;
1336
      end loop;
1337
 
1338
      Status := K_NO_SUCH_EVENT;
1339
   end Find_Event_By_Name;
1340
 
1341
   --------------------
1342
   -- Get_User_State --
1343
   --------------------
1344
 
1345
   function Get_User_State return Long_Integer is
1346
   begin
1347
      return STPO.Self.User_State;
1348
   end Get_User_State;
1349
 
1350
   ------------------------
1351
   -- List_Entry_Waiters --
1352
   ------------------------
1353
 
1354
   procedure List_Entry_Waiters
1355
     (Task_Value      : Task_Id;
1356
      Full_Display    : Boolean := False;
1357
      Suppress_Header : Boolean := False;
1358
      Print_Routine   : Print_Routine_Type := Default_Print_Routine'Access)
1359
   is
1360
      pragma Unreferenced (Suppress_Header);
1361
 
1362
      Entry_Call : Entry_Call_Link;
1363
      Have_Some  : Boolean := False;
1364
   begin
1365
      if not Full_Display then
1366
         return;
1367
      end if;
1368
 
1369
      if Task_Value.Entry_Queues'Length > 0 then
1370
         Print_Routine (Print_FAO, Print_Newline,
1371
           To_UL (DoAC ("        Waiting entry callers:")));
1372
      end if;
1373
      for I in Task_Value.Entry_Queues'Range loop
1374
         Entry_Call := Task_Value.Entry_Queues (I).Head;
1375
         if Entry_Call /= null then
1376
            Have_Some := True;
1377
 
1378
            Print_Routine (Print_FAO, Print_Newline,
1379
              To_UL (DoAC ("          Waiters for entry !UI:")),
1380
              To_UL (I));
1381
 
1382
            loop
1383
               declare
1384
                  Task_Image : ASCIC :=
1385
                   (Entry_Call.Self.Common.Task_Image_Len,
1386
                    Entry_Call.Self.Common.Task_Image
1387
                     (1 .. Entry_Call.Self.Common.Task_Image_Len));
1388
               begin
1389
                  Print_Routine (Print_FAO, Print_Newline,
1390
                    To_UL (DoAC ("              %TASK !UI, type: !AC")),
1391
                    To_UL (Entry_Call.Self.Known_Tasks_Index + 1),
1392
                    To_UL (Task_Image'Address));
1393
                  if Entry_Call = Task_Value.Entry_Queues (I).Tail then
1394
                     exit;
1395
                  end if;
1396
                  Entry_Call := Entry_Call.Next;
1397
               end;
1398
            end loop;
1399
         end if;
1400
      end loop;
1401
      if not Have_Some then
1402
         Print_Routine (Print_FAO, Print_Newline,
1403
           To_UL (DoAC ("          none.")));
1404
      end if;
1405
   end List_Entry_Waiters;
1406
 
1407
   ----------------
1408
   -- List_Tasks --
1409
   ----------------
1410
 
1411
   procedure List_Tasks is
1412
      C : Task_Id;
1413
   begin
1414
      C := All_Tasks_List;
1415
 
1416
      while C /= null loop
1417
         Print_Task_Info (C);
1418
         C := C.Common.All_Tasks_Link;
1419
      end loop;
1420
   end List_Tasks;
1421
 
1422
   ------------------------
1423
   -- Print_Current_Task --
1424
   ------------------------
1425
 
1426
   procedure Print_Current_Task is
1427
   begin
1428
      Print_Task_Info (STPO.Self);
1429
   end Print_Current_Task;
1430
 
1431
   ---------------------
1432
   -- Print_Task_Info --
1433
   ---------------------
1434
 
1435
   procedure Print_Task_Info (T : Task_Id) is
1436
      Entry_Call : Entry_Call_Link;
1437
      Parent     : Task_Id;
1438
 
1439
   begin
1440
      if T = null then
1441
         Put_Line ("null task");
1442
         return;
1443
      end if;
1444
 
1445
      Put (T.Common.Task_Image (1 .. T.Common.Task_Image_Len) & ": " &
1446
           Task_States'Image (T.Common.State));
1447
 
1448
      Parent := T.Common.Parent;
1449
 
1450
      if Parent = null then
1451
         Put (", parent: <none>");
1452
      else
1453
         Put (", parent: " &
1454
              Parent.Common.Task_Image (1 .. Parent.Common.Task_Image_Len));
1455
      end if;
1456
 
1457
      Put (", prio:" & T.Common.Current_Priority'Img);
1458
 
1459
      if not T.Callable then
1460
         Put (", not callable");
1461
      end if;
1462
 
1463
      if T.Aborting then
1464
         Put (", aborting");
1465
      end if;
1466
 
1467
      if T.Deferral_Level /= 0 then
1468
         Put (", abort deferred");
1469
      end if;
1470
 
1471
      if T.Common.Call /= null then
1472
         Entry_Call := T.Common.Call;
1473
         Put (", serving:");
1474
 
1475
         while Entry_Call /= null loop
1476
            Put (To_Integer (Entry_Call.Self)'Img);
1477
            Entry_Call := Entry_Call.Acceptor_Prev_Call;
1478
         end loop;
1479
      end if;
1480
 
1481
      if T.Open_Accepts /= null then
1482
         Put (", accepting:");
1483
 
1484
         for J in T.Open_Accepts'Range loop
1485
            Put (T.Open_Accepts (J).S'Img);
1486
         end loop;
1487
 
1488
         if T.Terminate_Alternative then
1489
            Put (" or terminate");
1490
         end if;
1491
      end if;
1492
 
1493
      if T.User_State /= 0 then
1494
         Put (", state:" & T.User_State'Img);
1495
      end if;
1496
 
1497
      Put_Line;
1498
   end Print_Task_Info;
1499
 
1500
   ---------
1501
   -- Put --
1502
   ---------
1503
 
1504
   procedure Put (S : String) is
1505
   begin
1506
      Write (2, S, S'Length);
1507
   end Put;
1508
 
1509
   --------------
1510
   -- Put_Line --
1511
   --------------
1512
 
1513
   procedure Put_Line (S : String := "") is
1514
   begin
1515
      Write (2, S & ASCII.LF, S'Length + 1);
1516
   end Put_Line;
1517
 
1518
   ----------------------
1519
   -- Resume_All_Tasks --
1520
   ----------------------
1521
 
1522
   procedure Resume_All_Tasks (Thread_Self : OS_Interface.Thread_Id) is
1523
      pragma Unreferenced (Thread_Self);
1524
   begin
1525
      null; --  VxWorks
1526
   end Resume_All_Tasks;
1527
 
1528
   ---------------
1529
   -- Set_Trace --
1530
   ---------------
1531
 
1532
   procedure Set_Trace (Flag  : Character; Value : Boolean := True) is
1533
   begin
1534
      Trace_On (Flag) := Value;
1535
   end Set_Trace;
1536
 
1537
   --------------------
1538
   -- Set_User_State --
1539
   --------------------
1540
 
1541
   procedure Set_User_State (Value : Long_Integer) is
1542
   begin
1543
      STPO.Self.User_State := Value;
1544
   end Set_User_State;
1545
 
1546
   ----------------
1547
   -- Show_Event --
1548
   ----------------
1549
 
1550
   procedure Show_Event
1551
      (Print_Routine : Print_Routine_Type := Default_Print_Routine'Access)
1552
   is
1553
   begin
1554
      for I in Event_Def_Help'Range loop
1555
         Print_Routine (Print_FAO, Print_Newline, To_UL (Event_Def_Help (I)));
1556
      end loop;
1557
 
1558
      for I in Event_Kind_Type'Range loop
1559
         Print_Routine (Print_FAO, Print_Newline,
1560
           To_UL (Event_Directory
1561
                   (Global_Event_Display_Order (I)).Name'Address));
1562
         Print_Routine (Print_FAO, Print_Newline,
1563
           To_UL (Event_Directory (Global_Event_Display_Order (I)).Help));
1564
      end loop;
1565
   end Show_Event;
1566
 
1567
   --------------------
1568
   -- Show_One_Task --
1569
   --------------------
1570
 
1571
   procedure Show_One_Task
1572
     (Task_Value      : Task_Id;
1573
      Full_Display    : Boolean := False;
1574
      Suppress_Header : Boolean := False;
1575
      Print_Routine   : Print_Routine_Type := Default_Print_Routine'Access)
1576
   is
1577
      Task_SP            : System.Address := Address_Zero;
1578
      Stack_Base         : System.Address := Address_Zero;
1579
      Stack_Top          : System.Address := Address_Zero;
1580
      TCB_Size           : Unsigned_Longword := 0;
1581
      CMA_TCB_Size       : Unsigned_Longword := 0;
1582
      Stack_Guard_Size   : Unsigned_Longword := 0;
1583
      Total_Task_Storage : Unsigned_Longword := 0;
1584
      Stack_In_Use       : Unsigned_Longword := 0;
1585
      Reserved_Size      : Unsigned_Longword := 0;
1586
      Hold_Flag          : Unsigned_Longword := 0;
1587
      Sched_State        : Unsigned_Longword := 0;
1588
      User_Prio          : Unsigned_Longword := 0;
1589
      Stack_Size         : Unsigned_Longword := 0;
1590
      Run_State          : Boolean := False;
1591
      Rea_State          : Boolean := False;
1592
      Sus_State          : Boolean := False;
1593
      Ter_State          : Boolean := False;
1594
 
1595
      Current_Flag : AASCIC := NoStar;
1596
      Hold_String  : AASCIC := NoHold;
1597
      Ada_State    : AASCIC := Ada_State_Invalid_State;
1598
      Debug_State  : AASCIC := Debug_State_Emp;
1599
 
1600
      Ada_State_Len   : constant Unsigned_Longword := 17;
1601
      Debug_State_Len : constant Unsigned_Longword := 5;
1602
 
1603
      Entry_Call : Entry_Call_Record;
1604
 
1605
   begin
1606
 
1607
      --  Initialize local task info variables
1608
 
1609
      Task_SP := Address_Zero;
1610
      Stack_Base := Address_Zero;
1611
      Stack_Top := Address_Zero;
1612
      CMA_TCB_Size := 0;
1613
      Stack_Guard_Size := 0;
1614
      Reserved_Size := 0;
1615
      Hold_Flag := 0;
1616
      Sched_State := 0;
1617
      TCB_Size := Unsigned_Longword (Task_Id'Size);
1618
 
1619
      if not Suppress_Header or else Full_Display then
1620
         Print_Routine (Print_FAO, Print_Newline, To_UL (Empty_Text));
1621
         Print_Routine (Print_FAO, Print_Newline, To_UL (Header));
1622
      end if;
1623
 
1624
      Trace_Output ("Show_One_Task Task Value: ");
1625
      Trace_Output (Unsigned_Longword'Image (To_UL (Task_Value)));
1626
 
1627
      --  Callback to DEBUG to get some task info
1628
 
1629
      if Task_Value.Common.State /= Terminated then
1630
         Debug_Get
1631
           (STPO.Get_Thread_Id (Task_Value),
1632
            CMA_C_DEBGET_STACKPTR,
1633
            Task_SP,
1634
            8);
1635
 
1636
         Debug_Get
1637
           (STPO.Get_Thread_Id (Task_Value),
1638
            CMA_C_DEBGET_TCB_SIZE,
1639
            CMA_TCB_Size,
1640
            4);
1641
 
1642
         Debug_Get
1643
           (STPO.Get_Thread_Id (Task_Value),
1644
            CMA_C_DEBGET_GUARDSIZE,
1645
            Stack_Guard_Size,
1646
            4);
1647
 
1648
         Debug_Get
1649
           (STPO.Get_Thread_Id (Task_Value),
1650
            CMA_C_DEBGET_YELLOWSIZE,
1651
            Reserved_Size,
1652
            4);
1653
 
1654
         Debug_Get
1655
           (STPO.Get_Thread_Id (Task_Value),
1656
            CMA_C_DEBGET_STACK_BASE,
1657
            Stack_Base,
1658
            8);
1659
 
1660
         Debug_Get
1661
           (STPO.Get_Thread_Id (Task_Value),
1662
            CMA_C_DEBGET_STACK_TOP,
1663
            Stack_Top,
1664
            8);
1665
 
1666
         Stack_Size := Unsigned_Longword (Stack_Base - Stack_Top)
1667
           - Reserved_Size - Stack_Guard_Size;
1668
         Stack_In_Use := Unsigned_Longword (Stack_Base - Task_SP) + 4;
1669
         Total_Task_Storage := TCB_Size + Stack_Size + Stack_Guard_Size
1670
           + Reserved_Size + CMA_TCB_Size;
1671
 
1672
         Debug_Get
1673
           (STPO.Get_Thread_Id (Task_Value),
1674
            CMA_C_DEBGET_IS_HELD,
1675
            Hold_Flag,
1676
            4);
1677
 
1678
         Hold_String := (if Hold_Flag /= 0 then Hold else NoHold);
1679
 
1680
         Debug_Get
1681
           (STPO.Get_Thread_Id (Task_Value),
1682
            CMA_C_DEBGET_SCHED_STATE,
1683
            Sched_State,
1684
            4);
1685
      end if;
1686
 
1687
      Run_State := False;
1688
      Rea_State := False;
1689
      Sus_State := Task_Value.Common.State = Unactivated;
1690
      Ter_State := Task_Value.Common.State = Terminated;
1691
 
1692
      if not Ter_State then
1693
         Run_State := Sched_State = 0;
1694
         Rea_State := Sched_State = 1;
1695
         Sus_State := Sched_State /= 0 and Sched_State /= 1;
1696
      end if;
1697
 
1698
      --  Set the debug state
1699
 
1700
      if Run_State then
1701
         Debug_State := Debug_State_Run;
1702
      elsif Rea_State then
1703
         Debug_State := Debug_State_Rea;
1704
      elsif Sus_State then
1705
         Debug_State := Debug_State_Sus;
1706
      elsif Ter_State then
1707
         Debug_State := Debug_State_Ter;
1708
      end if;
1709
 
1710
      Trace_Output ("Before case State: ");
1711
      Trace_Output (Task_States'Image (Task_Value.Common.State));
1712
 
1713
      --  Set the Ada state
1714
 
1715
      case Task_Value.Common.State is
1716
         when Unactivated =>
1717
            Ada_State := Ada_State_Not_Yet_Activated;
1718
 
1719
         when Activating =>
1720
            Ada_State := Ada_State_Activating;
1721
 
1722
         when Runnable =>
1723
            Ada_State := Ada_State_Runnable;
1724
 
1725
         when Terminated =>
1726
            Ada_State := Ada_State_Terminated;
1727
 
1728
         when Activator_Sleep =>
1729
            Ada_State := Ada_State_Activating_Tasks;
1730
 
1731
         when Acceptor_Sleep =>
1732
            Ada_State := Ada_State_Accept;
1733
 
1734
         when Acceptor_Delay_Sleep =>
1735
            Ada_State := Ada_State_Select_or_Delay;
1736
 
1737
         when Entry_Caller_Sleep =>
1738
            Entry_Call :=
1739
              Task_Value.Entry_Calls (Task_Value.ATC_Nesting_Level);
1740
 
1741
            case Entry_Call.Mode is
1742
               when Simple_Call =>
1743
                  Ada_State := Ada_State_Entry_Call;
1744
               when Conditional_Call =>
1745
                  Ada_State := Ada_State_Cond_Entry_Call;
1746
               when Timed_Call =>
1747
                  Ada_State := Ada_State_Timed_Entry_Call;
1748
               when Asynchronous_Call =>
1749
                  Ada_State := Ada_State_Async_Entry_Call;
1750
            end case;
1751
 
1752
         when Async_Select_Sleep =>
1753
            Ada_State := Ada_State_Select_or_Abort;
1754
 
1755
         when Delay_Sleep =>
1756
            Ada_State := Ada_State_Delay;
1757
 
1758
         when Master_Completion_Sleep =>
1759
            Ada_State := Ada_State_Completed;
1760
 
1761
         when Master_Phase_2_Sleep =>
1762
            Ada_State := Ada_State_Completed;
1763
 
1764
         when Interrupt_Server_Idle_Sleep |
1765
              Interrupt_Server_Blocked_Interrupt_Sleep |
1766
              Timer_Server_Sleep |
1767
              Interrupt_Server_Blocked_On_Event_Flag =>
1768
            Ada_State := Ada_State_Server;
1769
 
1770
         when AST_Server_Sleep =>
1771
            Ada_State := Ada_State_IO_or_AST;
1772
 
1773
         when Asynchronous_Hold =>
1774
            Ada_State := Ada_State_Async_Hold;
1775
 
1776
      end case;
1777
 
1778
      if Task_Value.Terminate_Alternative then
1779
         Ada_State := Ada_State_Select_or_Term;
1780
      end if;
1781
 
1782
      if Task_Value.Aborting then
1783
         Ada_State := Ada_State_Aborting;
1784
      end if;
1785
 
1786
      User_Prio := To_UL (Task_Value.Common.Current_Priority);
1787
      Trace_Output ("After user_prio");
1788
 
1789
      --  Flag the current task
1790
 
1791
      Current_Flag := (if Task_Value = Self then Star else NoStar);
1792
 
1793
      --  Show task info
1794
 
1795
      Print_Routine (Print_FAO, No_Print, To_UL (DoAC ("!AC%TASK !5<!UI!>")),
1796
        To_UL (Current_Flag), To_UL (Task_Value.Known_Tasks_Index + 1));
1797
 
1798
      Print_Routine (Print_FAO, No_Print, To_UL (DoAC ("!2UB")), User_Prio);
1799
 
1800
      Print_Routine (Print_FAO, No_Print, To_UL (DoAC (" !AC !5AD !17AD ")),
1801
        To_UL (Hold_String), Debug_State_Len, To_UL (Debug_State),
1802
        Ada_State_Len, To_UL (Ada_State));
1803
 
1804
--      Print_Routine (Print_Symbol, Print_Newline,
1805
--         Fetch (To_Addr (Task_Value.Common.Task_Entry_Point)));
1806
 
1807
      Print_Routine (Print_FAO, Print_Newline, To_UL (Empty_Text));
1808
 
1809
      --  If /full qualfier passed, show detailed info
1810
 
1811
      if Full_Display then
1812
         Show_Rendezvous (Task_Value, Ada_State, Full_Display,
1813
           Suppress_Header, Print_Routine);
1814
 
1815
         List_Entry_Waiters (Task_Value, Full_Display,
1816
           Suppress_Header, Print_Routine);
1817
 
1818
         Print_Routine (Print_FAO, Print_Newline, To_UL (Empty_Text));
1819
 
1820
         declare
1821
            Task_Image : ASCIC := (Task_Value.Common.Task_Image_Len,
1822
              Task_Value.Common.Task_Image
1823
               (1 .. Task_Value.Common.Task_Image_Len));
1824
         begin
1825
            Print_Routine (Print_FAO, Print_Newline,
1826
              To_UL (DoAC ("        Task type:      !AC")),
1827
              To_UL (Task_Image'Address));
1828
         end;
1829
 
1830
         --  How to find Creation_PC ???
1831
--         Print_Routine (Print_FAO, No_Print,
1832
--           To_UL (DoAC ("        Created at PC:  ")),
1833
--         Print_Routine (Print_FAO, Print_Newline, Creation_PC);
1834
 
1835
         if Task_Value.Common.Parent /= null then
1836
            Print_Routine (Print_FAO, Print_Newline,
1837
              To_UL (DoAC ("        Parent task:    %TASK !UI")),
1838
              To_UL (Task_Value.Common.Parent.Known_Tasks_Index + 1));
1839
         else
1840
            Print_Routine (Print_FAO, Print_Newline,
1841
             To_UL (DoAC ("        Parent task:    none")));
1842
         end if;
1843
 
1844
--         Print_Routine (Print_FAO, No_Print,
1845
--           To_UL (DoAC ("        Start PC:       ")));
1846
--         Print_Routine (Print_Symbol, Print_Newline,
1847
--            Fetch (To_Addr (Task_Value.Common.Task_Entry_Point)));
1848
 
1849
         Print_Routine (Print_FAO, Print_Newline,
1850
          To_UL (DoAC (
1851
           "        Task control block:             Stack storage (bytes):")));
1852
 
1853
         Print_Routine (Print_FAO, Print_Newline,
1854
          To_UL (DoAC (
1855
           "          Task value:   !10<!UI!>        RESERVED_BYTES:  !10UI")),
1856
          To_UL (Task_Value), Reserved_Size);
1857
 
1858
         Print_Routine (Print_FAO, Print_Newline,
1859
          To_UL (DoAC (
1860
           "          Entries:      !10<!UI!>        TOP_GUARD_SIZE:  !10UI")),
1861
          To_UL (Task_Value.Entry_Num), Stack_Guard_Size);
1862
 
1863
         Print_Routine (Print_FAO, Print_Newline,
1864
          To_UL (DoAC (
1865
           "          Size:         !10<!UI!>        STORAGE_SIZE:    !10UI")),
1866
          TCB_Size + CMA_TCB_Size, Stack_Size);
1867
 
1868
         Print_Routine (Print_FAO, Print_Newline,
1869
          To_UL (DoAC (
1870
           "        Stack addresses:                 Bytes in use:    !10UI")),
1871
          Stack_In_Use);
1872
 
1873
         Print_Routine (Print_FAO, Print_Newline,
1874
          To_UL (DoAC ("          Top address:  !10<!XI!>")),
1875
          To_UL (Stack_Top));
1876
 
1877
         Print_Routine (Print_FAO, Print_Newline,
1878
          To_UL (DoAC (
1879
           "          Base address: !10<!XI!>      Total storage:     !10UI")),
1880
          To_UL (Stack_Base), Total_Task_Storage);
1881
      end if;
1882
 
1883
   end Show_One_Task;
1884
 
1885
   ---------------------
1886
   -- Show_Rendezvous --
1887
   ---------------------
1888
 
1889
   procedure Show_Rendezvous
1890
     (Task_Value      : Task_Id;
1891
      Ada_State       : AASCIC := Empty_Text;
1892
      Full_Display    : Boolean := False;
1893
      Suppress_Header : Boolean := False;
1894
      Print_Routine   : Print_Routine_Type := Default_Print_Routine'Access)
1895
   is
1896
      pragma Unreferenced (Ada_State);
1897
      pragma Unreferenced (Suppress_Header);
1898
 
1899
      Temp_Entry  : Entry_Index;
1900
      Entry_Call  : Entry_Call_Record;
1901
      Called_Task : Task_Id;
1902
      AWR         : constant String := "        Awaiting rendezvous at: ";
1903
      --  Common prefix
1904
 
1905
      procedure Print_Accepts;
1906
      --  Display information about task rendezvous accepts
1907
 
1908
      procedure Print_Accepts is
1909
      begin
1910
         if Task_Value.Open_Accepts /= null then
1911
            for I in Task_Value.Open_Accepts'Range loop
1912
               Temp_Entry := Entry_Index (Task_Value.Open_Accepts (I).S);
1913
               declare
1914
                  Entry_Name_Image : ASCIC :=
1915
                    (Task_Value.Entry_Names (Temp_Entry).all'Length,
1916
                     Task_Value.Entry_Names (Temp_Entry).all);
1917
               begin
1918
                  Trace_Output ("Accept at: " & Entry_Name_Image.Text);
1919
                  Print_Routine (Print_FAO, Print_Newline,
1920
                    To_UL (DoAC ("             accept at: !AC")),
1921
                    To_UL (Entry_Name_Image'Address));
1922
               end;
1923
            end loop;
1924
         end if;
1925
      end Print_Accepts;
1926
   begin
1927
      if not Full_Display then
1928
         return;
1929
      end if;
1930
 
1931
      Trace_Output ("Show_Rendezvous Task Value: ");
1932
      Trace_Output (Unsigned_Longword'Image (To_UL (Task_Value)));
1933
 
1934
      if Task_Value.Common.State = Acceptor_Sleep and then
1935
         not Task_Value.Terminate_Alternative
1936
      then
1937
         if Task_Value.Open_Accepts /= null then
1938
            Temp_Entry := Entry_Index (Task_Value.Open_Accepts
1939
              (Task_Value.Open_Accepts'First).S);
1940
            declare
1941
               Entry_Name_Image : ASCIC :=
1942
                 (Task_Value.Entry_Names (Temp_Entry).all'Length,
1943
                  Task_Value.Entry_Names (Temp_Entry).all);
1944
            begin
1945
               Trace_Output (AWR & "accept " & Entry_Name_Image.Text);
1946
               Print_Routine (Print_FAO, Print_Newline,
1947
                 To_UL (DoAC (AWR & "accept !AC")),
1948
                 To_UL (Entry_Name_Image'Address));
1949
            end;
1950
 
1951
         else
1952
            Print_Routine (Print_FAO, Print_Newline,
1953
              To_UL (DoAC ("        entry name unavailable")));
1954
         end if;
1955
      else
1956
         case Task_Value.Common.State is
1957
            when Acceptor_Sleep =>
1958
               Print_Routine (Print_FAO, Print_Newline,
1959
                 To_UL (DoAC (AWR & "select with terminate.")));
1960
               Print_Accepts;
1961
 
1962
            when Async_Select_Sleep =>
1963
               Print_Routine (Print_FAO, Print_Newline,
1964
                 To_UL (DoAC (AWR & "select.")));
1965
               Print_Accepts;
1966
 
1967
            when Acceptor_Delay_Sleep =>
1968
               Print_Routine (Print_FAO, Print_Newline,
1969
                 To_UL (DoAC (AWR & "select with delay.")));
1970
               Print_Accepts;
1971
 
1972
            when Entry_Caller_Sleep =>
1973
               Entry_Call :=
1974
                 Task_Value.Entry_Calls (Task_Value.ATC_Nesting_Level);
1975
 
1976
               case Entry_Call.Mode is
1977
                  when Simple_Call =>
1978
                     Print_Routine (Print_FAO, Print_Newline,
1979
                       To_UL (DoAC (AWR & "entry call")));
1980
                  when Conditional_Call =>
1981
                     Print_Routine (Print_FAO, Print_Newline,
1982
                       To_UL (DoAC (AWR & "entry call with else")));
1983
                  when Timed_Call =>
1984
                     Print_Routine (Print_FAO, Print_Newline,
1985
                       To_UL (DoAC (AWR & "entry call with delay")));
1986
                  when Asynchronous_Call =>
1987
                     Print_Routine (Print_FAO, Print_Newline,
1988
                        To_UL (DoAC (AWR & "entry call with abort")));
1989
               end case;
1990
               Called_Task := Entry_Call.Called_Task;
1991
               declare
1992
                  Task_Image : ASCIC := (Called_Task.Common.Task_Image_Len,
1993
                    Called_Task.Common.Task_Image
1994
                     (1 .. Called_Task.Common.Task_Image_Len));
1995
                  Entry_Name_Image : ASCIC :=
1996
                    (Called_Task.Entry_Names (Entry_Call.E).all'Length,
1997
                     Called_Task.Entry_Names (Entry_Call.E).all);
1998
               begin
1999
                  Print_Routine (Print_FAO, Print_Newline,
2000
                    To_UL (DoAC
2001
                     ("        for entry !AC in %TASK !UI type !AC")),
2002
                    To_UL (Entry_Name_Image'Address),
2003
                    To_UL (Called_Task.Known_Tasks_Index),
2004
                    To_UL (Task_Image'Address));
2005
               end;
2006
 
2007
            when others =>
2008
               return;
2009
         end case;
2010
      end if;
2011
 
2012
   end Show_Rendezvous;
2013
 
2014
   ------------------------
2015
   -- Signal_Debug_Event --
2016
   ------------------------
2017
 
2018
   procedure Signal_Debug_Event
2019
    (Event_Kind : Event_Kind_Type; Task_Value : Task_Id)
2020
   is
2021
      Do_Signal : Boolean;
2022
      EVCB      : Ada_Event_Control_Block_Access;
2023
 
2024
      EVCB_Sent    : constant := 16#9B#;
2025
      Ada_Facility : constant := 49;
2026
      SS_DBGEVENT  : constant := 1729;
2027
   begin
2028
      Do_Signal := Global_Task_Debug_Events (Event_Kind);
2029
 
2030
      if not Do_Signal then
2031
         if Task_Value /= null then
2032
            Do_Signal := Do_Signal
2033
              or else Task_Value.Common.Debug_Events (Event_Kind);
2034
         end if;
2035
      end if;
2036
 
2037
      if Do_Signal then
2038
         --  Build an a tasking event control block and signal DEBUG
2039
 
2040
         EVCB := new Ada_Event_Control_Block_Type;
2041
         EVCB.Code := Unsigned_Word (Event_Kind);
2042
         EVCB.Sentinal := EVCB_Sent;
2043
         EVCB.Facility := Ada_Facility;
2044
 
2045
         if Task_Value /= null then
2046
            EVCB.Value := Unsigned_Longword (Task_Value.Known_Tasks_Index + 1);
2047
         else
2048
            EVCB.Value := 0;
2049
         end if;
2050
 
2051
         EVCB.Sub_Event := 0;
2052
         EVCB.P1 := 0;
2053
         EVCB.Sigargs := 0;
2054
         EVCB.Flags := 0;
2055
         EVCB.Unused1 := 0;
2056
         EVCB.Unused2 := 0;
2057
 
2058
         Signal (SS_DBGEVENT, 1, To_UL (EVCB));
2059
      end if;
2060
   end Signal_Debug_Event;
2061
 
2062
   --------------------
2063
   -- Stop_All_Tasks --
2064
   --------------------
2065
 
2066
   procedure Stop_All_Tasks is
2067
   begin
2068
      null; --  VxWorks
2069
   end Stop_All_Tasks;
2070
 
2071
   ----------------------------
2072
   -- Stop_All_Tasks_Handler --
2073
   ----------------------------
2074
 
2075
   procedure Stop_All_Tasks_Handler is
2076
   begin
2077
      null; --  VxWorks
2078
   end Stop_All_Tasks_Handler;
2079
 
2080
   -----------------------
2081
   -- Suspend_All_Tasks --
2082
   -----------------------
2083
 
2084
   procedure Suspend_All_Tasks (Thread_Self : OS_Interface.Thread_Id) is
2085
      pragma Unreferenced (Thread_Self);
2086
   begin
2087
      null; --  VxWorks
2088
   end Suspend_All_Tasks;
2089
 
2090
   ------------------------
2091
   -- Task_Creation_Hook --
2092
   ------------------------
2093
 
2094
   procedure Task_Creation_Hook (Thread : OS_Interface.Thread_Id) is
2095
      pragma Unreferenced (Thread);
2096
   begin
2097
      null; --  VxWorks
2098
   end Task_Creation_Hook;
2099
 
2100
   ---------------------------
2101
   -- Task_Termination_Hook --
2102
   ---------------------------
2103
 
2104
   procedure Task_Termination_Hook is
2105
   begin
2106
      null; --  VxWorks
2107
   end Task_Termination_Hook;
2108
 
2109
   -----------
2110
   -- Trace --
2111
   -----------
2112
 
2113
   procedure Trace
2114
     (Self_Id  : Task_Id;
2115
      Msg      : String;
2116
      Flag     : Character;
2117
      Other_Id : Task_Id := null)
2118
   is
2119
   begin
2120
      if Trace_On (Flag) then
2121
         Put (To_Integer (Self_Id)'Img &
2122
              ':' & Flag & ':' &
2123
              Self_Id.Common.Task_Image (1 .. Self_Id.Common.Task_Image_Len) &
2124
              ':');
2125
 
2126
         if Other_Id /= null then
2127
            Put (To_Integer (Other_Id)'Img & ':');
2128
         end if;
2129
 
2130
         Put_Line (Msg);
2131
      end if;
2132
   end Trace;
2133
 
2134
   ------------------
2135
   -- Trace_Output --
2136
   ------------------
2137
 
2138
   procedure Trace_Output (Message_String : String) is
2139
   begin
2140
      if Trace_On ('V') and Trace_On ('M') and Trace_On ('S') then
2141
         Put_Output (Message_String);
2142
      end if;
2143
   end Trace_Output;
2144
 
2145
   -----------
2146
   -- Write --
2147
   -----------
2148
 
2149
   procedure Write (Fd : Integer; S : String; Count : Integer) is
2150
      Discard : System.CRTL.ssize_t;
2151
      pragma Unreferenced (Discard);
2152
   begin
2153
      Discard := System.CRTL.write (Fd, S (S'First)'Address,
2154
                                    System.CRTL.size_t (Count));
2155
      --  Is it really right to ignore write errors here ???
2156
   end Write;
2157
 
2158
end System.Tasking.Debug;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.