
* Userspace change to use the new kernel calls - _taskcall(SYSTASK...) changed to _kernel_call(...) - int 32 reused for the kernel calls - _do_kernel_call() to make the trap to kernel - kernel_call() to make the actuall kernel call from C using _do_kernel_call() - unlike ipc call the kernel call always succeeds as kernel is always available, however, kernel may return an error * Kernel side implementation of kernel calls - the SYSTEm task does not run, only the proc table entry is preserved - every data_copy(SYSTEM is no data_copy(KERNEL - "locking" is an empty operation now as everything runs in kernel - sys_task() is replaced by kernel_call() which copies the message into kernel, dispatches the call to its handler and finishes by either copying the results back to userspace (if need be) or by suspending the process because of VM - suspended processes are later made runnable once the memory issue is resolved, picked up by the scheduler and only at this time the call is resumed (in fact restarted) which does not need to copy the message from userspace as the message is already saved in the process structure. - no ned for the vmrestart queue, the scheduler will restart the system calls - no special case in do_vmctl(), all requests remove the RTS_VMREQUEST flag
158 lines
4.6 KiB
C
158 lines
4.6 KiB
C
#ifndef _IPC_H
|
|
#define _IPC_H
|
|
|
|
#include <minix/type.h>
|
|
|
|
/*==========================================================================*
|
|
* Types relating to messages. *
|
|
*==========================================================================*/
|
|
|
|
#define M1 1
|
|
#define M3 3
|
|
#define M4 4
|
|
#define M3_STRING 14 /* legacy m3_ca1 size (must not be changed) */
|
|
#define M3_LONG_STRING 16 /* current m3_ca1 size (may be increased) */
|
|
|
|
typedef struct {int m1i1, m1i2, m1i3; char *m1p1, *m1p2, *m1p3;} mess_1;
|
|
typedef struct {int m2i1, m2i2, m2i3; long m2l1, m2l2; char *m2p1;
|
|
short m2s1;} mess_2;
|
|
typedef struct {int m3i1, m3i2; char *m3p1; char m3ca1[M3_LONG_STRING];} mess_3;
|
|
typedef struct {long m4l1, m4l2, m4l3, m4l4, m4l5;} mess_4;
|
|
typedef struct {short m5s1, m5s2; int m5i1, m5i2; long m5l1, m5l2, m5l3;}mess_5;
|
|
typedef struct {long m6l1, m6l2, m6l3; short m6s1, m6s2, m6s3; char m6c1, m6c2;
|
|
char *m6p1, *m6p2;} mess_6;
|
|
typedef struct {int m7i1, m7i2, m7i3, m7i4; char *m7p1, *m7p2;} mess_7;
|
|
typedef struct {int m8i1, m8i2; char *m8p1, *m8p2, *m8p3, *m8p4;} mess_8;
|
|
typedef struct {long m9l1, m9l2, m9l3, m9l4, m9l5;
|
|
short m9s1, m9s2, m9s3, m9s4; } mess_9;
|
|
|
|
typedef struct {
|
|
endpoint_t m_source; /* who sent the message */
|
|
int m_type; /* what kind of message is it */
|
|
union {
|
|
mess_1 m_m1;
|
|
mess_2 m_m2;
|
|
mess_3 m_m3;
|
|
mess_4 m_m4;
|
|
mess_5 m_m5;
|
|
mess_7 m_m7;
|
|
mess_8 m_m8;
|
|
mess_6 m_m6;
|
|
mess_9 m_m9;
|
|
} m_u;
|
|
} message;
|
|
|
|
/* The following defines provide names for useful members. */
|
|
#define m1_i1 m_u.m_m1.m1i1
|
|
#define m1_i2 m_u.m_m1.m1i2
|
|
#define m1_i3 m_u.m_m1.m1i3
|
|
#define m1_p1 m_u.m_m1.m1p1
|
|
#define m1_p2 m_u.m_m1.m1p2
|
|
#define m1_p3 m_u.m_m1.m1p3
|
|
|
|
#define m2_i1 m_u.m_m2.m2i1
|
|
#define m2_i2 m_u.m_m2.m2i2
|
|
#define m2_i3 m_u.m_m2.m2i3
|
|
#define m2_l1 m_u.m_m2.m2l1
|
|
#define m2_l2 m_u.m_m2.m2l2
|
|
#define m2_p1 m_u.m_m2.m2p1
|
|
|
|
#define m2_s1 m_u.m_m2.m2s1
|
|
|
|
#define m3_i1 m_u.m_m3.m3i1
|
|
#define m3_i2 m_u.m_m3.m3i2
|
|
#define m3_p1 m_u.m_m3.m3p1
|
|
#define m3_ca1 m_u.m_m3.m3ca1
|
|
|
|
#define m4_l1 m_u.m_m4.m4l1
|
|
#define m4_l2 m_u.m_m4.m4l2
|
|
#define m4_l3 m_u.m_m4.m4l3
|
|
#define m4_l4 m_u.m_m4.m4l4
|
|
#define m4_l5 m_u.m_m4.m4l5
|
|
|
|
#define m5_s1 m_u.m_m5.m5s1
|
|
#define m5_s2 m_u.m_m5.m5s2
|
|
#define m5_i1 m_u.m_m5.m5i1
|
|
#define m5_i2 m_u.m_m5.m5i2
|
|
#define m5_l1 m_u.m_m5.m5l1
|
|
#define m5_l2 m_u.m_m5.m5l2
|
|
#define m5_l3 m_u.m_m5.m5l3
|
|
|
|
#define m6_l1 m_u.m_m6.m6l1
|
|
#define m6_l2 m_u.m_m6.m6l2
|
|
#define m6_l3 m_u.m_m6.m6l3
|
|
#define m6_s1 m_u.m_m6.m6s1
|
|
#define m6_s2 m_u.m_m6.m6s2
|
|
#define m6_s3 m_u.m_m6.m6s3
|
|
#define m6_c1 m_u.m_m6.m6c1
|
|
#define m6_c2 m_u.m_m6.m6c2
|
|
#define m6_p1 m_u.m_m6.m6p1
|
|
#define m6_p2 m_u.m_m6.m6p2
|
|
|
|
#define m7_i1 m_u.m_m7.m7i1
|
|
#define m7_i2 m_u.m_m7.m7i2
|
|
#define m7_i3 m_u.m_m7.m7i3
|
|
#define m7_i4 m_u.m_m7.m7i4
|
|
#define m7_p1 m_u.m_m7.m7p1
|
|
#define m7_p2 m_u.m_m7.m7p2
|
|
|
|
#define m8_i1 m_u.m_m8.m8i1
|
|
#define m8_i2 m_u.m_m8.m8i2
|
|
#define m8_p1 m_u.m_m8.m8p1
|
|
#define m8_p2 m_u.m_m8.m8p2
|
|
#define m8_p3 m_u.m_m8.m8p3
|
|
#define m8_p4 m_u.m_m8.m8p4
|
|
|
|
#define m9_l1 m_u.m_m9.m9l1
|
|
#define m9_l2 m_u.m_m9.m9l2
|
|
#define m9_l3 m_u.m_m9.m9l3
|
|
#define m9_l4 m_u.m_m9.m9l4
|
|
#define m9_l5 m_u.m_m9.m9l5
|
|
#define m9_s1 m_u.m_m9.m9s1
|
|
#define m9_s2 m_u.m_m9.m9s2
|
|
#define m9_s3 m_u.m_m9.m9s3
|
|
#define m9_s4 m_u.m_m9.m9s4
|
|
|
|
/*==========================================================================*
|
|
* Minix run-time system (IPC). *
|
|
*==========================================================================*/
|
|
|
|
/* Datastructure for asynchronous sends */
|
|
typedef struct asynmsg
|
|
{
|
|
unsigned flags;
|
|
endpoint_t dst;
|
|
int result;
|
|
message msg;
|
|
} asynmsg_t;
|
|
|
|
/* Defines for flags field */
|
|
#define AMF_EMPTY 0 /* slot is not inuse */
|
|
#define AMF_VALID 1 /* slot contains message */
|
|
#define AMF_DONE 2 /* Kernel has processed the message. The
|
|
* result is stored in 'result'
|
|
*/
|
|
#define AMF_NOTIFY 4 /* Send a notification when AMF_DONE is set */
|
|
#define AMF_NOREPLY 8 /* Not a reply message for a SENDREC */
|
|
|
|
/* Hide names to avoid name space pollution. */
|
|
#define echo _echo
|
|
#define notify _notify
|
|
#define sendrec _sendrec
|
|
#define receive _receive
|
|
#define send _send
|
|
#define sendnb _sendnb
|
|
#define senda _senda
|
|
|
|
_PROTOTYPE( int echo, (message *m_ptr) );
|
|
_PROTOTYPE( int notify, (endpoint_t dest) );
|
|
_PROTOTYPE( int sendrec, (endpoint_t src_dest, message *m_ptr) );
|
|
_PROTOTYPE( int receive, (endpoint_t src, message *m_ptr) );
|
|
_PROTOTYPE( int send, (endpoint_t dest, message *m_ptr) );
|
|
_PROTOTYPE( int sendnb, (endpoint_t dest, message *m_ptr) );
|
|
_PROTOTYPE( int senda, (asynmsg_t *table, size_t count) );
|
|
|
|
_PROTOTYPE( int _do_kernel_call, (message *m_ptr) );
|
|
|
|
#endif /* _IPC_H */
|