* Diagnostic routine to check mbuf alignment as required by the * crypto device drivers (that use DMA). */
| 311 | * crypto device drivers (that use DMA). |
| 312 | */ |
| 313 | void |
| 314 | m_checkalignment(const char* where, struct mbuf *m0, int off, int len) |
| 315 | { |
| 316 | int roff; |
| 317 | struct mbuf *m = m_getptr(m0, off, &roff); |
| 318 | caddr_t addr; |
| 319 | |
| 320 | if (m == NULL) |
| 321 | return; |
| 322 | printf("%s (off %u len %u): ", where, off, len); |
| 323 | addr = mtod(m, caddr_t) + roff; |
| 324 | do { |
| 325 | int mlen; |
| 326 | |
| 327 | if (((uintptr_t) addr) & 3) { |
| 328 | printf("addr misaligned %p,", addr); |
| 329 | break; |
| 330 | } |
| 331 | mlen = m->m_len; |
| 332 | if (mlen > len) |
| 333 | mlen = len; |
| 334 | len -= mlen; |
| 335 | if (len && (mlen & 3)) { |
| 336 | printf("len mismatch %u,", mlen); |
| 337 | break; |
| 338 | } |
| 339 | m = m->m_next; |
| 340 | addr = m ? mtod(m, caddr_t) : NULL; |
| 341 | } while (m && len > 0); |
| 342 | for (m = m0; m; m = m->m_next) |
| 343 | printf(" [%p:%u]", mtod(m, caddr_t), m->m_len); |
| 344 | printf("\n"); |
| 345 | } |