Makefile.in: Switch VxWorks to s-interr-hwint.adb.
* gcc-interface/Makefile.in: Switch VxWorks to s-interr-hwint.adb. * s-interr-vxworks.adb: Renamed to s-interr-hwint.adb * s-interr-hwint.adb: New file. * s-osinte-vxworks.ads, s-osinte-vxworks.adb: Add new functions needed by s-interr-hwint.adb. * s-osinte-vxworks-kernel.adb: New file. From-SVN: r140147
This commit is contained in:
parent
22fb24d53a
commit
e5c73177bf
|
@ -1,3 +1,17 @@
|
||||||
|
2008-09-09 Arnaud Charlet <charlet@adacore.com>
|
||||||
|
Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||||
|
|
||||||
|
* gcc-interface/Makefile.in: Switch VxWorks to s-interr-hwint.adb.
|
||||||
|
|
||||||
|
* s-interr-vxworks.adb: Renamed to s-interr-hwint.adb
|
||||||
|
|
||||||
|
* s-interr-hwint.adb: New file.
|
||||||
|
|
||||||
|
* s-osinte-vxworks.ads, s-osinte-vxworks.adb: Add new functions
|
||||||
|
needed by s-interr-hwint.adb.
|
||||||
|
|
||||||
|
* s-osinte-vxworks-kernel.adb: New file.
|
||||||
|
|
||||||
2008-09-05 Joel Sherrill <joel.sherrill@oarcorp.com>
|
2008-09-05 Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||||
|
|
||||||
* s-stchop-rtems.adb: Add file missed in early commit. Already
|
* s-stchop-rtems.adb: Add file missed in early commit. Already
|
||||||
|
@ -28,8 +42,8 @@
|
||||||
|
|
||||||
* checks.adb (Determine_Range): Deal with values that might be invalid
|
* checks.adb (Determine_Range): Deal with values that might be invalid
|
||||||
|
|
||||||
* opt.adb, opt.ads (Assume_No_Invalid_Values[_Config]): New configuration
|
* opt.adb, opt.ads (Assume_No_Invalid_Values[_Config]): New
|
||||||
switches.
|
configuration switches.
|
||||||
|
|
||||||
* par-prag.adb: Dummy entry for pragma Assume_No_Invalid_Values
|
* par-prag.adb: Dummy entry for pragma Assume_No_Invalid_Values
|
||||||
|
|
||||||
|
|
|
@ -391,10 +391,10 @@ ifeq ($(strip $(filter-out m68k% wrs vx%,$(targ))),)
|
||||||
a-intnam.ads<a-intnam-vxworks.ads \
|
a-intnam.ads<a-intnam-vxworks.ads \
|
||||||
a-numaux.ads<a-numaux-vxworks.ads \
|
a-numaux.ads<a-numaux-vxworks.ads \
|
||||||
s-inmaop.adb<s-inmaop-posix.adb \
|
s-inmaop.adb<s-inmaop-posix.adb \
|
||||||
s-interr.adb<s-interr-vxworks.adb \
|
s-interr.adb<s-interr-hwint.adb \
|
||||||
s-intman.ads<s-intman-vxworks.ads \
|
s-intman.ads<s-intman-vxworks.ads \
|
||||||
s-intman.adb<s-intman-vxworks.adb \
|
s-intman.adb<s-intman-vxworks.adb \
|
||||||
s-osinte.adb<s-osinte-vxworks.adb \
|
s-osinte.adb<s-osinte-vxworks-kernel.adb \
|
||||||
s-osinte.ads<s-osinte-vxworks.ads \
|
s-osinte.ads<s-osinte-vxworks.ads \
|
||||||
s-osprim.adb<s-osprim-vxworks.adb \
|
s-osprim.adb<s-osprim-vxworks.adb \
|
||||||
s-parame.ads<s-parame-vxworks.ads \
|
s-parame.ads<s-parame-vxworks.ads \
|
||||||
|
@ -472,7 +472,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworks,$(targ))),)
|
||||||
EXTRA_GNATRTL_NONTASKING_OBJS=s-vxwexc.o
|
EXTRA_GNATRTL_NONTASKING_OBJS=s-vxwexc.o
|
||||||
else
|
else
|
||||||
LIBGNAT_TARGET_PAIRS += \
|
LIBGNAT_TARGET_PAIRS += \
|
||||||
s-interr.adb<s-interr-vxworks.adb \
|
s-interr.adb<s-interr-hwint.adb \
|
||||||
s-tpopsp.adb<s-tpopsp-vxworks.adb \
|
s-tpopsp.adb<s-tpopsp-vxworks.adb \
|
||||||
system.ads<system-vxworks-ppc.ads
|
system.ads<system-vxworks-ppc.ads
|
||||||
|
|
||||||
|
@ -505,10 +505,10 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworksae,$(targ))),)
|
||||||
g-io.adb<g-io-vxworks-ppc-cert.adb \
|
g-io.adb<g-io-vxworks-ppc-cert.adb \
|
||||||
g-io.ads<g-io-vxworks-ppc-cert.ads \
|
g-io.ads<g-io-vxworks-ppc-cert.ads \
|
||||||
s-inmaop.adb<s-inmaop-posix.adb \
|
s-inmaop.adb<s-inmaop-posix.adb \
|
||||||
s-interr.adb<s-interr-vxworks.adb \
|
s-interr.adb<s-interr-hwint.adb \
|
||||||
s-intman.ads<s-intman-vxworks.ads \
|
s-intman.ads<s-intman-vxworks.ads \
|
||||||
s-intman.adb<s-intman-vxworks.adb \
|
s-intman.adb<s-intman-vxworks.adb \
|
||||||
s-osinte.adb<s-osinte-vxworks.adb \
|
s-osinte.adb<s-osinte-vxworks-kernel.adb \
|
||||||
s-osinte.ads<s-osinte-vxworks.ads \
|
s-osinte.ads<s-osinte-vxworks.ads \
|
||||||
s-osprim.adb<s-osprim-vxworks.adb \
|
s-osprim.adb<s-osprim-vxworks.adb \
|
||||||
s-parame.ads<s-parame-ae653.ads \
|
s-parame.ads<s-parame-ae653.ads \
|
||||||
|
@ -551,10 +551,10 @@ ifeq ($(strip $(filter-out sparc% wrs vx%,$(targ))),)
|
||||||
a-intnam.ads<a-intnam-vxworks.ads \
|
a-intnam.ads<a-intnam-vxworks.ads \
|
||||||
a-numaux.ads<a-numaux-vxworks.ads \
|
a-numaux.ads<a-numaux-vxworks.ads \
|
||||||
s-inmaop.adb<s-inmaop-posix.adb \
|
s-inmaop.adb<s-inmaop-posix.adb \
|
||||||
s-interr.adb<s-interr-vxworks.adb \
|
s-interr.adb<s-interr-hwint.adb \
|
||||||
s-intman.ads<s-intman-vxworks.ads \
|
s-intman.ads<s-intman-vxworks.ads \
|
||||||
s-intman.adb<s-intman-vxworks.adb \
|
s-intman.adb<s-intman-vxworks.adb \
|
||||||
s-osinte.adb<s-osinte-vxworks.adb \
|
s-osinte.adb<s-osinte-vxworks-kernel.adb \
|
||||||
s-osinte.ads<s-osinte-vxworks.ads \
|
s-osinte.ads<s-osinte-vxworks.ads \
|
||||||
s-osprim.adb<s-osprim-vxworks.adb \
|
s-osprim.adb<s-osprim-vxworks.adb \
|
||||||
s-parame.ads<s-parame-vxworks.ads \
|
s-parame.ads<s-parame-vxworks.ads \
|
||||||
|
@ -626,7 +626,7 @@ ifeq ($(strip $(filter-out %86 wrs vxworks,$(targ))),)
|
||||||
EXTRA_GNATRTL_NONTASKING_OBJS=s-vxwexc.o
|
EXTRA_GNATRTL_NONTASKING_OBJS=s-vxwexc.o
|
||||||
else
|
else
|
||||||
LIBGNAT_TARGET_PAIRS += \
|
LIBGNAT_TARGET_PAIRS += \
|
||||||
s-interr.adb<s-interr-vxworks.adb \
|
s-interr.adb<s-interr-hwint.adb \
|
||||||
s-tpopsp.adb<s-tpopsp-vxworks.adb \
|
s-tpopsp.adb<s-tpopsp-vxworks.adb \
|
||||||
system.ads<system-vxworks-x86.ads
|
system.ads<system-vxworks-x86.ads
|
||||||
|
|
||||||
|
@ -654,10 +654,10 @@ ifeq ($(strip $(filter-out arm% coff wrs vx%,$(targ))),)
|
||||||
a-intnam.ads<a-intnam-vxworks.ads \
|
a-intnam.ads<a-intnam-vxworks.ads \
|
||||||
a-numaux.ads<a-numaux-vxworks.ads \
|
a-numaux.ads<a-numaux-vxworks.ads \
|
||||||
s-inmaop.adb<s-inmaop-posix.adb \
|
s-inmaop.adb<s-inmaop-posix.adb \
|
||||||
s-interr.adb<s-interr-vxworks.adb \
|
s-interr.adb<s-interr-hwint.adb \
|
||||||
s-intman.ads<s-intman-vxworks.ads \
|
s-intman.ads<s-intman-vxworks.ads \
|
||||||
s-intman.adb<s-intman-vxworks.adb \
|
s-intman.adb<s-intman-vxworks.adb \
|
||||||
s-osinte.adb<s-osinte-vxworks.adb \
|
s-osinte.adb<s-osinte-vxworks-kernel.adb \
|
||||||
s-osinte.ads<s-osinte-vxworks.ads \
|
s-osinte.ads<s-osinte-vxworks.ads \
|
||||||
s-osprim.adb<s-osprim-vxworks.adb \
|
s-osprim.adb<s-osprim-vxworks.adb \
|
||||||
s-parame.ads<s-parame-vxworks.ads \
|
s-parame.ads<s-parame-vxworks.ads \
|
||||||
|
@ -689,10 +689,10 @@ ifeq ($(strip $(filter-out mips% wrs vx%,$(targ))),)
|
||||||
a-intnam.ads<a-intnam-vxworks.ads \
|
a-intnam.ads<a-intnam-vxworks.ads \
|
||||||
a-numaux.ads<a-numaux-vxworks.ads \
|
a-numaux.ads<a-numaux-vxworks.ads \
|
||||||
s-inmaop.adb<s-inmaop-posix.adb \
|
s-inmaop.adb<s-inmaop-posix.adb \
|
||||||
s-interr.adb<s-interr-vxworks.adb \
|
s-interr.adb<s-interr-hwint.adb \
|
||||||
s-intman.ads<s-intman-vxworks.ads \
|
s-intman.ads<s-intman-vxworks.ads \
|
||||||
s-intman.adb<s-intman-vxworks.adb \
|
s-intman.adb<s-intman-vxworks.adb \
|
||||||
s-osinte.adb<s-osinte-vxworks.adb \
|
s-osinte.adb<s-osinte-vxworks-kernel.adb \
|
||||||
s-osinte.ads<s-osinte-vxworks.ads \
|
s-osinte.ads<s-osinte-vxworks.ads \
|
||||||
s-osprim.adb<s-osprim-vxworks.adb \
|
s-osprim.adb<s-osprim-vxworks.adb \
|
||||||
s-parame.ads<s-parame-vxworks.ads \
|
s-parame.ads<s-parame-vxworks.ads \
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
-- it must call Block_Interrupt/Unblock_Interrupt, which will have the effect
|
-- it must call Block_Interrupt/Unblock_Interrupt, which will have the effect
|
||||||
-- of unmasking/masking the signal in the Interrupt_Manager task. These
|
-- of unmasking/masking the signal in the Interrupt_Manager task. These
|
||||||
-- comments do not apply to vectored hardware interrupts, which may be masked
|
-- comments do not apply to vectored hardware interrupts, which may be masked
|
||||||
-- or unmasked using routined interfaced to the relevant VxWorks system
|
-- or unmasked using routined interfaced to the relevant embedded RTOS system
|
||||||
-- calls.
|
-- calls.
|
||||||
|
|
||||||
-- Once we associate a Signal_Server_Task with an signal, the task never goes
|
-- Once we associate a Signal_Server_Task with an signal, the task never goes
|
||||||
|
@ -61,14 +61,14 @@
|
||||||
-- status between Interrupt_Manager and Server_Task. Protection among service
|
-- status between Interrupt_Manager and Server_Task. Protection among service
|
||||||
-- requests are ensured via user calls to the Interrupt_Manager entries.
|
-- requests are ensured via user calls to the Interrupt_Manager entries.
|
||||||
|
|
||||||
-- This is the VxWorks version of this package, supporting vectored hardware
|
-- This is reasonably generic version of this package, supporting vectored
|
||||||
-- interrupts.
|
-- hardware interrupts using non-RTOS specific adapter routines which
|
||||||
|
-- should easily implemented on any RTOS capable of supporting GNAT.
|
||||||
|
|
||||||
with Ada.Unchecked_Conversion;
|
with Ada.Unchecked_Conversion;
|
||||||
with Ada.Task_Identification;
|
with Ada.Task_Identification;
|
||||||
|
|
||||||
with Interfaces.VxWorks;
|
with Interfaces.C; use Interfaces.C;
|
||||||
|
|
||||||
with System.OS_Interface; use System.OS_Interface;
|
with System.OS_Interface; use System.OS_Interface;
|
||||||
with System.Interrupt_Management;
|
with System.Interrupt_Management;
|
||||||
with System.Task_Primitives.Operations;
|
with System.Task_Primitives.Operations;
|
||||||
|
@ -125,7 +125,7 @@ package body System.Interrupts is
|
||||||
end Interrupt_Manager;
|
end Interrupt_Manager;
|
||||||
|
|
||||||
task type Interrupt_Server_Task
|
task type Interrupt_Server_Task
|
||||||
(Interrupt : Interrupt_ID; Int_Sema : SEM_ID) is
|
(Interrupt : Interrupt_ID; Int_Sema : Binary_Semaphore_Id) is
|
||||||
-- Server task for vectored hardware interrupt handling
|
-- Server task for vectored hardware interrupt handling
|
||||||
pragma Interrupt_Priority (System.Interrupt_Priority'First + 2);
|
pragma Interrupt_Priority (System.Interrupt_Priority'First + 2);
|
||||||
end Interrupt_Server_Task;
|
end Interrupt_Server_Task;
|
||||||
|
@ -182,7 +182,7 @@ package body System.Interrupts is
|
||||||
|
|
||||||
Semaphore_ID_Map : array
|
Semaphore_ID_Map : array
|
||||||
(Interrupt_ID range 0 .. System.OS_Interface.Max_HW_Interrupt)
|
(Interrupt_ID range 0 .. System.OS_Interface.Max_HW_Interrupt)
|
||||||
of SEM_ID := (others => 0);
|
of Binary_Semaphore_Id := (others => 0);
|
||||||
-- Array of binary semaphores associated with vectored interrupts
|
-- Array of binary semaphores associated with vectored interrupts
|
||||||
-- Note that the last bound should be Max_HW_Interrupt, but this will raise
|
-- Note that the last bound should be Max_HW_Interrupt, but this will raise
|
||||||
-- Storage_Error if Num_HW_Interrupts is null, so use an extra 4 bytes
|
-- Storage_Error if Num_HW_Interrupts is null, so use an extra 4 bytes
|
||||||
|
@ -213,11 +213,12 @@ package body System.Interrupts is
|
||||||
-- Always consider a null handler as registered.
|
-- Always consider a null handler as registered.
|
||||||
|
|
||||||
procedure Notify_Interrupt (Param : System.Address);
|
procedure Notify_Interrupt (Param : System.Address);
|
||||||
|
pragma Convention (C, Notify_Interrupt);
|
||||||
-- Umbrella handler for vectored interrupts (not signals)
|
-- Umbrella handler for vectored interrupts (not signals)
|
||||||
|
|
||||||
procedure Install_Umbrella_Handler
|
procedure Install_Umbrella_Handler
|
||||||
(Interrupt : HW_Interrupt;
|
(Interrupt : HW_Interrupt;
|
||||||
Handler : Interfaces.VxWorks.VOIDFUNCPTR);
|
Handler : System.OS_Interface.Interrupt_Handler);
|
||||||
-- Install the runtime umbrella handler for a vectored hardware
|
-- Install the runtime umbrella handler for a vectored hardware
|
||||||
-- interrupt
|
-- interrupt
|
||||||
|
|
||||||
|
@ -490,16 +491,12 @@ package body System.Interrupts is
|
||||||
|
|
||||||
procedure Install_Umbrella_Handler
|
procedure Install_Umbrella_Handler
|
||||||
(Interrupt : HW_Interrupt;
|
(Interrupt : HW_Interrupt;
|
||||||
Handler : Interfaces.VxWorks.VOIDFUNCPTR)
|
Handler : System.OS_Interface.Interrupt_Handler)
|
||||||
is
|
is
|
||||||
use Interfaces.VxWorks;
|
|
||||||
|
|
||||||
Vec : constant Interrupt_Vector :=
|
Vec : constant Interrupt_Vector :=
|
||||||
INUM_TO_IVEC (Interfaces.VxWorks.int (Interrupt));
|
Interrupt_Number_To_Vector (int (Interrupt));
|
||||||
|
|
||||||
Stat : Interfaces.VxWorks.STATUS;
|
Status : int;
|
||||||
pragma Unreferenced (Stat);
|
|
||||||
-- ??? shouldn't we test Stat at least in a pragma Assert?
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
-- Only install umbrella handler when no Ada handler has already been
|
-- Only install umbrella handler when no Ada handler has already been
|
||||||
|
@ -508,7 +505,10 @@ package body System.Interrupts is
|
||||||
-- wrapper generated by intConnect for each interrupt number.
|
-- wrapper generated by intConnect for each interrupt number.
|
||||||
|
|
||||||
if not Handler_Installed (Interrupt) then
|
if not Handler_Installed (Interrupt) then
|
||||||
Stat := intConnect (Vec, Handler, System.Address (Interrupt));
|
Status :=
|
||||||
|
Interrupt_Connect (Vec, Handler, System.Address (Interrupt));
|
||||||
|
pragma Assert (Status = 0);
|
||||||
|
|
||||||
Handler_Installed (Interrupt) := True;
|
Handler_Installed (Interrupt) := True;
|
||||||
end if;
|
end if;
|
||||||
end Install_Umbrella_Handler;
|
end Install_Umbrella_Handler;
|
||||||
|
@ -618,20 +618,20 @@ package body System.Interrupts is
|
||||||
-- on which it pends once it's been started. This routine determines
|
-- on which it pends once it's been started. This routine determines
|
||||||
-- The appropriate semaphore and issues a semGive call, waking
|
-- The appropriate semaphore and issues a semGive call, waking
|
||||||
-- the server task. When a handler is unbound,
|
-- the server task. When a handler is unbound,
|
||||||
-- System.Interrupts.Unbind_Handler issues a semFlush, and the
|
-- System.Interrupts.Unbind_Handler issues a Binary_Semaphore_Flush,
|
||||||
-- server task deletes its semaphore and terminates.
|
-- and the server task deletes its semaphore and terminates.
|
||||||
|
|
||||||
procedure Notify_Interrupt (Param : System.Address) is
|
procedure Notify_Interrupt (Param : System.Address) is
|
||||||
Interrupt : constant Interrupt_ID := Interrupt_ID (Param);
|
Interrupt : constant Interrupt_ID := Interrupt_ID (Param);
|
||||||
|
|
||||||
Id : constant SEM_ID := Semaphore_ID_Map (Interrupt);
|
Id : constant Binary_Semaphore_Id := Semaphore_ID_Map (Interrupt);
|
||||||
|
|
||||||
Discard_Result : STATUS;
|
Status : int;
|
||||||
pragma Unreferenced (Discard_Result);
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
if Id /= 0 then
|
if Id /= 0 then
|
||||||
Discard_Result := semGive (Id);
|
Status := Binary_Semaphore_Release (Id);
|
||||||
|
pragma Assert (Status = 0);
|
||||||
end if;
|
end if;
|
||||||
end Notify_Interrupt;
|
end Notify_Interrupt;
|
||||||
|
|
||||||
|
@ -764,15 +764,13 @@ package body System.Interrupts is
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
procedure Unbind_Handler (Interrupt : Interrupt_ID) is
|
procedure Unbind_Handler (Interrupt : Interrupt_ID) is
|
||||||
S : STATUS;
|
Status : int;
|
||||||
use type STATUS;
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
|
||||||
-- Flush server task off semaphore, allowing it to terminate
|
-- Flush server task off semaphore, allowing it to terminate
|
||||||
|
|
||||||
S := semFlush (Semaphore_ID_Map (Interrupt));
|
Status := Binary_Semaphore_Flush (Semaphore_ID_Map (Interrupt));
|
||||||
pragma Assert (S = 0);
|
pragma Assert (Status = 0);
|
||||||
end Unbind_Handler;
|
end Unbind_Handler;
|
||||||
|
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -890,8 +888,7 @@ package body System.Interrupts is
|
||||||
(To_Ada (Server_ID (Interrupt))))
|
(To_Ada (Server_ID (Interrupt))))
|
||||||
then
|
then
|
||||||
Interrupt_Access_Hold :=
|
Interrupt_Access_Hold :=
|
||||||
new Interrupt_Server_Task
|
new Interrupt_Server_Task (Interrupt, Binary_Semaphore_Create);
|
||||||
(Interrupt, semBCreate (SEM_Q_FIFO, SEM_EMPTY));
|
|
||||||
Server_ID (Interrupt) :=
|
Server_ID (Interrupt) :=
|
||||||
To_System (Interrupt_Access_Hold.all'Identity);
|
To_System (Interrupt_Access_Hold.all'Identity);
|
||||||
end if;
|
end if;
|
||||||
|
@ -988,7 +985,7 @@ package body System.Interrupts is
|
||||||
(To_Ada (Server_ID (Interrupt)))
|
(To_Ada (Server_ID (Interrupt)))
|
||||||
then
|
then
|
||||||
Interrupt_Access_Hold := new Interrupt_Server_Task
|
Interrupt_Access_Hold := new Interrupt_Server_Task
|
||||||
(Interrupt, semBCreate (SEM_Q_FIFO, SEM_EMPTY));
|
(Interrupt, Binary_Semaphore_Create);
|
||||||
Server_ID (Interrupt) :=
|
Server_ID (Interrupt) :=
|
||||||
To_System (Interrupt_Access_Hold.all'Identity);
|
To_System (Interrupt_Access_Hold.all'Identity);
|
||||||
end if;
|
end if;
|
||||||
|
@ -1046,9 +1043,7 @@ package body System.Interrupts is
|
||||||
Tmp_Handler : Parameterless_Handler;
|
Tmp_Handler : Parameterless_Handler;
|
||||||
Tmp_ID : Task_Id;
|
Tmp_ID : Task_Id;
|
||||||
Tmp_Entry_Index : Task_Entry_Index;
|
Tmp_Entry_Index : Task_Entry_Index;
|
||||||
S : STATUS;
|
Status : int;
|
||||||
|
|
||||||
use type STATUS;
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
System.Tasking.Utilities.Make_Independent;
|
System.Tasking.Utilities.Make_Independent;
|
||||||
|
@ -1058,8 +1053,8 @@ package body System.Interrupts is
|
||||||
-- Pend on semaphore that will be triggered by the
|
-- Pend on semaphore that will be triggered by the
|
||||||
-- umbrella handler when the associated interrupt comes in
|
-- umbrella handler when the associated interrupt comes in
|
||||||
|
|
||||||
S := semTake (Int_Sema, WAIT_FOREVER);
|
Status := Binary_Semaphore_Obtain (Int_Sema);
|
||||||
pragma Assert (S = 0);
|
pragma Assert (Status = 0);
|
||||||
|
|
||||||
if User_Handler (Interrupt).H /= null then
|
if User_Handler (Interrupt).H /= null then
|
||||||
|
|
||||||
|
@ -1091,9 +1086,9 @@ package body System.Interrupts is
|
||||||
|
|
||||||
-- Delete the associated semaphore
|
-- Delete the associated semaphore
|
||||||
|
|
||||||
S := semDelete (Int_Sema);
|
Status := Binary_Semaphore_Delete (Int_Sema);
|
||||||
|
|
||||||
pragma Assert (S = 0);
|
pragma Assert (Status = 0);
|
||||||
|
|
||||||
-- Set status for the Interrupt_Manager
|
-- Set status for the Interrupt_Manager
|
||||||
|
|
|
@ -0,0 +1,251 @@
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
-- --
|
||||||
|
-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
|
||||||
|
-- --
|
||||||
|
-- S Y S T E M . O S _ I N T E R F A C E --
|
||||||
|
-- --
|
||||||
|
-- B o d y --
|
||||||
|
-- --
|
||||||
|
-- Copyright (C) 1997-2008, Free Software Foundation, Inc. --
|
||||||
|
-- --
|
||||||
|
-- GNARL is free software; you can redistribute it and/or modify it under --
|
||||||
|
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||||
|
-- ware Foundation; either version 2, or (at your option) any later ver- --
|
||||||
|
-- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
|
||||||
|
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
||||||
|
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
|
||||||
|
-- for more details. You should have received a copy of the GNU General --
|
||||||
|
-- Public License distributed with GNARL; see file COPYING. If not, write --
|
||||||
|
-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
|
||||||
|
-- Boston, MA 02110-1301, USA. --
|
||||||
|
-- --
|
||||||
|
-- As a special exception, if other files instantiate generics from this --
|
||||||
|
-- unit, or you link this unit with other files to produce an executable, --
|
||||||
|
-- this unit does not by itself cause the resulting executable to be --
|
||||||
|
-- covered by the GNU General Public License. This exception does not --
|
||||||
|
-- however invalidate any other reasons why the executable file might be --
|
||||||
|
-- covered by the GNU Public License. --
|
||||||
|
-- --
|
||||||
|
-- GNARL was developed by the GNARL team at Florida State University. --
|
||||||
|
-- Extensive contributions were provided by Ada Core Technologies, Inc. --
|
||||||
|
-- --
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- This is the VxWorks version
|
||||||
|
|
||||||
|
-- This package encapsulates all direct interfaces to OS services that are
|
||||||
|
-- needed by children of System.
|
||||||
|
|
||||||
|
pragma Polling (Off);
|
||||||
|
-- Turn off polling, we do not want ATC polling to take place during tasking
|
||||||
|
-- operations. It causes infinite loops and other problems.
|
||||||
|
|
||||||
|
package body System.OS_Interface is
|
||||||
|
|
||||||
|
use type Interfaces.C.int;
|
||||||
|
|
||||||
|
Low_Priority : constant := 255;
|
||||||
|
-- VxWorks native (default) lowest scheduling priority
|
||||||
|
|
||||||
|
----------
|
||||||
|
-- kill --
|
||||||
|
----------
|
||||||
|
|
||||||
|
function kill (pid : t_id; sig : Signal) return int is
|
||||||
|
begin
|
||||||
|
return System.VxWorks.Ext.kill (pid, int (sig));
|
||||||
|
end kill;
|
||||||
|
|
||||||
|
-------------
|
||||||
|
-- sigwait --
|
||||||
|
-------------
|
||||||
|
|
||||||
|
function sigwait
|
||||||
|
(set : access sigset_t;
|
||||||
|
sig : access Signal) return int
|
||||||
|
is
|
||||||
|
Result : int;
|
||||||
|
|
||||||
|
function sigwaitinfo
|
||||||
|
(set : access sigset_t; sigvalue : System.Address) return int;
|
||||||
|
pragma Import (C, sigwaitinfo, "sigwaitinfo");
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result := sigwaitinfo (set, System.Null_Address);
|
||||||
|
|
||||||
|
if Result /= -1 then
|
||||||
|
sig.all := Signal (Result);
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
sig.all := 0;
|
||||||
|
return errno;
|
||||||
|
end if;
|
||||||
|
end sigwait;
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
-- To_Duration --
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
function To_Duration (TS : timespec) return Duration is
|
||||||
|
begin
|
||||||
|
return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
|
||||||
|
end To_Duration;
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
-- To_Timespec --
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
function To_Timespec (D : Duration) return timespec is
|
||||||
|
S : time_t;
|
||||||
|
F : Duration;
|
||||||
|
|
||||||
|
begin
|
||||||
|
S := time_t (Long_Long_Integer (D));
|
||||||
|
F := D - Duration (S);
|
||||||
|
|
||||||
|
-- If F is negative due to a round-up, adjust for positive F value
|
||||||
|
|
||||||
|
if F < 0.0 then
|
||||||
|
S := S - 1;
|
||||||
|
F := F + 1.0;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
return timespec'(ts_sec => S,
|
||||||
|
ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
|
||||||
|
end To_Timespec;
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
-- To_VxWorks_Priority --
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
function To_VxWorks_Priority (Priority : int) return int is
|
||||||
|
begin
|
||||||
|
return Low_Priority - Priority;
|
||||||
|
end To_VxWorks_Priority;
|
||||||
|
|
||||||
|
--------------------
|
||||||
|
-- To_Clock_Ticks --
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
-- ??? - For now, we'll always get the system clock rate since it is
|
||||||
|
-- allowed to be changed during run-time in VxWorks. A better method would
|
||||||
|
-- be to provide an operation to set it that so we can always know its
|
||||||
|
-- value.
|
||||||
|
|
||||||
|
-- Another thing we should probably allow for is a resultant tick count
|
||||||
|
-- greater than int'Last. This should probably be a procedure with two
|
||||||
|
-- output parameters, one in the range 0 .. int'Last, and another
|
||||||
|
-- representing the overflow count.
|
||||||
|
|
||||||
|
function To_Clock_Ticks (D : Duration) return int is
|
||||||
|
Ticks : Long_Long_Integer;
|
||||||
|
Rate_Duration : Duration;
|
||||||
|
Ticks_Duration : Duration;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if D < 0.0 then
|
||||||
|
return -1;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Ensure that the duration can be converted to ticks
|
||||||
|
-- at the current clock tick rate without overflowing.
|
||||||
|
|
||||||
|
Rate_Duration := Duration (sysClkRateGet);
|
||||||
|
|
||||||
|
if D > (Duration'Last / Rate_Duration) then
|
||||||
|
Ticks := Long_Long_Integer (int'Last);
|
||||||
|
else
|
||||||
|
Ticks_Duration := D * Rate_Duration;
|
||||||
|
Ticks := Long_Long_Integer (Ticks_Duration);
|
||||||
|
|
||||||
|
if Ticks_Duration > Duration (Ticks) then
|
||||||
|
Ticks := Ticks + 1;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if Ticks > Long_Long_Integer (int'Last) then
|
||||||
|
Ticks := Long_Long_Integer (int'Last);
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
return int (Ticks);
|
||||||
|
end To_Clock_Ticks;
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
-- Binary_Semaphore_Create --
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Create return Binary_Semaphore_Id is
|
||||||
|
begin
|
||||||
|
return Binary_Semaphore_Id (semBCreate (SEM_Q_FIFO, SEM_EMPTY));
|
||||||
|
end Binary_Semaphore_Create;
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
-- Binary_Semaphore_Delete --
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Delete (ID : Binary_Semaphore_Id) return int is
|
||||||
|
begin
|
||||||
|
return semDelete (SEM_ID (ID));
|
||||||
|
end Binary_Semaphore_Delete;
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
-- Binary_Semaphore_Obtain --
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Obtain (ID : Binary_Semaphore_Id) return int is
|
||||||
|
begin
|
||||||
|
return semTake (SEM_ID (ID), WAIT_FOREVER);
|
||||||
|
end Binary_Semaphore_Obtain;
|
||||||
|
|
||||||
|
------------------------------
|
||||||
|
-- Binary_Semaphore_Release --
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Release (ID : Binary_Semaphore_Id) return int is
|
||||||
|
begin
|
||||||
|
return semGive (SEM_ID (ID));
|
||||||
|
end Binary_Semaphore_Release;
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
-- Binary_Semaphore_Flush --
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Flush (ID : Binary_Semaphore_Id) return int is
|
||||||
|
begin
|
||||||
|
return semFlush (SEM_ID (ID));
|
||||||
|
end Binary_Semaphore_Flush;
|
||||||
|
|
||||||
|
-----------------------
|
||||||
|
-- Interrupt_Connect --
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
function Interrupt_Connect
|
||||||
|
(Vector : Interrupt_Vector;
|
||||||
|
Handler : Interrupt_Handler;
|
||||||
|
Parameter : System.Address := System.Null_Address) return int
|
||||||
|
is
|
||||||
|
function intConnect
|
||||||
|
(vector : Interrupt_Vector;
|
||||||
|
handler : Interrupt_Handler;
|
||||||
|
parameter : System.Address) return int;
|
||||||
|
pragma Import (C, intConnect, "intConnect");
|
||||||
|
|
||||||
|
begin
|
||||||
|
return intConnect (Vector, Handler, Parameter);
|
||||||
|
end Interrupt_Connect;
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
-- Interrupt_Number_To_Vector --
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
function Interrupt_Number_To_Vector
|
||||||
|
(intNum : int) return Interrupt_Vector
|
||||||
|
is
|
||||||
|
function INUM_TO_IVEC (intNum : int) return Interrupt_Vector;
|
||||||
|
pragma Import (C, INUM_TO_IVEC, "__gnat_inum_to_ivec");
|
||||||
|
|
||||||
|
begin
|
||||||
|
return INUM_TO_IVEC (intNum);
|
||||||
|
end Interrupt_Number_To_Vector;
|
||||||
|
|
||||||
|
end System.OS_Interface;
|
|
@ -6,7 +6,7 @@
|
||||||
-- --
|
-- --
|
||||||
-- B o d y --
|
-- B o d y --
|
||||||
-- --
|
-- --
|
||||||
-- Copyright (C) 1997-2007, Free Software Foundation, Inc. --
|
-- Copyright (C) 1997-2008, Free Software Foundation, Inc. --
|
||||||
-- --
|
-- --
|
||||||
-- GNARL is free software; you can redistribute it and/or modify it under --
|
-- GNARL is free software; you can redistribute it and/or modify it under --
|
||||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||||
|
@ -170,4 +170,73 @@ package body System.OS_Interface is
|
||||||
return int (Ticks);
|
return int (Ticks);
|
||||||
end To_Clock_Ticks;
|
end To_Clock_Ticks;
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
-- Binary_Semaphore_Create --
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Create return Binary_Semaphore_Id is
|
||||||
|
begin
|
||||||
|
return Binary_Semaphore_Id (semBCreate (SEM_Q_FIFO, SEM_EMPTY));
|
||||||
|
end Binary_Semaphore_Create;
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
-- Binary_Semaphore_Delete --
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Delete (ID : Binary_Semaphore_Id) return int is
|
||||||
|
begin
|
||||||
|
return semDelete (SEM_ID (ID));
|
||||||
|
end Binary_Semaphore_Delete;
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
-- Binary_Semaphore_Obtain --
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Obtain (ID : Binary_Semaphore_Id) return int is
|
||||||
|
begin
|
||||||
|
return semTake (SEM_ID (ID), WAIT_FOREVER);
|
||||||
|
end Binary_Semaphore_Obtain;
|
||||||
|
|
||||||
|
------------------------------
|
||||||
|
-- Binary_Semaphore_Release --
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Release (ID : Binary_Semaphore_Id) return int is
|
||||||
|
begin
|
||||||
|
return semGive (SEM_ID (ID));
|
||||||
|
end Binary_Semaphore_Release;
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
-- Binary_Semaphore_Flush --
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
function Binary_Semaphore_Flush (ID : Binary_Semaphore_Id) return int is
|
||||||
|
begin
|
||||||
|
return semFlush (SEM_ID (ID));
|
||||||
|
end Binary_Semaphore_Flush;
|
||||||
|
|
||||||
|
-----------------------
|
||||||
|
-- Interrupt_Connect --
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
function Interrupt_Connect
|
||||||
|
(Vector : Interrupt_Vector;
|
||||||
|
Handler : Interrupt_Handler;
|
||||||
|
Parameter : System.Address := System.Null_Address) return int
|
||||||
|
is
|
||||||
|
pragma Unreferenced (Vector, Handler, Parameter);
|
||||||
|
begin
|
||||||
|
return 0;
|
||||||
|
end Interrupt_Connect;
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
-- Interrupt_Number_To_Vector --
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
function Interrupt_Number_To_Vector
|
||||||
|
(intNum : int) return Interrupt_Vector is
|
||||||
|
begin
|
||||||
|
return Interrupt_Vector (intNum);
|
||||||
|
end Interrupt_Number_To_Vector;
|
||||||
|
|
||||||
end System.OS_Interface;
|
end System.OS_Interface;
|
||||||
|
|
|
@ -432,6 +432,50 @@ package System.OS_Interface is
|
||||||
pragma Import (C, semFlush, "semFlush");
|
pragma Import (C, semFlush, "semFlush");
|
||||||
-- Release all threads blocked on the semaphore
|
-- Release all threads blocked on the semaphore
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
-- Binary Semaphore Wrapper to Support Interrupt Tasks --
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
type Binary_Semaphore_Id is new Long_Integer;
|
||||||
|
|
||||||
|
function Binary_Semaphore_Create return Binary_Semaphore_Id;
|
||||||
|
pragma Inline (Binary_Semaphore_Create);
|
||||||
|
|
||||||
|
function Binary_Semaphore_Delete (ID : Binary_Semaphore_Id) return int;
|
||||||
|
pragma Inline (Binary_Semaphore_Delete);
|
||||||
|
|
||||||
|
function Binary_Semaphore_Obtain (ID : Binary_Semaphore_Id) return int;
|
||||||
|
pragma Inline (Binary_Semaphore_Obtain);
|
||||||
|
|
||||||
|
function Binary_Semaphore_Release (ID : Binary_Semaphore_Id) return int;
|
||||||
|
pragma Inline (Binary_Semaphore_Release);
|
||||||
|
|
||||||
|
function Binary_Semaphore_Flush (ID : Binary_Semaphore_Id) return int;
|
||||||
|
pragma Inline (Binary_Semaphore_Flush);
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
-- Hardware Interrupt Wrappers to Support Interrupt Tasks --
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
type Interrupt_Handler is access procedure (parameter : System.Address);
|
||||||
|
pragma Convention (C, Interrupt_Handler);
|
||||||
|
|
||||||
|
type Interrupt_Vector is new System.Address;
|
||||||
|
|
||||||
|
function Interrupt_Connect
|
||||||
|
(Vector : Interrupt_Vector;
|
||||||
|
Handler : Interrupt_Handler;
|
||||||
|
Parameter : System.Address := System.Null_Address) return int;
|
||||||
|
pragma Inline (Interrupt_Connect);
|
||||||
|
-- Use this to set up an user handler. The routine installs a
|
||||||
|
-- a user handler which is invoked after RTEMS has saved enough
|
||||||
|
-- context for a high-level language routine to be safely invoked.
|
||||||
|
|
||||||
|
function Interrupt_Number_To_Vector (intNum : int) return Interrupt_Vector;
|
||||||
|
pragma Inline (Interrupt_Number_To_Vector);
|
||||||
|
-- Convert a logical interrupt number to the hardware interrupt vector
|
||||||
|
-- number used to connect the interrupt.
|
||||||
|
|
||||||
private
|
private
|
||||||
type sigset_t is new unsigned_long_long;
|
type sigset_t is new unsigned_long_long;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue