Exemplo n.º 1
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);
}
Exemplo n.º 2
0
static void *translate_address (uint uva, int align)
{
   Pte *ptep;
   void *ptr = NULL;

   ptep = env_va2ptep (curenv, uva);
   if (ptep) {
/*
 && (*ptep & bits) == bits) {
*/
      ptr = (struct dinode *) (ptov (*ptep & ~PGMASK) + (uva % NBPG));
      if ((align) && ((uint)ptr % align)) {
         ptr = NULL;
      }
   }
   if ((ptr == NULL) && (uva != 0)) {
      printf ("fsprot: translate_address: bad address supplied (%x, align %d)\n", uva, align);
   }

   return (ptr);
}