OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [ada/] [s-osinte-vxworks.adb] - Blame information for rev 839

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 706 jeremybenn
------------------------------------------------------------------------------
2
--                                                                          --
3
--                  GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                --
4
--                                                                          --
5
--                   S Y S T E M . O S _ I N T E R F A C E                  --
6
--                                                                          --
7
--                                   B o d y                                --
8
--                                                                          --
9
--         Copyright (C) 1997-2010, Free Software Foundation, Inc.          --
10
--                                                                          --
11
-- GNARL is free software; you can  redistribute it  and/or modify it under --
12
-- terms of the  GNU General Public License as published  by the Free Soft- --
13
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16
-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
17
--                                                                          --
18
-- As a special exception under Section 7 of GPL version 3, you are granted --
19
-- additional permissions described in the GCC Runtime Library Exception,   --
20
-- version 3.1, as published by the Free Software Foundation.               --
21
--                                                                          --
22
-- You should have received a copy of the GNU General Public License and    --
23
-- a copy of the GCC Runtime Library Exception along with this program;     --
24
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
25
-- <http://www.gnu.org/licenses/>.                                          --
26
--                                                                          --
27
-- GNARL was developed by the GNARL team at Florida State University.       --
28
-- Extensive contributions were provided by Ada Core Technologies, Inc.     --
29
--                                                                          --
30
------------------------------------------------------------------------------
31
 
32
--  This is the VxWorks version
33
 
34
--  This package encapsulates all direct interfaces to OS services that are
35
--  needed by children of System.
36
 
37
pragma Polling (Off);
38
--  Turn off polling, we do not want ATC polling to take place during tasking
39
--  operations. It causes infinite loops and other problems.
40
 
41
package body System.OS_Interface is
42
 
43
   use type Interfaces.C.int;
44
 
45
   Low_Priority : constant := 255;
46
   --  VxWorks native (default) lowest scheduling priority
47
 
48
   -------------
49
   -- sigwait --
50
   -------------
51
 
52
   function sigwait
53
     (set : access sigset_t;
54
      sig : access Signal) return int
55
   is
56
      Result : int;
57
 
58
      function sigwaitinfo
59
        (set : access sigset_t; sigvalue : System.Address) return int;
60
      pragma Import (C, sigwaitinfo, "sigwaitinfo");
61
 
62
   begin
63
      Result := sigwaitinfo (set, System.Null_Address);
64
 
65
      if Result /= -1 then
66
         sig.all := Signal (Result);
67
         return OK;
68
      else
69
         sig.all := 0;
70
         return errno;
71
      end if;
72
   end sigwait;
73
 
74
   -----------------
75
   -- To_Duration --
76
   -----------------
77
 
78
   function To_Duration (TS : timespec) return Duration is
79
   begin
80
      return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
81
   end To_Duration;
82
 
83
   -----------------
84
   -- To_Timespec --
85
   -----------------
86
 
87
   function To_Timespec (D : Duration) return timespec is
88
      S : time_t;
89
      F : Duration;
90
 
91
   begin
92
      S := time_t (Long_Long_Integer (D));
93
      F := D - Duration (S);
94
 
95
      --  If F is negative due to a round-up, adjust for positive F value
96
 
97
      if F < 0.0 then
98
         S := S - 1;
99
         F := F + 1.0;
100
      end if;
101
 
102
      return timespec'(ts_sec  => S,
103
                       ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
104
   end To_Timespec;
105
 
106
   -------------------------
107
   -- To_VxWorks_Priority --
108
   -------------------------
109
 
110
   function To_VxWorks_Priority (Priority : int) return int is
111
   begin
112
      return Low_Priority - Priority;
113
   end To_VxWorks_Priority;
114
 
115
   --------------------
116
   -- To_Clock_Ticks --
117
   --------------------
118
 
119
   --  ??? - For now, we'll always get the system clock rate since it is
120
   --  allowed to be changed during run-time in VxWorks. A better method would
121
   --  be to provide an operation to set it that so we can always know its
122
   --  value.
123
 
124
   --  Another thing we should probably allow for is a resultant tick count
125
   --  greater than int'Last. This should probably be a procedure with two
126
   --  output parameters, one in the range 0 .. int'Last, and another
127
   --  representing the overflow count.
128
 
129
   function To_Clock_Ticks (D : Duration) return int is
130
      Ticks          : Long_Long_Integer;
131
      Rate_Duration  : Duration;
132
      Ticks_Duration : Duration;
133
 
134
   begin
135
      if D < 0.0 then
