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; }
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; }
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); }