------------------------------------------------------------------------------
--                                                                          --
--                  GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                --
--                                                                          --
--                    S Y S T E M . O S _ I N T E R F A C E                 --
--                                                                          --
--                                   S p e c                                --
--                                                                          --
--            Copyright (C) 1991-2017, Florida State University             --
--          Copyright (C) 1995-2021, 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 3,  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.                                     --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
-- 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 of this package

--  This package encapsulates all direct interfaces to OS services that are
--  needed by the tasking run-time (libgnarl).

--  PLEASE DO NOT add any with-clauses to this package or remove the pragma
--  Preelaborate. This package is designed to be a bottom-level (leaf) package.

with Interfaces.C;
with System.VxWorks;
with System.VxWorks.Ext;
with System.Multiprocessors;
with System.Parameters;

package System.OS_Interface is
   pragma Preelaborate;

   subtype int             is Interfaces.C.int;
   subtype unsigned        is Interfaces.C.unsigned;
   subtype short           is Short_Integer;
   type unsigned_int       is mod 2 ** int'Size;
   type long               is new Long_Integer;
   type unsigned_long      is mod 2 ** long'Size;
   type long_long          is new Long_Long_Integer;
   type unsigned_long_long is mod 2 ** long_long'Size;
   type size_t             is mod 2 ** Standard'Address_Size;

   -----------
   -- Errno --
   -----------

   function errno return int;
   pragma Import (C, errno, "errnoGet");

   EINTR     : constant := 4;
   EAGAIN    : constant := 35;
   ENOMEM    : constant := 12;
   EINVAL    : constant := 22;
   ETIMEDOUT : constant := 60;

   FUNC_ERR  : constant := -1;

   ----------------------------
   -- Signals and interrupts --
   ----------------------------

   NSIG : constant := 64;
   --  Number of signals on the target OS
   type Signal is new int range 0 .. Interfaces.C."-" (NSIG, 1);

   Max_HW_Interrupt : constant := System.VxWorks.Num_HW_Interrupts - 1;
   type HW_Interrupt is new int range 0 .. Max_HW_Interrupt;

   Max_Interrupt : constant := Max_HW_Interrupt;
   subtype Interrupt_Range is Natural range 0 .. Max_HW_Interrupt;
   --  For s-interr

   --  Signals common to Vxworks 5.x and 6.x

   SIGILL    : constant :=  4; --  illegal instruction (not reset when caught)
   SIGABRT   : constant :=  6; --  used by abort, replace SIGIOT in the future
   SIGFPE    : constant :=  8; --  floating point exception
   SIGBUS    : constant := 10; --  bus error
   SIGSEGV   : constant := 11; --  segmentation violation

   --  Signals specific to VxWorks 6.x

   SIGHUP    : constant :=  1; --  hangup
   SIGINT    : constant :=  2; --  interrupt
   SIGQUIT   : constant :=  3; --  quit
   SIGTRAP   : constant :=  5; --  trace trap (not reset when caught)
   SIGEMT    : constant :=  7; --  EMT instruction
   SIGKILL   : constant :=  9; --  kill
   SIGFMT    : constant := 12; --  STACK FORMAT ERROR (not posix)
   SIGPIPE   : constant := 13; --  write on a pipe with no one to read it
   SIGALRM   : constant := 14; --  alarm clock
   SIGTERM   : constant := 15; --  software termination signal from kill
   SIGCNCL   : constant := 16; --  pthreads cancellation signal
   SIGSTOP   : constant := 17; --  sendable stop signal not from tty
   SIGTSTP   : constant := 18; --  stop signal from tty
   SIGCONT   : constant := 19; --  continue a stopped process
   SIGCHLD   : constant := 20; --  to parent on child stop or exit
   SIGTTIN   : constant := 21; --  to readers pgrp upon background tty read
   SIGTTOU   : constant := 22; --  like TTIN for output

   SIGRES1   : constant := 23; --  reserved signal number (Not POSIX)
   SIGRES2   : constant := 24; --  reserved signal number (Not POSIX)
   SIGRES3   : constant := 25; --  reserved signal number (Not POSIX)
   SIGRES4   : constant := 26; --  reserved signal number (Not POSIX)
   SIGRES5   : constant := 27; --  reserved signal number (Not POSIX)
   SIGRES6   : constant := 28; --  reserved signal number (Not POSIX)
   SIGRES7   : constant := 29; --  reserved signal number (Not POSIX)

   SIGUSR1   : constant := 30; --  user defined signal 1
   SIGUSR2   : constant := 31; --  user defined signal 2

   SIGPOLL   : constant := 32; --  pollable event
   SIGPROF   : constant := 33; --  profiling timer expired
   SIGSYS    : constant := 34; --  bad system call
   SIGURG    : constant := 35; --  high bandwidth data is available at socket
   SIGVTALRM : constant := 36; --  virtual timer expired
   SIGXCPU   : constant := 37; --  CPU time limit exceeded
   SIGXFSZ   : constant := 38; --  file size time limit exceeded

   SIGEVTS   : constant := 39; --  signal event thread send
   SIGEVTD   : constant := 40; --  signal event thread delete

   SIGRTMIN  : constant := 48; --  Realtime signal min
   SIGRTMAX  : constant := 63; --  Realtime signal max

   -----------------------------------
   -- Signal processing definitions --
   -----------------------------------

   --  The how in sigprocmask()

   SIG_BLOCK   : constant := 1;
   SIG_UNBLOCK : constant := 2;
   SIG_SETMASK : constant := 3;

   --  The sa_flags in struct sigaction

   SA_SIGINFO : constant := 16#0002#;
   SA_ONSTACK : constant := 16#0004#;

   SIG_DFL : constant := 0;
   SIG_IGN : constant := 1;

   type sigset_t is private;

   type struct_sigaction is record
      sa_handler : System.Address;
      sa_mask    : sigset_t;
      sa_flags   : int;
   end record;
   pragma Convention (C, struct_sigaction);
   type struct_sigaction_ptr is access all struct_sigaction;

   function sigaddset (set : access sigset_t; sig : Signal) return int;
   pragma Import (C, sigaddset, "sigaddset");

   function sigdelset (set : access sigset_t; sig : Signal) return int;
   pragma Import (C, sigdelset, "sigdelset");

   function sigfillset (set : access sigset_t) return int;
   pragma Import (C, sigfillset, "sigfillset");

   function sigismember (set : access sigset_t; sig : Signal) return int;
   pragma Import (C, sigismember, "sigismember");

   function sigemptyset (set : access sigset_t) return int;
   pragma Import (C, sigemptyset, "sigemptyset");

   function sigaction
     (sig  : Signal;
      act  : struct_sigaction_ptr;
      oact : struct_sigaction_ptr) return int;
   pragma Import (C, sigaction, "sigaction");

   type isr_address is access procedure (sig : int);
   pragma Convention (C, isr_address);

   function c_signal (sig : Signal; handler : isr_address) return isr_address;
   pragma Import (C, c_signal, "signal");

   function pthread_sigmask
     (how  : int;
      set  : access sigset_t;
      oset : access sigset_t) return int;
   pragma Import (C, pthread_sigmask, "sigprocmask");

   subtype t_id is System.VxWorks.Ext.t_id;
   subtype Thread_Id is t_id;
   --  Thread_Id and t_id are VxWorks identifiers for tasks. This value,
   --  although represented as a Long_Integer, is in fact an address. With
   --  some BSPs, this address can have a value sufficiently high that the
   --  Thread_Id becomes negative: this should not be considered as an error.

   function kill (pid : t_id; sig : Signal) return int;
   pragma Inline (kill);

   function getpid return t_id renames System.VxWorks.Ext.getpid;

   function Task_Stop (tid : t_id) return int
     renames System.VxWorks.Ext.Task_Stop;
   --  If we are in the kernel space, stop the task whose t_id is given in
   --  parameter in such a way that it can be examined by the debugger. This
   --  typically maps to taskSuspend on VxWorks 5 and to taskStop on VxWorks 6.

   function Task_Cont (tid : t_id) return int
     renames System.VxWorks.Ext.Task_Cont;
   --  If we are in the kernel space, continue the task whose t_id is given
   --  in parameter if it has been stopped previously to be examined by the
   --  debugger (e.g. by taskStop). It typically maps to taskResume on VxWorks
   --  5 and to taskCont on VxWorks 6.

   function Int_Lock return int renames System.VxWorks.Ext.Int_Lock;
   --  If we are in the kernel space, lock interrupts. It typically maps to
   --  intLock.

   function Int_Unlock (Old : int) return int
     renames System.VxWorks.Ext.Int_Unlock;
   --  If we are in the kernel space, unlock interrupts. It typically maps to
   --  intUnlock. The parameter Old is only used on PowerPC where it contains
   --  the returned value from Int_Lock (the old MPSR).

   ----------
   -- Time --
   ----------

   type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
     .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
   --  Time_t here used to be unsigned to match the VxWorks header declaration.
   --  The header declaration has changed in newer releases and is now signed
   --  for applications.

   type timespec is record
      ts_sec  : time_t;
      ts_nsec : long;
   end record;
   pragma Convention (C, timespec);

   type clockid_t is new int;

   function To_Duration (TS : timespec) return Duration;
   pragma Inline (To_Duration);

   function To_Timespec (D : Duration) return timespec;
   pragma Inline (To_Timespec);
   --  Convert a Duration value to a timespec value. Note that in VxWorks,
   --  timespec is always non-negative (since time_t is defined above as
   --  unsigned long). This means that there is a potential problem if a
   --  negative argument is passed for D. However, in actual usage, the
   --  value of the input argument D is always non-negative, so no problem
   --  arises in practice.

   function To_Clock_Ticks (D : Duration) return int;
   --  Convert a duration value (in seconds) into clock ticks

   function clock_gettime
     (clock_id : clockid_t; tp : access timespec) return int;
   pragma Import (C, clock_gettime, "clock_gettime");

   ----------------------
   -- Utility Routines --
   ----------------------

   function To_VxWorks_Priority (Priority : int) return int;
   pragma Inline (To_VxWorks_Priority);
   --  Convenience routine to convert between VxWorks priority and Ada priority

   --------------------------
   -- VxWorks specific API --
   --------------------------

   subtype STATUS is int;
   --  Equivalent of the C type STATUS

   OK    : constant STATUS := 0;
   ERROR : constant STATUS := Interfaces.C.int (-1);

   function taskIdVerify (tid : t_id) return STATUS;
   pragma Import (C, taskIdVerify, "taskIdVerify");

   function taskIdSelf return t_id;
   pragma Import (C, taskIdSelf, "taskIdSelf");

   function taskOptionsGet (tid : t_id; pOptions : access int) return int;
   pragma Import (C, taskOptionsGet, "taskOptionsGet");

   function taskSuspend (tid : t_id) return int;
   pragma Import (C, taskSuspend, "taskSuspend");

   function taskResume (tid : t_id) return int;
   pragma Import (C, taskResume, "taskResume");

   function taskIsSuspended (tid : t_id) return int;
   pragma Import (C, taskIsSuspended, "taskIsSuspended");

   function taskDelay (ticks : int) return int;
   pragma Import (C, taskDelay, "taskDelay");

   function sysClkRateGet return int;
   pragma Import (C, sysClkRateGet, "sysClkRateGet");

   --  VxWorks 5.x specific functions
   --  Must not be called from run-time for versions that do not support
   --  taskVarLib: eg VxWorks 6 RTPs

   function taskVarAdd
     (tid : t_id; pVar : access System.Address) return int;
   pragma Import (C, taskVarAdd, "taskVarAdd");

   function taskVarDelete
     (tid : t_id; pVar : access System.Address) return int;
   pragma Import (C, taskVarDelete, "taskVarDelete");

   function taskVarSet
     (tid   : t_id;
      pVar  : access System.Address;
      value : System.Address) return int;
   pragma Import (C, taskVarSet, "taskVarSet");

   function taskVarGet
     (tid  : t_id;
      pVar : access System.Address) return int;
   pragma Import (C, taskVarGet, "taskVarGet");

   --  VxWorks 6.x specific functions

   --  Can only be called from the VxWorks 6 run-time libary that supports
   --  tlsLib, and not by the VxWorks 6.6 SMP library

   function tlsKeyCreate return int;
   pragma Import (C, tlsKeyCreate, "tlsKeyCreate");

   function tlsValueGet (key : int) return System.Address;
   pragma Import (C, tlsValueGet, "tlsValueGet");

   function tlsValueSet (key : int; value : System.Address) return STATUS;
   pragma Import (C, tlsValueSet, "tlsValueSet");

   --  Option flags for taskSpawn

   VX_UNBREAKABLE    : constant := 16#0002#;
   VX_FP_PRIVATE_ENV : constant := 16#0080#;
   VX_NO_STACK_FILL  : constant := 16#0100#;

   function taskSpawn
     (name          : System.Address;  --  Pointer to task name
      priority      : int;
      options       : int;
      stacksize     : size_t;
      start_routine : System.Address;
      arg1          : System.Address;
      arg2          : int := 0;
      arg3          : int := 0;
      arg4          : int := 0;
      arg5          : int := 0;
      arg6          : int := 0;
      arg7          : int := 0;
      arg8          : int := 0;
      arg9          : int := 0;
      arg10         : int := 0) return t_id;
   pragma Import (C, taskSpawn, "taskSpawn");

   procedure taskDelete (tid : t_id);
   pragma Import (C, taskDelete, "taskDelete");

   function Set_Time_Slice (ticks : int) return int
     renames System.VxWorks.Ext.Set_Time_Slice;
   --  Calls kernelTimeSlice under VxWorks 5.x, VxWorks 653, or in VxWorks 6
   --  kernel apps. Returns ERROR for RTPs, VxWorks 5 /CERT

   function taskPriorityGet (tid : t_id; pPriority : access int) return int;
   pragma Import (C, taskPriorityGet, "taskPriorityGet");

   function taskPrioritySet (tid : t_id; newPriority : int) return int;
   pragma Import (C, taskPrioritySet, "taskPrioritySet");

   --  Semaphore creation flags

   SEM_Q_FIFO         : constant := 0;
   SEM_Q_PRIORITY     : constant := 1;
   SEM_DELETE_SAFE    : constant := 4;  -- only valid for binary semaphore
   SEM_INVERSION_SAFE : constant := 8;  -- only valid for binary semaphore

   --  Semaphore initial state flags

   SEM_EMPTY : constant := 0;
   SEM_FULL  : constant := 1;

   --  Semaphore take (semTake) time constants

   WAIT_FOREVER : constant := -1;
   NO_WAIT      : constant := 0;

   --  Error codes (errno). The lower level 16 bits are the error code, with
   --  the upper 16 bits representing the module number in which the error
   --  occurred. By convention, the module number is 0 for UNIX errors. VxWorks
   --  reserves module numbers 1-500, with the remaining module numbers being
   --  available for user applications.

   M_objLib                 : constant := 61 * 2**16;
   --  semTake() failure with ticks = NO_WAIT
   S_objLib_OBJ_UNAVAILABLE : constant := M_objLib + 2;
   --  semTake() timeout with ticks > NO_WAIT
   S_objLib_OBJ_TIMEOUT     : constant := M_objLib + 4;

   subtype SEM_ID is System.VxWorks.Ext.SEM_ID;
   --  typedef struct semaphore *SEM_ID;

   --  We use two different kinds of VxWorks semaphores: mutex and binary
   --  semaphores. A null ID is returned when a semaphore cannot be created.

   function semBCreate (options : int; initial_state : int) return SEM_ID;
   pragma Import (C, semBCreate, "semBCreate");
   --  Create a binary semaphore. Return ID, or 0 if memory could not
   --  be allocated.

   function semMCreate (options : int) return SEM_ID;
   pragma Import (C, semMCreate, "semMCreate");

   function semDelete (Sem : SEM_ID) return int
     renames System.VxWorks.Ext.semDelete;
   --  Delete a semaphore

   function semGive (Sem : SEM_ID) return int;
   pragma Import (C, semGive, "semGive");

   function semTake (Sem : SEM_ID; timeout : int) return int;
   pragma Import (C, semTake, "semTake");
   --  Attempt to take binary semaphore.  Error is returned if operation
   --  times out

   function semFlush (SemID : SEM_ID) return STATUS;
   pragma Import (C, semFlush, "semFlush");
   --  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 user handler
   --  which is invoked after the OS has saved enough context for a high-level
   --  language routine to be safely invoked.

   function Interrupt_Context return int;
   pragma Inline (Interrupt_Context);
   --  Return 1 if executing in an interrupt context; return 0 if executing in
   --  a task context.

   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.

   --------------------------------
   -- Processor Affinity for SMP --
   --------------------------------

   function taskCpuAffinitySet (tid : t_id; CPU : int) return int
     renames System.VxWorks.Ext.taskCpuAffinitySet;
   --  For SMP run-times the affinity to CPU.
   --  For uniprocessor systems return ERROR status.

   function taskMaskAffinitySet (tid : t_id; CPU_Set : unsigned) return int
     renames System.VxWorks.Ext.taskMaskAffinitySet;
   --  For SMP run-times the affinity to CPU_Set.
   --  For uniprocessor systems return ERROR status.

   ---------------------
   -- Multiprocessors --
   ---------------------

   function Current_CPU return Multiprocessors.CPU;
   --  Return the id of the current CPU

private
   type pid_t is new int;

   ERROR_PID : constant pid_t := -1;

   type sigset_t is new System.VxWorks.Ext.sigset_t;
end System.OS_Interface;
