•  Back 
  •  System functions 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Help page 
  •  Show info about hypertext 
  •  View a new file 
Topic       : TOS - The Operating System
Author      : 
Version     : tos.hyp (December 19, 2008)
Subject     : Programmieren/Atari
Nodes       : 3010
Index Size  : 93790
HCP-Version : 5
Compiled on : Atari
@charset    : atarist
@lang       : 
@default    : Title
@help       : 
@options    : +g -i -s +x +zz -t4
@width      : 70
View Ref-File5.15.8  Ssystem                                                    TOS

 Name:         »Ssystem« - Control cookie jar, memory access and 
               various system settings.

 Opcode:       340 (0x0154)

 Syntax:       int32_t Ssystem ( int16_t mode, int32_t arg1, int32_t 
               arg2 );

 Description:  The Ssystem call has been designed to make your life 
               easier. Using this you can get some closer control of 
               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 multi-user setups.

               arg1 and arg2 are LONG parameters specific to a 
               particular mode. If a mode doesn't use a parameter, it 
               is usually ignored, but should be set to zero for 
               future compatibility. mode specifies a particular 
               action as follows:

                mode     Meaning

                S_INQUIRE(0xffff) Returns a zero if the kernel 
                         supports Ssystem. You can expect the function 
                         to be present if MiNT version at least 1.15 
                         is detected.

                S_OSNAME(0x0000) Identifies the operating system type. 
                         Returned LONGword contains a 32-bit positive 
                         number, which interpreted as an ASCII string 
                         gives a 4-character ID. For MiNT the returned 
                         value is 0x4d694e54 ('MiNT').

                S_OSXNAME(0x0001) Identifies the subtype of the 
                         operating system. If this call returns zero 
                         or a negative value, that means that no 
                         subtype is available. Otherwise the returned 
                         value, when interpreted as an ASCII string, 
                         gives a 4-character subtype ID. For FreeMiNT, 
                         being a derivative of the MiNT, the returned 
                         value is 0x46726565 ('Free').

                         If a subtype ID is less than 4 characters 
                         long, it should be padded with zeros.

                S_OSVERSION(0x0002) Identifies the exact operating 
                         system version. Returned LONGword contains a 
                         32-bit positive version number encoded as 
                         follows:

                          Bits   Meaning

                          0-7    Some printable character to 
                                 characterize the current version, 
                                 e.g.
                                  0x61    (`a') if alpha release,
                                  0x62    (`b') if beta release.
                                 For official releases you will always 
                                 find a value of 0 here.
                          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)

                         Definition of an official release: every 
                         release for which a value of 0 is returned in 
                         bits 0-7...

                S_OSHEADER(0x0003) Allows accessing the @{TOS ignore} 
                         header so as to get some information from it. 
                         Current implementation permits access to the 
                         first 256 LONGwords of the header. The 
                         address of the required LONGword, relative to 
                         the start address of the TOS header, has to 
                         be specified as arg1. Only even values are 
                         allowed (bit 0 of the @{I}arg1@{0} is 
                         masked out by the kernel). A whole LONGword 
                         is returned always.

                S_OSBUILDDATE(0x0004) Returns a 32-bit positive value 
                         with the build date encoded as follows:

                          Bits   Meaning

                          0-15   Binary year ($07dd for 1998)
                          16-23  Binary month ($0c for December)
                          24-31  Binary day of the month

                S_OSBUILDTIME(0x0005) Returns a 32-bit positive 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

                         Day of week has 1 for Monday, 2 for 
                         Tuesday... 7 for Sunday.

                         The call should never return a zero in these 
                         bits, but if it does, it should be 
                         interpreted as Sunday.

                S_OSCOMPILE(0x0006) Returns a 32-bit positive value 
                         specifying the primary CPU type the kernel 
                         has been compiled for. Encoding:

                          Bits   Meaning

                          0-7    Binary minor CPU ID
                          8-15   Binary major CPU ID
                          16-31  Reserved for future definition

                         The major ID identifies a particular series 
                         of processors. Currently only a value of $00 
                         is defined and it is assigned to Motorola 68k 
                         series. Other values of this field are 
                         reserved for future definition.

                         The minor CPU ID interpretation depends on 
                         the major ID. For 68k series, values are as 
                         follows:

                          0x00  68000 
                          0x0a  68010 
                          0x14  68020 
                          0x1e  68030 
                          0x28  68040 
                          0x3c  68060 

                         This is not the same as the _CPU cookie 
                         value. The _CPU cookie specifies the CPU 
                         physically present in the machine, while the 
                         S_OSCOMPILE indicates the processor type 
                         selected at the time when the system was 
                         compiled. In other words, running a 68000- 
                         compiled kernel will return a 0x00 here, even 
                         if the machine is running 68040 or something.

                S_OSFEATURES(0x0007) Returns a 32-bit positive value 
                         specifying the state of kernel features. 
                         Encoding:

                          Bits  Meaning

                          0     Memory protection (1 = turned on)
                          1     Virtual memory (1 = turned on)
                          2-31  Reserved for future usage

                         This call has an informative purpose only and 
                         you cannot toggle anything with it.

                S_GETCOOKIE(0x0008) Fetches required information from 
                         the cookie jar.

                           1. If arg1 is a value bigger than 65535 
                              (0xffff), 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.

                           2. 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.

                           3. If arg1 is equal to zero, then the 
                              cookie jar is searched for the NULL 
                              cookie, and the corresponding slot value 
                              is returned.

                         The place where the value fetched from the 
                         cookie jar will be returned is defined by 
                         arg2. If this is a zero, the call returns its 
                         values in the GEMDOS return value (d0). If 
                         arg2 is not a zero, it is interpreted as a 
                         pointer to a memory location where the slot 
                         tag or its value should be written to. The 
                         return value is 0 (E_OK) if everything went 
                         OK, or -1 otherwise.

                         This behaviour (where arg2 != NULL) is not 
                         implemented in MiNT versions below 1.14.8.

                S_SETCOOKIE(0x0009) Places a tag ID specified by arg1 
                         with the value of 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 adjusted. If 
                         there are no more free slots, no action is 
                         performed and ENOMEM is returned instead.

                         S_SETCOOKIE requires root euid, EACCES is 
                         returned otherwise and no action is 
                         performed.

                         The call refuses to place a cookie (a value 
                         of -1 is returned) whose tag id contains a 
                         zero-byte.

                S_GETLVAL(0x000a) Fetches and returns a LONGword from 
                         the address of supervisor area specified as a 
                         16-bit, even, unsigned integer value passed 
                         as arg1. Bit 0 and bits 16-31 are masked out 
                         (ignored). The call returns a zero if the 
                         value at the specified address has to be 
                         "hidden" from reading. Currently the hidden 
                         values are the initial PC value and the 
                         initial stack pointer value stored at 
                         0x00000000 and 0x00000004 respectively. 
                         Reading a hidden value may require root euid.

                         If the desired address is LONGword aligned, 
                         LONGwords can be also retrieved from the 
                         supervisor area using Setexc.

                S_GETWVAL(0x000b) Fetches and returns a word from the 
                         address of supervisor area specified as a 
                         16-bit, even, unsigned integer value passed 
                         as arg1. Bit 0 and bits 16-31 are masked out 
                         (ignored). The call returns a zero if the 
                         value at the specified address has to be 
                         "hidden" from reading. Currently the hidden 
                         values are the initial PC value and the 
                         initial stack pointer value stored at 
                         0x00000000 and 0x00000004 respectively. 
                         Reading a hidden value may require root euid.

                S_GETBVAL(0x000c) Fetches and returns a byte from the 
                         address of supervisor area specified as a 
                         16-bit unsigned integer value passed as arg1. 
                         Bits 16-31 are masked out (ignored). The call 
                         returns a zero if the value at the specified 
                         address has to be "hidden" from reading. 
                         Currently the hidden values are the initial 
                         PC value and the initial stack pointer value 
                         stored at 0x00000000 and 0x00000004 
                         respectively. Reading a hidden value may 
                         require root euid.

                S_SETLVAL(0x000d) Places a LONGword value specified by 
                         arg2 at address specified as 16-bit integer 
                         by arg1. Bit 0 and bits 16-31 of the arg1 are 
                         masked out (ignored). Since this call is 
                         designed to manipulate operating system 
                         variables located within the supervisor area 
                         (first 32k), it is restricted to root euid 
                         and returns EACCES if called by an 
                         unprivileged process.

                S_SETWVAL(0x000e) Places a word value specified by 
                         arg2 at address specified as 16-bit integer 
                         by arg1. Bit 0 and bits 16-31 of the arg1 are 
                         masked out (ignored). Since this call is 
                         designed to manipulate operating system 
                         variables located within the supervisor area 
                         (first 32k), it is restricted for root euid 
                         and returns EACCES if called by an 
                         unprivileged process.

                S_SETBVAL(0x000f) Places a byte value specified by 
                         arg2 at address specified as 16-bit integer 
                         by arg1. Bits 16-31 of the arg1 are masked 
                         out (ignored). Since this call is designed to 
                         manipulate operating system variables located 
                         within the supervisor area (first 32k), it is 
                         restricted for root euid and returns EACCES 
                         if called by an unprivileged process.

                S_SECLEVEL(0x0010) Resets the current security level 
                         to a value specified by arg1. Valid levels 
                         are as follows:

                         0: none of hardware specific system calls are 
                         restricted. This is a 'MultiTOS 
                         compatibility' mode.

                         1: BIOS and XBIOS calls require root 
                         privileges; any call except Supexec and Super 
                         returns EACCES if called by an unprivileged 
                         process. This does not apply to Setexc, which 
                         sends SIGSYS to the caller if a change of an 
                         exception vector was attempted.

                         2: as above, with except that Supexec and 
                         Super generates SIGSYS in order to kill the 
                         calling process.

                         On values bigger than 2, EACCES is returned. 
                         If arg1 is equal to -1, the current security 
                         level value is returned.

                         The call absolutely needs root privileges - 
                         user processes cannot even inquire the 
                         current security level value.

                S_RUNLEVEL(0x0011) Reserved for future definition.

                S_TSLICE(0x0012) Allows setting/interrogating the 
                         global timeslice value. Values are exactly 
                         the same as for SLICES keyword in mint.cnf. 
                         If arg1 is equal to -1, the call returns the 
                         current global timeslice value.

                         Setting the timeslice requires root 
                         privileges.

                S_FORCEFASTLOAD(0x0013) Allows changing the 
                         interpretation of the FASTLOAD bit in the 
                         program header.

                         On Ssystem(S_FORCEFASTLOAD, 0L, 0L); the 
                         program header bit will be used as before, 
                         this is actually equal to FASTLOAD=NO in 
                         mint.cnf.

                         On Ssystem(S_FORCEFASTLOAD, 1L, 0L); , the 
                         program header bit will be ignored and 
                         fastload will be forced for all programs.

                         arg1 = -1 allows interrogation of the current 
                         state of this variable.

                         You need root privileges to toggle the 
                         FASTLOAD mode.

                S_SYNCTIME(0x0014) Allows interrogation or changing 
                         the global file-system sync time. The default 
                         value is 5 sec.

                         If arg1 is a positive value, it is 
                         interpreted as a new sync time value.

                         If arg1 is equal to -1, the current sync time 
                         value will be returned.

                         To be able to change the file-system sync 
                         time you must have root privileges.

                S_BLOCKCACHE(0x0015) A positive value of arg1 ranging 
                         from 0 to 100 specifies the percentage of 
                         file-system cache to be filled with linear 
                         reads, as in the PERCENTAGE keyword in the 
                         mint.cnf file. A negative value of arg1 
                         returns the currently set percentage value.

                         Root privileges are required to use this 
                         mode.

                S_FLUSHCACHE(0x0016) Invalidates CPU cache entries. 
                         arg1 is a pointer to the memory area whose 
                         cache entries should be invalidated, arg2 is 
                         the size of the area in bytes. Passing -1 as 
                         arg2 invalidates all cache entries. If the 
                         CPU features separate instruction and data 
                         caches, both are flushed.

                         This call automatically recognizes caches in 
                         68020/030/040/060 and handles them as 
                         appropriate. The 68060 branch cache is 
                         automatically invalidated too. On 68000/68010 
                         calling this mode has no effect. This mode is 
                         in fact just an interface to the MiNT 
                         function cpush used internally by the system.

                         Root privileges are NOT required to use this 
                         mode.

                S_CTRLCACHE(0x0017) Provides an universal (among 68k 
                         family members) way of controlling the CPU 
                         on-chip caches. arg1, referenced as Cache 
                         Control Word (CCW), is a bit-field where each 
                         bit enables (if 1) or disables (if 0) a 
                         particular function of CPU caches. arg2, 
                         referenced as Cache Control Mask (CCM), is a 
                         bit-mask where you define (by setting 
                         appropriate bits to 1) which bits of the 
                         Cache Control Word should be actually taken 
                         into account and written into the Cache 
                         Control Register (CACR). This is the control 
                         mode of the S_CTRLCACHE.

                         In inquire mode you can pass -1 as either 
                         argument. If the CCW is -1, the call returns 
                         a LONGword reflecting the actual state of the 
                         caches.

                         If the CCM is -1, a default bit-mask is 
                         returned, where any bit set indicates that a 
                         cache function defined by the same bit in the 
                         Cache Control Word is valid for the processor 
                         the MiNT is currently running on.

                         If both arguments are negative, the call 
                         simply returns E_OK if it is valid at all, or 
                         ENOSYS otherwise. This is the acknowledge 
                         mode of the S_CTRLCACHE.

                         Bits in either argument are defined as 
                         follows:

                          0      Enable instruction cache
                          1      Enable data cache
                          2      Enable branch cache
                          3      Freeze instruction cache
                          4      Freeze data cache
                          5      Instruction burst enable
                          6      Data burst enable
                          7      Enable write allocate
                          8      Instruction cache full mode enable
                          9      Instruction cache read/write allocate 
                                 enable
                          10     Data cache full mode enable
                          11     Data cache read/write allocate enable
                          12     Invalidate branch cache
                          13     Invalidate branch cache user entries
                          14     Enable CPUSH invalidate
                          15     Enable store buffer
                          16-31  Reserved for future definition

                         Note that no processor currently supports all 
                         of these functions and some (68000 and 68010) 
                         have no on-chip caches at all. To figure out 
                         what functions are valid for the actual CPU 
                         used, you should first request the default 
                         bit-mask using the inquire mode described 
                         above. Your program should save this mask, 
                         logically AND the arg2 with it, then pass the 
                         result as the Cache Control Mask for a 
                         control mode call.

                         Also note that the above bit definition does 
                         not exactly reflect the function and even 
                         position of actual bits in the physical Cache 
                         Control Register. The bits of either argument 
                         are arbitrarily assigned to particular cache 
                         functions, but their position and state are 
                         converted by the system before the Cache 
                         Control Register is written and after it is 
                         read, so that the user program can see always 
                         the same functions assigned to bits as above 
                         regardless of the physical configuration of 
                         the Cache Control Register.

                         Since changing cache configuration is global 
                         and may severely affect system performance, 
                         root privileges are needed to use S_CTRLCACHE 
                         control mode.

                S_INITIALTPA(0x0018) A positive non-zero value of arg1 
                         defines the default amount of memory (in 
                         bytes) allocated for TPA space, as in the 
                         INITIALMEM keyword of the mint.cnf file. A 
                         negative value allows one to interrogate the 
                         value currently set. A value of 0 is illegal 
                         and will cause the call to fail and return 
                         EBADARG. Note that even if you define a very 
                         small value, like 1 or 2 bytes, the system 
                         will round this up to the smallest size of a 
                         memory block possible to allocate.

                         Root privileges are required to use this 
                         mode.

                S_CAD(0x0019) Reserved for future definition.

                S_CLOCKMODE(0x0064) S_CLOCKMODE(0x0064) S_CLOCKMODE 
                         called with an arg1 of -1 inquires the 
                         kernel's notion of the hardware system clock. 
                         If the command returns a 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. Any other 
                         positive value of arg1 sets the current clock 
                         mode. On a 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 the 
                         changed interpretation the clock seems to 
                         warp; don't play around too much with it.

                S_KNAME(0x0384) arg1 and arg2 specify the address and 
                         length in bytes, respectively, of a memory 
                         buffer where a NULL-terminated ASCII string 
                         will be written identifying the full name and 
                         version of the system kernel. If the memory 
                         buffer is not long enough to hold the entire 
                         string, the string is truncated down to the 
                         buffer size.

                S_CNAME(0x038e) arg1 and arg2 specify the address and 
                         length in bytes, respectively, of a memory 
                         buffer where a NULL-terminated ASCII string 
                         will be written identifying the full name of 
                         the compiler used to compile the system 
                         kernel. If the memory buffer is not long 
                         enough to hold the entire string, the string 
                         is truncated down to the buffer size.

                S_CVERSION(0x038f) arg1 and arg2 specify the address 
                         and length in bytes, respectively, of a 
                         memory buffer where a NULL-terminated ASCII 
                         string will be written identifying the 
                         version of the compiler used to compile the 
                         system kernel. If the memory buffer is not 
                         long enough to hold the entire string, the 
                         string is truncated down to the buffer size.

                S_CDEFINES(0x0390) arg1 and arg2 specify the address 
                         and length in bytes, respectively, of a 
                         memory buffer where a NULL-terminated ASCII 
                         string will be written containing the compile 
                         time definitions (switches) used while 
                         compiling the system kernel. If the memory 
                         buffer is not long enough to hold the entire 
                         string, the string is truncated down to the 
                         buffer size.

                S_COPTIM(0x0391) arg1 and arg2 specify the address and 
                         length in bytes, respectively, of a memory 
                         buffer where a NULL-terminated ASCII string 
                         will be written containing the compile time 
                         optimization options used while compiling the 
                         system kernel. If the memory buffer is not 
                         long enough to hold the entire string, the 
                         string is truncated down to the buffer size.

                S_DEBUGLEVEL(0x03e8) S_DEBUGLEVEL called with an arg1 
                         of -1 inquires the kernel's current debug 
                         level. Any other positive value will set the 
                         current debug level. If it is a zero, the 
                         kernel will not output any debugging 
                         information, except for fatal error-messages. 
                         The higher the debug level, the more MiNT 
                         will spew about what it is doing.

                         Note that special debug kernels will output 
                         more information than an ordinary 
                         distribution kernel.

                         Root privileges are needed to change the 
                         debug level.

                S_DEBUGDEV(0x03e9) S_DEBUGDEV called with an arg1 of 
                         -1 inquires the current BIOS device to output 
                         the debug information to. The order of 
                         defined BIOS devices is as follows:

                            . 0, printer
                            . 1, AUX:
                            . 2, console (default)
                            . 3, MIDI
                            . 4, keyboard
                            . 5, raw screen

                         Any positive value of arg1, ranging from 0 to 
                         9, will redirect the debug information output 
                         to an appropriate BIOS device. Notice 
                         however, that setting device 4 (keyboard) as 
                         a debug device does not make much sense and 
                         may produce undesired results. The system 
                         does not restrict this in any way though, 
                         just assuming that you know what you're 
                         doing.

                         Root privileges are needed to change the 
                         debug device.

                S_TIOCMGET(0x54f8) This mode is reserved for the 
                         internal and exclusive usage of the MiNT 
                         Library.

               Ssystem was first introduced as of MiNT version 1.14.6, 
               but it is considered fully functional as of MiNT 
               version 1.15.0 release.

               The S_OSHEADER opcode should be only used for fetching 
               the TOS version number when running MiNT versions below 
               1.15.0 release.

               The S_FLUSHCACHE, S_CTRLCACHE, S_DEBUGLEVEL and 
               S_DEBUGDEV are supported as of MiNT version 1.15.1 
               release.

               You should never use Ssystem(S_TIOCMGET, ...); in your 
               own programs.

               The Ssystem behaviour does not depend on the S_SECLEVEL 
               settings.

               Any values returned by the kernel on reserved fields 
               should be considered undocumented and no software 
               should rely on them.

               It's strictly encouraged to access GEMDOS variables and 
               system vectors via the Ssystem, because this way is 
               considered safe for multi-user setups. For example, you 
               can access the cookie jar pointer using the call 
               Ssystem(S_GETLVAL, 0x05a0, NULL), though if TOS- 
               compatibility is the issue you should rather use (2, 
               -1).

               Prior to any further Ssystem usage, your application 
               should first check if the kernel supports this call. If 
               it does, the Ssystem(-1, 0L, 0L); should return a zero.

               Ssystem is used and supported by the MiNT Library as of 
               patchlevel 48.

 Return value:

 Availability: Available when a 'MiNT' cookie with a version of at 
               least 1.15 exists.

 Group:        System functions

 See also:     Binding   Tgettimeofday   Tsettimeofday