X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/a39ff7e25e19b3a8c3020042a3872ca9ec9659f1..HEAD:/bsd/dev/arm64/cpu_in_cksum.s diff --git a/bsd/dev/arm64/cpu_in_cksum.s b/bsd/dev/arm64/cpu_in_cksum.s index 00a00c667..35f317a44 100644 --- a/bsd/dev/arm64/cpu_in_cksum.s +++ b/bsd/dev/arm64/cpu_in_cksum.s @@ -51,9 +51,15 @@ * routine expects "mbuf-like" argument, and it does not expect the mbuf to be * authentic; it only cares about 3 fields. */ +#if defined(__LP64__) #define M_NEXT 0 #define M_DATA 16 // 8-byte address, would be aligned to 8-byte boundary #define M_LEN 24 +#else +#define M_NEXT 0 +#define M_DATA 8 +#define M_LEN 12 +#endif .globl _os_cpu_in_cksum_mbuf .text @@ -98,6 +104,14 @@ _os_cpu_in_cksum_mbuf: #define Wmlen w6 #define t x7 #define data x8 +#if defined(__LP64__) + #define ptr_m x0 + #define ptr_data x8 +#else + #define ptr_m w0 + #define ptr_data w8 +#endif + mov needs_swap, #0 // needs_swap = FALSE; mov started_on_odd, #0 // started_on_odd = FALSE; @@ -128,7 +142,7 @@ _os_cpu_in_cksum_mbuf: ldr Wmlen, [m, #M_LEN] // mlen = m->m_len; cmp mlen, off b.le 1f - ldr data, [m, #M_DATA] // mtod(m, uint8_t *) + ldr ptr_data, [m, #M_DATA] // mtod(m, uint8_t *) sub mlen, mlen, off // mlen -= off; add data, data, off // data = mtod(m, uint8_t *) + off; b L_post_initial_offset @@ -138,7 +152,7 @@ _os_cpu_in_cksum_mbuf: mov x0, x3 ret lr 2: - ldr m, [m, #M_NEXT] + ldr ptr_m, [m, #M_NEXT] b 0b L_loop: // for (; len > 0; m = m->m_next) { @@ -152,7 +166,7 @@ L_loop: // for (; len > 0; m = m->m_next) { */ cbz m, Lin_cksum_whoops // if (m == NULL) return -1; ldr Wmlen, [m, #M_LEN] // mlen = m->m_len; - ldr data, [m, #M_DATA] // mtod(m, uint8_t *) + ldr ptr_data, [m, #M_DATA] // mtod(m, uint8_t *) L_post_initial_offset: /* @@ -207,6 +221,26 @@ L_post_initial_offset: add w7, w7, w9 1: +/* + * if ((uintptr_t)data & 4) { + * if (mlen < 4) + * goto L2_bytes; + * partial += *(uint32_t *)(void *)data; + * data += 4; + * mlen -= 4; + * } + */ + // align on 8-bytes boundary if applicable + tst data, #4 + b.eq 1f + cmp mlen, #4 + b.lt L2_bytes + ldr w9, [data], #4 + sub mlen, mlen, #4 + adds w7, w7, w9 + adc x7, x7, x10 // assumes x10 still is #0 as set above +1: + /* * while (mlen >= 64) { * __builtin_prefetch(data + 32); @@ -374,7 +408,7 @@ L0_bytes: L_continue: cmp len, #0 - ldr m, [m, #M_NEXT] // m = m->m_next + ldr ptr_m, [m, #M_NEXT] // m = m->m_next b.gt L_loop /*