1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211 | ------------------------------------------------------------------------------
-- --
-- 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-1994, Florida State University --
-- Copyright (C) 1995-2023, 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. --
-- --
------------------------------------------------------------------------------
-- Ravenscar version of this package for bare board targets
-- This package encapsulates all direct interfaces to OS services that are
-- needed by the tasking run-time (libgnarl).
pragma Restrictions (No_Elaboration_Code);
-- The kernel initialization routine needs to execute before elaboration.
-- Consequently, packages used by this code cannot require elaboration.
with System.Multiprocessors;
with System.Storage_Elements;
with System.BB.Threads.Queues;
with System.BB.Time;
with System.BB.Interrupts;
with System.BB.Board_Support;
with System.BB.Parameters;
package System.OS_Interface is
pragma Preelaborate;
----------------
-- Interrupts --
----------------
subtype Interrupt_Range is System.BB.Interrupts.Interrupt_ID;
-- Range of interrupts identifiers, for s-inter
subtype Interrupt_ID is System.BB.Interrupts.Interrupt_ID;
-- Interrupt identifiers
subtype Any_Interrupt_ID is System.BB.Interrupts.Any_Interrupt_ID;
-- Interrupt identifiers plus No_Interrupt
No_Interrupt : constant Any_Interrupt_ID :=
System.BB.Interrupts.No_Interrupt;
-- Special value indicating no interrupt
subtype Interrupt_Handler is System.BB.Interrupts.Interrupt_Handler;
-- Interrupt handlers
--------------------------
-- Interrupt processing --
--------------------------
function Current_Interrupt return Any_Interrupt_ID
renames System.BB.Interrupts.Current_Interrupt;
-- Function that returns the hardware interrupt currently being
-- handled (if any). In case no hardware interrupt is being handled
-- the returned value is No_Interrupt.
procedure Attach_Handler
(Handler : Interrupt_Handler;
Id : Interrupt_ID;
PO_Prio : Interrupt_Priority)
renames System.BB.Interrupts.Attach_Handler;
-- Attach a handler to a hardware interrupt
procedure Power_Down renames System.BB.Board_Support.Interrupts.Power_Down;
-- Put current CPU in power-down mode
----------
-- Time --
----------
subtype Time is System.BB.Time.Time;
-- Representation of the time in the underlying tasking system
subtype Time_Span is System.BB.Time.Time_Span;
-- Represents the length of time intervals in the underlying tasking
-- system.
Ticks_Per_Second : constant := System.BB.Parameters.Ticks_Per_Second;
-- Number of clock ticks per second
function Clock return Time renames System.BB.Time.Clock;
-- Get the number of ticks elapsed since startup
procedure Delay_Until (T : Time) renames System.BB.Time.Delay_Until;
-- Suspend the calling task until the absolute time specified by T
-------------
-- Threads --
-------------
subtype Thread_Descriptor is System.BB.Threads.Thread_Descriptor;
-- Type that contains the information about a thread (registers,
-- priority, etc.).
subtype Thread_Id is System.BB.Threads.Thread_Id;
-- Identifiers for the underlying threads
Null_Thread_Id : constant Thread_Id :=
System.BB.Threads.Null_Thread_Id;
-- Identifier for a non valid thread
Lwp_Self : constant System.Address := Null_Address;
-- LWP is not used by gdb on ravenscar
procedure Initialize
(Environment_Thread : Thread_Id;
Main_Priority : System.Any_Priority)
renames System.BB.Threads.Initialize;
-- Procedure for initializing the underlying tasking system
procedure Initialize_Slave
(Idle_Thread : Thread_Id;
Idle_Priority : Integer;
Stack_Address : System.Address;
Stack_Size : System.Storage_Elements.Storage_Offset)
renames System.BB.Threads.Initialize_Slave;
-- Procedure to initialize the idle thread
procedure Thread_Create
(Id : Thread_Id;
Code : System.Address;
Arg : System.Address;
Priority : Integer;
Base_CPU : System.Multiprocessors.CPU_Range;
Stack_Address : System.Address;
Stack_Size : System.Storage_Elements.Storage_Offset)
renames System.BB.Threads.Thread_Create;
-- Create a new thread
function Thread_Self return Thread_Id renames System.BB.Threads.Thread_Self;
-- Return the thread identifier for the calling task
----------
-- ATCB --
----------
procedure Set_ATCB (Id : Thread_Id; ATCB : System.Address)
renames System.BB.Threads.Set_ATCB;
-- Associate the specified ATCB to the thread ID
function Get_ATCB return System.Address renames System.BB.Threads.Get_ATCB;
-- Get the ATCB associated to the currently running thread
----------------
-- Scheduling --
----------------
procedure Set_Priority (Priority : Integer)
renames System.BB.Threads.Set_Priority;
-- Set the active priority of the executing thread to the given value
function Get_Priority (Id : Thread_Id) return Integer
renames System.BB.Threads.Get_Priority;
-- Get the current base priority of a thread
procedure Sleep renames System.BB.Threads.Sleep;
-- The calling thread is unconditionally suspended
procedure Wakeup (Id : Thread_Id) renames System.BB.Threads.Wakeup;
-- The referred thread becomes ready (the thread must be suspended)
---------------------
-- Multiprocessors --
---------------------
function Get_Affinity (Id : Thread_Id) return Multiprocessors.CPU_Range
renames System.BB.Threads.Get_Affinity;
-- Return CPU affinity of the given thread (maybe Not_A_Specific_CPU)
function Get_CPU (Id : Thread_Id) return Multiprocessors.CPU
renames System.BB.Threads.Get_CPU;
-- Return the CPU in charge of the given thread (always a valid CPU)
function Current_Priority
(CPU_Id : Multiprocessors.CPU) return System.Any_Priority
renames System.BB.Threads.Queues.Current_Priority;
-- Return the active priority of the current thread or
-- System.Any_Priority'First if no threads are running.
function Current_CPU return Multiprocessors.CPU
renames System.BB.Board_Support.Multiprocessors.Current_CPU;
-- Return the id of the current CPU
end System.OS_Interface;
|