//--------------------------------------------------------------------- // Mbox send handler // // handle mbox send trap // mbox_send(mbox_t handle, int num_bytes, void *data) //---------------------------------------------------------------------- static int TrapMboxSendHandler (uint32 *trapArgs, int sysMode) { mbox_t handle; // Holds handle to mailbox char msg[MBOX_MAX_MESSAGE_LENGTH]; // Holds message in kernel space char *usermessage = NULL; // Pointer to user-space message int length=-1; // Holds length of message (in bytes) // If we're not in system mode, we need to copy everything from the // user-space virtual address to the kernel space address if (!sysMode) { // Get the arguments themselves into system space // Argument 0: handle to mailbox MemoryCopyUserToSystem (currentPCB, (trapArgs+0), &handle, sizeof(mbox_t)); // Argument 1: length of message (in bytes) MemoryCopyUserToSystem (currentPCB, (trapArgs+1), &length, sizeof(int)); // Argument 2: pointer to message data MemoryCopyUserToSystem (currentPCB, (trapArgs+2), &usermessage, sizeof(char *)); // Now copy message data from user space to kernel space MemoryCopyUserToSystem (currentPCB, usermessage, msg, length); } else { // Already in kernel space, no address translation necessary handle = (mbox_t)trapArgs[0]; length = (int)trapArgs[1]; bcopy ((void *)(trapArgs[2]), (void *)msg, length); // Copy message into local variable for simplicity } return MboxSend(handle, length, msg); }
int XXp1(char *arg) { int i, result; char buffer[20]; USLOSS_Console("XXp1(): started\n"); for (i = 0; i <= 1; i++) { USLOSS_Console("XXp1(): sending message #%d to mailbox %d\n", i, mbox_id); sprintf(buffer, "hello there, #%d", i); result = MboxSend(mbox_id, buffer, strlen(buffer)+1); USLOSS_Console("XXp1(): after send of message #%d, result = %d\n", i, result); } quit(-3); return 0; } /* XXp1 */
int XXp2(char *arg) { int result; char buffer[20]; sprintf(buffer, "hello from %s", arg); USLOSS_Console("%s(): sending message '%s' to mailbox %d, msg_size = %lu\n", arg, buffer, mbox_id, strlen(buffer)+1); result = MboxSend(mbox_id, buffer, strlen(buffer)+1); USLOSS_Console("%s(): after send of message '%s', result = %d\n", arg, buffer, result); if (result == -3) USLOSS_Console("%s(): zap'd by MboxSend() call\n", arg); quit(-3); return 0; } /* XXp2 */
int XXp3(char *arg) { char buffer[100]; int i = 0, result, count; USLOSS_Console("\nXXp3(): started\n"); count = 0; while ( (result = MboxCondReceive(mbox_id, buffer, 100)) >= 0 ) { USLOSS_Console("XXp3(): conditionally received message #%d ", i); USLOSS_Console("from mailbox %d\n", mbox_id); USLOSS_Console(" message = `%s'\n", buffer); count++; } USLOSS_Console("XXp3(): After loop, result is negative; result = %d\n", result); USLOSS_Console("XXp3(): received %d hello messages from mailbox %d\n", count, mbox_id); MboxSend(pause_mbox, NULL, 0); // should release XXp1 count = 0; while ( (result = MboxCondReceive(mbox_id, buffer, 100)) >= 0 ) { USLOSS_Console("XXp3(): conditionally received message #%d ", i); USLOSS_Console("from mailbox %d\n", mbox_id); USLOSS_Console(" message = `%s', result = %d\n", buffer, result); count++; } USLOSS_Console("XXp3(): After loop, result is negative; result = %d\n", result); USLOSS_Console("XXp3(): received %d good-bye messages from mailbox %d\n", count, mbox_id); quit(-4); return 0; } /* XXp3 */