136
         return ERROR;
137
      end if;
138
 
139
      --  Ensure that the duration can be converted to ticks
140
      --  at the current clock tick rate without overflowing.
141
 
142
      Rate_Duration := Duration (sysClkRateGet);
143
 
144
      if D > (Duration'Last / Rate_Duration) then
145
         Ticks := Long_Long_Integer (int'Last);
146
      else
147
         Ticks_Duration := D * Rate_Duration;
148
         Ticks := Long_Long_Integer (Ticks_Duration);
149
 
150
         if Ticks_Duration > Duration (Ticks) then
151
            Ticks := Ticks + 1;
152
         end if;
153
 
154
         if Ticks > Long_Long_Integer (int'Last) then
155
            Ticks := Long_Long_Integer (int'Last);
156
         end if;
157
      end if;
158
 
159
      return int (Ticks);
160
   end To_Clock_Ticks;
161
 
162
   -----------------------------
163
   -- Binary_Semaphore_Create --
164
   -----------------------------
165
 
166
   function Binary_Semaphore_Create return Binary_Semaphore_Id is
167
   begin
168
      return Binary_Semaphore_Id (semBCreate (SEM_Q_FIFO, SEM_EMPTY));
169
   end Binary_Semaphore_Create;
170
 
171
   -----------------------------
172
   -- Binary_Semaphore_Delete --
173
   -----------------------------
174
 
175
   function Binary_Semaphore_Delete (ID : Binary_Semaphore_Id) return int is
176
   begin
177
      return semDelete (SEM_ID (ID));
178
   end Binary_Semaphore_Delete;
179
 
180
   -----------------------------
181
   -- Binary_Semaphore_Obtain --
182
   -----------------------------
183
 
184
   function Binary_Semaphore_Obtain (ID : Binary_Semaphore_Id) return int is
185
   begin
186
      return semTake (SEM_ID (ID), WAIT_FOREVER);
187
   end Binary_Semaphore_Obtain;
188
 
189
   ------------------------------
190
   -- Binary_Semaphore_Release --
191
   ------------------------------
192
 
193
   function Binary_Semaphore_Release (ID : Binary_Semaphore_Id) return int is
194
   begin
195
      return semGive (SEM_ID (ID));
196
   end Binary_Semaphore_Release;
197
 
198
   ----------------------------
199
   -- Binary_Semaphore_Flush --
200
   ----------------------------
201
 
202
   function Binary_Semaphore_Flush (ID : Binary_Semaphore_Id) return int is
203
   begin
204
      return semFlush (SEM_ID (ID));
205
   end Binary_Semaphore_Flush;
206
 
207
   ----------
208
   -- kill --
209
   ----------
210
 
211
   function kill (pid : t_id; sig : Signal) return int is
212
   begin
213
      return System.VxWorks.Ext.kill (pid, int (sig));
214
   end kill;
215
 
216
   -----------------------
217
   -- Interrupt_Connect --
218
   -----------------------
219
 
220
   function Interrupt_Connect
221
     (Vector    : Interrupt_Vector;
222
      Handler   : Interrupt_Handler;
223
      Parameter : System.Address := System.Null_Address) return int is
224
   begin
225
      return
226
        System.VxWorks.Ext.Interrupt_Connect
227
        (System.VxWorks.Ext.Interrupt_Vector (Vector),
228
         System.VxWorks.Ext.Interrupt_Handler (Handler),
229
         Parameter);
230
   end Interrupt_Connect;
231
 
232
   -----------------------
233
   -- Interrupt_Context --
234
   -----------------------
235
 
236
   function Interrupt_Context return int is
237
   begin
238
      return System.VxWorks.Ext.Interrupt_Context;
239
   end Interrupt_Context;
240
 
241
   --------------------------------
242
   -- Interrupt_Number_To_Vector --
243
   --------------------------------
244
 
245
   function Interrupt_Number_To_Vector
246
     (intNum : int) return Interrupt_Vector
247
   is
248
   begin
249
      return Interrupt_Vector
250
        (System.VxWorks.Ext.Interrupt_Number_To_Vector (intNum));
251
   end Interrupt_Number_To_Vector;
252
 
253
   -----------------
254
   -- Current_CPU --
255
   -----------------
256
 
257
   function Current_CPU return Multiprocessors.CPU is
258
   begin
259
      --  ??? Should use vxworks multiprocessor interface
260
 
261
      return Multiprocessors.CPU'First;
262
   end Current_CPU;
263
 
264
end System.OS_Interface;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.