int as_define_stack(struct addrspace *as, vaddr_t *stackptr) { struct page *p; size_t npages; size_t curpage; struct uio ku; vaddr_t maxvaddr; vaddr_t lowerbound; int i; int result; unsigned int rval; vaddr_t stacktop; *stackptr = USERTOP; /* Do Stack ASLR */ if (randvnode!=NULL) { mk_kuio(&ku, &rval, 4, 0, UIO_READ); result = VOP_READ(randvnode, &ku); if (result) return result; maxvaddr = (vaddr_t) 0; for(i=0;i<array_getnum(as->pages);i++) { p = (struct page *) array_getguy(as->pages, i); if (p->vaddr>maxvaddr) maxvaddr = p->vaddr; } lowerbound = maxvaddr + ((STACKSIZE * PAGE_SIZE) + PAGE_SIZE); rval %= USERTOP - (USERTOP - lowerbound); *stackptr = (lowerbound + rval) & PAGE_FRAME; } npages = (size_t) STACKSIZE; stacktop = *stackptr - PAGE_SIZE * npages; for(curpage=0;curpage<npages;curpage++) { p = (struct page *) kmalloc(sizeof(struct page)); if (p==NULL) return ENOMEM; p->vaddr = stacktop + curpage * PAGE_SIZE; p->perms = P_R_B | P_W_B; array_add(as->pages, p); addpage(p->vaddr, curthread->t_pid, p->perms & P_R_B, p->perms & P_W_B, p->perms & P_X_B, NULL); } return 0; }
void endin_convertf( fields *endin, fields *info, int reftype, param *p, variants *all, int nall ) { newstr *d; int i, level, n, process; char *newtag, *t; for ( i=0; i<endin->nfields; ++i ) { /* Ensure that data exists */ d = &( endin->data[i] ); if ( !(d->data) || d->len==0 ) continue; /* * All refer format tags start with '%'. If we have one * that doesn't, assume that it comes from endx2xml * and just copy and paste to output */ t = endin->tag[i].data; if ( t[0]!='%' ) { fields_add( info, t, d->data, endin->level[i] ); continue; } n = process_findoldtag( t, reftype, all, nall ); if ( n==-1 ) { endin_notag( p, t, d->data ); continue; } process = ((all[reftype]).tags[n]).processingtype; if ( process == ALWAYS ) continue; /* add these later */ level = ((all[reftype]).tags[n]).level; newtag = ((all[reftype]).tags[n]).newstr; if ( process==SIMPLE ) fields_add( info, newtag, d->data, level ); else if ( process==TYPE ) addtype( info, d->data, level ); else if ( process==TITLE ) title_process( info, newtag, d->data, level ); else if ( process==PERSON ) name_add( info, newtag, d->data, level, &(p->asis), &(p->corps) ); else if ( process==DATE ) adddate( info, t, newtag,d->data,level); else if ( process==PAGES ) addpage( info, d->data, level ); else if ( process==SERIALNO ) addsn( info, d->data, level ); else if ( process==NOTES ) addnotes( info, newtag, d->data, level ); else { /* fprintf(stderr,"%s: internal error -- illegal process %d\n", r->progname, process ); */ } } }
/* place all entries into the pagetable */ int as_prepare_load(struct addrspace *as) { struct page *p; int i; int num = array_getnum(as->pages); for (i=0;i<num;i++) { p = (struct page *) array_getguy(as->pages, i); addpage(p->vaddr, curthread->t_pid, 1, 1, 1, NULL); // enable all permission for writing page in } return 0; }
int as_copy(struct addrspace *old, struct addrspace **ret, pid_t pid) { struct addrspace *newas; struct page *newpage, *page; int i; int nindex, oindex; paddr_t nf, of; newas = as_create(); if (newas==NULL) { return ENOMEM; } for(i=0;i<array_getnum(old->pages);i++) { newpage = (struct page *) kmalloc(sizeof(struct page)); if (newpage==NULL) return ENOMEM; page = (struct page *) array_getguy(old->pages, i); memcpy(newpage, page, sizeof(struct page)); array_add(newas->pages, newpage); oindex = getindex(newpage->vaddr); of = FRAME(oindex); nindex = addpage(newpage->vaddr, pid, newpage->perms & P_R_B, newpage->perms & P_W_B, newpage->perms & P_X_B, PADDR_TO_KVADDR(of)); } *ret = newas; return 0; }