2009-10-01 12:33:01 +02:00
|
|
|
/* This file defines constants for use in message communication (mostly)
|
|
|
|
* between system processes.
|
|
|
|
*
|
|
|
|
* A number of protocol message request and response types are defined. For
|
|
|
|
* debugging purposes, each protocol is assigned its own unique number range.
|
|
|
|
* The following such message type ranges have been allocated:
|
|
|
|
*
|
2013-11-04 22:48:08 +01:00
|
|
|
* 0x00 - 0xFF Process Manager (PM) requests (see callnr.h)
|
|
|
|
* 0x100 - 0x1FF Virtual File System (VFS) requests (see callnr.h)
|
2009-10-01 12:33:01 +02:00
|
|
|
* 0x200 - 0x2FF Data link layer requests and responses
|
|
|
|
* 0x300 - 0x3FF Bus controller requests and responses
|
2013-09-10 20:25:01 +02:00
|
|
|
* 0x400 - 0x4FF Character device requests and responses
|
|
|
|
* 0x500 - 0x5FF Block device requests and responses
|
2013-11-04 22:48:08 +01:00
|
|
|
* 0x600 - 0x6FF Kernel calls
|
2009-10-01 12:33:01 +02:00
|
|
|
* 0x700 - 0x7FF Reincarnation Server (RS) requests
|
|
|
|
* 0x800 - 0x8FF Data Store (DS) requests
|
|
|
|
* 0x900 - 0x9FF Requests from PM to VFS, and responses
|
|
|
|
* 0xA00 - 0xAFF Requests from VFS to file systems (see vfsif.h)
|
2013-11-04 22:48:08 +01:00
|
|
|
* 0xB00 - 0xBFF Transaction IDs from VFS to file systems (see vfsif.h)
|
2009-10-01 12:33:01 +02:00
|
|
|
* 0xC00 - 0xCFF Virtual Memory (VM) requests
|
|
|
|
* 0xD00 - 0xDFF IPC server requests
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
* 0xE00 - 0xEFF Common system messages (e.g. system signals)
|
2013-11-04 22:48:08 +01:00
|
|
|
* 0xF00 - 0xFFF Scheduling messages
|
2009-10-01 12:33:01 +02:00
|
|
|
* 0x1000 - 0x10FF Notify messages
|
2011-02-21 16:16:29 +01:00
|
|
|
* 0x1100 - 0x11FF USB
|
2013-11-04 22:48:08 +01:00
|
|
|
* 0x1200 - 0x12FF Devman
|
Input infrastructure, INPUT server, PCKBD driver
This commit separates the low-level keyboard driver from TTY, putting
it in a separate driver (PCKBD). The commit also separates management
of raw input devices from TTY, and puts it in a separate server
(INPUT). All keyboard and mouse input from hardware is sent by drivers
to the INPUT server, which either sends it to a process that has
opened a raw input device, or otherwise forwards it to TTY for
standard processing.
Design by Dirk Vogt. Prototype by Uli Kastlunger.
Additional changes made to the prototype:
- the event communication is now based on USB HID codes; all input
drivers have to use USB codes to describe events;
- all TTY keymaps have been converted to USB format, with the effect
that a single keymap covers all keys; there is no (static) escaped
keymap anymore;
- further keymap tweaks now allow remapping of literally all keys;
- input device renumbering and protocol rewrite;
- INPUT server rewrite, with added support for cancel and select;
- PCKBD reimplementation, including PC/AT-to-USB translation;
- support for manipulating keyboard LEDs has been added;
- keyboard and mouse multiplexer devices have been added to INPUT,
primarily so that an X server need only open two devices;
- a new "libinputdriver" library abstracts away protocol details from
input drivers, and should be used by all future input drivers;
- both INPUT and PCKBD can be restarted;
- TTY is now scheduled by KERNEL, so that it won't be punished for
running a lot; without this, simply running "yes" on the console
kills the system;
- the KIOCBELL IOCTL has been moved to /dev/console;
- support for the SCANCODES termios setting has been removed;
- obsolete keymap compression has been removed;
- the obsolete Olivetti M24 keymap has been removed.
Change-Id: I3a672fb8c4fd566734e4b46d3994b4b7fc96d578
2013-09-28 14:46:21 +02:00
|
|
|
* 0x1300 - 0x13FF TTY requests
|
2013-11-04 22:48:08 +01:00
|
|
|
* 0x1400 - 0x14FF Real Time Clock requests and responses
|
Input infrastructure, INPUT server, PCKBD driver
This commit separates the low-level keyboard driver from TTY, putting
it in a separate driver (PCKBD). The commit also separates management
of raw input devices from TTY, and puts it in a separate server
(INPUT). All keyboard and mouse input from hardware is sent by drivers
to the INPUT server, which either sends it to a process that has
opened a raw input device, or otherwise forwards it to TTY for
standard processing.
Design by Dirk Vogt. Prototype by Uli Kastlunger.
Additional changes made to the prototype:
- the event communication is now based on USB HID codes; all input
drivers have to use USB codes to describe events;
- all TTY keymaps have been converted to USB format, with the effect
that a single keymap covers all keys; there is no (static) escaped
keymap anymore;
- further keymap tweaks now allow remapping of literally all keys;
- input device renumbering and protocol rewrite;
- INPUT server rewrite, with added support for cancel and select;
- PCKBD reimplementation, including PC/AT-to-USB translation;
- support for manipulating keyboard LEDs has been added;
- keyboard and mouse multiplexer devices have been added to INPUT,
primarily so that an X server need only open two devices;
- a new "libinputdriver" library abstracts away protocol details from
input drivers, and should be used by all future input drivers;
- both INPUT and PCKBD can be restarted;
- TTY is now scheduled by KERNEL, so that it won't be punished for
running a lot; without this, simply running "yes" on the console
kills the system;
- the KIOCBELL IOCTL has been moved to /dev/console;
- support for the SCANCODES termios setting has been removed;
- obsolete keymap compression has been removed;
- the obsolete Olivetti M24 keymap has been removed.
Change-Id: I3a672fb8c4fd566734e4b46d3994b4b7fc96d578
2013-09-28 14:46:21 +02:00
|
|
|
* 0x1500 - 0x15FF Input server messages
|
2012-04-09 15:56:20 +02:00
|
|
|
* 0x1600 - 0x16FF VirtualBox (VBOX) requests (see vboxif.h)
|
Add PTYFS, Unix98 pseudo terminal support
This patch adds support for Unix98 pseudo terminals, that is,
posix_openpt(3), grantpt(3), unlockpt(3), /dev/ptmx, and /dev/pts/.
The latter is implemented with a new pseudo file system, PTYFS.
In effect, this patch adds secure support for unprivileged pseudo
terminal allocation, allowing programs such as tmux(1) to be used by
non-root users as well. Test77 has been extended with new tests, and
no longer needs to run as root.
The new functionality is optional. To revert to the old behavior,
remove the "ptyfs" entry from /etc/fstab.
Technical nodes:
o The reason for not implementing the NetBSD /dev/ptm approach is that
implementing the corresponding ioctl (TIOCPTMGET) would require
adding a number of extremely hairy exceptions to VFS, including the
PTY driver having to create new file descriptors for its own device
nodes.
o PTYFS is required for Unix98 PTYs in order to avoid that the PTY
driver has to be aware of old-style PTY naming schemes and even has
to call chmod(2) on a disk-backed file system. PTY cannot be its
own PTYFS since a character driver may currently not also be a file
system. However, PTYFS may be subsumed into a DEVFS in the future.
o The Unix98 PTY behavior differs somewhat from NetBSD's, in that
slave nodes are created on ptyfs only upon the first call to
grantpt(3). This approach obviates the need to revoke access as
part of the grantpt(3) call.
o Shutting down PTY may leave slave nodes on PTYFS, but once PTY is
restarted, these leftover slave nodes will be removed before they
create a security risk. Unmounting PTYFS will make existing PTY
slaves permanently unavailable, and absence of PTYFS will block
allocation of new Unix98 PTYs until PTYFS is (re)mounted.
Change-Id: I822b43ba32707c8815fd0f7d5bb7a438f51421c1
2015-06-22 19:14:34 +02:00
|
|
|
* 0x1700 - 0x17FF PTYFS requests
|
2009-10-01 12:33:01 +02:00
|
|
|
*
|
|
|
|
* Zero and negative values are widely used for OK and error responses.
|
|
|
|
*/
|
|
|
|
|
2005-07-27 15:09:38 +02:00
|
|
|
#ifndef _MINIX_COM_H
|
2005-08-03 13:53:36 +02:00
|
|
|
#define _MINIX_COM_H
|
2005-07-27 15:09:38 +02:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Process numbers of processes in the system image *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
/* Kernel tasks. These all run in the same address space. */
|
2011-04-08 17:14:48 +02:00
|
|
|
#define ASYNCM ((endpoint_t) -5) /* notifies about finished async sends */
|
2010-03-03 00:12:13 +01:00
|
|
|
#define IDLE ((endpoint_t) -4) /* runs when no one else can run */
|
|
|
|
#define CLOCK ((endpoint_t) -3) /* alarms and other clock functions */
|
|
|
|
#define SYSTEM ((endpoint_t) -2) /* request system functionality */
|
|
|
|
#define KERNEL ((endpoint_t) -1) /* pseudo-process for IPC and scheduling */
|
2005-05-24 16:35:58 +02:00
|
|
|
#define HARDWARE KERNEL /* for hardware interrupt handlers */
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* Number of tasks. Note that NR_PROCS is defined in <minix/config.h>. */
|
2009-09-29 22:13:41 +02:00
|
|
|
#define MAX_NR_TASKS 1023
|
2011-04-08 17:14:48 +02:00
|
|
|
#define NR_TASKS 5
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2005-07-26 14:50:41 +02:00
|
|
|
/* User-space processes, that is, device drivers, servers, and INIT. */
|
2010-03-03 00:12:13 +01:00
|
|
|
#define PM_PROC_NR ((endpoint_t) 0) /* process manager */
|
2010-06-08 15:58:01 +02:00
|
|
|
#define VFS_PROC_NR ((endpoint_t) 1) /* file system */
|
2010-03-03 00:12:13 +01:00
|
|
|
#define RS_PROC_NR ((endpoint_t) 2) /* reincarnation server */
|
|
|
|
#define MEM_PROC_NR ((endpoint_t) 3) /* memory driver (RAM disk, null, etc.) */
|
2013-09-21 17:35:15 +02:00
|
|
|
#define SCHED_PROC_NR ((endpoint_t) 4) /* scheduler */
|
2010-03-03 00:12:13 +01:00
|
|
|
#define TTY_PROC_NR ((endpoint_t) 5) /* terminal (TTY) driver */
|
|
|
|
#define DS_PROC_NR ((endpoint_t) 6) /* data store server */
|
|
|
|
#define MFS_PROC_NR ((endpoint_t) 7) /* minix root filesystem */
|
|
|
|
#define VM_PROC_NR ((endpoint_t) 8) /* memory server */
|
Scheduling server (by Bjorn Swift)
In this second phase, scheduling is moved from PM to its own
scheduler (see r6557 for phase one). In the next phase we hope to a)
include useful information in the "out of quantum" message and b)
create some simple scheduling policy that makes use of that
information.
When the system starts up, PM will iterate over its process table and
ask SCHED to take over scheduling unprivileged processes. This is
done by sending a SCHEDULING_START message to SCHED. This message
includes the processes endpoint, the parent's endpoint and its nice
level. The scheduler adds this process to its schedproc table, issues
a schedctl, and returns its own endpoint to PM - as the endpoint of
the effective scheduler. When a process terminates, a SCHEDULING_STOP
message is sent to the scheduler.
The reason for this effective endpoint is for future compatibility.
Some day, we may have a scheduler that, instead of scheduling the
process itself, forwards the SCHEDULING_START message on to another
scheduler.
PM has information on who schedules whom. As such, scheduling
messages from user-land are sent through PM. An example is when
processes change their priority, using nice(). In that case, a
getsetpriority message is sent to PM, which then sends a
SCHEDULING_SET_NICE to the process's effective scheduler.
When a process is forked through PM, it inherits its parent's
scheduler, but is spawned with an empty quantum. As before, a request
to fork a process flows through VM before returning to PM, which then
wakes up the child process. This flow has been modified slightly so
that PM notifies the scheduler of the new process, before waking up
the child process. If the scheduler fails to take over scheduling,
the child process is torn down and the fork fails with an erroneous
value.
Process priority is entirely decided upon using nice levels. PM
stores a copy of each process's nice level and when a child is
forked, its parent's nice level is sent in the SCHEDULING_START
message. How this level is mapped to a priority queue is up to the
scheduler. It should be noted that the nice level is used to
determine the max_priority and the parent could have been in a lower
priority when it was spawned. To prevent a CPU intensive process from
hawking the CPU by continuously forking children that get scheduled
in the max_priority, the scheduler should determine in which queue
the parent is currently scheduled, and schedule the child in that
same queue.
Other fixes: The USER_Q in kernel/proc.h was incorrectly defined as
NR_SCHED_QUEUES/2. That results in a "off by one" error when
converting priority->nice->priority for nice=0. This also had the
side effect that if someone were to set the MAX_USER_Q to something
else than 0, then USER_Q would be off.
2010-05-18 15:39:04 +02:00
|
|
|
#define PFS_PROC_NR ((endpoint_t) 9) /* pipe filesystem */
|
2013-09-21 17:35:15 +02:00
|
|
|
#define LAST_SPECIAL_PROC_NR 10 /* An untyped version for
|
2010-03-03 00:12:13 +01:00
|
|
|
computation in macros.*/
|
|
|
|
#define INIT_PROC_NR ((endpoint_t) LAST_SPECIAL_PROC_NR) /* init
|
|
|
|
-- goes multiuser */
|
2012-11-06 15:36:53 +01:00
|
|
|
#define NR_BOOT_MODULES (INIT_PROC_NR+1)
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2009-12-11 01:08:19 +01:00
|
|
|
/* Root system process and root user process. */
|
|
|
|
#define ROOT_SYS_PROC_NR RS_PROC_NR
|
|
|
|
#define ROOT_USR_PROC_NR INIT_PROC_NR
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Kernel notification types *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
/* Kernel notification types. In principle, these can be sent to any process,
|
|
|
|
* so make sure that these types do not interfere with other message types.
|
|
|
|
* Notifications are prioritized because of the way they are unhold() and
|
|
|
|
* blocking notifications are delivered. The lowest numbers go first. The
|
|
|
|
* offset are used for the per-process notification bit maps.
|
|
|
|
*/
|
2005-07-25 14:03:00 +02:00
|
|
|
#define NOTIFY_MESSAGE 0x1000
|
2010-03-23 01:09:11 +01:00
|
|
|
/* FIXME the old is_notify(a) should be replaced by is_ipc_notify(status). */
|
2010-04-08 15:41:35 +02:00
|
|
|
#define is_ipc_notify(ipc_status) (IPC_STATUS_CALL(ipc_status) == NOTIFY)
|
|
|
|
#define is_notify(a) ((unsigned) ((a) - NOTIFY_MESSAGE) < 0x100)
|
|
|
|
#define is_ipc_asynch(ipc_status) \
|
|
|
|
(is_ipc_notify(ipc_status) || IPC_STATUS_CALL(ipc_status) == SENDA)
|
2005-07-14 17:14:44 +02:00
|
|
|
|
2005-12-02 15:40:51 +01:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for BUS controller drivers *
|
|
|
|
*===========================================================================*/
|
|
|
|
#define BUSC_RQ_BASE 0x300 /* base for request types */
|
|
|
|
#define BUSC_RS_BASE 0x380 /* base for response types */
|
|
|
|
|
|
|
|
#define BUSC_PCI_INIT (BUSC_RQ_BASE + 0) /* First message to
|
|
|
|
* PCI driver
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_FIRST_DEV (BUSC_RQ_BASE + 1) /* Get index (and
|
|
|
|
* vid/did) of the
|
|
|
|
* first PCI device
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_NEXT_DEV (BUSC_RQ_BASE + 2) /* Get index (and
|
|
|
|
* vid/did) of the
|
|
|
|
* next PCI device
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_FIND_DEV (BUSC_RQ_BASE + 3) /* Get index of a
|
|
|
|
* PCI device based on
|
|
|
|
* bus/dev/function
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_IDS (BUSC_RQ_BASE + 4) /* Get vid/did from an
|
|
|
|
* index
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_RESERVE (BUSC_RQ_BASE + 7) /* Reserve a PCI dev */
|
|
|
|
#define BUSC_PCI_ATTR_R8 (BUSC_RQ_BASE + 8) /* Read 8-bit
|
|
|
|
* attribute value
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_ATTR_R16 (BUSC_RQ_BASE + 9) /* Read 16-bit
|
|
|
|
* attribute value
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_ATTR_R32 (BUSC_RQ_BASE + 10) /* Read 32-bit
|
|
|
|
* attribute value
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_ATTR_W8 (BUSC_RQ_BASE + 11) /* Write 8-bit
|
|
|
|
* attribute value
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_ATTR_W16 (BUSC_RQ_BASE + 12) /* Write 16-bit
|
|
|
|
* attribute value
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_ATTR_W32 (BUSC_RQ_BASE + 13) /* Write 32-bit
|
|
|
|
* attribute value
|
|
|
|
*/
|
2006-01-12 15:34:00 +01:00
|
|
|
#define BUSC_PCI_RESCAN (BUSC_RQ_BASE + 14) /* Rescan bus */
|
2006-07-10 14:13:29 +02:00
|
|
|
#define BUSC_PCI_DEV_NAME_S (BUSC_RQ_BASE + 15) /* Get the name of a
|
|
|
|
* PCI device
|
|
|
|
* (safecopy)
|
|
|
|
*/
|
|
|
|
#define BUSC_PCI_SLOT_NAME_S (BUSC_RQ_BASE + 16) /* Get the name of a
|
|
|
|
* PCI slot (safecopy)
|
|
|
|
*/
|
2007-04-23 14:01:47 +02:00
|
|
|
#define BUSC_PCI_SET_ACL (BUSC_RQ_BASE + 17) /* Set the ACL for a
|
2006-10-20 17:01:32 +02:00
|
|
|
* driver (safecopy)
|
|
|
|
*/
|
2007-04-23 14:01:47 +02:00
|
|
|
#define BUSC_PCI_DEL_ACL (BUSC_RQ_BASE + 18) /* Delete the ACL of a
|
|
|
|
* driver
|
|
|
|
*/
|
2010-07-01 11:10:16 +02:00
|
|
|
#define BUSC_PCI_GET_BAR (BUSC_RQ_BASE + 19) /* Get Base Address
|
|
|
|
* Register properties
|
|
|
|
*/
|
2008-02-25 15:39:19 +01:00
|
|
|
#define IOMMU_MAP (BUSC_RQ_BASE + 32) /* Ask IOMMU to map
|
|
|
|
* a segment of memory
|
|
|
|
*/
|
|
|
|
|
2013-07-15 16:29:09 +02:00
|
|
|
#define BUSC_I2C_RESERVE (BUSC_RQ_BASE + 64) /* reserve i2c device */
|
|
|
|
#define BUSC_I2C_EXEC (BUSC_RQ_BASE + 65) /* perform i2c action */
|
2008-02-25 15:39:19 +01:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for networking layer *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
2005-08-04 21:23:03 +02:00
|
|
|
/* Base type for data link layer requests and responses. */
|
2009-10-01 12:33:01 +02:00
|
|
|
#define DL_RQ_BASE 0x200
|
|
|
|
#define DL_RS_BASE 0x280
|
2005-08-04 21:23:03 +02:00
|
|
|
|
2013-08-18 12:04:25 +02:00
|
|
|
#define IS_DL_RQ(type) (((type) & ~0x7f) == DL_RQ_BASE)
|
|
|
|
#define IS_DL_RS(type) (((type) & ~0x7f) == DL_RS_BASE)
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* Message types for data link layer requests. */
|
2010-05-18 00:22:53 +02:00
|
|
|
#define DL_CONF (DL_RQ_BASE + 0)
|
|
|
|
#define DL_GETSTAT_S (DL_RQ_BASE + 1)
|
|
|
|
#define DL_WRITEV_S (DL_RQ_BASE + 2)
|
|
|
|
#define DL_READV_S (DL_RQ_BASE + 3)
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* Message type for data link layer replies. */
|
2010-05-18 00:22:53 +02:00
|
|
|
#define DL_CONF_REPLY (DL_RS_BASE + 0)
|
|
|
|
#define DL_STAT_REPLY (DL_RS_BASE + 1)
|
|
|
|
#define DL_TASK_REPLY (DL_RS_BASE + 2)
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2014-05-20 09:13:26 +02:00
|
|
|
/* Bits in 'flags' field of DL replies. */
|
2010-05-18 00:22:53 +02:00
|
|
|
# define DL_NOFLAGS 0x00
|
2005-04-21 16:53:53 +02:00
|
|
|
# define DL_PACK_SEND 0x01
|
|
|
|
# define DL_PACK_RECV 0x02
|
|
|
|
|
|
|
|
/* Bits in 'DL_MODE' field of DL requests. */
|
|
|
|
# define DL_NOMODE 0x0
|
2010-05-18 00:22:53 +02:00
|
|
|
# define DL_PROMISC_REQ 0x1
|
|
|
|
# define DL_MULTI_REQ 0x2
|
|
|
|
# define DL_BROAD_REQ 0x4
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/*===========================================================================*
|
|
|
|
* SYSTASK request types and field names *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
/* System library calls are dispatched via a call vector, so be careful when
|
|
|
|
* modifying the system call numbers. The numbers here determine which call
|
|
|
|
* is made from the call vector.
|
|
|
|
*/
|
2005-07-25 14:03:00 +02:00
|
|
|
#define KERNEL_CALL 0x600 /* base for kernel calls to SYSTEM */
|
|
|
|
|
2005-08-04 21:23:03 +02:00
|
|
|
# define SYS_FORK (KERNEL_CALL + 0) /* sys_fork() */
|
|
|
|
# define SYS_EXEC (KERNEL_CALL + 1) /* sys_exec() */
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
# define SYS_CLEAR (KERNEL_CALL + 2) /* sys_clear() */
|
Userspace scheduling
- cotributed by Bjorn Swift
- In this first phase, scheduling is moved from the kernel to the PM
server. The next steps are to a) moving scheduling to its own server
and b) include useful information in the "out of quantum" message,
so that the scheduler can make use of this information.
- The kernel process table now keeps record of who is responsible for
scheduling each process (p_scheduler). When this pointer is NULL,
the process will be scheduled by the kernel. If such a process runs
out of quantum, the kernel will simply renew its quantum an requeue
it.
- When PM loads, it will take over scheduling of all running
processes, except system processes, using sys_schedctl().
Essentially, this only results in taking over init. As children
inherit a scheduler from their parent, user space programs forked by
init will inherit PM (for now) as their scheduler.
- Once a process has been assigned a scheduler, and runs out of
quantum, its RTS_NO_QUANTUM flag will be set and the process
dequeued. The kernel will send a message to the scheduler, on the
process' behalf, informing the scheduler that it has run out of
quantum. The scheduler can take what ever action it pleases, based
on its policy, and then reschedule the process using the
sys_schedule() system call.
- Balance queues does not work as before. While the old in-kernel
function used to renew the quantum of processes in the highest
priority run queue, the user-space implementation only acts on
processes that have been bumped down to a lower priority queue.
This approach reacts slower to changes than the old one, but saves
us sending a sys_schedule message for each process every time we
balance the queues. Currently, when processes are moved up a
priority queue, their quantum is also renewed, but this can be
fiddled with.
- do_nice has been removed from kernel. PM answers to get- and
setpriority calls, updates it's own nice variable as well as the
max_run_queue. This will be refactored once scheduling is moved to a
separate server. We will probably have PM update it's local nice
value and then send a message to whoever is scheduling the process.
- changes to fix an issue in do_fork() where processes could run out
of quantum but bypassing the code path that handles it correctly.
The future plan is to remove the policy from do_fork() and implement
it in userspace too.
2010-03-29 13:07:20 +02:00
|
|
|
# define SYS_SCHEDULE (KERNEL_CALL + 3) /* sys_schedule() */
|
2005-08-04 21:23:03 +02:00
|
|
|
# define SYS_PRIVCTL (KERNEL_CALL + 4) /* sys_privctl() */
|
|
|
|
# define SYS_TRACE (KERNEL_CALL + 5) /* sys_trace() */
|
|
|
|
# define SYS_KILL (KERNEL_CALL + 6) /* sys_kill() */
|
|
|
|
|
|
|
|
# define SYS_GETKSIG (KERNEL_CALL + 7) /* sys_getsig() */
|
|
|
|
# define SYS_ENDKSIG (KERNEL_CALL + 8) /* sys_endsig() */
|
|
|
|
# define SYS_SIGSEND (KERNEL_CALL + 9) /* sys_sigsend() */
|
|
|
|
# define SYS_SIGRETURN (KERNEL_CALL + 10) /* sys_sigreturn() */
|
|
|
|
|
|
|
|
# define SYS_MEMSET (KERNEL_CALL + 13) /* sys_memset() */
|
|
|
|
|
|
|
|
# define SYS_UMAP (KERNEL_CALL + 14) /* sys_umap() */
|
|
|
|
# define SYS_VIRCOPY (KERNEL_CALL + 15) /* sys_vircopy() */
|
|
|
|
# define SYS_PHYSCOPY (KERNEL_CALL + 16) /* sys_physcopy() */
|
2011-06-10 16:28:20 +02:00
|
|
|
# define SYS_UMAP_REMOTE (KERNEL_CALL + 17) /* sys_umap_remote() */
|
2012-03-21 23:51:18 +01:00
|
|
|
# define SYS_VUMAP (KERNEL_CALL + 18) /* sys_vumap() */
|
2005-07-26 16:54:49 +02:00
|
|
|
|
2005-08-04 21:23:03 +02:00
|
|
|
# define SYS_IRQCTL (KERNEL_CALL + 19) /* sys_irqctl() */
|
|
|
|
# define SYS_INT86 (KERNEL_CALL + 20) /* sys_int86() */
|
|
|
|
# define SYS_DEVIO (KERNEL_CALL + 21) /* sys_devio() */
|
|
|
|
# define SYS_SDEVIO (KERNEL_CALL + 22) /* sys_sdevio() */
|
|
|
|
# define SYS_VDEVIO (KERNEL_CALL + 23) /* sys_vdevio() */
|
2005-07-26 16:54:49 +02:00
|
|
|
|
2005-08-04 21:23:03 +02:00
|
|
|
# define SYS_SETALARM (KERNEL_CALL + 24) /* sys_setalarm() */
|
|
|
|
# define SYS_TIMES (KERNEL_CALL + 25) /* sys_times() */
|
|
|
|
# define SYS_GETINFO (KERNEL_CALL + 26) /* sys_getinfo() */
|
|
|
|
# define SYS_ABORT (KERNEL_CALL + 27) /* sys_abort() */
|
2005-09-30 14:47:03 +02:00
|
|
|
# define SYS_IOPENABLE (KERNEL_CALL + 28) /* sys_enable_iop() */
|
2006-06-23 17:07:41 +02:00
|
|
|
# define SYS_SAFECOPYFROM (KERNEL_CALL + 31) /* sys_safecopyfrom() */
|
|
|
|
# define SYS_SAFECOPYTO (KERNEL_CALL + 32) /* sys_safecopyto() */
|
2006-06-23 13:54:03 +02:00
|
|
|
# define SYS_VSAFECOPY (KERNEL_CALL + 33) /* sys_vsafecopy() */
|
2006-06-23 17:35:05 +02:00
|
|
|
# define SYS_SETGRANT (KERNEL_CALL + 34) /* sys_setgrant() */
|
2006-07-10 14:13:29 +02:00
|
|
|
# define SYS_READBIOS (KERNEL_CALL + 35) /* sys_readbios() */
|
. introduced DEV_READ_S, DEV_WRITE_S, DEV_SCATTER_S, DEV_GATHER_S
and DEV_IOCTL_S as replacements for DEV_READ, DEV_WRITE, DEV_SCATTER,
DEV_GATHER and DEV_IOCTL. Instead of a direct address, the *_S commands
pass 'grant ids' to the drivers which are referenced through a new set
of copy calls (sys_safecopyfrom and sys_safecopyto). in order for this
copy to succeed, the grant must have previously been created in the
address space of the granter.
. bitmap manipulation functions moved to <minix/bitmap.h>
. HIGHPOS introduced as field containing high 32 bits of position in
device I/O message; TTY_FLAGS no longer used
. IO_GRANT field introduced for GRANTs, to replace ADDRESS
. REP_IO_GRANT field for un-SUSPEND messages introduced to indicate
grant for which I/O was done to disambiguate messages
. SYS_SAFECOPYFROM and SYS_SAFECOPYTO introduced as new calls
. SYS_PRIV_SET_GRANTS code introduced as a code to set the address and
size of the grant table in a process' own address space
. 'type' and 'direction' field of _ins* and _outs* I/O functions
are merged into one by ORing _DIO_INPUT/_DIO_OUTPUT and _DIO_BYTE/_DIO_WORD
etc. This allows for an additional parameter, _DIO_SAFE, which indicates
the address in another address space isn't actually an address, but
a grant id. Also needs an offset, for which fields had to be merged.
. SCP_* are field names for SYS_SAFECOPY* functions
. DIAGNOSTICS and GET_KMESS moved to their own range above DIAG_BASE,
added DIAGNOSTICS_S which is a grant-based variant of DIAGNOSTICS
. removed obsolete BINCOMPAT and SRCCOMPAT options
. added GRANT_SEG type for use in vircopy - allows copying to a grant
id (without offset)
. added _MINIX_IOCTL_* macros that decode information encoded by
_IO* macros in ioctl codes, used to check which grants are necessary
for an ioctl
. introduced the type endpoint_t for process endpoints, changed some
prototypes and struct field types to match
. renamed protected to prot for g++
2006-06-20 10:38:15 +02:00
|
|
|
|
2006-10-30 16:53:38 +01:00
|
|
|
# define SYS_SPROF (KERNEL_CALL + 36) /* sys_sprof() */
|
|
|
|
|
2010-01-05 20:39:27 +01:00
|
|
|
# define SYS_STIME (KERNEL_CALL + 39) /* sys_stime() */
|
2013-03-30 17:59:21 +01:00
|
|
|
# define SYS_SETTIME (KERNEL_CALL + 40) /* sys_settime() */
|
2007-08-07 13:55:28 +02:00
|
|
|
|
2010-01-05 20:39:27 +01:00
|
|
|
# define SYS_VMCTL (KERNEL_CALL + 43) /* sys_vmctl() */
|
2013-09-21 00:58:46 +02:00
|
|
|
|
|
|
|
# define SYS_DIAGCTL (KERNEL_CALL + 44) /* sys_diagctl() */
|
2008-02-21 16:57:35 +01:00
|
|
|
|
2009-08-15 23:37:26 +02:00
|
|
|
# define SYS_VTIMER (KERNEL_CALL + 45) /* sys_vtimer() */
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
# define SYS_RUNCTL (KERNEL_CALL + 46) /* sys_runctl() */
|
2010-03-12 16:58:41 +01:00
|
|
|
# define SYS_GETMCONTEXT (KERNEL_CALL + 50) /* sys_getmcontext() */
|
|
|
|
# define SYS_SETMCONTEXT (KERNEL_CALL + 51) /* sys_setmcontext() */
|
2009-08-15 23:37:26 +02:00
|
|
|
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
# define SYS_UPDATE (KERNEL_CALL + 52) /* sys_update() */
|
|
|
|
# define SYS_EXIT (KERNEL_CALL + 53) /* sys_exit() */
|
|
|
|
|
Userspace scheduling
- cotributed by Bjorn Swift
- In this first phase, scheduling is moved from the kernel to the PM
server. The next steps are to a) moving scheduling to its own server
and b) include useful information in the "out of quantum" message,
so that the scheduler can make use of this information.
- The kernel process table now keeps record of who is responsible for
scheduling each process (p_scheduler). When this pointer is NULL,
the process will be scheduled by the kernel. If such a process runs
out of quantum, the kernel will simply renew its quantum an requeue
it.
- When PM loads, it will take over scheduling of all running
processes, except system processes, using sys_schedctl().
Essentially, this only results in taking over init. As children
inherit a scheduler from their parent, user space programs forked by
init will inherit PM (for now) as their scheduler.
- Once a process has been assigned a scheduler, and runs out of
quantum, its RTS_NO_QUANTUM flag will be set and the process
dequeued. The kernel will send a message to the scheduler, on the
process' behalf, informing the scheduler that it has run out of
quantum. The scheduler can take what ever action it pleases, based
on its policy, and then reschedule the process using the
sys_schedule() system call.
- Balance queues does not work as before. While the old in-kernel
function used to renew the quantum of processes in the highest
priority run queue, the user-space implementation only acts on
processes that have been bumped down to a lower priority queue.
This approach reacts slower to changes than the old one, but saves
us sending a sys_schedule message for each process every time we
balance the queues. Currently, when processes are moved up a
priority queue, their quantum is also renewed, but this can be
fiddled with.
- do_nice has been removed from kernel. PM answers to get- and
setpriority calls, updates it's own nice variable as well as the
max_run_queue. This will be refactored once scheduling is moved to a
separate server. We will probably have PM update it's local nice
value and then send a message to whoever is scheduling the process.
- changes to fix an issue in do_fork() where processes could run out
of quantum but bypassing the code path that handles it correctly.
The future plan is to remove the policy from do_fork() and implement
it in userspace too.
2010-03-29 13:07:20 +02:00
|
|
|
# define SYS_SCHEDCTL (KERNEL_CALL + 54) /* sys_schedctl() */
|
2010-04-08 15:41:35 +02:00
|
|
|
# define SYS_STATECTL (KERNEL_CALL + 55) /* sys_statectl() */
|
Userspace scheduling
- cotributed by Bjorn Swift
- In this first phase, scheduling is moved from the kernel to the PM
server. The next steps are to a) moving scheduling to its own server
and b) include useful information in the "out of quantum" message,
so that the scheduler can make use of this information.
- The kernel process table now keeps record of who is responsible for
scheduling each process (p_scheduler). When this pointer is NULL,
the process will be scheduled by the kernel. If such a process runs
out of quantum, the kernel will simply renew its quantum an requeue
it.
- When PM loads, it will take over scheduling of all running
processes, except system processes, using sys_schedctl().
Essentially, this only results in taking over init. As children
inherit a scheduler from their parent, user space programs forked by
init will inherit PM (for now) as their scheduler.
- Once a process has been assigned a scheduler, and runs out of
quantum, its RTS_NO_QUANTUM flag will be set and the process
dequeued. The kernel will send a message to the scheduler, on the
process' behalf, informing the scheduler that it has run out of
quantum. The scheduler can take what ever action it pleases, based
on its policy, and then reschedule the process using the
sys_schedule() system call.
- Balance queues does not work as before. While the old in-kernel
function used to renew the quantum of processes in the highest
priority run queue, the user-space implementation only acts on
processes that have been bumped down to a lower priority queue.
This approach reacts slower to changes than the old one, but saves
us sending a sys_schedule message for each process every time we
balance the queues. Currently, when processes are moved up a
priority queue, their quantum is also renewed, but this can be
fiddled with.
- do_nice has been removed from kernel. PM answers to get- and
setpriority calls, updates it's own nice variable as well as the
max_run_queue. This will be refactored once scheduling is moved to a
separate server. We will probably have PM update it's local nice
value and then send a message to whoever is scheduling the process.
- changes to fix an issue in do_fork() where processes could run out
of quantum but bypassing the code path that handles it correctly.
The future plan is to remove the policy from do_fork() and implement
it in userspace too.
2010-03-29 13:07:20 +02:00
|
|
|
|
2012-09-22 22:01:05 +02:00
|
|
|
# define SYS_SAFEMEMSET (KERNEL_CALL + 56) /* sys_safememset() */
|
|
|
|
|
2013-08-28 06:43:45 +02:00
|
|
|
# define SYS_PADCONF (KERNEL_CALL + 57) /* sys_padconf() */
|
|
|
|
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
/* Total */
|
2013-08-28 06:43:45 +02:00
|
|
|
#define NR_SYS_CALLS 58 /* number of kernel calls */
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
|
Initialization protocol for system services.
SYSLIB CHANGES:
- SEF framework now supports a new SEF Init request type from RS. 3 different
callbacks are available (init_fresh, init_lu, init_restart) to specify
initialization code when a service starts fresh, starts after a live update,
or restarts.
SYSTEM SERVICE CHANGES:
- Initialization code for system services is now enclosed in a callback SEF will
automatically call at init time. The return code of the callback will
tell RS whether the initialization completed successfully.
- Each init callback can access information passed by RS to initialize. As of
now, each system service has access to the public entries of RS's system process
table to gather all the information required to initialize. This design
eliminates many existing or potential races at boot time and provides a uniform
initialization interface to system services. The same interface will be reused
for the upcoming publish/subscribe model to handle dynamic
registration / deregistration of system services.
VM CHANGES:
- Uniform privilege management for all system services. Every service uses the
same call mask format. For boot services, VM copies the call mask from init
data. For dynamic services, VM still receives the call mask via rs_set_priv
call that will be soon replaced by the upcoming publish/subscribe model.
RS CHANGES:
- The system process table has been reorganized and split into private entries
and public entries. Only the latter ones are exposed to system services.
- VM call masks are now entirely configured in rs/table.c
- RS has now its own slot in the system process table. Only kernel tasks and
user processes not included in the boot image are now left out from the system
process table.
- RS implements the initialization protocol for system services.
- For services in the boot image, RS blocks till initialization is complete and
panics when failure is reported back. Services are initialized in their order of
appearance in the boot image priv table and RS blocks to implements synchronous
initialization for every system service having the flag SF_SYNCH_BOOT set.
- For services started dynamically, the initialization protocol is implemented
as though it were the first ping for the service. In this case, if the
system service fails to report back (or reports failure), RS brings the service
down rather than trying to restart it.
2010-01-08 02:20:42 +01:00
|
|
|
#define SYS_CALL_MASK_SIZE BITMAP_CHUNKS(NR_SYS_CALLS)
|
2005-07-26 16:54:49 +02:00
|
|
|
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
/* Basic kernel calls allowed to every system process. */
|
|
|
|
#define SYS_BASIC_CALLS \
|
|
|
|
SYS_EXIT, SYS_SAFECOPYFROM, SYS_SAFECOPYTO, SYS_VSAFECOPY, SYS_GETINFO, \
|
2012-10-25 16:38:38 +02:00
|
|
|
SYS_TIMES, SYS_SETALARM, SYS_SETGRANT, \
|
2014-09-30 14:31:44 +02:00
|
|
|
SYS_DIAGCTL, SYS_STATECTL, SYS_SAFEMEMSET
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* Field names for SYS_DEVIO, SYS_VDEVIO, SYS_SDEVIO. */
|
. introduced DEV_READ_S, DEV_WRITE_S, DEV_SCATTER_S, DEV_GATHER_S
and DEV_IOCTL_S as replacements for DEV_READ, DEV_WRITE, DEV_SCATTER,
DEV_GATHER and DEV_IOCTL. Instead of a direct address, the *_S commands
pass 'grant ids' to the drivers which are referenced through a new set
of copy calls (sys_safecopyfrom and sys_safecopyto). in order for this
copy to succeed, the grant must have previously been created in the
address space of the granter.
. bitmap manipulation functions moved to <minix/bitmap.h>
. HIGHPOS introduced as field containing high 32 bits of position in
device I/O message; TTY_FLAGS no longer used
. IO_GRANT field introduced for GRANTs, to replace ADDRESS
. REP_IO_GRANT field for un-SUSPEND messages introduced to indicate
grant for which I/O was done to disambiguate messages
. SYS_SAFECOPYFROM and SYS_SAFECOPYTO introduced as new calls
. SYS_PRIV_SET_GRANTS code introduced as a code to set the address and
size of the grant table in a process' own address space
. 'type' and 'direction' field of _ins* and _outs* I/O functions
are merged into one by ORing _DIO_INPUT/_DIO_OUTPUT and _DIO_BYTE/_DIO_WORD
etc. This allows for an additional parameter, _DIO_SAFE, which indicates
the address in another address space isn't actually an address, but
a grant id. Also needs an offset, for which fields had to be merged.
. SCP_* are field names for SYS_SAFECOPY* functions
. DIAGNOSTICS and GET_KMESS moved to their own range above DIAG_BASE,
added DIAGNOSTICS_S which is a grant-based variant of DIAGNOSTICS
. removed obsolete BINCOMPAT and SRCCOMPAT options
. added GRANT_SEG type for use in vircopy - allows copying to a grant
id (without offset)
. added _MINIX_IOCTL_* macros that decode information encoded by
_IO* macros in ioctl codes, used to check which grants are necessary
for an ioctl
. introduced the type endpoint_t for process endpoints, changed some
prototypes and struct field types to match
. renamed protected to prot for g++
2006-06-20 10:38:15 +02:00
|
|
|
# define _DIO_INPUT 0x001
|
|
|
|
# define _DIO_OUTPUT 0x002
|
|
|
|
# define _DIO_DIRMASK 0x00f
|
|
|
|
# define _DIO_BYTE 0x010
|
|
|
|
# define _DIO_WORD 0x020
|
|
|
|
# define _DIO_LONG 0x030
|
|
|
|
# define _DIO_TYPEMASK 0x0f0
|
|
|
|
# define _DIO_SAFE 0x100
|
|
|
|
# define _DIO_SAFEMASK 0xf00
|
|
|
|
# define DIO_INPUT_BYTE (_DIO_INPUT|_DIO_BYTE)
|
|
|
|
# define DIO_INPUT_WORD (_DIO_INPUT|_DIO_WORD)
|
2010-01-05 20:39:27 +01:00
|
|
|
# define DIO_INPUT_LONG (_DIO_INPUT|_DIO_LONG)
|
. introduced DEV_READ_S, DEV_WRITE_S, DEV_SCATTER_S, DEV_GATHER_S
and DEV_IOCTL_S as replacements for DEV_READ, DEV_WRITE, DEV_SCATTER,
DEV_GATHER and DEV_IOCTL. Instead of a direct address, the *_S commands
pass 'grant ids' to the drivers which are referenced through a new set
of copy calls (sys_safecopyfrom and sys_safecopyto). in order for this
copy to succeed, the grant must have previously been created in the
address space of the granter.
. bitmap manipulation functions moved to <minix/bitmap.h>
. HIGHPOS introduced as field containing high 32 bits of position in
device I/O message; TTY_FLAGS no longer used
. IO_GRANT field introduced for GRANTs, to replace ADDRESS
. REP_IO_GRANT field for un-SUSPEND messages introduced to indicate
grant for which I/O was done to disambiguate messages
. SYS_SAFECOPYFROM and SYS_SAFECOPYTO introduced as new calls
. SYS_PRIV_SET_GRANTS code introduced as a code to set the address and
size of the grant table in a process' own address space
. 'type' and 'direction' field of _ins* and _outs* I/O functions
are merged into one by ORing _DIO_INPUT/_DIO_OUTPUT and _DIO_BYTE/_DIO_WORD
etc. This allows for an additional parameter, _DIO_SAFE, which indicates
the address in another address space isn't actually an address, but
a grant id. Also needs an offset, for which fields had to be merged.
. SCP_* are field names for SYS_SAFECOPY* functions
. DIAGNOSTICS and GET_KMESS moved to their own range above DIAG_BASE,
added DIAGNOSTICS_S which is a grant-based variant of DIAGNOSTICS
. removed obsolete BINCOMPAT and SRCCOMPAT options
. added GRANT_SEG type for use in vircopy - allows copying to a grant
id (without offset)
. added _MINIX_IOCTL_* macros that decode information encoded by
_IO* macros in ioctl codes, used to check which grants are necessary
for an ioctl
. introduced the type endpoint_t for process endpoints, changed some
prototypes and struct field types to match
. renamed protected to prot for g++
2006-06-20 10:38:15 +02:00
|
|
|
# define DIO_OUTPUT_BYTE (_DIO_OUTPUT|_DIO_BYTE)
|
|
|
|
# define DIO_OUTPUT_WORD (_DIO_OUTPUT|_DIO_WORD)
|
2010-01-05 20:39:27 +01:00
|
|
|
# define DIO_OUTPUT_LONG (_DIO_OUTPUT|_DIO_LONG)
|
. introduced DEV_READ_S, DEV_WRITE_S, DEV_SCATTER_S, DEV_GATHER_S
and DEV_IOCTL_S as replacements for DEV_READ, DEV_WRITE, DEV_SCATTER,
DEV_GATHER and DEV_IOCTL. Instead of a direct address, the *_S commands
pass 'grant ids' to the drivers which are referenced through a new set
of copy calls (sys_safecopyfrom and sys_safecopyto). in order for this
copy to succeed, the grant must have previously been created in the
address space of the granter.
. bitmap manipulation functions moved to <minix/bitmap.h>
. HIGHPOS introduced as field containing high 32 bits of position in
device I/O message; TTY_FLAGS no longer used
. IO_GRANT field introduced for GRANTs, to replace ADDRESS
. REP_IO_GRANT field for un-SUSPEND messages introduced to indicate
grant for which I/O was done to disambiguate messages
. SYS_SAFECOPYFROM and SYS_SAFECOPYTO introduced as new calls
. SYS_PRIV_SET_GRANTS code introduced as a code to set the address and
size of the grant table in a process' own address space
. 'type' and 'direction' field of _ins* and _outs* I/O functions
are merged into one by ORing _DIO_INPUT/_DIO_OUTPUT and _DIO_BYTE/_DIO_WORD
etc. This allows for an additional parameter, _DIO_SAFE, which indicates
the address in another address space isn't actually an address, but
a grant id. Also needs an offset, for which fields had to be merged.
. SCP_* are field names for SYS_SAFECOPY* functions
. DIAGNOSTICS and GET_KMESS moved to their own range above DIAG_BASE,
added DIAGNOSTICS_S which is a grant-based variant of DIAGNOSTICS
. removed obsolete BINCOMPAT and SRCCOMPAT options
. added GRANT_SEG type for use in vircopy - allows copying to a grant
id (without offset)
. added _MINIX_IOCTL_* macros that decode information encoded by
_IO* macros in ioctl codes, used to check which grants are necessary
for an ioctl
. introduced the type endpoint_t for process endpoints, changed some
prototypes and struct field types to match
. renamed protected to prot for g++
2006-06-20 10:38:15 +02:00
|
|
|
# define DIO_SAFE_INPUT_BYTE (_DIO_INPUT|_DIO_BYTE|_DIO_SAFE)
|
|
|
|
# define DIO_SAFE_INPUT_WORD (_DIO_INPUT|_DIO_WORD|_DIO_SAFE)
|
2010-01-05 20:39:27 +01:00
|
|
|
# define DIO_SAFE_INPUT_LONG (_DIO_INPUT|_DIO_LONG|_DIO_SAFE)
|
. introduced DEV_READ_S, DEV_WRITE_S, DEV_SCATTER_S, DEV_GATHER_S
and DEV_IOCTL_S as replacements for DEV_READ, DEV_WRITE, DEV_SCATTER,
DEV_GATHER and DEV_IOCTL. Instead of a direct address, the *_S commands
pass 'grant ids' to the drivers which are referenced through a new set
of copy calls (sys_safecopyfrom and sys_safecopyto). in order for this
copy to succeed, the grant must have previously been created in the
address space of the granter.
. bitmap manipulation functions moved to <minix/bitmap.h>
. HIGHPOS introduced as field containing high 32 bits of position in
device I/O message; TTY_FLAGS no longer used
. IO_GRANT field introduced for GRANTs, to replace ADDRESS
. REP_IO_GRANT field for un-SUSPEND messages introduced to indicate
grant for which I/O was done to disambiguate messages
. SYS_SAFECOPYFROM and SYS_SAFECOPYTO introduced as new calls
. SYS_PRIV_SET_GRANTS code introduced as a code to set the address and
size of the grant table in a process' own address space
. 'type' and 'direction' field of _ins* and _outs* I/O functions
are merged into one by ORing _DIO_INPUT/_DIO_OUTPUT and _DIO_BYTE/_DIO_WORD
etc. This allows for an additional parameter, _DIO_SAFE, which indicates
the address in another address space isn't actually an address, but
a grant id. Also needs an offset, for which fields had to be merged.
. SCP_* are field names for SYS_SAFECOPY* functions
. DIAGNOSTICS and GET_KMESS moved to their own range above DIAG_BASE,
added DIAGNOSTICS_S which is a grant-based variant of DIAGNOSTICS
. removed obsolete BINCOMPAT and SRCCOMPAT options
. added GRANT_SEG type for use in vircopy - allows copying to a grant
id (without offset)
. added _MINIX_IOCTL_* macros that decode information encoded by
_IO* macros in ioctl codes, used to check which grants are necessary
for an ioctl
. introduced the type endpoint_t for process endpoints, changed some
prototypes and struct field types to match
. renamed protected to prot for g++
2006-06-20 10:38:15 +02:00
|
|
|
# define DIO_SAFE_OUTPUT_BYTE (_DIO_OUTPUT|_DIO_BYTE|_DIO_SAFE)
|
|
|
|
# define DIO_SAFE_OUTPUT_WORD (_DIO_OUTPUT|_DIO_WORD|_DIO_SAFE)
|
2010-01-05 20:39:27 +01:00
|
|
|
# define DIO_SAFE_OUTPUT_LONG (_DIO_OUTPUT|_DIO_LONG|_DIO_SAFE)
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* Field names for SYS_IRQCTL. */
|
|
|
|
# define IRQ_SETPOLICY 1 /* manage a slot of the IRQ table */
|
2005-05-12 18:07:15 +02:00
|
|
|
# define IRQ_RMPOLICY 2 /* remove a slot of the IRQ table */
|
|
|
|
# define IRQ_ENABLE 3 /* enable interrupts */
|
|
|
|
# define IRQ_DISABLE 4 /* disable interrupts */
|
2005-09-16 16:23:14 +02:00
|
|
|
# define IRQ_REENABLE 0x001 /* reenable IRQ line after interrupt */
|
|
|
|
# define IRQ_BYTE 0x100 /* byte values */
|
|
|
|
# define IRQ_WORD 0x200 /* word values */
|
|
|
|
# define IRQ_LONG 0x400 /* long values */
|
2005-04-21 16:53:53 +02:00
|
|
|
|
make vfs & filesystems use failable copying
Change the kernel to add features to vircopy and safecopies so that
transparent copy fixing won't happen to avoid deadlocks, and such copies
fail with EFAULT.
Transparently making copying work from filesystems (as normally done by
the kernel & VM when copying fails because of missing/readonly memory)
is problematic as it can happen that, for file-mapped ranges, that that
same filesystem that is blocked on the copy request is needed to satisfy
the memory range, leading to deadlock. Dito for VFS itself, if done with
a blocking call.
This change makes the copying done from a filesystem fail in such cases
with EFAULT by VFS adding the CPF_TRY flag to the grants. If a FS call
fails with EFAULT, VFS will then request the range to be made available
to VM after the FS is unblocked, allowing it to be used to satisfy the
range if need be in another VFS thread.
Similarly, for datacopies that VFS itself does, it uses the failable
vircopy variant and callers use a wrapper that talk to VM if necessary
to get the copy to work.
. kernel: add CPF_TRY flag to safecopies
. kernel: only request writable ranges to VM for the
target buffer when copying fails
. do copying in VFS TRY-first
. some fixes in VM to build SANITYCHECK mode
. add regression test for the cases where
- a FS system call needs memory mapped in a process that the
FS itself must map.
- such a range covers more than one file-mapped region.
. add 'try' mode to vircopy, physcopy
. add flags field to copy kernel call messages
. if CP_FLAG_TRY is set, do not transparently try
to fix memory ranges
. for use by VFS when accessing user buffers to avoid
deadlock
. remove some obsolete backwards compatability assignments
. VFS: let thread scheduling work for VM requests too
Allows VFS to make calls to VM while suspending and resuming
the currently running thread. Does currently not work for the
main thread.
. VM: add fix memory range call for use by VFS
Change-Id: I295794269cea51a3163519a9cfe5901301d90b32
2014-01-16 14:22:13 +01:00
|
|
|
#define CP_FLAG_TRY 0x01 /* do not transparently map */
|
2012-06-16 19:29:37 +02:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* Field names for SYS_GETINFO. */
|
2005-04-29 17:36:43 +02:00
|
|
|
# define GET_KINFO 0 /* get kernel information structure */
|
2005-04-21 16:53:53 +02:00
|
|
|
# define GET_IMAGE 1 /* get system image table */
|
2005-06-03 15:55:06 +02:00
|
|
|
# define GET_PROCTAB 2 /* get kernel process table */
|
|
|
|
# define GET_RANDOMNESS 3 /* get randomness buffer */
|
2005-04-21 16:53:53 +02:00
|
|
|
# define GET_MONPARAMS 4 /* get monitor parameters */
|
|
|
|
# define GET_KENV 5 /* get kernel environment string */
|
2005-05-02 16:30:04 +02:00
|
|
|
# define GET_IRQHOOKS 6 /* get the IRQ table */
|
2005-07-14 17:14:44 +02:00
|
|
|
# define GET_PRIVTAB 8 /* get kernel privileges table */
|
2005-04-21 16:53:53 +02:00
|
|
|
# define GET_KADDRESSES 9 /* get various kernel addresses */
|
|
|
|
# define GET_SCHEDINFO 10 /* get scheduling queues */
|
|
|
|
# define GET_PROC 11 /* get process slot if given process */
|
2005-04-29 17:36:43 +02:00
|
|
|
# define GET_MACHINE 12 /* get machine information */
|
2011-02-21 16:16:29 +01:00
|
|
|
# define GET_LOCKTIMING 13 /* get lock()/unlock() latency timing */
|
2005-07-29 12:21:04 +02:00
|
|
|
# define GET_BIOSBUFFER 14 /* get a buffer for BIOS calls */
|
2005-11-14 16:58:07 +01:00
|
|
|
# define GET_LOADINFO 15 /* get load average information */
|
2007-04-23 14:01:47 +02:00
|
|
|
# define GET_IRQACTIDS 16 /* get the IRQ masks */
|
2009-12-11 01:08:19 +01:00
|
|
|
# define GET_PRIV 17 /* get privilege structure */
|
2008-11-19 13:26:10 +01:00
|
|
|
# define GET_HZ 18 /* get HZ value */
|
2010-07-07 00:05:21 +02:00
|
|
|
# define GET_WHOAMI 19 /* get own name, endpoint, and privileges */
|
2009-04-02 17:24:44 +02:00
|
|
|
# define GET_RANDOMNESS_BIN 20 /* get one randomness bin */
|
2009-12-02 12:52:26 +01:00
|
|
|
# define GET_IDLETSC 21 /* get cumulative idle time stamp counter */
|
2010-10-26 23:07:50 +02:00
|
|
|
# define GET_CPUINFO 23 /* get information about cpus */
|
2011-11-22 02:07:33 +01:00
|
|
|
# define GET_REGS 24 /* get general process registers */
|
2013-06-25 14:41:01 +02:00
|
|
|
# define GET_RUSAGE 25 /* get resource usage */
|
2008-11-19 13:26:10 +01:00
|
|
|
|
2010-01-05 20:39:27 +01:00
|
|
|
/* Subfunctions for SYS_PRIVCTL */
|
|
|
|
#define SYS_PRIV_ALLOW 1 /* Allow process to run */
|
|
|
|
#define SYS_PRIV_DISALLOW 2 /* Disallow process to run */
|
|
|
|
#define SYS_PRIV_SET_SYS 3 /* Set a system privilege structure */
|
|
|
|
#define SYS_PRIV_SET_USER 4 /* Set a user privilege structure */
|
|
|
|
#define SYS_PRIV_ADD_IO 5 /* Add I/O range (struct io_range) */
|
|
|
|
#define SYS_PRIV_ADD_MEM 6 /* Add memory range (struct mem_range)
|
|
|
|
*/
|
|
|
|
#define SYS_PRIV_ADD_IRQ 7 /* Add IRQ */
|
|
|
|
#define SYS_PRIV_QUERY_MEM 8 /* Verify memory privilege. */
|
2010-07-07 00:05:21 +02:00
|
|
|
#define SYS_PRIV_UPDATE_SYS 9 /* Update a sys privilege structure. */
|
2010-07-09 20:29:04 +02:00
|
|
|
#define SYS_PRIV_YIELD 10 /* Allow process to run and suspend */
|
2010-01-05 20:39:27 +01:00
|
|
|
|
2013-11-04 22:48:08 +01:00
|
|
|
/* Constants for exec. FIXME: these do not belong here. */
|
2012-04-03 15:52:25 +02:00
|
|
|
#define PMEF_AUXVECTORS 20
|
2013-09-13 20:12:22 +02:00
|
|
|
#define PMEF_EXECNAMELEN1 PATH_MAX
|
2012-04-03 15:52:25 +02:00
|
|
|
|
2008-11-19 13:26:10 +01:00
|
|
|
/* Flags for PR_FORK_FLAGS. */
|
|
|
|
#define PFF_VMINHIBIT 0x01 /* Don't schedule until release by VM. */
|
|
|
|
|
2012-09-22 22:01:05 +02:00
|
|
|
/* SYS_SAFEMEMSET */
|
|
|
|
#define SMS_DST m2_i1 /* dst endpoint */
|
|
|
|
#define SMS_GID m2_i3 /* grant id */
|
|
|
|
#define SMS_OFFSET m2_l1 /* offset within grant */
|
2012-09-22 22:02:14 +02:00
|
|
|
#define SMS_BYTES m2_l2 /* bytes from offset */
|
|
|
|
#define SMS_PATTERN m2_i2 /* memset() pattern */
|
2012-09-22 22:01:05 +02:00
|
|
|
|
2008-11-19 13:26:10 +01:00
|
|
|
/* Field names for SYS_VMCTL. */
|
|
|
|
#define SVMCTL_WHO m1_i1
|
|
|
|
#define SVMCTL_PARAM m1_i2 /* All SYS_VMCTL requests. */
|
|
|
|
#define SVMCTL_VALUE m1_i3
|
2010-01-14 16:24:16 +01:00
|
|
|
#define SVMCTL_MRG_TARGET m2_i1 /* MEMREQ_GET reply: target process */
|
|
|
|
#define SVMCTL_MRG_ADDR m2_i2 /* MEMREQ_GET reply: address */
|
|
|
|
#define SVMCTL_MRG_LENGTH m2_i3 /* MEMREQ_GET reply: length */
|
|
|
|
#define SVMCTL_MRG_FLAG m2_s1 /* MEMREQ_GET reply: flag */
|
|
|
|
#define SVMCTL_MRG_EP2 m2_l1 /* MEMREQ_GET reply: source process */
|
|
|
|
#define SVMCTL_MRG_ADDR2 m2_l2 /* MEMREQ_GET reply: source address */
|
|
|
|
#define SVMCTL_MRG_REQUESTOR m2_p1 /* MEMREQ_GET reply: requestor */
|
2009-11-11 13:07:06 +01:00
|
|
|
#define SVMCTL_MAP_VIR_ADDR m1_p1
|
2010-05-12 10:31:05 +02:00
|
|
|
#define SVMCTL_PTROOT m1_i3
|
|
|
|
#define SVMCTL_PTROOT_V m1_p1
|
2009-11-11 13:07:06 +01:00
|
|
|
|
|
|
|
/* Reply message for VMCTL_KERN_PHYSMAP */
|
|
|
|
#define SVMCTL_MAP_FLAGS m2_i1 /* VMMF_* */
|
|
|
|
#define SVMCTL_MAP_PHYS_ADDR m2_l1
|
|
|
|
#define SVMCTL_MAP_PHYS_LEN m2_l2
|
|
|
|
|
|
|
|
#define VMMF_UNCACHED (1L << 0)
|
2012-07-18 18:53:20 +02:00
|
|
|
#define VMMF_USER (1L << 1)
|
|
|
|
#define VMMF_WRITE (1L << 2)
|
|
|
|
#define VMMF_GLO (1L << 3)
|
2008-11-19 13:26:10 +01:00
|
|
|
|
|
|
|
/* Values for SVMCTL_PARAM. */
|
|
|
|
#define VMCTL_CLEAR_PAGEFAULT 12
|
2012-08-11 17:45:35 +02:00
|
|
|
#define VMCTL_GET_PDBR 13
|
|
|
|
#define VMCTL_MEMREQ_GET 14
|
2008-11-19 13:26:10 +01:00
|
|
|
#define VMCTL_MEMREQ_REPLY 15
|
2008-12-18 15:30:55 +01:00
|
|
|
#define VMCTL_NOPAGEZERO 18
|
2009-09-21 16:23:10 +02:00
|
|
|
#define VMCTL_I386_KERNELLIMIT 19
|
|
|
|
#define VMCTL_I386_INVLPG 25
|
|
|
|
#define VMCTL_FLUSHTLB 26
|
2009-11-11 13:07:06 +01:00
|
|
|
#define VMCTL_KERN_PHYSMAP 27
|
|
|
|
#define VMCTL_KERN_MAP_REPLY 28
|
2010-05-12 10:31:05 +02:00
|
|
|
#define VMCTL_SETADDRSPACE 29
|
2010-09-15 16:11:12 +02:00
|
|
|
#define VMCTL_VMINHIBIT_SET 30
|
|
|
|
#define VMCTL_VMINHIBIT_CLEAR 31
|
No more intel/minix segments.
This commit removes all traces of Minix segments (the text/data/stack
memory map abstraction in the kernel) and significance of Intel segments
(hardware segments like CS, DS that add offsets to all addressing before
page table translation). This ultimately simplifies the memory layout
and addressing and makes the same layout possible on non-Intel
architectures.
There are only two types of addresses in the world now: virtual
and physical; even the kernel and processes have the same virtual
address space. Kernel and user processes can be distinguished at a
glance as processes won't use 0xF0000000 and above.
No static pre-allocated memory sizes exist any more.
Changes to booting:
. The pre_init.c leaves the kernel and modules exactly as
they were left by the bootloader in physical memory
. The kernel starts running using physical addressing,
loaded at a fixed location given in its linker script by the
bootloader. All code and data in this phase are linked to
this fixed low location.
. It makes a bootstrap pagetable to map itself to a
fixed high location (also in linker script) and jumps to
the high address. All code and data then use this high addressing.
. All code/data symbols linked at the low addresses is prefixed by
an objcopy step with __k_unpaged_*, so that that code cannot
reference highly-linked symbols (which aren't valid yet) or vice
versa (symbols that aren't valid any more).
. The two addressing modes are separated in the linker script by
collecting the unpaged_*.o objects and linking them with low
addresses, and linking the rest high. Some objects are linked
twice, once low and once high.
. The bootstrap phase passes a lot of information (e.g. free memory
list, physical location of the modules, etc.) using the kinfo
struct.
. After this bootstrap the low-linked part is freed.
. The kernel maps in VM into the bootstrap page table so that VM can
begin executing. Its first job is to make page tables for all other
boot processes. So VM runs before RS, and RS gets a fully dynamic,
VM-managed address space. VM gets its privilege info from RS as usual
but that happens after RS starts running.
. Both the kernel loading VM and VM organizing boot processes happen
using the libexec logic. This removes the last reason for VM to
still know much about exec() and vm/exec.c is gone.
Further Implementation:
. All segments are based at 0 and have a 4 GB limit.
. The kernel is mapped in at the top of the virtual address
space so as not to constrain the user processes.
. Processes do not use segments from the LDT at all; there are
no segments in the LDT any more, so no LLDT is needed.
. The Minix segments T/D/S are gone and so none of the
user-space or in-kernel copy functions use them. The copy
functions use a process endpoint of NONE to realize it's
a physical address, virtual otherwise.
. The umap call only makes sense to translate a virtual address
to a physical address now.
. Segments-related calls like newmap and alloc_segments are gone.
. All segments-related translation in VM is gone (vir2map etc).
. Initialization in VM is simpler as no moving around is necessary.
. VM and all other boot processes can be linked wherever they wish
and will be mapped in at the right location by the kernel and VM
respectively.
Other changes:
. The multiboot code is less special: it does not use mb_print
for its diagnostics any more but uses printf() as normal, saving
the output into the diagnostics buffer, only printing to the
screen using the direct print functions if a panic() occurs.
. The multiboot code uses the flexible 'free memory map list'
style to receive the list of free memory if available.
. The kernel determines the memory layout of the processes to
a degree: it tells VM where the kernel starts and ends and
where the kernel wants the top of the process to be. VM then
uses this entire range, i.e. the stack is right at the top,
and mmap()ped bits of memory are placed below that downwards,
and the break grows upwards.
Other Consequences:
. Every process gets its own page table as address spaces
can't be separated any more by segments.
. As all segments are 0-based, there is no distinction between
virtual and linear addresses, nor between userspace and
kernel addresses.
. Less work is done when context switching, leading to a net
performance increase. (8% faster on my machine for 'make servers'.)
. The layout and configuration of the GDT makes sysenter and syscall
possible.
2012-05-07 16:03:35 +02:00
|
|
|
#define VMCTL_CLEARMAPCACHE 32
|
2012-06-10 19:50:17 +02:00
|
|
|
#define VMCTL_BOOTINHIBIT_CLEAR 33
|
2008-11-19 13:26:10 +01:00
|
|
|
|
2013-09-21 00:58:46 +02:00
|
|
|
/* Codes and field names for SYS_DIAGCTL. */
|
|
|
|
#define DIAGCTL_CODE_DIAG 1 /* Print diagnostics. */
|
|
|
|
#define DIAGCTL_CODE_STACKTRACE 2 /* Print process stack. */
|
2013-09-21 15:03:20 +02:00
|
|
|
#define DIAGCTL_CODE_REGISTER 3 /* Register for diagnostic signals */
|
|
|
|
#define DIAGCTL_CODE_UNREGISTER 4 /* Unregister for diagnostic signals */
|
2010-01-05 20:39:27 +01:00
|
|
|
#define DIAG_BUFSIZE (80*25)
|
|
|
|
|
2009-08-15 23:37:26 +02:00
|
|
|
/* Field names for SYS_VTIMER. */
|
|
|
|
#define VT_WHICH m2_i1 /* which timer to set/retrieve */
|
|
|
|
# define VT_VIRTUAL 1 /* the ITIMER_VIRTUAL timer */
|
|
|
|
# define VT_PROF 2 /* the ITIMER_PROF timer */
|
|
|
|
#define VT_SET m2_i2 /* 1 for setting a timer, 0 retrieval only */
|
|
|
|
#define VT_VALUE m2_l1 /* new/previous value of the timer */
|
|
|
|
#define VT_ENDPT m2_l2 /* process to set/retrieve the timer for */
|
|
|
|
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
/* Field names for SYS_RUNCTL. */
|
|
|
|
#define RC_ENDPT m1_i1 /* which process to stop or resume */
|
|
|
|
#define RC_ACTION m1_i2 /* set or clear stop flag */
|
2009-10-01 12:36:09 +02:00
|
|
|
# define RC_STOP 0 /* stop the process */
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
# define RC_RESUME 1 /* clear the stop flag */
|
2009-10-01 12:36:09 +02:00
|
|
|
#define RC_FLAGS m1_i3 /* request flags */
|
|
|
|
# define RC_DELAY 1 /* delay stop if process is sending */
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
/* Field names for SYS_UPDATE. */
|
|
|
|
#define SYS_UPD_SRC_ENDPT m1_i1 /* source endpoint */
|
|
|
|
#define SYS_UPD_DST_ENDPT m1_i2 /* destination endpoint */
|
|
|
|
|
2010-04-08 15:41:35 +02:00
|
|
|
/* Subfunctions for SYS_STATECTL */
|
|
|
|
#define SYS_STATE_CLEAR_IPC_REFS 1 /* clear IPC references */
|
|
|
|
|
2010-07-01 10:32:33 +02:00
|
|
|
/* Subfunctions for SYS_SCHEDCTL */
|
|
|
|
# define SCHEDCTL_FLAG_KERNEL 1 /* mark kernel scheduler and remove
|
|
|
|
* RTS_NO_QUANTUM; otherwise caller is
|
|
|
|
* marked scheduler
|
|
|
|
*/
|
|
|
|
|
2013-08-28 06:43:45 +02:00
|
|
|
/* Field names for SYS_PADCONF */
|
|
|
|
#define PADCONF_PADCONF m2_i1 /* pad to configure */
|
|
|
|
#define PADCONF_MASK m2_i2 /* mask to apply */
|
|
|
|
#define PADCONF_VALUE m2_i3 /* value to write */
|
|
|
|
|
2005-08-03 13:53:36 +02:00
|
|
|
/*===========================================================================*
|
2005-10-20 22:34:34 +02:00
|
|
|
* Messages for the Reincarnation Server *
|
2005-08-03 13:53:36 +02:00
|
|
|
*===========================================================================*/
|
|
|
|
|
2005-10-20 22:34:34 +02:00
|
|
|
#define RS_RQ_BASE 0x700
|
2005-08-03 13:53:36 +02:00
|
|
|
|
2005-10-20 22:34:34 +02:00
|
|
|
#define RS_UP (RS_RQ_BASE + 0) /* start system service */
|
|
|
|
#define RS_DOWN (RS_RQ_BASE + 1) /* stop system service */
|
2006-10-20 17:01:32 +02:00
|
|
|
#define RS_REFRESH (RS_RQ_BASE + 2) /* refresh system service */
|
|
|
|
#define RS_RESTART (RS_RQ_BASE + 3) /* restart system service */
|
2009-12-17 02:53:26 +01:00
|
|
|
#define RS_SHUTDOWN (RS_RQ_BASE + 4) /* alert about shutdown */
|
Basic System Event Framework (SEF) with ping and live update.
SYSLIB CHANGES:
- SEF must be used by every system process and is thereby part of the system
library.
- The framework provides a receive() interface (sef_receive) for system
processes to automatically catch known system even messages and process them.
- SEF provides a default behavior for each type of system event, but allows
system processes to register callbacks to override the default behavior.
- Custom (local to the process) or predefined (provided by SEF) callback
implementations can be registered to SEF.
- SEF currently includes support for 2 types of system events:
1. SEF Ping. The event occurs every time RS sends a ping to figure out
whether a system process is still alive. The default callback implementation
provided by SEF is to notify RS back to let it know the process is alive
and kicking.
2. SEF Live update. The event occurs every time RS sends a prepare to update
message to let a system process know an update is available and to prepare
for it. The live update support is very basic for now. SEF only deals with
verifying if the prepare state can be supported by the process, dumping the
state for debugging purposes, and providing an event-driven programming
model to the process to react to state changes check-in when ready to update.
- SEF should be extended in the future to integrate support for more types of
system events. Ideally, all the cross-cutting concerns should be integrated into
SEF to avoid duplicating code and ease extensibility. Examples include:
* PM notify messages primarily used at shutdown.
* SYSTEM notify messages primarily used for signals.
* CLOCK notify messages used for system alarms.
* Debug messages. IS could still be in charge of fkey handling but would
forward the debug message to the target process (e.g. PM, if the user
requested debug information about PM). SEF would then catch the message and
do nothing unless the process has registered an appropriate callback to
deal with the event. This simplifies the programming model to print debug
information, avoids duplicating code, and reduces the effort to print
debug information.
SYSTEM PROCESSES CHANGES:
- Every system process registers SEF callbacks it needs to override the default
system behavior and calls sef_startup() right after being started.
- sef_startup() does almost nothing now, but will be extended in the future to
support callbacks of its own to let RS control and synchronize with every
system process at initialization time.
- Every system process calls sef_receive() now rather than receive() directly,
to let SEF handle predefined system events.
RS CHANGES:
- RS supports a basic single-component live update protocol now, as follows:
* When an update command is issued (via "service update *"), RS notifies the
target system process to prepare for a specific update state.
* If the process doesn't respond back in time, the update is aborted.
* When the process responds back, RS kills it and marks it for refreshing.
* The process is then automatically restarted as for a buggy process and can
start running again.
* Live update is currently prototyped as a controlled failure.
2009-12-21 15:12:21 +01:00
|
|
|
#define RS_UPDATE (RS_RQ_BASE + 5) /* update system service */
|
2010-06-28 23:38:29 +02:00
|
|
|
#define RS_CLONE (RS_RQ_BASE + 6) /* clone system service */
|
2010-07-05 21:37:08 +02:00
|
|
|
#define RS_EDIT (RS_RQ_BASE + 7) /* edit system service */
|
2009-12-17 02:53:26 +01:00
|
|
|
|
2009-09-21 17:25:15 +02:00
|
|
|
#define RS_LOOKUP (RS_RQ_BASE + 8) /* lookup server name */
|
2005-08-03 13:53:36 +02:00
|
|
|
|
2013-10-28 22:30:41 +01:00
|
|
|
#define RS_GETSYSINFO (RS_RQ_BASE + 9) /* get system information */
|
|
|
|
|
Initialization protocol for system services.
SYSLIB CHANGES:
- SEF framework now supports a new SEF Init request type from RS. 3 different
callbacks are available (init_fresh, init_lu, init_restart) to specify
initialization code when a service starts fresh, starts after a live update,
or restarts.
SYSTEM SERVICE CHANGES:
- Initialization code for system services is now enclosed in a callback SEF will
automatically call at init time. The return code of the callback will
tell RS whether the initialization completed successfully.
- Each init callback can access information passed by RS to initialize. As of
now, each system service has access to the public entries of RS's system process
table to gather all the information required to initialize. This design
eliminates many existing or potential races at boot time and provides a uniform
initialization interface to system services. The same interface will be reused
for the upcoming publish/subscribe model to handle dynamic
registration / deregistration of system services.
VM CHANGES:
- Uniform privilege management for all system services. Every service uses the
same call mask format. For boot services, VM copies the call mask from init
data. For dynamic services, VM still receives the call mask via rs_set_priv
call that will be soon replaced by the upcoming publish/subscribe model.
RS CHANGES:
- The system process table has been reorganized and split into private entries
and public entries. Only the latter ones are exposed to system services.
- VM call masks are now entirely configured in rs/table.c
- RS has now its own slot in the system process table. Only kernel tasks and
user processes not included in the boot image are now left out from the system
process table.
- RS implements the initialization protocol for system services.
- For services in the boot image, RS blocks till initialization is complete and
panics when failure is reported back. Services are initialized in their order of
appearance in the boot image priv table and RS blocks to implements synchronous
initialization for every system service having the flag SF_SYNCH_BOOT set.
- For services started dynamically, the initialization protocol is implemented
as though it were the first ping for the service. In this case, if the
system service fails to report back (or reports failure), RS brings the service
down rather than trying to restart it.
2010-01-08 02:20:42 +01:00
|
|
|
#define RS_INIT (RS_RQ_BASE + 20) /* service init message */
|
Basic System Event Framework (SEF) with ping and live update.
SYSLIB CHANGES:
- SEF must be used by every system process and is thereby part of the system
library.
- The framework provides a receive() interface (sef_receive) for system
processes to automatically catch known system even messages and process them.
- SEF provides a default behavior for each type of system event, but allows
system processes to register callbacks to override the default behavior.
- Custom (local to the process) or predefined (provided by SEF) callback
implementations can be registered to SEF.
- SEF currently includes support for 2 types of system events:
1. SEF Ping. The event occurs every time RS sends a ping to figure out
whether a system process is still alive. The default callback implementation
provided by SEF is to notify RS back to let it know the process is alive
and kicking.
2. SEF Live update. The event occurs every time RS sends a prepare to update
message to let a system process know an update is available and to prepare
for it. The live update support is very basic for now. SEF only deals with
verifying if the prepare state can be supported by the process, dumping the
state for debugging purposes, and providing an event-driven programming
model to the process to react to state changes check-in when ready to update.
- SEF should be extended in the future to integrate support for more types of
system events. Ideally, all the cross-cutting concerns should be integrated into
SEF to avoid duplicating code and ease extensibility. Examples include:
* PM notify messages primarily used at shutdown.
* SYSTEM notify messages primarily used for signals.
* CLOCK notify messages used for system alarms.
* Debug messages. IS could still be in charge of fkey handling but would
forward the debug message to the target process (e.g. PM, if the user
requested debug information about PM). SEF would then catch the message and
do nothing unless the process has registered an appropriate callback to
deal with the event. This simplifies the programming model to print debug
information, avoids duplicating code, and reduces the effort to print
debug information.
SYSTEM PROCESSES CHANGES:
- Every system process registers SEF callbacks it needs to override the default
system behavior and calls sef_startup() right after being started.
- sef_startup() does almost nothing now, but will be extended in the future to
support callbacks of its own to let RS control and synchronize with every
system process at initialization time.
- Every system process calls sef_receive() now rather than receive() directly,
to let SEF handle predefined system events.
RS CHANGES:
- RS supports a basic single-component live update protocol now, as follows:
* When an update command is issued (via "service update *"), RS notifies the
target system process to prepare for a specific update state.
* If the process doesn't respond back in time, the update is aborted.
* When the process responds back, RS kills it and marks it for refreshing.
* The process is then automatically restarted as for a buggy process and can
start running again.
* Live update is currently prototyped as a controlled failure.
2009-12-21 15:12:21 +01:00
|
|
|
#define RS_LU_PREPARE (RS_RQ_BASE + 21) /* prepare to update message */
|
|
|
|
|
2005-10-20 22:34:34 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for the Data Store Server *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
#define DS_RQ_BASE 0x800
|
|
|
|
|
2010-01-14 16:24:16 +01:00
|
|
|
#define DS_PUBLISH (DS_RQ_BASE + 0) /* publish data */
|
|
|
|
#define DS_RETRIEVE (DS_RQ_BASE + 1) /* retrieve data by name */
|
|
|
|
#define DS_SUBSCRIBE (DS_RQ_BASE + 2) /* subscribe to data updates */
|
|
|
|
#define DS_CHECK (DS_RQ_BASE + 3) /* retrieve updated data */
|
|
|
|
#define DS_DELETE (DS_RQ_BASE + 4) /* delete data */
|
|
|
|
#define DS_SNAPSHOT (DS_RQ_BASE + 5) /* take a snapshot */
|
|
|
|
#define DS_RETRIEVE_LABEL (DS_RQ_BASE + 6) /* retrieve label's name */
|
2013-10-28 22:30:41 +01:00
|
|
|
#define DS_GETSYSINFO (DS_RQ_BASE + 7) /* get system information */
|
2010-01-14 16:24:16 +01:00
|
|
|
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages used between PM and VFS *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
2013-10-28 22:19:40 +01:00
|
|
|
#define VFS_PM_RQ_BASE 0x900
|
|
|
|
#define VFS_PM_RS_BASE 0x980
|
|
|
|
|
|
|
|
#define IS_VFS_PM_RQ(type) (((type) & ~0x7f) == VFS_PM_RQ_BASE)
|
|
|
|
#define IS_VFS_PM_RS(type) (((type) & ~0x7f) == VFS_PM_RS_BASE)
|
|
|
|
|
|
|
|
/* Requests from PM to VFS. */
|
|
|
|
#define VFS_PM_INIT (VFS_PM_RQ_BASE + 0) /* Process table exchange */
|
|
|
|
#define VFS_PM_SETUID (VFS_PM_RQ_BASE + 1) /* Set new user ID */
|
|
|
|
#define VFS_PM_SETGID (VFS_PM_RQ_BASE + 2) /* Set group ID */
|
|
|
|
#define VFS_PM_SETSID (VFS_PM_RQ_BASE + 3) /* Set session leader */
|
|
|
|
#define VFS_PM_EXIT (VFS_PM_RQ_BASE + 4) /* Process exits */
|
|
|
|
#define VFS_PM_DUMPCORE (VFS_PM_RQ_BASE + 5) /* Process is to dump core */
|
|
|
|
#define VFS_PM_EXEC (VFS_PM_RQ_BASE + 6) /* Forwarded exec call */
|
|
|
|
#define VFS_PM_FORK (VFS_PM_RQ_BASE + 7) /* Newly forked process */
|
|
|
|
#define VFS_PM_SRV_FORK (VFS_PM_RQ_BASE + 8) /* fork for system services */
|
|
|
|
#define VFS_PM_UNPAUSE (VFS_PM_RQ_BASE + 9) /* Interrupt process call */
|
|
|
|
#define VFS_PM_REBOOT (VFS_PM_RQ_BASE + 10) /* System reboot */
|
|
|
|
#define VFS_PM_SETGROUPS (VFS_PM_RQ_BASE + 11) /* Set groups */
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
|
|
|
|
/* Replies from VFS to PM */
|
2013-10-28 22:19:40 +01:00
|
|
|
#define VFS_PM_SETUID_REPLY (VFS_PM_RS_BASE + 1)
|
|
|
|
#define VFS_PM_SETGID_REPLY (VFS_PM_RS_BASE + 2)
|
|
|
|
#define VFS_PM_SETSID_REPLY (VFS_PM_RS_BASE + 3)
|
|
|
|
#define VFS_PM_EXIT_REPLY (VFS_PM_RS_BASE + 4)
|
|
|
|
#define VFS_PM_CORE_REPLY (VFS_PM_RS_BASE + 5)
|
|
|
|
#define VFS_PM_EXEC_REPLY (VFS_PM_RS_BASE + 6)
|
|
|
|
#define VFS_PM_FORK_REPLY (VFS_PM_RS_BASE + 7)
|
|
|
|
#define VFS_PM_SRV_FORK_REPLY (VFS_PM_RS_BASE + 8)
|
|
|
|
#define VFS_PM_UNPAUSE_REPLY (VFS_PM_RS_BASE + 9)
|
|
|
|
#define VFS_PM_REBOOT_REPLY (VFS_PM_RS_BASE + 10)
|
|
|
|
#define VFS_PM_SETGROUPS_REPLY (VFS_PM_RS_BASE + 11)
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
|
|
|
|
/* Standard parameters for all requests and replies, except PM_REBOOT */
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_ENDPT m7_i1 /* process endpoint */
|
2010-01-05 20:39:27 +01:00
|
|
|
|
|
|
|
/* Additional parameters for PM_INIT */
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_SLOT m7_i2 /* process slot number */
|
|
|
|
# define VFS_PM_PID m7_i3 /* process pid */
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
|
|
|
|
/* Additional parameters for PM_SETUID and PM_SETGID */
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_EID m7_i2 /* effective user/group id */
|
|
|
|
# define VFS_PM_RID m7_i3 /* real user/group id */
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
|
- Introduce support for sticky bit.
- Revise VFS-FS protocol and update VFS/MFS/ISOFS accordingly.
- Clean up MFS by removing old, dead code (backwards compatibility is broken by
the new VFS-FS protocol, anyway) and rewrite other parts. Also, make sure all
functions have proper banners and prototypes.
- VFS should always provide a (syntactically) valid path to the FS; no need for
the FS to do sanity checks when leaving/entering mount points.
- Fix several bugs in MFS:
- Several path lookup bugs in MFS.
- A link can be too big for the path buffer.
- A mountpoint can become inaccessible when the creation of a new inode
fails, because the inode already exists and is a mountpoint.
- Introduce support for supplemental groups.
- Add test 46 to test supplemental group functionality (and removed obsolete
suppl. tests from test 2).
- Clean up VFS (not everything is done yet).
- ISOFS now opens device read-only. This makes the -r flag in the mount command
unnecessary (but will still report to be mounted read-write).
- Introduce PipeFS. PipeFS is a new FS that handles all anonymous and
named pipes. However, named pipes still reside on the (M)FS, as they are part
of the file system on disk. To make this work VFS now has a concept of
'mapped' inodes, which causes read, write, truncate and stat requests to be
redirected to the mapped FS, and all other requests to the original FS.
2009-12-20 21:27:14 +01:00
|
|
|
/* Additional parameter for PM_SETGROUPS */
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_GROUP_NO m7_i2 /* number of groups */
|
|
|
|
# define VFS_PM_GROUP_ADDR m7_p1 /* struct holding group data */
|
- Introduce support for sticky bit.
- Revise VFS-FS protocol and update VFS/MFS/ISOFS accordingly.
- Clean up MFS by removing old, dead code (backwards compatibility is broken by
the new VFS-FS protocol, anyway) and rewrite other parts. Also, make sure all
functions have proper banners and prototypes.
- VFS should always provide a (syntactically) valid path to the FS; no need for
the FS to do sanity checks when leaving/entering mount points.
- Fix several bugs in MFS:
- Several path lookup bugs in MFS.
- A link can be too big for the path buffer.
- A mountpoint can become inaccessible when the creation of a new inode
fails, because the inode already exists and is a mountpoint.
- Introduce support for supplemental groups.
- Add test 46 to test supplemental group functionality (and removed obsolete
suppl. tests from test 2).
- Clean up VFS (not everything is done yet).
- ISOFS now opens device read-only. This makes the -r flag in the mount command
unnecessary (but will still report to be mounted read-write).
- Introduce PipeFS. PipeFS is a new FS that handles all anonymous and
named pipes. However, named pipes still reside on the (M)FS, as they are part
of the file system on disk. To make this work VFS now has a concept of
'mapped' inodes, which causes read, write, truncate and stat requests to be
redirected to the mapped FS, and all other requests to the original FS.
2009-12-20 21:27:14 +01:00
|
|
|
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
/* Additional parameters for PM_EXEC */
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_PATH m7_p1 /* executable */
|
|
|
|
# define VFS_PM_PATH_LEN m7_i2 /* length of path including
|
2010-01-05 20:39:27 +01:00
|
|
|
* terminating null character
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
*/
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_FRAME m7_p2 /* arguments and environment */
|
|
|
|
# define VFS_PM_FRAME_LEN m7_i3 /* size of frame */
|
|
|
|
# define VFS_PM_PS_STR m7_i5 /* ps_strings pointer */
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
|
|
|
|
/* Additional parameters for PM_EXEC_REPLY and PM_CORE_REPLY */
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_STATUS m7_i2 /* OK or failure */
|
|
|
|
# define VFS_PM_PC m7_p1 /* program counter */
|
|
|
|
# define VFS_PM_NEWSP m7_p2 /* possibly-changed stack ptr */
|
|
|
|
# define VFS_PM_NEWPS_STR m7_i5 /* possibly-changed ps_strings ptr */
|
Merge of David's ptrace branch. Summary:
o Support for ptrace T_ATTACH/T_DETACH and T_SYSCALL
o PM signal handling logic should now work properly, even with debuggers
being present
o Asynchronous PM/VFS protocol, full IPC support for senda(), and
AMF_NOREPLY senda() flag
DETAILS
Process stop and delay call handling of PM:
o Added sys_runctl() kernel call with sys_stop() and sys_resume()
aliases, for PM to stop and resume a process
o Added exception for sending/syscall-traced processes to sys_runctl(),
and matching SIGKREADY pseudo-signal to PM
o Fixed PM signal logic to deal with requests from a process after
stopping it (so-called "delay calls"), using the SIGKREADY facility
o Fixed various PM panics due to race conditions with delay calls versus
VFS calls
o Removed special PRIO_STOP priority value
o Added SYS_LOCK RTS kernel flag, to stop an individual process from
running while modifying its process structure
Signal and debugger handling in PM:
o Fixed debugger signals being dropped if a second signal arrives when
the debugger has not retrieved the first one
o Fixed debugger signals being sent to the debugger more than once
o Fixed debugger signals unpausing process in VFS; removed PM_UNPAUSE_TR
protocol message
o Detached debugger signals from general signal logic and from being
blocked on VFS calls, meaning that even VFS can now be traced
o Fixed debugger being unable to receive more than one pending signal in
one process stop
o Fixed signal delivery being delayed needlessly when multiple signals
are pending
o Fixed wait test for tracer, which was returning for children that were
not waited for
o Removed second parallel pending call from PM to VFS for any process
o Fixed process becoming runnable between exec() and debugger trap
o Added support for notifying the debugger before the parent when a
debugged child exits
o Fixed debugger death causing child to remain stopped forever
o Fixed consistently incorrect use of _NSIG
Extensions to ptrace():
o Added T_ATTACH and T_DETACH ptrace request, to attach and detach a
debugger to and from a process
o Added T_SYSCALL ptrace request, to trace system calls
o Added T_SETOPT ptrace request, to set trace options
o Added TO_TRACEFORK trace option, to attach automatically to children
of a traced process
o Added TO_ALTEXEC trace option, to send SIGSTOP instead of SIGTRAP upon
a successful exec() of the tracee
o Extended T_GETUSER ptrace support to allow retrieving a process's priv
structure
o Removed T_STOP ptrace request again, as it does not help implementing
debuggers properly
o Added MINIX3-specific ptrace test (test42)
o Added proper manual page for ptrace(2)
Asynchronous PM/VFS interface:
o Fixed asynchronous messages not being checked when receive() is called
with an endpoint other than ANY
o Added AMF_NOREPLY senda() flag, preventing such messages from
satisfying the receive part of a sendrec()
o Added asynsend3() that takes optional flags; asynsend() is now a
#define passing in 0 as third parameter
o Made PM/VFS protocol asynchronous; reintroduced tell_fs()
o Made PM_BASE request/reply number range unique
o Hacked in a horrible temporary workaround into RS to deal with newly
revealed RS-PM-VFS race condition triangle until VFS is asynchronous
System signal handling:
o Fixed shutdown logic of device drivers; removed old SIGKSTOP signal
o Removed is-superuser check from PM's do_procstat() (aka getsigset())
o Added sigset macros to allow system processes to deal with the full
signal set, rather than just the POSIX subset
Miscellaneous PM fixes:
o Split do_getset into do_get and do_set, merging common code and making
structure clearer
o Fixed setpriority() being able to put to sleep processes using an
invalid parameter, or revive zombie processes
o Made find_proc() global; removed obsolete proc_from_pid()
o Cleanup here and there
Also included:
o Fixed false-positive boot order kernel warning
o Removed last traces of old NOTIFY_FROM code
THINGS OF POSSIBLE INTEREST
o It should now be possible to run PM at any priority, even lower than
user processes
o No assumptions are made about communication speed between PM and VFS,
although communication must be FIFO
o A debugger will now receive incoming debuggee signals at kill time
only; the process may not yet be fully stopped
o A first step has been made towards making the SYSTEM task preemptible
2009-09-30 11:57:22 +02:00
|
|
|
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
/* Additional parameters for PM_FORK and PM_SRV_FORK */
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_PENDPT m7_i2 /* parent process endpoint */
|
|
|
|
# define VFS_PM_CPID m7_i3 /* child pid */
|
|
|
|
# define VFS_PM_REUID m7_i4 /* real and effective uid */
|
|
|
|
# define VFS_PM_REGID m7_i5 /* real and effective gid */
|
2006-05-11 16:47:31 +02:00
|
|
|
|
2011-07-30 08:03:23 +02:00
|
|
|
/* Additional parameters for PM_DUMPCORE */
|
2013-10-28 22:19:40 +01:00
|
|
|
# define VFS_PM_TERM_SIG m7_i2 /* process's termination signal */
|
2011-07-30 08:03:23 +02:00
|
|
|
|
2009-10-01 12:33:01 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages used from VFS to file servers *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
2013-11-02 16:39:03 +01:00
|
|
|
#define FS_BASE 0xA00 /* Requests sent by VFS to filesystem
|
2007-08-07 13:55:28 +02:00
|
|
|
* implementations. See <minix/vfsif.h>
|
|
|
|
*/
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2010-01-05 20:39:27 +01:00
|
|
|
/*===========================================================================*
|
2011-11-07 21:11:30 +01:00
|
|
|
* Common requests and miscellaneous field names *
|
2010-01-05 20:39:27 +01:00
|
|
|
*===========================================================================*/
|
|
|
|
|
2011-11-07 21:11:30 +01:00
|
|
|
#define COMMON_RQ_BASE 0xE00
|
|
|
|
|
|
|
|
/* Field names for system signals (sent by a signal manager). */
|
|
|
|
#define SIGS_SIGNAL_RECEIVED (COMMON_RQ_BASE+0)
|
|
|
|
|
|
|
|
/* Common request to all processes: gcov data. */
|
|
|
|
#define COMMON_REQ_GCOV_DATA (COMMON_RQ_BASE+1)
|
|
|
|
|
2014-06-12 17:08:31 +02:00
|
|
|
/* Common fault injection ctl request to all processes. */
|
|
|
|
#define COMMON_REQ_FI_CTL (COMMON_RQ_BASE+2)
|
|
|
|
|
2008-11-19 13:26:10 +01:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for VM server *
|
|
|
|
*===========================================================================*/
|
|
|
|
#define VM_RQ_BASE 0xC00
|
|
|
|
|
|
|
|
/* Calls from PM */
|
|
|
|
#define VM_EXIT (VM_RQ_BASE+0)
|
|
|
|
# define VME_ENDPOINT m1_i1
|
|
|
|
#define VM_FORK (VM_RQ_BASE+1)
|
|
|
|
# define VMF_ENDPOINT m1_i1
|
|
|
|
# define VMF_SLOTNO m1_i2
|
|
|
|
# define VMF_CHILD_ENDPOINT m1_i3 /* result */
|
|
|
|
#define VM_BRK (VM_RQ_BASE+2)
|
|
|
|
#define VM_EXEC_NEWMEM (VM_RQ_BASE+3)
|
|
|
|
# define VMEN_ENDPOINT m1_i1
|
|
|
|
# define VMEN_ARGSPTR m1_p1
|
|
|
|
# define VMEN_ARGSSIZE m1_i2
|
|
|
|
# define VMEN_FLAGS m1_i3 /* result */
|
|
|
|
# define VMEN_STACK_TOP m1_p2 /* result */
|
|
|
|
#define VM_WILLEXIT (VM_RQ_BASE+5)
|
|
|
|
# define VMWE_ENDPOINT m1_i1
|
|
|
|
|
|
|
|
/* General calls. */
|
|
|
|
#define VM_MMAP (VM_RQ_BASE+10)
|
2013-11-28 17:51:21 +01:00
|
|
|
|
|
|
|
#define VM_MUNMAP (VM_RQ_BASE+17)
|
2013-11-28 18:17:38 +01:00
|
|
|
# define VMUM_ADDR m_mmap.addr
|
|
|
|
# define VMUM_LEN m_mmap.len
|
2008-11-19 13:26:10 +01:00
|
|
|
|
|
|
|
/* to VM: inform VM about a region of memory that is used for
|
|
|
|
* bus-master DMA
|
|
|
|
*/
|
|
|
|
#define VM_ADDDMA (VM_RQ_BASE+12)
|
|
|
|
# define VMAD_EP m2_i1
|
|
|
|
# define VMAD_START m2_l1
|
|
|
|
# define VMAD_SIZE m2_l2
|
|
|
|
|
|
|
|
/* to VM: inform VM that a region of memory that is no longer
|
|
|
|
* used for bus-master DMA
|
|
|
|
*/
|
|
|
|
#define VM_DELDMA (VM_RQ_BASE+13)
|
|
|
|
# define VMDD_EP m2_i1
|
|
|
|
# define VMDD_START m2_l1
|
|
|
|
# define VMDD_SIZE m2_l2
|
|
|
|
|
|
|
|
/* to VM: ask VM for a region of memory that should not
|
|
|
|
* be used for bus-master DMA any longer
|
|
|
|
*/
|
|
|
|
#define VM_GETDMA (VM_RQ_BASE+14)
|
|
|
|
# define VMGD_PROCP m2_i1
|
|
|
|
# define VMGD_BASEP m2_l1
|
|
|
|
# define VMGD_SIZEP m2_l2
|
|
|
|
|
|
|
|
#define VM_MAP_PHYS (VM_RQ_BASE+15)
|
|
|
|
|
|
|
|
#define VM_UNMAP_PHYS (VM_RQ_BASE+16)
|
|
|
|
|
2012-11-08 13:45:06 +01:00
|
|
|
/* To VM: map in cache block by FS */
|
|
|
|
#define VM_MAPCACHEPAGE (VM_RQ_BASE+26)
|
2010-05-05 13:35:04 +02:00
|
|
|
|
2013-03-20 20:18:52 +01:00
|
|
|
/* To VM: identify cache block in FS */
|
|
|
|
#define VM_SETCACHEPAGE (VM_RQ_BASE+27)
|
|
|
|
|
2013-09-15 18:55:42 +02:00
|
|
|
/* To VM: clear all cache blocks for a device */
|
|
|
|
#define VM_CLEARCACHE (VM_RQ_BASE+28)
|
|
|
|
|
2013-03-20 20:18:52 +01:00
|
|
|
/* To VFS: fields for request from VM. */
|
|
|
|
# define VFS_VMCALL_REQ m10_i1
|
|
|
|
# define VFS_VMCALL_FD m10_i2
|
|
|
|
# define VFS_VMCALL_REQID m10_i3
|
|
|
|
# define VFS_VMCALL_ENDPOINT m10_i4
|
2014-02-24 17:14:07 +01:00
|
|
|
# define VFS_VMCALL_OFFSET m10_ull1
|
2013-03-20 20:18:52 +01:00
|
|
|
# define VFS_VMCALL_LENGTH m10_l3
|
|
|
|
|
|
|
|
/* Request codes to from VM to VFS */
|
|
|
|
#define VMVFSREQ_FDLOOKUP 101
|
|
|
|
#define VMVFSREQ_FDCLOSE 102
|
|
|
|
#define VMVFSREQ_FDIO 103
|
|
|
|
|
2008-11-19 13:26:10 +01:00
|
|
|
/* Calls from VFS. */
|
2013-03-20 20:18:52 +01:00
|
|
|
#define VM_VFS_REPLY (VM_RQ_BASE+30)
|
|
|
|
# define VMV_ENDPOINT m10_i1
|
|
|
|
# define VMV_RESULT m10_i2
|
|
|
|
# define VMV_REQID m10_i3
|
|
|
|
# define VMV_DEV m10_i4
|
|
|
|
# define VMV_INO m10_l1
|
|
|
|
# define VMV_FD m10_l2
|
2013-05-07 14:41:07 +02:00
|
|
|
# define VMV_SIZE_PAGES m10_l3
|
2008-11-19 13:26:10 +01:00
|
|
|
|
2009-09-21 16:23:10 +02:00
|
|
|
#define VM_REMAP (VM_RQ_BASE+33)
|
|
|
|
|
|
|
|
#define VM_SHM_UNMAP (VM_RQ_BASE+34)
|
|
|
|
|
|
|
|
#define VM_GETPHYS (VM_RQ_BASE+35)
|
|
|
|
|
|
|
|
#define VM_GETREF (VM_RQ_BASE+36)
|
|
|
|
|
|
|
|
#define VM_RS_SET_PRIV (VM_RQ_BASE+37)
|
|
|
|
# define VM_RS_NR m2_i1
|
|
|
|
# define VM_RS_BUF m2_l1
|
2013-08-07 22:03:47 +02:00
|
|
|
# define VM_RS_SYS m2_i2
|
2009-09-21 16:23:10 +02:00
|
|
|
|
|
|
|
#define VM_QUERY_EXIT (VM_RQ_BASE+38)
|
|
|
|
|
|
|
|
#define VM_NOTIFY_SIG (VM_RQ_BASE+39)
|
|
|
|
# define VM_NOTIFY_SIG_ENDPOINT m1_i1
|
|
|
|
# define VM_NOTIFY_SIG_IPC m1_i2
|
|
|
|
|
2010-01-19 22:00:20 +01:00
|
|
|
#define VM_INFO (VM_RQ_BASE+40)
|
|
|
|
|
2014-07-26 13:53:48 +02:00
|
|
|
/* VM_INFO 'what' values. */
|
2010-01-19 22:00:20 +01:00
|
|
|
#define VMIW_STATS 1
|
|
|
|
#define VMIW_USAGE 2
|
|
|
|
#define VMIW_REGION 3
|
2009-09-21 16:23:10 +02:00
|
|
|
|
New RS and new signal handling for system processes.
UPDATING INFO:
20100317:
/usr/src/etc/system.conf updated to ignore default kernel calls: copy
it (or merge it) to /etc/system.conf.
The hello driver (/dev/hello) added to the distribution:
# cd /usr/src/commands/scripts && make clean install
# cd /dev && MAKEDEV hello
KERNEL CHANGES:
- Generic signal handling support. The kernel no longer assumes PM as a signal
manager for every process. The signal manager of a given process can now be
specified in its privilege slot. When a signal has to be delivered, the kernel
performs the lookup and forwards the signal to the appropriate signal manager.
PM is the default signal manager for user processes, RS is the default signal
manager for system processes. To enable ptrace()ing for system processes, it
is sufficient to change the default signal manager to PM. This will temporarily
disable crash recovery, though.
- sys_exit() is now split into sys_exit() (i.e. exit() for system processes,
which generates a self-termination signal), and sys_clear() (i.e. used by PM
to ask the kernel to clear a process slot when a process exits).
- Added a new kernel call (i.e. sys_update()) to swap two process slots and
implement live update.
PM CHANGES:
- Posix signal handling is no longer allowed for system processes. System
signals are split into two fixed categories: termination and non-termination
signals. When a non-termination signaled is processed, PM transforms the signal
into an IPC message and delivers the message to the system process. When a
termination signal is processed, PM terminates the process.
- PM no longer assumes itself as the signal manager for system processes. It now
makes sure that every system signal goes through the kernel before being
actually processes. The kernel will then dispatch the signal to the appropriate
signal manager which may or may not be PM.
SYSLIB CHANGES:
- Simplified SEF init and LU callbacks.
- Added additional predefined SEF callbacks to debug crash recovery and
live update.
- Fixed a temporary ack in the SEF init protocol. SEF init reply is now
completely synchronous.
- Added SEF signal event type to provide a uniform interface for system
processes to deal with signals. A sef_cb_signal_handler() callback is
available for system processes to handle every received signal. A
sef_cb_signal_manager() callback is used by signal managers to process
system signals on behalf of the kernel.
- Fixed a few bugs with memory mapping and DS.
VM CHANGES:
- Page faults and memory requests coming from the kernel are now implemented
using signals.
- Added a new VM call to swap two process slots and implement live update.
- The call is used by RS at update time and in turn invokes the kernel call
sys_update().
RS CHANGES:
- RS has been reworked with a better functional decomposition.
- Better kernel call masks. com.h now defines the set of very basic kernel calls
every system service is allowed to use. This makes system.conf simpler and
easier to maintain. In addition, this guarantees a higher level of isolation
for system libraries that use one or more kernel calls internally (e.g. printf).
- RS is the default signal manager for system processes. By default, RS
intercepts every signal delivered to every system process. This makes crash
recovery possible before bringing PM and friends in the loop.
- RS now supports fast rollback when something goes wrong while initializing
the new version during a live update.
- Live update is now implemented by keeping the two versions side-by-side and
swapping the process slots when the old version is ready to update.
- Crash recovery is now implemented by keeping the two versions side-by-side
and cleaning up the old version only when the recovery process is complete.
DS CHANGES:
- Fixed a bug when the process doing ds_publish() or ds_delete() is not known
by DS.
- Fixed the completely broken support for strings. String publishing is now
implemented in the system library and simply wraps publishing of memory ranges.
Ideally, we should adopt a similar approach for other data types as well.
- Test suite fixed.
DRIVER CHANGES:
- The hello driver has been added to the Minix distribution to demonstrate basic
live update and crash recovery functionalities.
- Other drivers have been adapted to conform the new SEF interface.
2010-03-17 02:15:29 +01:00
|
|
|
#define VM_RS_UPDATE (VM_RQ_BASE+41)
|
|
|
|
|
2010-06-28 23:53:37 +02:00
|
|
|
#define VM_RS_MEMCTL (VM_RQ_BASE+42)
|
|
|
|
# define VM_RS_CTL_ENDPT m1_i1
|
|
|
|
# define VM_RS_CTL_REQ m1_i2
|
2010-07-21 01:03:52 +02:00
|
|
|
# define VM_RS_MEM_PIN 0 /* pin memory */
|
|
|
|
# define VM_RS_MEM_MAKE_VM 1 /* make VM instance */
|
2010-06-28 23:53:37 +02:00
|
|
|
|
2011-08-05 01:52:03 +02:00
|
|
|
#define VM_WATCH_EXIT (VM_RQ_BASE+43)
|
|
|
|
|
2011-11-28 19:05:50 +01:00
|
|
|
#define VM_REMAP_RO (VM_RQ_BASE+44)
|
|
|
|
/* same args as VM_REMAP */
|
|
|
|
|
2012-06-06 00:50:13 +02:00
|
|
|
#define VM_PROCCTL (VM_RQ_BASE+45)
|
make vfs & filesystems use failable copying
Change the kernel to add features to vircopy and safecopies so that
transparent copy fixing won't happen to avoid deadlocks, and such copies
fail with EFAULT.
Transparently making copying work from filesystems (as normally done by
the kernel & VM when copying fails because of missing/readonly memory)
is problematic as it can happen that, for file-mapped ranges, that that
same filesystem that is blocked on the copy request is needed to satisfy
the memory range, leading to deadlock. Dito for VFS itself, if done with
a blocking call.
This change makes the copying done from a filesystem fail in such cases
with EFAULT by VFS adding the CPF_TRY flag to the grants. If a FS call
fails with EFAULT, VFS will then request the range to be made available
to VM after the FS is unblocked, allowing it to be used to satisfy the
range if need be in another VFS thread.
Similarly, for datacopies that VFS itself does, it uses the failable
vircopy variant and callers use a wrapper that talk to VM if necessary
to get the copy to work.
. kernel: add CPF_TRY flag to safecopies
. kernel: only request writable ranges to VM for the
target buffer when copying fails
. do copying in VFS TRY-first
. some fixes in VM to build SANITYCHECK mode
. add regression test for the cases where
- a FS system call needs memory mapped in a process that the
FS itself must map.
- such a range covers more than one file-mapped region.
. add 'try' mode to vircopy, physcopy
. add flags field to copy kernel call messages
. if CP_FLAG_TRY is set, do not transparently try
to fix memory ranges
. for use by VFS when accessing user buffers to avoid
deadlock
. remove some obsolete backwards compatability assignments
. VFS: let thread scheduling work for VM requests too
Allows VFS to make calls to VM while suspending and resuming
the currently running thread. Does currently not work for the
main thread.
. VM: add fix memory range call for use by VFS
Change-Id: I295794269cea51a3163519a9cfe5901301d90b32
2014-01-16 14:22:13 +01:00
|
|
|
#define VMPCTL_PARAM m9_l1
|
|
|
|
#define VMPCTL_WHO m9_l2
|
|
|
|
#define VMPCTL_M1 m9_l3
|
|
|
|
#define VMPCTL_LEN m9_l4
|
|
|
|
#define VMPCTL_FLAGS m9_l5
|
2012-06-06 00:50:13 +02:00
|
|
|
|
|
|
|
#define VMPPARAM_CLEAR 1 /* values for VMPCTL_PARAM */
|
make vfs & filesystems use failable copying
Change the kernel to add features to vircopy and safecopies so that
transparent copy fixing won't happen to avoid deadlocks, and such copies
fail with EFAULT.
Transparently making copying work from filesystems (as normally done by
the kernel & VM when copying fails because of missing/readonly memory)
is problematic as it can happen that, for file-mapped ranges, that that
same filesystem that is blocked on the copy request is needed to satisfy
the memory range, leading to deadlock. Dito for VFS itself, if done with
a blocking call.
This change makes the copying done from a filesystem fail in such cases
with EFAULT by VFS adding the CPF_TRY flag to the grants. If a FS call
fails with EFAULT, VFS will then request the range to be made available
to VM after the FS is unblocked, allowing it to be used to satisfy the
range if need be in another VFS thread.
Similarly, for datacopies that VFS itself does, it uses the failable
vircopy variant and callers use a wrapper that talk to VM if necessary
to get the copy to work.
. kernel: add CPF_TRY flag to safecopies
. kernel: only request writable ranges to VM for the
target buffer when copying fails
. do copying in VFS TRY-first
. some fixes in VM to build SANITYCHECK mode
. add regression test for the cases where
- a FS system call needs memory mapped in a process that the
FS itself must map.
- such a range covers more than one file-mapped region.
. add 'try' mode to vircopy, physcopy
. add flags field to copy kernel call messages
. if CP_FLAG_TRY is set, do not transparently try
to fix memory ranges
. for use by VFS when accessing user buffers to avoid
deadlock
. remove some obsolete backwards compatability assignments
. VFS: let thread scheduling work for VM requests too
Allows VFS to make calls to VM while suspending and resuming
the currently running thread. Does currently not work for the
main thread.
. VM: add fix memory range call for use by VFS
Change-Id: I295794269cea51a3163519a9cfe5901301d90b32
2014-01-16 14:22:13 +01:00
|
|
|
#define VMPPARAM_HANDLEMEM 2
|
2012-06-06 00:50:13 +02:00
|
|
|
|
2013-05-07 14:41:07 +02:00
|
|
|
#define VM_VFS_MMAP (VM_RQ_BASE+46)
|
|
|
|
|
2013-06-25 14:41:01 +02:00
|
|
|
#define VM_GETRUSAGE (VM_RQ_BASE+47)
|
|
|
|
|
2008-11-19 13:26:10 +01:00
|
|
|
/* Total. */
|
2013-06-25 14:41:01 +02:00
|
|
|
#define NR_VM_CALLS 48
|
Initialization protocol for system services.
SYSLIB CHANGES:
- SEF framework now supports a new SEF Init request type from RS. 3 different
callbacks are available (init_fresh, init_lu, init_restart) to specify
initialization code when a service starts fresh, starts after a live update,
or restarts.
SYSTEM SERVICE CHANGES:
- Initialization code for system services is now enclosed in a callback SEF will
automatically call at init time. The return code of the callback will
tell RS whether the initialization completed successfully.
- Each init callback can access information passed by RS to initialize. As of
now, each system service has access to the public entries of RS's system process
table to gather all the information required to initialize. This design
eliminates many existing or potential races at boot time and provides a uniform
initialization interface to system services. The same interface will be reused
for the upcoming publish/subscribe model to handle dynamic
registration / deregistration of system services.
VM CHANGES:
- Uniform privilege management for all system services. Every service uses the
same call mask format. For boot services, VM copies the call mask from init
data. For dynamic services, VM still receives the call mask via rs_set_priv
call that will be soon replaced by the upcoming publish/subscribe model.
RS CHANGES:
- The system process table has been reorganized and split into private entries
and public entries. Only the latter ones are exposed to system services.
- VM call masks are now entirely configured in rs/table.c
- RS has now its own slot in the system process table. Only kernel tasks and
user processes not included in the boot image are now left out from the system
process table.
- RS implements the initialization protocol for system services.
- For services in the boot image, RS blocks till initialization is complete and
panics when failure is reported back. Services are initialized in their order of
appearance in the boot image priv table and RS blocks to implements synchronous
initialization for every system service having the flag SF_SYNCH_BOOT set.
- For services started dynamically, the initialization protocol is implemented
as though it were the first ping for the service. In this case, if the
system service fails to report back (or reports failure), RS brings the service
down rather than trying to restart it.
2010-01-08 02:20:42 +01:00
|
|
|
#define VM_CALL_MASK_SIZE BITMAP_CHUNKS(NR_VM_CALLS)
|
|
|
|
|
2010-04-27 01:21:26 +02:00
|
|
|
/* not handled as a normal VM call, thus at the end of the reserved rage */
|
|
|
|
#define VM_PAGEFAULT (VM_RQ_BASE+0xff)
|
|
|
|
# define VPF_ADDR m1_i1
|
|
|
|
# define VPF_FLAGS m1_i2
|
|
|
|
|
Initialization protocol for system services.
SYSLIB CHANGES:
- SEF framework now supports a new SEF Init request type from RS. 3 different
callbacks are available (init_fresh, init_lu, init_restart) to specify
initialization code when a service starts fresh, starts after a live update,
or restarts.
SYSTEM SERVICE CHANGES:
- Initialization code for system services is now enclosed in a callback SEF will
automatically call at init time. The return code of the callback will
tell RS whether the initialization completed successfully.
- Each init callback can access information passed by RS to initialize. As of
now, each system service has access to the public entries of RS's system process
table to gather all the information required to initialize. This design
eliminates many existing or potential races at boot time and provides a uniform
initialization interface to system services. The same interface will be reused
for the upcoming publish/subscribe model to handle dynamic
registration / deregistration of system services.
VM CHANGES:
- Uniform privilege management for all system services. Every service uses the
same call mask format. For boot services, VM copies the call mask from init
data. For dynamic services, VM still receives the call mask via rs_set_priv
call that will be soon replaced by the upcoming publish/subscribe model.
RS CHANGES:
- The system process table has been reorganized and split into private entries
and public entries. Only the latter ones are exposed to system services.
- VM call masks are now entirely configured in rs/table.c
- RS has now its own slot in the system process table. Only kernel tasks and
user processes not included in the boot image are now left out from the system
process table.
- RS implements the initialization protocol for system services.
- For services in the boot image, RS blocks till initialization is complete and
panics when failure is reported back. Services are initialized in their order of
appearance in the boot image priv table and RS blocks to implements synchronous
initialization for every system service having the flag SF_SYNCH_BOOT set.
- For services started dynamically, the initialization protocol is implemented
as though it were the first ping for the service. In this case, if the
system service fails to report back (or reports failure), RS brings the service
down rather than trying to restart it.
2010-01-08 02:20:42 +01:00
|
|
|
/* Basic vm calls allowed to every process. */
|
|
|
|
#define VM_BASIC_CALLS \
|
2013-11-04 22:48:08 +01:00
|
|
|
VM_BRK, VM_MMAP, VM_MUNMAP, VM_MAP_PHYS, VM_UNMAP_PHYS, VM_INFO, \
|
|
|
|
VM_GETRUSAGE
|
2009-09-21 16:23:10 +02:00
|
|
|
|
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for IPC server *
|
|
|
|
*===========================================================================*/
|
|
|
|
#define IPC_BASE 0xD00
|
|
|
|
|
|
|
|
/* Shared Memory */
|
|
|
|
#define IPC_SHMGET (IPC_BASE+1)
|
|
|
|
#define IPC_SHMAT (IPC_BASE+2)
|
|
|
|
#define IPC_SHMDT (IPC_BASE+3)
|
|
|
|
#define IPC_SHMCTL (IPC_BASE+4)
|
|
|
|
|
|
|
|
/* Semaphore */
|
|
|
|
#define IPC_SEMGET (IPC_BASE+5)
|
|
|
|
#define IPC_SEMCTL (IPC_BASE+6)
|
|
|
|
#define IPC_SEMOP (IPC_BASE+7)
|
2008-11-19 13:26:10 +01:00
|
|
|
|
Userspace scheduling
- cotributed by Bjorn Swift
- In this first phase, scheduling is moved from the kernel to the PM
server. The next steps are to a) moving scheduling to its own server
and b) include useful information in the "out of quantum" message,
so that the scheduler can make use of this information.
- The kernel process table now keeps record of who is responsible for
scheduling each process (p_scheduler). When this pointer is NULL,
the process will be scheduled by the kernel. If such a process runs
out of quantum, the kernel will simply renew its quantum an requeue
it.
- When PM loads, it will take over scheduling of all running
processes, except system processes, using sys_schedctl().
Essentially, this only results in taking over init. As children
inherit a scheduler from their parent, user space programs forked by
init will inherit PM (for now) as their scheduler.
- Once a process has been assigned a scheduler, and runs out of
quantum, its RTS_NO_QUANTUM flag will be set and the process
dequeued. The kernel will send a message to the scheduler, on the
process' behalf, informing the scheduler that it has run out of
quantum. The scheduler can take what ever action it pleases, based
on its policy, and then reschedule the process using the
sys_schedule() system call.
- Balance queues does not work as before. While the old in-kernel
function used to renew the quantum of processes in the highest
priority run queue, the user-space implementation only acts on
processes that have been bumped down to a lower priority queue.
This approach reacts slower to changes than the old one, but saves
us sending a sys_schedule message for each process every time we
balance the queues. Currently, when processes are moved up a
priority queue, their quantum is also renewed, but this can be
fiddled with.
- do_nice has been removed from kernel. PM answers to get- and
setpriority calls, updates it's own nice variable as well as the
max_run_queue. This will be refactored once scheduling is moved to a
separate server. We will probably have PM update it's local nice
value and then send a message to whoever is scheduling the process.
- changes to fix an issue in do_fork() where processes could run out
of quantum but bypassing the code path that handles it correctly.
The future plan is to remove the policy from do_fork() and implement
it in userspace too.
2010-03-29 13:07:20 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for Scheduling *
|
|
|
|
*===========================================================================*/
|
|
|
|
#define SCHEDULING_BASE 0xF00
|
|
|
|
|
|
|
|
#define SCHEDULING_NO_QUANTUM (SCHEDULING_BASE+1)
|
Scheduling server (by Bjorn Swift)
In this second phase, scheduling is moved from PM to its own
scheduler (see r6557 for phase one). In the next phase we hope to a)
include useful information in the "out of quantum" message and b)
create some simple scheduling policy that makes use of that
information.
When the system starts up, PM will iterate over its process table and
ask SCHED to take over scheduling unprivileged processes. This is
done by sending a SCHEDULING_START message to SCHED. This message
includes the processes endpoint, the parent's endpoint and its nice
level. The scheduler adds this process to its schedproc table, issues
a schedctl, and returns its own endpoint to PM - as the endpoint of
the effective scheduler. When a process terminates, a SCHEDULING_STOP
message is sent to the scheduler.
The reason for this effective endpoint is for future compatibility.
Some day, we may have a scheduler that, instead of scheduling the
process itself, forwards the SCHEDULING_START message on to another
scheduler.
PM has information on who schedules whom. As such, scheduling
messages from user-land are sent through PM. An example is when
processes change their priority, using nice(). In that case, a
getsetpriority message is sent to PM, which then sends a
SCHEDULING_SET_NICE to the process's effective scheduler.
When a process is forked through PM, it inherits its parent's
scheduler, but is spawned with an empty quantum. As before, a request
to fork a process flows through VM before returning to PM, which then
wakes up the child process. This flow has been modified slightly so
that PM notifies the scheduler of the new process, before waking up
the child process. If the scheduler fails to take over scheduling,
the child process is torn down and the fork fails with an erroneous
value.
Process priority is entirely decided upon using nice levels. PM
stores a copy of each process's nice level and when a child is
forked, its parent's nice level is sent in the SCHEDULING_START
message. How this level is mapped to a priority queue is up to the
scheduler. It should be noted that the nice level is used to
determine the max_priority and the parent could have been in a lower
priority when it was spawned. To prevent a CPU intensive process from
hawking the CPU by continuously forking children that get scheduled
in the max_priority, the scheduler should determine in which queue
the parent is currently scheduled, and schedule the child in that
same queue.
Other fixes: The USER_Q in kernel/proc.h was incorrectly defined as
NR_SCHED_QUEUES/2. That results in a "off by one" error when
converting priority->nice->priority for nice=0. This also had the
side effect that if someone were to set the MAX_USER_Q to something
else than 0, then USER_Q would be off.
2010-05-18 15:39:04 +02:00
|
|
|
#define SCHEDULING_START (SCHEDULING_BASE+2)
|
|
|
|
#define SCHEDULING_STOP (SCHEDULING_BASE+3)
|
|
|
|
#define SCHEDULING_SET_NICE (SCHEDULING_BASE+4)
|
2010-07-01 10:32:33 +02:00
|
|
|
#define SCHEDULING_INHERIT (SCHEDULING_BASE+5)
|
|
|
|
|
2011-02-21 16:16:29 +01:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for USB *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
#define USB_BASE 0x1100
|
|
|
|
|
|
|
|
/* those are from driver to USBD */
|
|
|
|
#define USB_RQ_INIT (USB_BASE + 0) /* First message to HCD driver */
|
|
|
|
#define USB_RQ_DEINIT (USB_BASE + 1) /* Quit the session */
|
|
|
|
#define USB_RQ_SEND_URB (USB_BASE + 2) /* Send URB */
|
|
|
|
#define USB_RQ_CANCEL_URB (USB_BASE + 3) /* Cancel URB */
|
2014-06-26 14:05:41 +02:00
|
|
|
#define USB_RQ_SEND_INFO (USB_BASE + 4) /* Sends various information */
|
|
|
|
#define USB_REPLY (USB_BASE + 5)
|
2011-02-21 16:16:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* those are from USBD to driver */
|
|
|
|
#define USB_COMPLETE_URB (USB_BASE + 6)
|
|
|
|
#define USB_ANNOUCE_DEV (USB_BASE + 7) /* Announce a new USB Device */
|
|
|
|
#define USB_WITHDRAW_DEV (USB_BASE + 8) /* Withdraw a allready anncounced
|
|
|
|
USB device*/
|
|
|
|
# define USB_GRANT_ID m4_l1
|
|
|
|
# define USB_GRANT_SIZE m4_l2
|
|
|
|
|
|
|
|
# define USB_URB_ID m4_l1
|
|
|
|
# define USB_RESULT m4_l2
|
|
|
|
# define USB_DEV_ID m4_l1
|
|
|
|
# define USB_DRIVER_EP m4_l2
|
|
|
|
# define USB_INTERFACES m4_l3
|
|
|
|
# define USB_RB_INIT_NAME m3_ca1
|
|
|
|
|
2014-06-26 14:05:41 +02:00
|
|
|
# define USB_INFO_TYPE m4_l1
|
|
|
|
# define USB_INFO_VALUE m4_l2
|
|
|
|
|
2011-02-23 14:48:03 +01:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for DeviceManager (s/t like SysFS) *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
#define DEVMAN_BASE 0x1200
|
|
|
|
|
|
|
|
#define DEVMAN_ADD_DEV (DEVMAN_BASE + 0)
|
|
|
|
#define DEVMAN_DEL_DEV (DEVMAN_BASE + 1)
|
|
|
|
#define DEVMAN_ADD_BUS (DEVMAN_BASE + 2)
|
|
|
|
#define DEVMAN_DEL_BUS (DEVMAN_BASE + 3)
|
|
|
|
#define DEVMAN_ADD_DEVFILE (DEVMAN_BASE + 4)
|
|
|
|
#define DEVMAN_DEL_DEVFILE (DEVMAN_BASE + 5)
|
|
|
|
|
|
|
|
#define DEVMAN_REQUEST (DEVMAN_BASE + 6)
|
|
|
|
#define DEVMAN_REPLY (DEVMAN_BASE + 7)
|
|
|
|
|
|
|
|
#define DEVMAN_BIND (DEVMAN_BASE + 8)
|
|
|
|
#define DEVMAN_UNBIND (DEVMAN_BASE + 9)
|
|
|
|
|
|
|
|
# define DEVMAN_GRANT_ID m4_l1
|
|
|
|
# define DEVMAN_GRANT_SIZE m4_l2
|
|
|
|
|
|
|
|
# define DEVMAN_ENDPOINT m4_l3
|
|
|
|
# define DEVMAN_DEVICE_ID m4_l2
|
|
|
|
# define DEVMAN_RESULT m4_l1
|
|
|
|
|
2010-11-17 15:53:07 +01:00
|
|
|
/*===========================================================================*
|
Input infrastructure, INPUT server, PCKBD driver
This commit separates the low-level keyboard driver from TTY, putting
it in a separate driver (PCKBD). The commit also separates management
of raw input devices from TTY, and puts it in a separate server
(INPUT). All keyboard and mouse input from hardware is sent by drivers
to the INPUT server, which either sends it to a process that has
opened a raw input device, or otherwise forwards it to TTY for
standard processing.
Design by Dirk Vogt. Prototype by Uli Kastlunger.
Additional changes made to the prototype:
- the event communication is now based on USB HID codes; all input
drivers have to use USB codes to describe events;
- all TTY keymaps have been converted to USB format, with the effect
that a single keymap covers all keys; there is no (static) escaped
keymap anymore;
- further keymap tweaks now allow remapping of literally all keys;
- input device renumbering and protocol rewrite;
- INPUT server rewrite, with added support for cancel and select;
- PCKBD reimplementation, including PC/AT-to-USB translation;
- support for manipulating keyboard LEDs has been added;
- keyboard and mouse multiplexer devices have been added to INPUT,
primarily so that an X server need only open two devices;
- a new "libinputdriver" library abstracts away protocol details from
input drivers, and should be used by all future input drivers;
- both INPUT and PCKBD can be restarted;
- TTY is now scheduled by KERNEL, so that it won't be punished for
running a lot; without this, simply running "yes" on the console
kills the system;
- the KIOCBELL IOCTL has been moved to /dev/console;
- support for the SCANCODES termios setting has been removed;
- obsolete keymap compression has been removed;
- the obsolete Olivetti M24 keymap has been removed.
Change-Id: I3a672fb8c4fd566734e4b46d3994b4b7fc96d578
2013-09-28 14:46:21 +02:00
|
|
|
* Messages for TTY *
|
2010-11-17 15:53:07 +01:00
|
|
|
*===========================================================================*/
|
|
|
|
|
2013-05-01 21:01:17 +02:00
|
|
|
#define TTY_RQ_BASE 0x1300
|
2010-11-17 15:53:07 +01:00
|
|
|
|
2013-05-01 21:01:17 +02:00
|
|
|
#define TTY_FKEY_CONTROL (TTY_RQ_BASE + 1) /* control an F-key at TTY */
|
|
|
|
# define FKEY_MAP 10 /* observe function key */
|
|
|
|
# define FKEY_UNMAP 11 /* stop observing function key */
|
|
|
|
# define FKEY_EVENTS 12 /* request open key presses */
|
|
|
|
|
Input infrastructure, INPUT server, PCKBD driver
This commit separates the low-level keyboard driver from TTY, putting
it in a separate driver (PCKBD). The commit also separates management
of raw input devices from TTY, and puts it in a separate server
(INPUT). All keyboard and mouse input from hardware is sent by drivers
to the INPUT server, which either sends it to a process that has
opened a raw input device, or otherwise forwards it to TTY for
standard processing.
Design by Dirk Vogt. Prototype by Uli Kastlunger.
Additional changes made to the prototype:
- the event communication is now based on USB HID codes; all input
drivers have to use USB codes to describe events;
- all TTY keymaps have been converted to USB format, with the effect
that a single keymap covers all keys; there is no (static) escaped
keymap anymore;
- further keymap tweaks now allow remapping of literally all keys;
- input device renumbering and protocol rewrite;
- INPUT server rewrite, with added support for cancel and select;
- PCKBD reimplementation, including PC/AT-to-USB translation;
- support for manipulating keyboard LEDs has been added;
- keyboard and mouse multiplexer devices have been added to INPUT,
primarily so that an X server need only open two devices;
- a new "libinputdriver" library abstracts away protocol details from
input drivers, and should be used by all future input drivers;
- both INPUT and PCKBD can be restarted;
- TTY is now scheduled by KERNEL, so that it won't be punished for
running a lot; without this, simply running "yes" on the console
kills the system;
- the KIOCBELL IOCTL has been moved to /dev/console;
- support for the SCANCODES termios setting has been removed;
- obsolete keymap compression has been removed;
- the obsolete Olivetti M24 keymap has been removed.
Change-Id: I3a672fb8c4fd566734e4b46d3994b4b7fc96d578
2013-09-28 14:46:21 +02:00
|
|
|
#define TTY_INPUT_UP (TTY_RQ_BASE + 2) /* input server is up */
|
|
|
|
#define TTY_INPUT_EVENT (TTY_RQ_BASE + 3) /* relayed input event */
|
|
|
|
|
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for input server and drivers *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
/* The input protocol has no real replies. All messages are one-way. */
|
|
|
|
#define INPUT_RQ_BASE 0x1500 /* from TTY to server, or server to driver */
|
|
|
|
#define INPUT_RS_BASE 0x1580 /* from input driver to input server */
|
|
|
|
|
|
|
|
#define INPUT_CONF (INPUT_RQ_BASE + 0) /* configure driver */
|
|
|
|
#define INPUT_SETLEDS (INPUT_RQ_BASE + 1) /* set keyboard LEDs */
|
|
|
|
|
|
|
|
#define INPUT_EVENT (INPUT_RS_BASE + 0) /* send input event */
|
Userspace scheduling
- cotributed by Bjorn Swift
- In this first phase, scheduling is moved from the kernel to the PM
server. The next steps are to a) moving scheduling to its own server
and b) include useful information in the "out of quantum" message,
so that the scheduler can make use of this information.
- The kernel process table now keeps record of who is responsible for
scheduling each process (p_scheduler). When this pointer is NULL,
the process will be scheduled by the kernel. If such a process runs
out of quantum, the kernel will simply renew its quantum an requeue
it.
- When PM loads, it will take over scheduling of all running
processes, except system processes, using sys_schedctl().
Essentially, this only results in taking over init. As children
inherit a scheduler from their parent, user space programs forked by
init will inherit PM (for now) as their scheduler.
- Once a process has been assigned a scheduler, and runs out of
quantum, its RTS_NO_QUANTUM flag will be set and the process
dequeued. The kernel will send a message to the scheduler, on the
process' behalf, informing the scheduler that it has run out of
quantum. The scheduler can take what ever action it pleases, based
on its policy, and then reschedule the process using the
sys_schedule() system call.
- Balance queues does not work as before. While the old in-kernel
function used to renew the quantum of processes in the highest
priority run queue, the user-space implementation only acts on
processes that have been bumped down to a lower priority queue.
This approach reacts slower to changes than the old one, but saves
us sending a sys_schedule message for each process every time we
balance the queues. Currently, when processes are moved up a
priority queue, their quantum is also renewed, but this can be
fiddled with.
- do_nice has been removed from kernel. PM answers to get- and
setpriority calls, updates it's own nice variable as well as the
max_run_queue. This will be refactored once scheduling is moved to a
separate server. We will probably have PM update it's local nice
value and then send a message to whoever is scheduling the process.
- changes to fix an issue in do_fork() where processes could run out
of quantum but bypassing the code path that handles it correctly.
The future plan is to remove the policy from do_fork() and implement
it in userspace too.
2010-03-29 13:07:20 +02:00
|
|
|
|
Add PTYFS, Unix98 pseudo terminal support
This patch adds support for Unix98 pseudo terminals, that is,
posix_openpt(3), grantpt(3), unlockpt(3), /dev/ptmx, and /dev/pts/.
The latter is implemented with a new pseudo file system, PTYFS.
In effect, this patch adds secure support for unprivileged pseudo
terminal allocation, allowing programs such as tmux(1) to be used by
non-root users as well. Test77 has been extended with new tests, and
no longer needs to run as root.
The new functionality is optional. To revert to the old behavior,
remove the "ptyfs" entry from /etc/fstab.
Technical nodes:
o The reason for not implementing the NetBSD /dev/ptm approach is that
implementing the corresponding ioctl (TIOCPTMGET) would require
adding a number of extremely hairy exceptions to VFS, including the
PTY driver having to create new file descriptors for its own device
nodes.
o PTYFS is required for Unix98 PTYs in order to avoid that the PTY
driver has to be aware of old-style PTY naming schemes and even has
to call chmod(2) on a disk-backed file system. PTY cannot be its
own PTYFS since a character driver may currently not also be a file
system. However, PTYFS may be subsumed into a DEVFS in the future.
o The Unix98 PTY behavior differs somewhat from NetBSD's, in that
slave nodes are created on ptyfs only upon the first call to
grantpt(3). This approach obviates the need to revoke access as
part of the grantpt(3) call.
o Shutting down PTY may leave slave nodes on PTYFS, but once PTY is
restarted, these leftover slave nodes will be removed before they
create a security risk. Unmounting PTYFS will make existing PTY
slaves permanently unavailable, and absence of PTYFS will block
allocation of new Unix98 PTYs until PTYFS is (re)mounted.
Change-Id: I822b43ba32707c8815fd0f7d5bb7a438f51421c1
2015-06-22 19:14:34 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for PTYFS *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
#define PTYFS_BASE 0x1700
|
|
|
|
|
|
|
|
#define PTYFS_SET (PTYFS_BASE + 0) /* add/update node */
|
|
|
|
#define PTYFS_CLEAR (PTYFS_BASE + 1) /* delete node */
|
|
|
|
#define PTYFS_NAME (PTYFS_BASE + 2) /* get node name */
|
|
|
|
|
2011-07-27 17:49:42 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* VFS-FS TRANSACTION IDs *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
2013-11-04 22:48:08 +01:00
|
|
|
#define VFS_TRANSACTION_BASE 0xB00
|
2011-07-27 17:49:42 +02:00
|
|
|
|
|
|
|
#define VFS_TRANSID (VFS_TRANSACTION_BASE + 1)
|
|
|
|
#define IS_VFS_FS_TRANSID(type) (((type) & ~0xff) == VFS_TRANSACTION_BASE)
|
|
|
|
|
2013-09-10 20:25:01 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for character devices *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
/* Base type for character device requests and responses. */
|
|
|
|
#define CDEV_RQ_BASE 0x400
|
|
|
|
#define CDEV_RS_BASE 0x480
|
|
|
|
|
|
|
|
#define IS_CDEV_RQ(type) (((type) & ~0x7f) == CDEV_RQ_BASE)
|
|
|
|
#define IS_CDEV_RS(type) (((type) & ~0x7f) == CDEV_RS_BASE)
|
|
|
|
|
|
|
|
/* Message types for character device requests. */
|
|
|
|
#define CDEV_OPEN (CDEV_RQ_BASE + 0) /* open a minor device */
|
|
|
|
#define CDEV_CLOSE (CDEV_RQ_BASE + 1) /* close a minor device */
|
|
|
|
#define CDEV_READ (CDEV_RQ_BASE + 2) /* read into a buffer */
|
|
|
|
#define CDEV_WRITE (CDEV_RQ_BASE + 3) /* write from a buffer */
|
|
|
|
#define CDEV_IOCTL (CDEV_RQ_BASE + 4) /* I/O control operation */
|
|
|
|
#define CDEV_CANCEL (CDEV_RQ_BASE + 5) /* cancel suspended request */
|
|
|
|
#define CDEV_SELECT (CDEV_RQ_BASE + 6) /* test for ready operations */
|
|
|
|
|
|
|
|
/* Message types for character device responses. */
|
|
|
|
#define CDEV_REPLY (CDEV_RS_BASE + 0) /* general reply code */
|
|
|
|
#define CDEV_SEL1_REPLY (CDEV_RS_BASE + 1) /* immediate select reply */
|
|
|
|
#define CDEV_SEL2_REPLY (CDEV_RS_BASE + 2) /* select notification reply */
|
|
|
|
|
|
|
|
/* Bits in 'CDEV_ACCESS' field of block device open requests. */
|
|
|
|
# define CDEV_R_BIT 0x01 /* open with read access */
|
|
|
|
# define CDEV_W_BIT 0x02 /* open with write access */
|
|
|
|
# define CDEV_NOCTTY 0x04 /* not to become the controlling TTY */
|
|
|
|
|
|
|
|
/* Bits in 'CDEV_FLAGS' field of block device transfer requests. */
|
|
|
|
# define CDEV_NOFLAGS 0x00 /* no flags are set */
|
|
|
|
# define CDEV_NONBLOCK 0x01 /* do not suspend I/O request */
|
|
|
|
|
|
|
|
/* Bits in 'CDEV_OPS', 'CDEV_STATUS' fields of block device select messages. */
|
|
|
|
# define CDEV_OP_RD 0x01 /* selected for read operation */
|
|
|
|
# define CDEV_OP_WR 0x02 /* selected for write operation */
|
|
|
|
# define CDEV_OP_ERR 0x04 /* selected for error operation */
|
|
|
|
# define CDEV_NOTIFY 0x08 /* notification requested */
|
|
|
|
|
|
|
|
/* Bits in 'CDEV_STATUS' field of block device open responses. */
|
|
|
|
# define CDEV_CLONED 0x20000000 /* device is cloned */
|
|
|
|
# define CDEV_CTTY 0x40000000 /* device is controlling TTY */
|
|
|
|
|
Split block/character protocols and libdriver
This patch separates the character and block driver communication
protocols. The old character protocol remains the same, but a new
block protocol is introduced. The libdriver library is replaced by
two new libraries: libchardriver and libblockdriver. Their exposed
API, and drivers that use them, have been updated accordingly.
Together, libbdev and libblockdriver now completely abstract away
the message format used by the block protocol. As the memory driver
is both a character and a block device driver, it now implements its
own message loop.
The most important semantic change made to the block protocol is that
it is no longer possible to return both partial results and an error
for a single transfer. This simplifies the interaction between the
caller and the driver, as the I/O vector no longer needs to be copied
back. Also, drivers are now no longer supposed to decide based on the
layout of the I/O vector when a transfer should be cut short. Put
simply, transfers are now supposed to either succeed completely, or
result in an error.
After this patch, the state of the various pieces is as follows:
- block protocol: stable
- libbdev API: stable for synchronous communication
- libblockdriver API: needs slight revision (the drvlib/partition API
in particular; the threading API will also change shortly)
- character protocol: needs cleanup
- libchardriver API: needs cleanup accordingly
- driver restarts: largely unsupported until endpoint changes are
reintroduced
As a side effect, this patch eliminates several bugs, hacks, and gcc
-Wall and -W warnings all over the place. It probably introduces a
few new ones, too.
Update warning: this patch changes the protocol between MFS and disk
drivers, so in order to use old/new images, the MFS from the ramdisk
must be used to mount all file systems.
2011-11-22 13:27:53 +01:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for block devices *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
/* Base type for block device requests and responses. */
|
2013-09-10 20:25:01 +02:00
|
|
|
#define BDEV_RQ_BASE 0x500
|
|
|
|
#define BDEV_RS_BASE 0x580
|
Split block/character protocols and libdriver
This patch separates the character and block driver communication
protocols. The old character protocol remains the same, but a new
block protocol is introduced. The libdriver library is replaced by
two new libraries: libchardriver and libblockdriver. Their exposed
API, and drivers that use them, have been updated accordingly.
Together, libbdev and libblockdriver now completely abstract away
the message format used by the block protocol. As the memory driver
is both a character and a block device driver, it now implements its
own message loop.
The most important semantic change made to the block protocol is that
it is no longer possible to return both partial results and an error
for a single transfer. This simplifies the interaction between the
caller and the driver, as the I/O vector no longer needs to be copied
back. Also, drivers are now no longer supposed to decide based on the
layout of the I/O vector when a transfer should be cut short. Put
simply, transfers are now supposed to either succeed completely, or
result in an error.
After this patch, the state of the various pieces is as follows:
- block protocol: stable
- libbdev API: stable for synchronous communication
- libblockdriver API: needs slight revision (the drvlib/partition API
in particular; the threading API will also change shortly)
- character protocol: needs cleanup
- libchardriver API: needs cleanup accordingly
- driver restarts: largely unsupported until endpoint changes are
reintroduced
As a side effect, this patch eliminates several bugs, hacks, and gcc
-Wall and -W warnings all over the place. It probably introduces a
few new ones, too.
Update warning: this patch changes the protocol between MFS and disk
drivers, so in order to use old/new images, the MFS from the ramdisk
must be used to mount all file systems.
2011-11-22 13:27:53 +01:00
|
|
|
|
|
|
|
#define IS_BDEV_RQ(type) (((type) & ~0x7f) == BDEV_RQ_BASE)
|
|
|
|
#define IS_BDEV_RS(type) (((type) & ~0x7f) == BDEV_RS_BASE)
|
|
|
|
|
|
|
|
/* Message types for block device requests. */
|
|
|
|
#define BDEV_OPEN (BDEV_RQ_BASE + 0) /* open a minor device */
|
|
|
|
#define BDEV_CLOSE (BDEV_RQ_BASE + 1) /* close a minor device */
|
|
|
|
#define BDEV_READ (BDEV_RQ_BASE + 2) /* read into a buffer */
|
|
|
|
#define BDEV_WRITE (BDEV_RQ_BASE + 3) /* write from a buffer */
|
|
|
|
#define BDEV_GATHER (BDEV_RQ_BASE + 4) /* read into a vector */
|
|
|
|
#define BDEV_SCATTER (BDEV_RQ_BASE + 5) /* write from a vector */
|
|
|
|
#define BDEV_IOCTL (BDEV_RQ_BASE + 6) /* I/O control operation */
|
|
|
|
|
|
|
|
/* Message types for block device responses. */
|
|
|
|
#define BDEV_REPLY (BDEV_RS_BASE + 0) /* general reply code */
|
|
|
|
|
2013-07-27 00:49:49 +02:00
|
|
|
/* Bits in 'BDEV_ACCESS' field of block device open requests. */
|
|
|
|
# define BDEV_R_BIT 0x01 /* open with read access */
|
|
|
|
# define BDEV_W_BIT 0x02 /* open with write access */
|
|
|
|
|
Split block/character protocols and libdriver
This patch separates the character and block driver communication
protocols. The old character protocol remains the same, but a new
block protocol is introduced. The libdriver library is replaced by
two new libraries: libchardriver and libblockdriver. Their exposed
API, and drivers that use them, have been updated accordingly.
Together, libbdev and libblockdriver now completely abstract away
the message format used by the block protocol. As the memory driver
is both a character and a block device driver, it now implements its
own message loop.
The most important semantic change made to the block protocol is that
it is no longer possible to return both partial results and an error
for a single transfer. This simplifies the interaction between the
caller and the driver, as the I/O vector no longer needs to be copied
back. Also, drivers are now no longer supposed to decide based on the
layout of the I/O vector when a transfer should be cut short. Put
simply, transfers are now supposed to either succeed completely, or
result in an error.
After this patch, the state of the various pieces is as follows:
- block protocol: stable
- libbdev API: stable for synchronous communication
- libblockdriver API: needs slight revision (the drvlib/partition API
in particular; the threading API will also change shortly)
- character protocol: needs cleanup
- libchardriver API: needs cleanup accordingly
- driver restarts: largely unsupported until endpoint changes are
reintroduced
As a side effect, this patch eliminates several bugs, hacks, and gcc
-Wall and -W warnings all over the place. It probably introduces a
few new ones, too.
Update warning: this patch changes the protocol between MFS and disk
drivers, so in order to use old/new images, the MFS from the ramdisk
must be used to mount all file systems.
2011-11-22 13:27:53 +01:00
|
|
|
/* Bits in 'BDEV_FLAGS' field of block device transfer requests. */
|
|
|
|
# define BDEV_NOFLAGS 0x00 /* no flags are set */
|
|
|
|
# define BDEV_FORCEWRITE 0x01 /* force write to disk immediately */
|
2013-07-27 01:44:52 +02:00
|
|
|
# define BDEV_NOPAGE 0x02 /* eeprom: don't send page address */
|
Split block/character protocols and libdriver
This patch separates the character and block driver communication
protocols. The old character protocol remains the same, but a new
block protocol is introduced. The libdriver library is replaced by
two new libraries: libchardriver and libblockdriver. Their exposed
API, and drivers that use them, have been updated accordingly.
Together, libbdev and libblockdriver now completely abstract away
the message format used by the block protocol. As the memory driver
is both a character and a block device driver, it now implements its
own message loop.
The most important semantic change made to the block protocol is that
it is no longer possible to return both partial results and an error
for a single transfer. This simplifies the interaction between the
caller and the driver, as the I/O vector no longer needs to be copied
back. Also, drivers are now no longer supposed to decide based on the
layout of the I/O vector when a transfer should be cut short. Put
simply, transfers are now supposed to either succeed completely, or
result in an error.
After this patch, the state of the various pieces is as follows:
- block protocol: stable
- libbdev API: stable for synchronous communication
- libblockdriver API: needs slight revision (the drvlib/partition API
in particular; the threading API will also change shortly)
- character protocol: needs cleanup
- libchardriver API: needs cleanup accordingly
- driver restarts: largely unsupported until endpoint changes are
reintroduced
As a side effect, this patch eliminates several bugs, hacks, and gcc
-Wall and -W warnings all over the place. It probably introduces a
few new ones, too.
Update warning: this patch changes the protocol between MFS and disk
drivers, so in order to use old/new images, the MFS from the ramdisk
must be used to mount all file systems.
2011-11-22 13:27:53 +01:00
|
|
|
|
2013-08-02 16:10:30 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Messages for Real Time Clocks *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
/* Base type for real time clock requests and responses. */
|
2013-11-04 22:48:08 +01:00
|
|
|
#define RTCDEV_RQ_BASE 0x1400
|
|
|
|
#define RTCDEV_RS_BASE 0x1480
|
2013-08-02 16:10:30 +02:00
|
|
|
|
|
|
|
#define IS_RTCDEV_RQ(type) (((type) & ~0x7f) == RTCDEV_RQ_BASE)
|
|
|
|
#define IS_RTCDEV_RS(type) (((type) & ~0x7f) == RTCDEV_RS_BASE)
|
|
|
|
|
|
|
|
/* Message types for real time clock requests. */
|
|
|
|
#define RTCDEV_GET_TIME (RTCDEV_RQ_BASE + 0) /* get time from hw clock */
|
|
|
|
#define RTCDEV_SET_TIME (RTCDEV_RQ_BASE + 1) /* set time in hw clock */
|
|
|
|
#define RTCDEV_PWR_OFF (RTCDEV_RQ_BASE + 2) /* set time to cut the power */
|
|
|
|
|
2013-08-06 15:52:46 +02:00
|
|
|
/* Same as GET/SET above but using grants */
|
|
|
|
#define RTCDEV_GET_TIME_G (RTCDEV_RQ_BASE + 3) /* get time from hw clock */
|
|
|
|
#define RTCDEV_SET_TIME_G (RTCDEV_RQ_BASE + 4) /* set time in hw clock */
|
|
|
|
|
2013-08-02 16:10:30 +02:00
|
|
|
/* Message types for real time clock responses. */
|
|
|
|
#define RTCDEV_REPLY (RTCDEV_RS_BASE + 0) /* general reply code */
|
|
|
|
|
2014-05-19 09:19:01 +02:00
|
|
|
/* Bits in 'lc_readclock_rtcdev.flags' field of real time clock requests. */
|
2013-08-02 16:10:30 +02:00
|
|
|
#define RTCDEV_NOFLAGS 0x00 /* no flags are set */
|
|
|
|
#define RTCDEV_Y2KBUG 0x01 /* Interpret 1980 as 2000 for RTC w/Y2K bug */
|
|
|
|
#define RTCDEV_CMOSREG 0x02 /* Also set the CMOS clock register bits. */
|
|
|
|
|
2013-09-10 20:25:01 +02:00
|
|
|
/*===========================================================================*
|
|
|
|
* Internal codes used by several services *
|
|
|
|
*===========================================================================*/
|
|
|
|
|
|
|
|
#define SUSPEND -998 /* status to suspend caller, reply later */
|
|
|
|
|
Input infrastructure, INPUT server, PCKBD driver
This commit separates the low-level keyboard driver from TTY, putting
it in a separate driver (PCKBD). The commit also separates management
of raw input devices from TTY, and puts it in a separate server
(INPUT). All keyboard and mouse input from hardware is sent by drivers
to the INPUT server, which either sends it to a process that has
opened a raw input device, or otherwise forwards it to TTY for
standard processing.
Design by Dirk Vogt. Prototype by Uli Kastlunger.
Additional changes made to the prototype:
- the event communication is now based on USB HID codes; all input
drivers have to use USB codes to describe events;
- all TTY keymaps have been converted to USB format, with the effect
that a single keymap covers all keys; there is no (static) escaped
keymap anymore;
- further keymap tweaks now allow remapping of literally all keys;
- input device renumbering and protocol rewrite;
- INPUT server rewrite, with added support for cancel and select;
- PCKBD reimplementation, including PC/AT-to-USB translation;
- support for manipulating keyboard LEDs has been added;
- keyboard and mouse multiplexer devices have been added to INPUT,
primarily so that an X server need only open two devices;
- a new "libinputdriver" library abstracts away protocol details from
input drivers, and should be used by all future input drivers;
- both INPUT and PCKBD can be restarted;
- TTY is now scheduled by KERNEL, so that it won't be punished for
running a lot; without this, simply running "yes" on the console
kills the system;
- the KIOCBELL IOCTL has been moved to /dev/console;
- support for the SCANCODES termios setting has been removed;
- obsolete keymap compression has been removed;
- the obsolete Olivetti M24 keymap has been removed.
Change-Id: I3a672fb8c4fd566734e4b46d3994b4b7fc96d578
2013-09-28 14:46:21 +02:00
|
|
|
#endif /* !_MINIX_COM_H */
|