 bde2109b7c
			
		
	
	
		bde2109b7c
		
	
	
	
	
		
			
			IPC changes: - receive() is changed to take an additional parameter, which is a pointer to a status code. - The status code is filled in by the kernel to provide additional information to the caller. For now, the kernel only fills in the IPC call used by the sender. Syslib changes: - sef_receive() has been split into sef_receive() (with the original semantics) and sef_receive_status() which exposes the status code to userland. - Ideally, every sys process should gradually switch to sef_receive_status() and use is_ipc_notify() as a dependable way to check for notify. - SEF has been modified to use is_ipc_notify() and demonstrate how to use the new status code.
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #include <minix/ipcconst.h>
 | |
| 
 | |
| .globl	__notify, __send, __senda, __sendnb, __receive, __sendrec, __do_kernel_call
 | |
| 
 | |
| 	IPCVEC = 33	/* ipc trap to kernel  */
 | |
| 	KERVEC = 32	/* syscall trap to kernel */
 | |
| 
 | |
| 	SRC_DST = 8	/* source/ destination process  */
 | |
| 	MESSAGE = 12	/* message pointer  */
 | |
| 	STATUS = 16	/* status pointer  */
 | |
| 
 | |
| /**========================================================================* */
 | |
| /*                           IPC assembly routines			  * */
 | |
| /**========================================================================* */
 | |
| /* all message passing routines save ebx, but destroy eax and ecx. */
 | |
| .text
 | |
| __send:
 | |
| 	push	%ebp
 | |
| 	movl	%esp, %ebp
 | |
| 	push	%ebx
 | |
| 	movl	SRC_DST(%ebp), %eax	/* eax = dest-src */
 | |
| 	movl	MESSAGE(%ebp), %ebx	/* ebx = message pointer */
 | |
| 	movl	$SEND, %ecx	/* _send(dest, ptr) */
 | |
| 	int	$IPCVEC	/* trap to the kernel */
 | |
| 	pop	%ebx
 | |
| 	pop	%ebp
 | |
| 	ret
 | |
| 
 | |
| __receive:
 | |
| 	push	%ebp
 | |
| 	movl	%esp, %ebp
 | |
| 	push	%ebx
 | |
| 	movl	SRC_DST(%ebp), %eax	/* eax = dest-src */
 | |
| 	movl	MESSAGE(%ebp), %ebx	/* ebx = message pointer */
 | |
| 	movl	$RECEIVE, %ecx	/* _receive(src, ptr) */
 | |
| 	int	$IPCVEC	/* trap to the kernel */
 | |
| 	movl	STATUS(%ebp), %ecx	/* ecx = status pointer */
 | |
| 	movl	%ebx, (%ecx)
 | |
| 	pop	%ebx
 | |
| 	pop	%ebp
 | |
| 	ret
 | |
| 
 | |
| __sendrec:
 | |
| 	push	%ebp
 | |
| 	movl	%esp, %ebp
 | |
| 	push	%ebx
 | |
| 	movl	SRC_DST(%ebp), %eax	/* eax = dest-src */
 | |
| 	movl	MESSAGE(%ebp), %ebx	/* ebx = message pointer */
 | |
| 	movl	$SENDREC, %ecx	/* _sendrec(srcdest, ptr) */
 | |
| 	int	$IPCVEC	/* trap to the kernel */
 | |
| 	pop	%ebx
 | |
| 	pop	%ebp
 | |
| 	ret
 | |
| 
 | |
| __notify:
 | |
| 	push	%ebp
 | |
| 	movl	%esp, %ebp
 | |
| 	push	%ebx
 | |
| 	movl	SRC_DST(%ebp), %eax	/* eax = destination  */
 | |
| 	movl	$NOTIFY, %ecx	/* _notify(srcdst) */
 | |
| 	int	$IPCVEC	/* trap to the kernel */
 | |
| 	pop	%ebx
 | |
| 	pop	%ebp
 | |
| 	ret
 | |
| 
 | |
| __sendnb:
 | |
| 	push	%ebp
 | |
| 	movl	%esp, %ebp
 | |
| 	push	%ebx
 | |
| 	movl	SRC_DST(%ebp), %eax	/* eax = dest-src */
 | |
| 	movl	MESSAGE(%ebp), %ebx	/* ebx = message pointer */
 | |
| 	movl	$SENDNB, %ecx	/* _sendnb(dest, ptr) */
 | |
| 	int	$IPCVEC	/* trap to the kernel */
 | |
| 	pop	%ebx
 | |
| 	pop	%ebp
 | |
| 	ret
 | |
| 
 | |
| __do_kernel_call:
 | |
| 	/* pass the message pointer to kernel in the %eax register */
 | |
| 	movl	4(%esp), %eax
 | |
| 	int	$KERVEC
 | |
| 	ret
 |