.sect .text; .sect .rom; .sect .data; .sect .bss
-.define __echo, __notify, __send, __nb_send, __receive, __nb_receive, __sendrec
+.define __echo, __notify, __send, __receive, __sendrec
! See src/kernel/ipc.h for C definitions
SEND = 1
SENDREC = 3
NOTIFY = 4
ECHO = 8
-NB_SEND = 1 + 16 ! flags 0x10 to prevent blocking
-NB_RECEIVE = 2 + 16 ! flags 0x10 to prevent blocking
SYSVEC = 33 ! trap to kernel
SRC_DST = 8 ! source/ destination process
-ECHO_MESS = 8 ! doesn't have SRC_DST
+ECHO_MESS = 8 ! echo doesn't have SRC_DST
MESSAGE = 12 ! message pointer
!*========================================================================*
! IPC assembly routines *
!*========================================================================*
! all message passing routines save ebp, but destroy eax and ecx.
-.define __echo, __notify, __send, __nb_send, __receive, __nb_receive, __sendrec
+.define __echo, __notify, __send, __receive, __sendrec
.sect .text
__send:
push ebp
pop ebp
ret
-__nb_send:
- push ebp
- mov ebp, esp
- push ebx
- mov eax, SRC_DST(ebp) ! eax = dest-src
- mov ebx, MESSAGE(ebp) ! ebx = message pointer
- mov ecx, NB_SEND ! _nb_send(dest, ptr)
- int SYSVEC ! trap to the kernel
- pop ebx
- pop ebp
- ret
-
__receive:
push ebp
mov ebp, esp
pop ebp
ret
-__nb_receive:
- push ebp
- mov ebp, esp
- push ebx
- mov eax, SRC_DST(ebp) ! eax = dest-src
- mov ebx, MESSAGE(ebp) ! ebx = message pointer
- mov ecx, NB_RECEIVE ! _nb_receive(src, ptr)
- int SYSVEC ! trap to the kernel
- pop ebx
- pop ebp
- ret
-
__sendrec:
push ebp
mov ebp, esp
--- /dev/null
+.sect .text; .sect .rom; .sect .data; .sect .bss
+.define __ipc_request, __ipc_reply, __ipc_notify, __ipc_receive
+
+! See src/kernel/ipc.h for C definitions.
+IPC_REQUEST = 16 ! each gets a distinct bit
+IPC_REPLY = 32
+IPC_NOTIFY = 64
+IPC_RECEIVE = 128
+
+SYSVEC = 33 ! trap to kernel
+
+! Offsets of arguments relative to stack pointer.
+SRC_DST = 8 ! source/ destination process
+SEND_MSG = 12 ! message pointer for sending
+EVENT_SET = 12 ! notification event set
+RECV_MSG = 16 ! message pointer for receiving
+
+
+!*========================================================================*
+! IPC assembly routines *
+!*========================================================================*
+! all message passing routines save ebp, but destroy eax, ecx, and edx.
+.define __ipc_request, __ipc_reply, __ipc_notify, __ipc_receive
+.sect .text
+
+__ipc_request:
+ push ebp
+ mov ebp, esp
+ push ebx
+ mov eax, SRC_DST(ebp) ! eax = destination
+ mov ebx, SEND_MSG(ebp) ! ebx = message pointer
+ mov ecx, IPC_REQUEST ! _ipc_request(dst, ptr)
+ int SYSVEC ! trap to the kernel
+ pop ebx
+ pop ebp
+ ret
+
+__ipc_reply:
+ push ebp
+ mov ebp, esp
+ push ebx
+ mov eax, SRC_DST(ebp) ! eax = destination
+ mov ebx, SEND_MSG(ebp) ! ebx = message pointer
+ mov ecx, IPC_REPLY ! _ipc_reply(dst, ptr)
+ int SYSVEC ! trap to the kernel
+ pop ebx
+ pop ebp
+ ret
+
+__ipc_receive:
+ push ebp
+ mov ebp, esp
+ push ebx
+ mov eax, SRC_DST(ebp) ! eax = source
+ mov edx, EVENT_SET(ebp) ! ebx = event set
+ mov ebx, RCV_MSG(ebp) ! ebx = message pointer
+ mov ecx, IPC_RECEIVE ! _ipc_receive(src, events, ptr)
+ int SYSVEC ! trap to the kernel
+ pop ebx
+ pop ebp
+ ret
+
+__ipc_notify:
+ push ebp
+ mov ebp, esp
+ push ebx
+ mov eax, SRC_DST(ebp) ! ebx = destination
+ mov edx, EVENT_SET(ebp) ! edx = event set
+ mov ecx, IPC_NOTIFY ! _ipc_notify(dst, events)
+ int SYSVEC ! trap to the kernel
+ pop ebx
+ pop ebp
+ ret
+
+