static isoprint (struct sockaddr_iso *siso, char *bp) { int didone = 0; if (siso -> siso_plen) { hexprint (bp, siso -> siso_plen, PSEL (siso), "'", "'H"); bp += strlen (bp); *bp++ = '/'; didone++; } if (siso -> siso_slen || didone) { hexprint (bp, siso -> siso_slen, SSEL (siso), "'", "'H"); bp += strlen (bp); *bp++ = '/'; didone++; } if (siso -> siso_tlen || didone) { hexprint (bp, siso -> siso_tlen, TSEL (siso), "'", "'H"); bp += strlen (bp); *bp++ = '/'; didone++; } hexprint (bp, siso -> siso_nlen, siso -> siso_data, "NS+", ""); }
/* * Return user to state before notify() */ void noted(Ureg* cur, uintptr arg0) { NFrame *nf; Note note; Ureg *nur; qlock(&up->debug); if(arg0 != NRSTR && !up->notified){ qunlock(&up->debug); pprint("suicide: call to noted when not notified\n"); pexit("Suicide", 0); } up->notified = 0; fpunoted(); nf = up->ureg; /* sanity clause */ if(!okaddr(PTR2UINT(nf), sizeof(NFrame), 0)){ qunlock(&up->debug); pprint("suicide: bad ureg %#p in noted\n", nf); pexit("Suicide", 0); } /* * Check the segment selectors are all valid. */ nur = &nf->ureg; if(nur->cs != SSEL(SiUCS, SsRPL3) || nur->ss != SSEL(SiUDS, SsRPL3) || nur->ds != SSEL(SiUDS, SsRPL3) || nur->es != SSEL(SiUDS, SsRPL3) || nur->fs != SSEL(SiUDS, SsRPL3) || nur->gs != SSEL(SiUDS, SsRPL3)){ qunlock(&up->debug); pprint("suicide: bad segment selector in noted\n"); pexit("Suicide", 0); } /* don't let user change system flags */ nur->flags &= (Of|Df|Sf|Zf|Af|Pf|Cf); nur->flags |= cur->flags & ~(Of|Df|Sf|Zf|Af|Pf|Cf); memmove(cur, nur, sizeof(Ureg)); switch((int)arg0){ case NCONT: case NRSTR: if(!okaddr(nur->ip, BY2SE, 0) || !okaddr(nur->sp, BY2SE, 0)){ qunlock(&up->debug); pprint("suicide: trap in noted pc=%#p sp=%#p\n", nur->ip, nur->sp); pexit("Suicide", 0); } up->ureg = nf->old; qunlock(&up->debug); break; case NSAVE: if(!okaddr(nur->ip, BY2SE, 0) || !okaddr(nur->sp, BY2SE, 0)){ qunlock(&up->debug); pprint("suicide: trap in noted pc=%#p sp=%#p\n", nur->ip, nur->sp); pexit("Suicide", 0); } qunlock(&up->debug); splhi(); nf->arg1 = nf->msg; nf->arg0 = &nf->ureg; cur->bp = PTR2UINT(nf->arg0); nf->ip = 0; cur->sp = PTR2UINT(nf); break; default: memmove(¬e, &up->lastnote, sizeof(Note)); qunlock(&up->debug); pprint("suicide: bad arg %#p in noted: %s\n", arg0, note.msg); pexit(note.msg, 0); break; case NDFLT: memmove(¬e, &up->lastnote, sizeof(Note)); qunlock(&up->debug); if(note.flag == NDebug) pprint("suicide: %s\n", note.msg); pexit(note.msg, note.flag != NDebug); break; } }