| (* SYSTEM.def provides access to COROUTINE primitives and underlying system. |
| |
| Copyright (C) 2002-2025 Free Software Foundation, Inc. |
| Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>. |
| |
| This file is part of GNU Modula-2. |
| |
| GNU Modula-2 is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3, or (at your option) |
| any later version. |
| |
| GNU Modula-2 is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| 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/>. *) |
| |
| DEFINITION MODULE SYSTEM ; |
| |
| (* This module is designed to be used on a native operating system |
| rather than an embedded system as it implements the coroutine |
| primitives TRANSFER, IOTRANSFER and |
| NEWPROCESS through the GNU Pthread library. *) |
| |
| FROM COROUTINES IMPORT PROTECTION ; |
| |
| EXPORT QUALIFIED (* the following are built into the compiler: *) |
| ADDRESS, WORD, BYTE, CSIZE_T, CSSIZE_T, COFF_T, (* @SYSTEM_DATATYPES@ *) |
| ADR, TSIZE, ROTATE, SHIFT, THROW, TBITSIZE, |
| (* SIZE is exported depending upon -fpim2 and |
| -fpedantic. *) |
| (* The rest are implemented in SYSTEM.mod. *) |
| PROCESS, TRANSFER, NEWPROCESS, IOTRANSFER, |
| LISTEN, |
| ListenLoop, TurnInterrupts ; |
| |
| |
| TYPE |
| PROCESS = RECORD |
| context: INTEGER ; |
| END ; |
| |
| (* Note that the full list of system and sized datatypes include: |
| LOC, WORD, BYTE, ADDRESS, |
| |
| (and the non language standard target types) |
| |
| INTEGER8, INTEGER16, INTEGER32, INTEGER64, |
| CARDINAL8, CARDINAL16, CARDINAL32, CARDINAL64, |
| WORD16, WORD32, WORD64, BITSET8, BITSET16, |
| BITSET32, REAL32, REAL64, REAL128, COMPLEX32, |
| COMPLEX64, COMPLEX128, CSIZE_T, CSSIZE_T. |
| |
| Also note that the non-standard data types will |
| move into another module in the future. *) |
| |
| (* The following types are supported on this target: |
| @SYSTEM_TYPES@ |
| *) |
| |
| |
| (* |
| TRANSFER - save the current volatile environment into, p1. |
| Restore the volatile environment from, p2. |
| *) |
| |
| PROCEDURE TRANSFER (VAR p1: PROCESS; p2: PROCESS) ; |
| |
| |
| (* |
| NEWPROCESS - p is a parameterless procedure, a, is the origin of |
| the workspace used for the process stack and containing |
| the volatile environment of the process. StackSize, is |
| the maximum size of the stack in bytes which can be used |
| by this process. new, is the new process. |
| *) |
| |
| PROCEDURE NEWPROCESS (p: PROC; a: ADDRESS; StackSize: CARDINAL; VAR new: PROCESS) ; |
| |
| |
| (* |
| IOTRANSFER - saves the current volatile environment into, First, |
| and restores volatile environment, Second. |
| When an interrupt, InterruptNo, is encountered then |
| the reverse takes place. (The then current volatile |
| environment is shelved onto Second and First is resumed). |
| |
| NOTE: that upon interrupt the Second might not be the |
| same process as that before the original call to |
| IOTRANSFER. |
| *) |
| |
| PROCEDURE IOTRANSFER (VAR First, Second: PROCESS; InterruptNo: CARDINAL) ; |
| |
| |
| (* |
| LISTEN - briefly listen for any interrupts. |
| *) |
| |
| PROCEDURE LISTEN ; |
| |
| |
| (* |
| ListenLoop - should be called instead of users writing: |
| |
| LOOP |
| LISTEN |
| END |
| |
| It performs the same function but yields |
| control back to the underlying operating system |
| via a call to pth_select. |
| It also checks for deadlock. |
| This function returns when an interrupt occurs ie |
| a file descriptor becomes ready or a time event |
| expires. See the module RTint. |
| *) |
| |
| PROCEDURE ListenLoop ; |
| |
| |
| (* |
| TurnInterrupts - switches processor interrupts to the protection |
| level, to. It returns the old value. |
| *) |
| |
| PROCEDURE TurnInterrupts (to: PROTECTION) : PROTECTION ; |
| |
| |
| (* |
| all the functions below are declared internally to gm2 |
| ==================================================== |
| |
| PROCEDURE ADR (VAR v: <anytype>): ADDRESS; |
| (* Returns the address of variable v. *) |
| |
| PROCEDURE SIZE (v: <type>) : ZType; |
| (* Returns the number of BYTES used to store a v of |
| any specified <type>. Only available if -fpim2 is used. |
| *) |
| |
| PROCEDURE TSIZE (<type>) : CARDINAL; |
| (* Returns the number of BYTES used to store a value of the |
| specified <type>. |
| *) |
| |
| PROCEDURE ROTATE (val: <a set type>; |
| num: INTEGER): <type of first parameter>; |
| (* Returns a bit sequence obtained from val by rotating up or down |
| (left or right) by the absolute value of num. The direction is |
| down if the sign of num is negative, otherwise the direction is up. |
| *) |
| |
| PROCEDURE SHIFT (val: <a set type>; |
| num: INTEGER): <type of first parameter>; |
| (* Returns a bit sequence obtained from val by shifting up or down |
| (left or right) by the absolute value of num, introducing |
| zeros as necessary. The direction is down if the sign of |
| num is negative, otherwise the direction is up. |
| *) |
| |
| PROCEDURE THROW (i: INTEGER) <* noreturn *> ; |
| (* |
| THROW is a GNU extension and was not part of the PIM or ISO |
| standards. It throws an exception which will be caught by the EXCEPT |
| block (assuming it exists). This is a compiler builtin function which |
| interfaces to the GCC exception handling runtime system. |
| GCC uses the term throw, hence the naming distinction between |
| the GCC builtin and the Modula-2 runtime library procedure Raise. |
| The later library procedure Raise will call SYSTEM.THROW after |
| performing various housekeeping activities. |
| *) |
| |
| PROCEDURE TBITSIZE (<type>) : CARDINAL ; |
| (* Returns the minimum number of bits necessary to represent |
| <type>. This procedure function is only useful for determining |
| the number of bits used for any type field within a packed RECORD. |
| It is not particularly useful elsewhere since <type> might be |
| optimized for speed, for example a BOOLEAN could occupy a WORD. |
| *) |
| *) |
| |
| END SYSTEM. |