Ejemplo n.º 1
0
//---------------------------------------------------------------------
//   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);
}
Ejemplo n.º 2
0
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 */
Ejemplo n.º 3
0
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 */
Ejemplo n.º 4
0
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 */