Calculate continued TCP/IP checkum.
47 {
48 unsigned long sum = ( ( ~partial ) & 0xffff );
49 unsigned long initial_word_count;
50 unsigned long loop_count;
51 unsigned long loop_partial_count;
52 unsigned long final_word_count;
53 unsigned long final_byte;
56 unsigned long discard_a;
57 unsigned long discard_r1;
58 unsigned long discard_r2;
59
60
61
62
63
64
65 if (
len >=
sizeof ( sum ) ) {
67 ( sizeof ( sum ) - 1 ) ) >> 1 );
68 } else {
69 initial_word_count = 0;
70 }
71 len -= ( initial_word_count * 2 );
72
73
74
75
76
77
78 loop_count = (
len / (
sizeof ( sum ) * 16 ) );
79 loop_partial_count =
80 ( (
len % (
sizeof ( sum ) * 16 ) ) /
sizeof ( sum ) );
81
82
83
84
85 final_word_count = ( (
len %
sizeof ( sum ) ) / 2 );
86
87
88 final_byte = (
len & 1 );
89
90
92
93
94 "imul $( -x86_tcpip_loop_step_size ), %4\n\t"
95 "add %5, %4\n\t"
96
97
98 "clc\n\t"
99
100
101 "jmp 2f\n\t"
102 "\n1:\n\t"
103 "lodsw\n\t"
104 "adcw %w2, %w0\n\t"
105 "\n2:\n\t"
106 "loop 1b\n\t"
107
108
109 "mov %12, %3\n\t"
110 "jmp *%4\n\t"
111 "\nx86_tcpip_loop_start:\n\t"
112 "lods%z2\n\tadc %2, %0\n\t"
113 "lods%z2\n\tadc %2, %0\n\t"
114 "lods%z2\n\tadc %2, %0\n\t"
115 "lods%z2\n\tadc %2, %0\n\t"
116 "lods%z2\n\tadc %2, %0\n\t"
117 "lods%z2\n\tadc %2, %0\n\t"
118 "lods%z2\n\tadc %2, %0\n\t"
119 "lods%z2\n\tadc %2, %0\n\t"
120 "lods%z2\n\tadc %2, %0\n\t"
121 "lods%z2\n\tadc %2, %0\n\t"
122 "lods%z2\n\tadc %2, %0\n\t"
123 "lods%z2\n\tadc %2, %0\n\t"
124 "lods%z2\n\tadc %2, %0\n\t"
125 "lods%z2\n\tadc %2, %0\n\t"
126 "lods%z2\n\tadc %2, %0\n\t"
127 "lods%z2\n\tadc %2, %0\n\t"
128 "\nx86_tcpip_loop_end:\n\t"
129 "loop x86_tcpip_loop_start\n\t"
130 ".equ x86_tcpip_loop_step_size, "
131 " ( ( x86_tcpip_loop_end - x86_tcpip_loop_start ) >> 4 )\n\t"
132
133
134 "mov %13, %3\n\t"
135 "jmp 2f\n\t"
136 "\n1:\n\t"
137 "lodsw\n\t"
138 "adcw %w2, %w0\n\t"
139 "\n2:\n\t"
140 "loop 1b\n\t"
141
142
143 "mov %14, %3\n\t"
144 "loop 1f\n\t"
145 "adcb (%1), %b0\n\t"
146 "adcb $0, %h0\n\t"
147 "\n1:\n\t"
148
149
150 "push %0\n\t"
151 "popw %w0\n\t"
152 "popw %w2\n\t"
153 "adcw %w2, %w0\n\t"
155 "popw %w2\n\t"
156 "adcw %w2, %w0\n\t"
157 "popw %w2\n\t"
158 "adcw %w2, %w0\n\t"
159#endif
160
161
162 "adcw $0, %w0\n\t"
163 "adcw $0, %w0\n\t"
164
165 :
"=&Q" ( sum ),
"=&S" (
discard_S ),
"=&a" ( discard_a ),
166 "=&c" (
discard_c ),
"=&r" ( discard_r1 ),
167 "=&r" ( discard_r2 )
168 :
"0" ( sum ),
"1" (
data ),
"2" ( 0 ),
169 "3" ( initial_word_count + 1 ), "4" ( loop_partial_count ),
171 "g" ( final_word_count + 1 ), "g" ( final_byte ) );
172
173 return ( ~sum & 0xffff );
174}
uint8_t data[48]
Additional event data.
__asm__(".section \".rodata\", \"a\", " PROGBITS "\n\t" "\nprivate_key_data:\n\t" ".size private_key_data, ( . - private_key_data )\n\t" ".equ private_key_len, ( . - private_key_data )\n\t" ".previous\n\t")
char x86_tcpip_loop_end[]