/* * This is slightly less fun than the above.. */ static inline unsigned long csum_partial_cfu_src_aligned(const unsigned long __user *src, unsigned long *dst, unsigned long doff, long len, unsigned long checksum, unsigned long partial_dest, int *errp) { unsigned long carry = 0; unsigned long word; unsigned long second_dest; int err = 0; mskql(partial_dest, doff, partial_dest); while (len >= 0) { err |= __get_user(word, src); len -= 8; insql(word, doff, second_dest); checksum += carry; stq_u(partial_dest | second_dest, dst); src++; checksum += word; insqh(word, doff, partial_dest); carry = checksum < word; dst++; } len += 8; if (len) { checksum += carry; err |= __get_user(word, src); mskql(word, len, word); len -= 8; checksum += word; insql(word, doff, second_dest); len += doff; carry = checksum < word; partial_dest |= second_dest; if (len >= 0) { stq_u(partial_dest, dst); if (!len) goto out; dst++; insqh(word, doff, partial_dest); } doff = len; } ldq_u(second_dest, dst); mskqh(second_dest, doff, second_dest); stq_u(partial_dest | second_dest, dst); out: checksum += carry; if (err && errp) *errp = err; return checksum; }
void cmj_incoming_call(struct NTD *tsk) { int rval, rc; struct CLB *lnk; struct sockaddr_in in; GTM_SOCKLEN_TYPE sz = SIZEOF(in); cmi_status_t status; while ((-1 == (rval = ACCEPT(tsk->listen_fd, (struct sockaddr *)&in, (GTM_SOCKLEN_TYPE *)&sz))) && EINTR == errno) ; while (rval >= 0) { status = cmj_setupfd(rval); if (CMI_ERROR(status)) { CLOSEFILE_RESET(rval, rc); /* resets "rval" to FD_INVALID */ return; } status = cmj_set_async(rval); if (CMI_ERROR(status)) { CLOSEFILE_RESET(rval, rc); /* resets "rval" to FD_INVALID */ return; } /* grab a clb off of the free list */ lnk = cmi_alloc_clb(); if (!lnk || !tsk->acc || !tsk->acc(lnk) || !tsk->crq) { /* no point if the callbacks are not in place */ cmi_free_clb(lnk); CLOSEFILE_RESET(rval, rc); /* resets "rval" to FD_INVALID */ return; } if (rval > tsk->max_fd) tsk->max_fd = rval; lnk->mun = rval; lnk->sta = CM_CLB_IDLE; lnk->peer = in; insqh(&lnk->cqe, &tsk->cqh); lnk->ntd = tsk; FD_SET(rval, &tsk->es); /* setup for callback processing */ lnk->deferred_event = TRUE; lnk->deferred_reason = CMI_REASON_CONNECT; while ((-1 == (rval = ACCEPT(tsk->listen_fd, (struct sockaddr *)&in, (GTM_SOCKLEN_TYPE *)&sz))) && EINTR == errno) ; } }
/* * This is so totally un-fun that it's frightening. Don't * look at this too closely, you'll go blind. */ static inline unsigned long csum_partial_cfu_unaligned(const unsigned long __user * src, unsigned long * dst, unsigned long soff, unsigned long doff, long len, unsigned long checksum, unsigned long partial_dest, int *errp) { unsigned long carry = 0; unsigned long first; unsigned long lastsrc; int err = 0; err |= __get_user_u(first, src); lastsrc = 7+len+(unsigned long)src; mskql(partial_dest, doff, partial_dest); while (len >= 0) { unsigned long second, word; unsigned long second_dest; err |= __get_user_u(second, src+1); extql(first, soff, word); checksum += carry; len -= 8; extqh(second, soff, first); src++; word |= first; first = second; insql(word, doff, second_dest); checksum += word; stq_u(partial_dest | second_dest, dst); carry = checksum < word; insqh(word, doff, partial_dest); dst++; } len += doff; checksum += carry; if (len >= 0) { unsigned long second, word; unsigned long second_dest; err |= __get_user_u(second, lastsrc); extql(first, soff, word); extqh(second, soff, first); word |= first; first = second; mskql(word, len-doff, word); checksum += word; insql(word, doff, second_dest); carry = checksum < word; stq_u(partial_dest | second_dest, dst); if (len) { ldq_u(second_dest, dst+1); insqh(word, doff, partial_dest); mskqh(second_dest, len, second_dest); stq_u(partial_dest | second_dest, dst+1); } checksum += carry; } else { unsigned long second, word; unsigned long second_dest; err |= __get_user_u(second, lastsrc); extql(first, soff, word); extqh(second, soff, first); word |= first; ldq_u(second_dest, dst); mskql(word, len-doff, word); checksum += word; mskqh(second_dest, len, second_dest); carry = checksum < word; insql(word, doff, word); stq_u(partial_dest | word | second_dest, dst); checksum += carry; } if (err && errp) *errp = err; return checksum; }