|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 9130 (0x23aa) Types: TextFile Notes: R1k Text-file segment
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦97b266e22⟧ └─⟦this⟧
-- Copyright 1989, 1991, 1992 Verdix Corporation ------------------------------------------------------------------------------ -- User interface to the program / task callout services -- -- Provides backward compatibility with earlier releases of VADS. -- -- The interface to ALL the low kernel services is now provided in -- ada_krn_i.a. Types used by these services is defined in ada_krn_defs.a. -- -- This package simply layers upon the callout data structures and -- subprograms found in ada_krn_defs.a and ada_krn_i.a. -- -- Differences from earlier releases: -- [1] Only the callout events, EXIT_EVENT and UNEXPECTED_EXIT_EVENT -- are supported by all the underlying RTS kernels. The -- VADS_MICRO RTS continues to support the events: -- PROGRAM_SWITCH_EVENT, TASK_CREATE_EVENT, TASK_SWITCH_EVENT -- and TASK_COMPLETE_EVENT. The event, IDLE_EVENT has been -- added for the VADS_MICRO RTS. -- [2] For VADS_MICRO: the task events are called with a pointer to -- the micro kernel's task control block, not the Ada task_id as was -- done in earlier releases. -- [3] For VADS_MICRO: the program events are called with a pointer to -- the micro kernel's program control block, not the Ada program_id as was -- done in earlier releases. -- [4] Added the service, get_task_storage2() to get the address of -- task storage using the underlying kernel's task_id (not the -- Ada task_id as is used for get_task_storage()). This was added -- because the task callouts are called with the kernel's task_id -- and not the Ada task_id. ------------------------------------------------------------------------------ with system; use system; with ada_krn_defs; package v_i_callout is pragma suppress(ALL_CHECKS); pragma suppress(EXCEPTION_TABLES); pragma not_elaborated; -- Underlying kernel task and program id's type krn_task_id is new ada_krn_defs.krn_task_id; type krn_program_id is new ada_krn_defs.krn_task_id; -- Callout events type callout_event_t is new ada_krn_defs.callout_event_t; -- Id for accessing user defined storage in the task control block type task_storage_id is new ada_krn_defs.task_storage_id; -- NO_TASK_STORAGE_ID: constant task_storage_id := -- task_storage_id(ada_krn_defs.NO_TASK_STORAGE_ID); function NO_TASK_STORAGE_ID return task_storage_id; pragma inline_only(NO_TASK_STORAGE_ID); -- Service to install a program or task callout. procedure install_callout( event: callout_event_t; proc: address); pragma inline_only(install_callout); -- The following information is only applicable to the -- VADS_MICRO kernel. -- -- If not enough memory in the kernel for the callout control -- block, then, the STORAGE_ERROR exception is raised. -- -- For EXIT_EVENT or UNEXPECTED_EXIT_EVENT, the callout procedures -- are called LIFO. They are called in FIFO order for the other -- events. -- -- The callouts reside in the user program's -- space. The EXIT_EVENT and UNEXPECTED_EXIT_EVENT callouts are -- called in the context of the main program's task. The IDLE_EVENT -- callouts are called in the context of the idle task. The remaining -- callouts are called directly from kernel logic (use the kernel's -- stack) and can only call kernel services that are re-entrant, the -- same services callable from ISR's. The service of most interest is -- TS_CURRENT_TIME which would be called for time stamping. -- -- Before any non-PROGRAM_SWITCH_EVENT callout procedure is -- invoked, the STACK_LIMIT in the user program is set to 0 to -- negate any stack limit checking. Therefore, the callout -- procedures don't need to be compiled with stack limit checking -- suppressed. However, the STACK_LIMIT isn't zeroed before calling -- the PROGRAM_SWITCH_EVENT callout. It needs to be compiled with -- stack checking suppressed. -- -- Except for the PROGRAM_SWITCH_EVENT, the callouts are only -- installed and called for the program where they reside. -- -- An overview of each callout follows: -- -- EXIT_EVENT -- Called when the program exits or terminates itself. Not -- called when the program is terminated from another program. -- Still called when the UNEXPECTED_EXIT_EVENT callout is called. -- -- UNEXPECTED_EXIT_EVENT -- Called when the program is abandoned due to an unhandled Ada -- exception. -- -- IDLE_EVENT -- Called repetitively whenever the idle task is executing. -- -- PROGRAM_SWITCH_EVENT -- Called before switching to a task that resides in a -- program different from the current program. Called for -- all program switches, not just switches to and from the -- program containing the callout. -- -- TASK_CREATE_EVENT -- Called whenever a task is created in the program containing -- the callout. Since the TASK_CREATE_EVENT callout can be -- called after numerous tasks have already been created, the -- install_callout service loops through all existing tasks -- invoking the just installed TASK_CREATE_EVENT callout before -- returning. -- -- TASK_SWITCH_EVENT -- Called before switching to a different task in the same -- program. For a program switch, the TASK_SWITCH_EVENT -- callout is called with the tsk parameter set to -- system.NO_TASK_ID. -- -- TASK_SWITCH_COMPLETE -- Called whenever any task in the callout's program completes or -- is aborted. -- -- -- An EXIT_EVENT or UNEXPECTED_EXIT_EVENT callout procedure -- is called as follows: -- procedure exit_callout_proc( -- status: integer); -- main subprogram -- -- return status -- -- An IDLE_EVENT callout procedure is called as follows: -- procedure idle_callout_proc; -- -- A PROGRAM_SWITCH_EVENT callout procedure is called as follows: -- procedure program_switch_callout_proc( -- new_prg: krn_program_id; -- -- NOTE: in earlier releases, new_prg was of -- -- type, system.program_id. -- new_key: address); -- -- A TASK_CREATE_EVENT, TASK_SWITCH_EVENT or TASK_COMPLETE_EVENT -- callout procedure is called as follows: -- procedure task_callout_proc( -- tsk: krn_task_id); -- -- NOTE: in earlier releases, tsk was of -- -- type, system.task_id. -- Service to allocate storage in the task control block function allocate_task_storage( size: integer) return task_storage_id; pragma inline_only(allocate_task_storage); -- If not enough memory in the task control block for the -- task storage, then, the STORAGE_ERROR exception is raised. -- The configuration parameter, TASK_STORAGE_SIZE, defines -- the size of the storage area set aside in the -- control block for each task. -- Each allocation from this area is aligned on a 4 or 8 -- byte boundary (the alignment is CPU dependent). -- The task storage allocation is only applicable to tasks in the -- current program. -- This service returns the starting address of the task storage area -- given the Ada task_id. function get_task_storage( Ada_tsk: system.task_id; storage_id: task_storage_id) return address; pragma inline_only(get_task_storage); -- The storage_id parameter, contains the value returned by -- a previous call to allocate_task_storage. Its only -- applicable to tasks in the program where the -- allocate_task_storage service was called from. -- This service is called using the task's underlying kernel id -- instead of its Ada task_id as is done for the above get_task_storage(). -- Normally, get_task_storage2() is called from the task_callouts. function get_task_storage2( krn_tsk: krn_task_id; storage_id: task_storage_id) return address; pragma inline_only(get_task_storage2); end v_i_callout; with system; use system; with ada_krn_defs; with ada_krn_i; package body v_i_callout is pragma suppress(ALL_CHECKS); pragma suppress(EXCEPTION_TABLES); procedure install_callout( event: callout_event_t; proc: address) is begin if not ada_krn_i.callout_install( ada_krn_defs.callout_event_t(event), proc) then raise STORAGE_ERROR; end if; end; function allocate_task_storage( size: integer) return task_storage_id is id: task_storage_id; begin id := task_storage_id(ada_krn_i.task_storage_alloc(size)); if id = NO_TASK_STORAGE_ID then raise STORAGE_ERROR; end if; return id; end; function get_task_storage( Ada_tsk: system.task_id; storage_id: task_storage_id) return address is begin return ada_krn_i.task_storage_get(Ada_tsk, ada_krn_defs.task_storage_id(storage_id)); end; function get_task_storage2( krn_tsk: krn_task_id; storage_id: task_storage_id) return address is begin return ada_krn_i.task_storage_get2(ada_krn_defs.krn_task_id(krn_tsk), ada_krn_defs.task_storage_id(storage_id)); end; function NO_TASK_STORAGE_ID return task_storage_id is begin return task_storage_id(ada_krn_defs.NO_TASK_STORAGE_ID); end; end v_i_callout