| 384 | } |
| 385 | |
| 386 | void |
| 387 | crypto_cursor_copyback(struct crypto_buffer_cursor *cc, int size, |
| 388 | const void *vsrc) |
| 389 | { |
| 390 | size_t remain, todo; |
| 391 | const char *src; |
| 392 | char *dst; |
| 393 | |
| 394 | src = vsrc; |
| 395 | switch (cc->cc_type) { |
| 396 | case CRYPTO_BUF_CONTIG: |
| 397 | MPASS(cc->cc_buf_len >= size); |
| 398 | memcpy(cc->cc_buf, src, size); |
| 399 | cc->cc_buf += size; |
| 400 | cc->cc_buf_len -= size; |
| 401 | break; |
| 402 | case CRYPTO_BUF_MBUF: |
| 403 | for (;;) { |
| 404 | KASSERT((cc->cc_mbuf->m_flags & M_EXTPG) == 0, |
| 405 | ("%s: not supported for unmapped mbufs", __func__)); |
| 406 | dst = mtod(cc->cc_mbuf, char *) + cc->cc_offset; |
| 407 | remain = cc->cc_mbuf->m_len - cc->cc_offset; |
| 408 | todo = MIN(remain, size); |
| 409 | memcpy(dst, src, todo); |
| 410 | src += todo; |
| 411 | if (todo < remain) { |
| 412 | cc->cc_offset += todo; |
| 413 | break; |
| 414 | } |
| 415 | size -= todo; |
| 416 | cc->cc_mbuf = cc->cc_mbuf->m_next; |
| 417 | cc->cc_offset = 0; |
| 418 | if (size == 0) |
| 419 | break; |
| 420 | } |
| 421 | break; |
| 422 | case CRYPTO_BUF_VMPAGE: |
| 423 | for (;;) { |
| 424 | dst = (char *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS( |
| 425 | *cc->cc_vmpage)) + cc->cc_offset; |
| 426 | remain = MIN(PAGE_SIZE - cc->cc_offset, cc->cc_buf_len); |
| 427 | todo = MIN(remain, size); |
| 428 | memcpy(dst, src, todo); |
| 429 | src += todo; |
| 430 | cc->cc_buf_len -= todo; |
| 431 | if (todo < remain) { |
| 432 | cc->cc_offset += todo; |
| 433 | break; |
| 434 | } |
| 435 | size -= todo; |
| 436 | cc->cc_vmpage++; |
| 437 | cc->cc_offset = 0; |
| 438 | if (size == 0) |
| 439 | break; |
| 440 | } |
| 441 | break; |
| 442 | case CRYPTO_BUF_UIO: |
| 443 | for (;;) { |
no test coverage detected