DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦1c5e5abb7⟧ Ada Source

    Length: 13312 (0x3400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package V_I_Pass, seg_0509c9

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



-- Copyright 1988,1992,1993 Verdix Corporation

------------------------------------------------------------------------------
-- Interface to the passive task data structure and subprograms.
--
-- The compiler emits calls to these subprograms when
-- "pragma passive" is present in task specification.
--
-- The compiler does an implicit "with v_i_pass" while compiling
-- units that declare passive tasks.  The compiler knows the
-- names and the basic data types of most of the objects declared
-- in this package.
------------------------------------------------------------------------------
with System;
use System;
with Ada_Krn_Defs;
with V_I_Mutex;
with Unchecked_Conversion;
-- CIFO_SYNCHRONIZATION or PRIORITY_CEILING
with V_I_Cifo;
-- CIFO_SYNCHRONIZATION or PRIORITY_CEILING
package V_I_Pass is

    pragma Suppress (All_Checks);
    pragma Suppress (Exception_Tables);
    pragma Not_Elaborated;
    pragma Local_Access;

    --------------------------------------------------------------------------
    -- Passive task header record,  allocated and built by the
    -- compiler,  one for each passive task object.  The entry
    -- and guard arrays are not really 1..8,  but we want them
    -- to be constrained.
    --------------------------------------------------------------------------
    type Entry_Array is array (Integer range 1 .. 8) of Integer;
    type A_Entrys is access Entry_Array;
    type Guard_Array is array (Integer range 1 .. 8) of Boolean;
    type A_Guards is access Guard_Array;

    type Task_Header;
    type Task_Header_Ref is access Task_Header;
    type Task_Header is
        record
            State : Integer;
            Alloc_Base : Address;
            Guard_Ptr : A_Guards;
            Entry_Ptr : A_Entrys;

            Abort_Safe : Boolean;
            Entered_From_Isr : Boolean;
            Callable_From_Isr : Boolean;

            Active_Passive_Link : Task_Header_Ref;
-- CIFO_SYNCHRONIZATION
            Entry_Criteria : V_I_Cifo.Queuing_T;
-- CIFO_SYNCHRONIZATION
-- PRIORITY_CEILING
            Ceiling_Prio : Integer;
-- PRIORITY_CEILING
            Attr : Ada_Krn_Defs.A_Mutex_Attr_T;
            Safe_Cond : V_I_Mutex.Safe_Cond_T;
            Safe_Mutex : V_I_Mutex.Safe_Mutex_T;
        end record;

    function To_Task_Header_Ref is
       new Unchecked_Conversion (Address, Task_Header_Ref);


    --------------------------------------------------------------------------
    -- The three different kinds of entry calls.
    --------------------------------------------------------------------------
    Pt_Entry_Call : constant Integer := 1;
    Pt_Cond_Call : constant Integer := 2;
    Pt_Timed_Call : constant Integer := 3;

    --------------------------------------------------------------------------
    -- Parameter block passed to passive task accept bodies and the
    -- compiler generated utility routines called by the accept bodies.
    -- A pointer to this block is passed in the target's RESULT register.
    --------------------------------------------------------------------------
    type Param_Block is
        record
            Header : Task_Header_Ref;
            Kind_Of_Call : Integer;
            Delay_Value : Duration;
        end record;
    type A_Param_Block is access Param_Block;

    -- These constants are used in v_usr_conf to allow the machine
    -- code routine V_PASSIVE_ISR to reference param_block fields.
    -- The rep spec below is included to allow the compiler to check
    -- that the offsets are correct and/or reasonable.

    Pt_Pb_Header_Off : constant := 0;
    Pt_Pb_Kind_Off : constant := 4;
    Pt_Pb_Delay_Off : constant := 8;

    for Param_Block use
        record
            Header at Pt_Pb_Header_Off range 0 .. 31;
            Kind_Of_Call at Pt_Pb_Kind_Off range 0 .. 31;
            Delay_Value at Pt_Pb_Delay_Off range 0 .. 31;
        end record;

    --------------------------------------------------------------------------
    -- Interrupt entry's ISR header record built by the compiler
    --------------------------------------------------------------------------
    type Isr_Header is
        record
            Vector_Num : Integer;
            Entry_Num : Integer;
            Param_Block : A_Param_Block;
            Finish_Accept_A : Address;
        end record;

    -- These constants are used in v_usr_conf to allow the machine
    -- code routine V_PASSIVE_ISR to reference the isr header.
    -- The rep spec below is included to allow the compiler to check
    -- that the offsets are correct and/or reasonable.

    Pt_Isr_Vector_Num_Off : constant := 0;
    Pt_Isr_Entry_Num_Off : constant := 4;
    Pt_Isr_Param_Block_Off : constant := 8;
    Pt_Isr_Finish_Accept_A_Off : constant := 12;

    for Isr_Header use
        record
            Vector_Num at Pt_Isr_Vector_Num_Off range 0 .. 31;
            Entry_Num at Pt_Isr_Entry_Num_Off range 0 .. 31;
            Param_Block at Pt_Isr_Param_Block_Off range 0 .. 31;
            Finish_Accept_A at Pt_Isr_Finish_Accept_A_Off range 0 .. 31;
        end record;

    type Isr_Header_Ref is access Isr_Header;

    --------------------------------------------------------------------------
    -- Subprograms to call/enter a passive task's entry
    --------------------------------------------------------------------------
    function Pt_Enter (Entry_Num : Integer; T : Task_Header_Ref) return Boolean;
    function Pt_Safe_Enter
                (Entry_Num : Integer; T : Task_Header_Ref) return Boolean;

    function Pt_Cond_Enter
                (Entry_Num : Integer; T : Task_Header_Ref) return Boolean;
    function Pt_Safe_Cond_Enter
                (Entry_Num : Integer; T : Task_Header_Ref) return Boolean;

    function Pt_Timed_Enter
                (Timeout : Duration; Entry_Num : Integer; T : Task_Header_Ref)
                return Boolean;
    function Pt_Safe_Timed_Enter
                (Timeout : Duration; Entry_Num : Integer; T : Task_Header_Ref)
                return Boolean;

    --------------------------------------------------------------------------
    -- Subprogam to call/enter a passive task's entry from an ISR
    --------------------------------------------------------------------------
    procedure Pt_Isr_Enter (T : Task_Header_Ref);

    --------------------------------------------------------------------------
    -- Subprogram to leave a passive task
    --------------------------------------------------------------------------
    procedure Pt_Leave (T : Task_Header_Ref);
    procedure Pt_Safe_Leave (T : Task_Header_Ref);

    --------------------------------------------------------------------------
    -- Subprogram to initialize a passive task
    --------------------------------------------------------------------------
    procedure Pt_Init (T : Task_Header_Ref);

    --------------------------------------------------------------------------
    -- Abort a passive task by setting it's state to TERMINATED.
    --------------------------------------------------------------------------
    procedure Pt_Abort (T : Task_Header_Ref);

    --------------------------------------------------------------------------
    -- The E'count attribute for passive tasks.
    --------------------------------------------------------------------------
    function Pt_Count (Entry_Num : Integer; T : Task_Header_Ref) return Integer;

    --------------------------------------------------------------------------
    -- Routines to elaborate passive tasks.  Tasks are added to the
    -- activation list by pt_link and elaborated _en masse_ by pt_elab_list.
    --------------------------------------------------------------------------
    procedure Pt_Link (Activ_List : System.Address;
                       T : Task_Header_Ref;
                       Proc_Addr : System.Address;
                       Flag_Addr : System.Address;
                       Generic_Env : System.Address);

    procedure Pt_Elab_List (Activ_List : System.Address);

-- PRIORITY_CEILING
    --------------------------------------------------------------------------
    -- Priority ceiling server task subprograms
    --
    -- Only supported as part of the CIFO add-on product. These routines
    -- support the INITIAL_TASK_PRIORITY_CEILING pragma. Also support
    -- the routines, SET_PRIORITY_CEILING and PRIORITY_CEILING_OF
    -- found in the DYNAMIC_TASK_PRIORITY_CEILINGS package.
    --------------------------------------------------------------------------
    procedure Pt_Ceiling_Init (T : Task_Header_Ref; Ceiling_Prio : Priority);
    function Pt_Ceiling_Enter
                (Entry_Num : Integer; T : Task_Header_Ref) return Boolean;
    procedure Pt_Ceiling_Leave (T : Task_Header_Ref);

    procedure Pt_Ceiling_Set_Priority
                 (T : Task_Header_Ref; Ceiling_Prio : Priority);
    function Pt_Ceiling_Get_Priority (T : Task_Header_Ref) return Priority;
    -- Either routine will raise v_i_cifo.PRIORITY_CEILING_ERROR if the
    -- passive task isn't a priority ceiling server.
-- PRIORITY_CEILING

private
    pragma Interface (Ada, Pt_Enter);
    pragma Interface_Name (Pt_Enter, "PT_ENTER");
    pragma Interface (Ada, Pt_Safe_Enter);
    pragma Interface_Name (Pt_Safe_Enter, "PT_SAFE_ENTER");

    pragma Interface (Ada, Pt_Cond_Enter);
    pragma Interface_Name (Pt_Cond_Enter, "PT_COND_ENTER");
    pragma Interface (Ada, Pt_Safe_Cond_Enter);
    pragma Interface_Name (Pt_Safe_Cond_Enter, "PT_SAFE_COND_ENTER");

    pragma Interface (Ada, Pt_Timed_Enter);
    pragma Interface_Name (Pt_Timed_Enter, "PT_TIMED_ENTER");
    pragma Interface (Ada, Pt_Safe_Timed_Enter);
    pragma Interface_Name (Pt_Safe_Timed_Enter, "PT_SAFE_TIMED_ENTER");

    pragma Interface (Ada, Pt_Isr_Enter);
    pragma Interface_Name (Pt_Isr_Enter, "PT_ISR_ENTER");

    pragma Interface (Ada, Pt_Leave);
    pragma Interface_Name (Pt_Leave, "PT_LEAVE");
    pragma Interface (Ada, Pt_Safe_Leave);
    pragma Interface_Name (Pt_Safe_Leave, "PT_SAFE_LEAVE");

    pragma Interface (Ada, Pt_Init);
    pragma Interface_Name (Pt_Init, "PT_INIT");
    pragma Interface (Ada, Pt_Elab_List);
    pragma Interface_Name (Pt_Elab_List, "PT_ELAB_LIST");
    pragma Interface (Ada, Pt_Link);
    pragma Interface_Name (Pt_Link, "PT_LINK");
    pragma Interface (Ada, Pt_Count);
    pragma Interface_Name (Pt_Count, "PT_COUNT");
    pragma Interface (Ada, Pt_Abort);
    pragma Interface_Name (Pt_Abort, "PT_ABORT");

-- PRIORITY_CEILING
    pragma Interface (Ada, Pt_Ceiling_Init);
    pragma Interface_Name (Pt_Ceiling_Init, "PT_CEILING_INIT");
    pragma Interface (Ada, Pt_Ceiling_Enter);
    pragma Interface_Name (Pt_Ceiling_Enter, "PT_CEILING_ENTER");
    pragma Interface (Ada, Pt_Ceiling_Leave);
    pragma Interface_Name (Pt_Ceiling_Leave, "PT_CEILING_LEAVE");
    pragma Interface (Ada, Pt_Ceiling_Set_Priority);
    pragma Interface_Name (Pt_Ceiling_Set_Priority, "PT_CEILING_SET_PRIORITY");
    pragma Interface (Ada, Pt_Ceiling_Get_Priority);
    pragma Interface_Name (Pt_Ceiling_Get_Priority, "PT_CEILING_GET_PRIORITY");
-- PRIORITY_CEILING
end V_I_Pass;

E3 Meta Data

    nblk1=c
    nid=0
    hdr6=18
        [0x00] rec0=1e rec1=00 rec2=01 rec3=02e
        [0x01] rec0=18 rec1=00 rec2=02 rec3=062
        [0x02] rec0=19 rec1=00 rec2=03 rec3=05e
        [0x03] rec0=18 rec1=00 rec2=04 rec3=06a
        [0x04] rec0=1a rec1=00 rec2=05 rec3=04c
        [0x05] rec0=15 rec1=00 rec2=06 rec3=05e
        [0x06] rec0=13 rec1=00 rec2=07 rec3=08e
        [0x07] rec0=12 rec1=00 rec2=08 rec3=01c
        [0x08] rec0=13 rec1=00 rec2=09 rec3=060
        [0x09] rec0=17 rec1=00 rec2=0a rec3=07c
        [0x0a] rec0=19 rec1=00 rec2=0b rec3=052
        [0x0b] rec0=0a rec1=00 rec2=0c rec3=000
    tail 0x2175806a4878e79f93572 0x42a00088462060003