Exemplo n.º 1
0
int 
sys_ipc_sendmsg (u_int sn, u_int k, u_int envid, u_int sz, u_int addr)
{
  int r;
  // unsigned char msg[IPC_MAX_MSG_SIZE];
  struct Env *e;
  extern int msgring_handlemsg(struct Env *, int sz, unsigned char *);

  if (sz == 0)
    return -E_INVAL;

  if (sz > IPC_MAX_MSG_SIZE)
    return -E_INVAL;

  if (!(e = env_id2env (envid, &r)))
    return -E_BAD_ENV;
  
  if (e->msgring == NULL)
    return -E_NO_MSGRING;
  
  // copyin((void*)addr, &msg[0], sz);

  MP_SPINLOCK_GET(&e->env_spinlock);
  r = msgring_handlemsg(e, sz, (unsigned char *)addr);
  MP_SPINLOCK_RELEASE (&e->env_spinlock);

  return r;
}
Exemplo n.º 2
0
int 
ShareAshRegion(u_int k, int envid) {
  /* printf("ShareAshRegion sz: %d\n",sizeof(struct ash_sh_network)); */
  if (__vm_share_region(ADD_UVA(ASH_PKT_DATA_ADDR),
			sizeof(struct ash_sh_network), k, k, envid,
			ASH_PKT_DATA_ADDR + env_id2env(envid)->env_ashuva)
      < 0) {
    sys_env_free (k, envid);
    kprintf("ShareAshRegion: __vm_share_region failed\n");
    return (-1);
  }
  
  return 0;
}
Exemplo n.º 3
0
void
disk_buf_free (struct buf *bp)
{
  u_int datalen;
  u_int data, next;

  /* unpin pages */
  if (bp->b_flags & B_SCSICMD) {
    struct scsicmd *scsicmd = (struct scsicmd *) bp->b_memaddr;
    data = (u_int) scsicmd->data_addr;
    datalen = scsicmd->datalen;
    free (scsicmd->scsi_cmd);
    free (scsicmd);
  } else {
    data = (u_int)bp->b_memaddr;
    datalen = bp->b_bcount;
  }

  while (datalen > 0) {
    if (bp->b_flags & B_BC_REQ) {
      ppage_unpin (kva2pp (data));
    } else {
      struct Env *e;
      int r;

      e = env_id2env (bp->b_envid, &r);
      assert (e); /* XXX - what if an env with an outstanding request dies? */
      ppage_unpin (&ppages[PGNO (*env_va2ptep (e, data))]);
    }
    /* go to start of next page of data */
    next = (data & ~PGMASK) + NBPG;
    if (next - data >= datalen) break;
    assert (next > data);
    datalen -= next - data;
    data = next;
  }

  if (bp->b_resptr) {
    ppage_unpin (kva2pp ((u_int) bp->b_resptr));
  }

  free (bp);
}