|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T V
Length: 13738 (0x35aa)
Types: TextFile
Names: »V«
└─⟦516dceb10⟧ Bits:30000751 8mm tape, Rational 1000, RCI_VADS
└─⟦9a14c9417⟧ »DATA«
└─⟦this⟧
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--
-- VERDIX CORPORATION (C) COPYRIGHT 1988
-- 14130-A Sullyfield Circle Proprietary Information
-- Chantilly, Virginia 22021 Not to be Disclosed
--
-- FILE: V_VADS_EXEC.A
--
-- UNITS: VADS/EXEC Package Specifications
--
-- PURPOSE: This file contains the user's high level interface to VADS_EXEC.
-- It contains packages for each of the following services:
--
-- Interrupt Handling (package V_INTERRUPTS)
-- Tasking Extensions (package V_XTASKING)
-- Semaphores (package V_SEMAPHORES)
-- Mailboxes (package V_MAILBOXES)
-- Memory Management (package V_MEMORY)
-- Stack Operations (package V_STACK)
--
-- The specifications for the above packages are contained in
-- this file. The bodies are located in the following files also
-- found in this directory:
-- V_INTERRUPTS v_intr_b.a
-- V_XTASKING v_xtask_b.a
-- V_SEMAPHORES v_sema_b.a
-- V_MAILBOXES v_mbox_b.a
-- V_MEMORY v_mem_b.a
-- V_STACK v_stack_b.a
--
-- These packages are layered upon the low level kernel/library
-- primitives. The interface to these primitives is provided by
-- the V_I_* packages also found in this directory.
--
-- Do not modify or recompile these packages.
--
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--
-- Revision History:
--
-- 880306:1430 B01
--
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
with V_I_Types;
with System;
package V_Interrupts is
pragma Suppress (All_Checks);
-- PURPOSE : V_INTERRUPTS provides interrupt processing support
-- for the use of user-defined interrupt service
-- routines (ISR's), the getting/setting of interrupt status and
-- entering/leaving of supervisor state for the current task.
--
-- Refer to V_INTERRUPTS's machine dependent body in
-- V_INTR_B.A file for an outline of the actions that must
-- be performed in an ISR.
--
--
-- NOTES ON FLOATING-POINT COPROCESSOR SAVE/RESTORE IN ISR's:
--
-- A save/restore of the floating-point coprocessor state is
-- necessary if a coprocessor is in use and
-- floating-point objects might be used
-- during the execution of the interrupt handler. Note
-- that VADS_EXEC does not use floating-point
-- objects; thus, a coprocessor save/restore is not
-- necessary before calling the services.
--
-- NOTES ON DATA REFERENCES IN ISR's:
--
-- The user-defined interrupt handler must not reference
-- non-local stack-relative data (including tasks declared
-- within a subprogram). Instead, all references should
-- be either to objects declared in library-level
-- package specifications/bodies, in the interrupt
-- handler itself or in subprograms called by the handler.
--
-- NOTES ON EXCEPTION PROPAGATION IN ISR's:
--
-- Exceptions raised in an interrupt handler must be
-- handled locally. An "others" exception handler should
-- be provided to prevent attempting to propogate an
-- exception from an interrupt handler. If you don't provide
-- a handler for a raised exception (such as NUMERIC_ERROR),
-- then, the entire program is abandoned (just like an unhandled
-- exception for the main subprogram).
--
-- NOTES ON ISR/ADA TASK INTERACTION:
--
-- An ISR executes in the context of the task it interrupted.
-- Since the ISR does not have its own task state, it must
-- not perform any Ada tasking operations which would affect
-- the state of the interrupted task:
--
-- - task creations
-- - accept statements
-- - entry calls
-- - delay statements
-- - abort statements
-- - evaluation of an allocator or deallocator
--
-- In addition, the ISR cannot invoke any VADS_EXEC service which
-- might block:
--
-- - SUSPEND_TASK
-- - WAIT_SEMAPHORE
-- - WAIT_MAILBOX
-- - any V_MEMORY allocator or deallocator
--
-- If the ISR calls a service that would block, the
-- TASKING_ERROR exception is raised.
--
-- It may, however, invoke any non-blocking operation,
-- including:
--
-- - RESUME_TASK
-- - SIGNAL_SEMAPHORE
-- - WRITE_MAILBOX
--
-- Floating-point registers do not have to be saved before
-- invoking VADS_EXEC services from an ISR.
--
-- The tasking and interrupt services support pre-emptive
-- task scheduling. If a call to a service from an
-- interrupt handler causes a task with a priority higher
-- than that of the interrupted task to become ready to run,
-- the higher priority task will run immediately upon return
-- from the outermost interrupt service routine.
--
--
-- EXAMPLE :
--
-- package ISR_EXAMPLE is
-- end;
--
-- with V_INTERRUPTS;
-- with SYSTEM;
-- package body ISR_EXAMPLE is
--
-- INTEGER_CNT: integer := 0;
-- FLOAT_CNT: float := 0.0;
--
-- procedure INTEGER_HANDLER is
-- begin
-- -- No floating point operations
--
-- INTEGER_CNT := INTEGER_CNT + 1;
-- end;
--
-- procedure FLOAT_HANDLER is
-- begin
-- -- Does floating point operations
--
-- FLOAT_CNT := FLOAT_CNT + 1.0;
-- end;
--
--
-- procedure INTEGER_ISR is new
-- V_INTERRUPTS.ISR(INTEGER_HANDLER);
-- -- An instantiated isr that doesn't perform any floating
-- -- point operations.
--
-- procedure WRAPPED_FLOAT_HANDLER is new
-- V_INTERRUPTS.FLOAT_WRAPPER(FLOAT_HANDLER);
-- -- An instantiated subprogram with floating point state
-- -- saved and initialized upon entry and then restored
-- -- upon return. This wrapped procedure is passed when
-- -- the isr is instantiated.
--
-- procedure FLOAT_ISR is new
-- V_INTERRUPTS.ISR(WRAPPED_FLOAT_HANDLER);
-- -- An instantiated isr that performs floating point
-- -- operations.
-- begin
-- -- Attach above instantiated isr's
-- V_INTERRUPTS.ATTACH_ISR(16#80#, INTEGER_ISR'address);
-- V_INTERRUPTS.ATTACH_ISR(16#81#, FLOAT_ISR'address);
-- end ISR_EXAMPLE;
-- The following type is used to specify the valid range for
-- interrupt vector numbers.
subtype Vector_Id is V_I_Types.Intr_Vector_Id_T;
-- The following type is used for interrupt status
subtype Interrupt_Status_T is V_I_Types.Intr_Status_T;
-- Machine independent interrupt status constants
Enable_Interrupt : constant Interrupt_Status_T :=
V_I_Types.Enable_Intr_Status;
Disable_Interrupt : constant Interrupt_Status_T :=
V_I_Types.Disable_Intr_Status;
-- The following exceptions may be raised by interrupt services.
Invalid_Interrupt_Vector : exception;
-- INVALID_INTERRUPT_VECTOR is raised if the vector number passed to the
-- service is not a valid vector number.
Vector_In_Use : exception;
-- VECTOR_IN_USE is raised if an attempt is made to attach an ISR
-- to a vector that is already attached to an ISR.
Unexpected_V_Interrupts_Error : exception;
-- UNEXPECTED_V_INTERRUPTS_ERROR may be raised if an unexpected
-- error occurs in an V_INTERRUPTS routine.
generic
with procedure Interrupt_Handler;
procedure Isr;
pragma Share_Code (Isr, False);
-- Purpose: ISR provides the wrapper required for all
-- interrupt service routines. It may be instantiated
-- with a parameterless procedure which provides the
-- handler for a particular interrupt. The address
-- of the resulting instantiation should be passed to
-- ATTACH_ISR to attach the interrupt service routine
-- to a particular vector.
--
-- Notes: This wrapper doesn't save/restore the floating point
-- context.
--
-- This generic must be instantiated at the library
-- package level.
generic
with procedure Interrupt_Handler;
procedure Fast_Isr;
pragma Share_Code (Fast_Isr, False);
-- Purpose: Faster version of the above ISR wrapper. Refer
-- to V_INTERRUPTS's machine dependent body in
-- V_INTR_B.A file for additional restrictions imposed
-- on the INTERRUPT_HANDLER procedure.
generic
with procedure Float_Handler;
procedure Float_Wrapper;
pragma Share_Code (Float_Wrapper, False);
-- Purpose: FLOAT_WRAPPER saves/restores the floating point state.
-- Before FLOAT_HANDLER is called, the floating point state
-- is reset and float exceptions are enabled according to
-- the FLOATING_POINT_CONTROL parameter in the kernel
-- program's configuration package (V_KRN_CONF).
-- See the body of this generic for further details.
--
-- The resultant instantiation is normally used as an input
-- procedure parameter to the above ISR generic.
procedure Attach_Isr (Vector : in Vector_Id; Isr : in System.Address);
-- Purpose: To attach an interrupt service routine to a given
-- interrupt vector.
-- Where:
--
-- vector specifies the interrupt vector number to which
-- the interrupt service routine is to be attached.
-- The vector number is the number, not address,
-- of the interrupt vector.
--
-- isr specifies the address of the interrupt service routine.
--
-- Exceptions:
--
-- INVALID_INTERRUPT_VECTOR is raised if the vector number is
-- out-of-range.
--
-- VECTOR_IN_USE is raised if an interrupt handler has already been
-- assigned to the vector.
procedure Detach_Isr (Vector : in Vector_Id);
-- Purpose: To detach an interrupt routine from a given
-- interrupt vector (the attachment may have been
-- performed during VADS kernel initialization if the vector
-- was given an initial value in the user's interrupt
-- vector table).
--
-- Where:
--
-- vector specifies the number of the interrupt vector
-- which is to be detach. The vector number is
-- the number, not address, of the interrupt vector.
--
-- Notes: The interrupt service routine V_DEFAULT_ISR
-- defined in the V_KRN_CONF package will
-- be attached to the vector.
--
-- Exceptions:
--
-- INVALID_INTERRUPT_VECTOR is raised if the vector number is
-- out-of-range.
function Current_Interrupt_Status return Interrupt_Status_T;
-- Purpose: To get the current CPU interrupt status (mask or priority
-- level.
function Set_Interrupt_Status
(New_Status : in Interrupt_Status_T) return Interrupt_Status_T;
-- Purpose: To set the interrupt status (mask or priority) to a
-- different setting. The previous interrupt status
-- is returned.
-- Where:
--
-- new_status specifies the new interrupt status setting.
procedure Enter_Supervisor_State;
-- Purpose: To enter supervisor state for the current task.
-- This allows subsequent execution of privilege
-- instructions.
procedure Leave_Supervisor_State;
-- Purpose: To leave supervisor state for the current task.
-- Subsequent execution of privilege instructions results
-- in a CPU exception.
end V_Interrupts;