KitFreeMiNT
Documentation file for Ssystem(), the new kernel call
last update: 1998-10-06
I. Introduction
The Ssystem() call has been designed to make your life easier. Using this you can get some closer control on the system and the kernel itself. Via this call the kernel now supports e.g. an easy Cookie Jar management and provides a safe access to supervisor memory. It's strictly encouraged to access GEMDOS variables and system vectors via the Ssystem(), because this way is considered safe for multiuser setups.
II. Definition
C:
long Ssystem(short mode, long arg1, long arg2);
Assembler:
move.l #arg2,-(sp)
move.l #arg1,-(sp)
move.w #mode,-(sp)
move.w #$0154,-(sp)
trap #1
lea $0c(sp),sp
III. Caveats
-
a) Prior to any further Ssystem() usage, your application should first check if the kernel supports this call. If it does, the following statement:
Ssystem(-1, 0L, 0L);
should return a zero. You can expect the function to be present if MiNT version at least 1.15 is detected.
- b) the Ssystem() does NOT depend on the SECURELEVEL.
- c) any values returned by the kernel on 'reserved' fields should be considered undocumented and no software should rely on them.
IV. Available modes
Notice: the returned value is always LONG, so, if you're a C programmer, you may have to cast the result to the type specified in the 'return' column.
Kernel information
| number | mode | arg1 | arg2 | return | comment |
|---|---|---|---|---|---|
| 0 | OSNAME | NULL | NULL | long | 0x4d694e54 for MiNT |
| 1 | OSXNAME | NULL | NULL | long | 0x46726565 = FreeMiNT |
| 2 | OSVERSION | NULL | NULL | long | 0x010e0662 = 1.14.6 beta |
| 3 | TOSHEADER | 0L | NULL | short | TOS version number in low word |
| 4 | OS_BUILD_DATE | NULL | NULL | long | 0x040c07dc = 4.XII.1997. |
| 5 | OS_BUILD_TIME | NULL | NULL | long | 0x04090a16 = Thu 9:10:22 am |
| 6 | COMPILE_TYPE | NULL | NULL | long | the CPU the kernel was compiled for |
| 7 | FEATURES | NULL | NULL | long | memory protection/VM state |
OSNAME identifies the operating system type. Returned longword contains a 32-bit number, which interpreted as an ASCII string gives a 4-character ID. For MiNT the returned value is 0x4d694e54 ('MiNT').
OSXNAME identifies the subtype of the operating system. If this call returns a zero, that means, that no subtype is available. Otherwise the returned value, when interpreted as an ASCII string gives a 4-character sub-ID. For FreeMiNT, being a derivative of the MiNT, the returned value is 0x46726565 ('Free').
OSVERSION identifies the exact operating system version. Returned longword contains a 32 bit version number encoded as follows:
bits meaning
---- -------
0-7 some printable character to characterize the
current version eg.
0x61 ('a') if alpha release,
0x62 ('b') if beta release.
For `official' FreeMiNT releases you will
always find a value of 0 here. (Definition of
an `official' FreeMiNT release: Every
release for which in bits 0-7 a value of 0
is returned...)
8-15 patchlevel (0x55 for pl 88)
16-23 minor version number (0x0e for x.14)
24-31 major version number ($01 for 1.xx)
TOSHEADER allows to access the TOS header in order to get some information from. Current implementation allows to access the first 1024 longwords of the header. The address of the required longword, relative to the beginning of the TOS header, has to be specified as arg1. Only even values are allowed (bit 0 of the arg1 is masked out by the kernel). Always a whole longword is returned.
OS_BUILD_DATE returns a 32 bit value with the build date encoded as follows:
bits meaning
---- -------
0-15 binary year ($07dd for 1998)
16-23 binary month ($0c for the December)
24-31 binary day of the month
OS_BUILD_TIME returns a 32 bit value with the build time encoded as follows:
bits meaning
---- -------
0-7 binary seconds
8-15 binary minutes
16-23 binary hours
24-31 day of week (1 for monday, 2 for tuesday ... 7 for sunday)
COMPILE_TYPE returns a 32-bit value specifying the CPU type the kernel has been compiled for. Encoding:
bits meaning
---- -------
0-15 binary CPU ID ($001e = 68030)
16-31 reserved for FPU ID (currently not implemented)
FEATURES returns a 32-bit value specifying the state of memory management features. Encoding:
bits meaning
---- -------
0 memory protection (1 = turned on)
1 virtual memory (1 = turned on)
2-31 reserved for future usage
Cookie Jar management
| number | mode | arg1 | arg2 | return | comment |
|---|---|---|---|---|---|
| 8 | GETCOOKIE | tag | ptr | 0 | get Cookie Jar value for 'tag' |
| 8 | GETCOOKIE | slot | ptr | 0 | get Cookie Jar tag of number 'slot' |
| 9 | SETCOOKIE | tag | value | 0 | place tag/value in the Cookie Jar |
GETCOOKIE fetches required information from the Cookie Jar. If 'arg1' is a value bigger than 65535 ($ffff), it is interpreted as a tag id. The cookie jar is searched for such a tag, then if the tag is found, the corresponding slot value is returned or -1 otherwise. If 'arg1' is a value between 1 and 65535, it is interpreted as a slot number, not a tag id. Then the corresponding tag id is fetched and returned or a value of -1 if the specified slot is free or does not exist at all (a slot number past the end of the Cookie Jar was specified). The first slot in the Cookie Jar is considered number 1. If 'arg1' is equal to a zero, then the Cookie Jar is searched for the NULL cookie, then the corresponding slot value is returned. The place where the value fetched from the Cookie Jar will be returned is defined by the 'arg2'. If this is a zero, the call returns its values in the GEMDOS return value (d0). If the 'arg2' is not a zero, it is interpreted as a pointer, where the slot tag or value should be written to. The return value is 0 (E_OK) then, if everything went OK, or -1 otherwise. This behaviour (where arg2 != NULL) is new in MiNT 1.14.8.
SETCOOKIE places a tag id specified by the 'arg1' with the value of the 'arg2' in the Cookie Jar. If a slot with the specified tag id already exists, it will be replaced with the new value. NULL cookie is reallocated automatically and its value is corrected. If there are no more free slots, no action is performed and ENSMEM is returned instead. SETCOOKIE requires euid root, EACCDN is returned otherwise and no action is performed either. SETCOOKIE refuses to place a cookie (a value of -1 is returned) whose tag id contains a zero-byte.
System variables management
| number | mode | arg1 | arg2 | return | comment |
|---|---|---|---|---|---|
| 10 | GET_LVAL | addr | NULL | long | returns lword from specified addr |
| 11 | GET_WVAL | addr | NULL | short | returns word from speified addr |
| 12 | GET_BVAL | addr | NULL | char | returns byte from specified addr |
| 13 | SET_LVAL | addr | value | 0 | sets a byte at a specified address |
| 14 | SET_WVAL | addr | value | 0 | sets a word at a specified address |
| 15 | SET_BVAL | addr | value | 0 | sets a longword at a specified address |
GET_LVAL, GET_WVAL and GET_BVAL fetch and return a longword, a word or a byte respectively from the address of supervisor area specified as a 16-bit, even integer value passed as 'arg1'. Odd numbers get decreased by 1 for GET_LVAL and GET_WVAL. Addresses from $0008 up to $ffff are allowed, the call returns a zero for addresses less than $0008.
SET_LVAL, SET_WVAL and SET_BVAL places a longword, word or byte value respectively, specified by 'arg2' at address specified by 'arg1'. Since this call is designed for manipulating operating system variables located within the supervisor area (first 32k), all SET_xVAL modes are restricted for euid root and return EACCDN if called by an unprivileged process.
Kernel management
| number | mode | arg1 | arg2 | return | comment |
|---|---|---|---|---|---|
| 16 | SYS_SLEVEL | slevel | NULL | 0 | |
| 16 | SYS_SLEVEL | -1 | NULL | slevel | |
| 18 | TSLICE | slices | NULL | 0 | negative on error |
| 18 | TSLICE | -1 | NULL | slices | current time_slice value |
| 19 | FORCEFASTLOAD | 0 | NULL | 0 | switch off fastload |
| 19 | FORCEFASTLOAD | 1 | NULL | 0 | switch on fastload |
| 19 | FORCEFASTLOAD | -1 | NULL | fastld | return the current state of the fastload |
| 20 | SYNC_TIME | seconds | NULL | 0 | set sync time |
| 20 | SYNC_TIME | -1 | NULL | seconds | current sync time |
SYS_SLEVEL resets the current security level to a value specified by 'arg1'. Only values of 0, 1 and 2 are accepted, EACCDN is returned otherwise. This mode is restricted to euid root. If 'arg1' is equal to a -1, the current security level value is returned.
TSLICE allows you to set/interrogate the timeslice value. Values are exactly the same as for SLICES keyword in MINT.CNF. 'arg1' equal to -1 returns the current global timeslice value.
FORCEFASTLOAD allows to change the interpretation of the FASTLOAD bit from the program header. On Ssystem(FORCEFASTLOAD, 0, NULL) the program header bit will be used as before, this is actually equal to FASTLOAD=NO in MINT.CNF. On Ssystem(FORCEFASTLOAD, 1, NULL), the program header bit will be ignored and fastload will be forced for all programs. arg1 = -1 allows to examinate the current state of this feature. This mode is restricted to euid root.
SYNC_TIME allows to change the time between two filesystem syncs. If you use a filesystem with write back cache like MinixFS or NEWFATFS the kernel sync automatically every filesystem in regular intervals. With SYNC_TIME you can change these time. This mode is new in FreeMiNT 1.15.
Time management
| number | mode | arg1 | arg2 | return | comment |
|---|---|---|---|---|---|
| 100 | CLOCK_UTC | -1 | NULL | cmode | |
| 100 | CLOCK_UTC | cmode | NULL | 0 |
GET_CLOCK_MODE called with an ARG1 of -1 inquires the kernel's notion of the hardware system clock. If the command returns zero, the hardware clock is considered to tick in UTC, if it returns a positive non-zero value it is considered to tick in local time. Every other positive value sets the current clock mode. For 0 it is reset to UTC, or to local time otherwise. Although this call will never really change the setting of the hardware clock, due to a changed interpretation the clock seems to warp; don't play around too much with it.
For further information please see the file minttime.doc.
WARNING: modes 16-18 are new in FreeMiNT 1.14.7. Mode 100 is new in FreeMiNT 1.15. If the kernel provides Tgettimeofday and Tsettimeofday you can expect them to be supported.
Other modes
| number | mode | arg1 | arg2 | return | comment |
|---|---|---|---|---|---|
| 17 | RUN_LEVEL | run_lvl | NULL | short | currently not implemented |
| 21752 | TIOCMGET | addr | NULL | short | reserved for the MiNT Library |
RUN_LEVEL is currently not implemented but reserved for future.
TIOCMGET is reserved for the MiNT Library and shouldn't be used by application software.
V. Implementations
Ssystem(), if supported by the kernel, is used by the MiNT Library as of patchlevel 48. The call should be considered officially supported as of FreeMiNT version 1.15.