]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Test/UnitTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests32.c
MdePkg: Apply uncrustify changes
[mirror_edk2.git] / MdePkg / Test / UnitTest / Library / BaseSafeIntLib / SafeIntLibUintnIntnUnitTests32.c
CommitLineData
e50c2bb3
MK
1/** @file\r
2 IA32-specific functions for unit-testing INTN and UINTN functions in\r
3 SafeIntLib.\r
4\r
5 Copyright (c) Microsoft Corporation.<BR>\r
6 Copyright (c) 2019 - 2020, Intel Corporation. All rights reserved.<BR>\r
7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9**/\r
10\r
11#include "TestBaseSafeIntLib.h"\r
12\r
13UNIT_TEST_STATUS\r
14EFIAPI\r
15TestSafeInt32ToUintn (\r
2f88bd3a 16 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
17 )\r
18{\r
19 EFI_STATUS Status;\r
20 INT32 Operand;\r
21 UINTN Result;\r
22\r
23 //\r
24 // If Operand is non-negative, then it's a cast\r
25 //\r
26 Operand = 0x5bababab;\r
2f88bd3a
MK
27 Result = 0;\r
28 Status = SafeInt32ToUintn (Operand, &Result);\r
29 UT_ASSERT_NOT_EFI_ERROR (Status);\r
30 UT_ASSERT_EQUAL (0x5bababab, Result);\r
e50c2bb3
MK
31\r
32 //\r
33 // Otherwise should result in an error status\r
34 //\r
35 Operand = (-1537977259);\r
2f88bd3a
MK
36 Status = SafeInt32ToUintn (Operand, &Result);\r
37 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
38\r
39 return UNIT_TEST_PASSED;\r
40}\r
41\r
42UNIT_TEST_STATUS\r
43EFIAPI\r
44TestSafeUint32ToIntn (\r
2f88bd3a 45 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
46 )\r
47{\r
48 EFI_STATUS Status;\r
49 UINT32 Operand;\r
50 INTN Result;\r
51\r
52 //\r
53 // If Operand is <= MAX_INTN, then it's a cast\r
54 //\r
55 Operand = 0x5bababab;\r
2f88bd3a
MK
56 Result = 0;\r
57 Status = SafeUint32ToIntn (Operand, &Result);\r
58 UT_ASSERT_NOT_EFI_ERROR (Status);\r
59 UT_ASSERT_EQUAL (0x5bababab, Result);\r
e50c2bb3
MK
60\r
61 //\r
62 // Otherwise should result in an error status\r
63 //\r
64 Operand = (0xabababab);\r
2f88bd3a
MK
65 Status = SafeUint32ToIntn (Operand, &Result);\r
66 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
67\r
68 return UNIT_TEST_PASSED;\r
69}\r
70\r
71UNIT_TEST_STATUS\r
72EFIAPI\r
73TestSafeIntnToInt32 (\r
2f88bd3a 74 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
75 )\r
76{\r
77 EFI_STATUS Status;\r
78 INTN Operand;\r
79 INT32 Result;\r
80\r
81 //\r
82 // INTN is same as INT32 in IA32, so this is just a cast\r
83 //\r
84 Operand = 0x5bababab;\r
2f88bd3a
MK
85 Result = 0;\r
86 Status = SafeIntnToInt32 (Operand, &Result);\r
87 UT_ASSERT_NOT_EFI_ERROR (Status);\r
88 UT_ASSERT_EQUAL (0x5bababab, Result);\r
e50c2bb3
MK
89\r
90 return UNIT_TEST_PASSED;\r
91}\r
92\r
93UNIT_TEST_STATUS\r
94EFIAPI\r
95TestSafeIntnToUint32 (\r
2f88bd3a 96 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
97 )\r
98{\r
99 EFI_STATUS Status;\r
100 INTN Operand;\r
101 UINT32 Result;\r
102\r
103 //\r
104 // If Operand is non-negative, then it's a cast\r
105 //\r
106 Operand = 0x5bababab;\r
2f88bd3a
MK
107 Result = 0;\r
108 Status = SafeIntnToUint32 (Operand, &Result);\r
109 UT_ASSERT_NOT_EFI_ERROR (Status);\r
110 UT_ASSERT_EQUAL (0x5bababab, Result);\r
e50c2bb3
MK
111\r
112 //\r
113 // Otherwise should result in an error status\r
114 //\r
115 Operand = (-1537977259);\r
2f88bd3a
MK
116 Status = SafeIntnToUint32 (Operand, &Result);\r
117 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
118\r
119 return UNIT_TEST_PASSED;\r
120}\r
121\r
122UNIT_TEST_STATUS\r
123EFIAPI\r
124TestSafeUintnToUint32 (\r
2f88bd3a 125 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
126 )\r
127{\r
128 EFI_STATUS Status;\r
129 UINTN Operand;\r
130 UINT32 Result;\r
131\r
132 //\r
133 // UINTN is same as UINT32 in IA32, so this is just a cast\r
134 //\r
135 Operand = 0xabababab;\r
2f88bd3a
MK
136 Result = 0;\r
137 Status = SafeUintnToUint32 (Operand, &Result);\r
138 UT_ASSERT_NOT_EFI_ERROR (Status);\r
139 UT_ASSERT_EQUAL (0xabababab, Result);\r
e50c2bb3
MK
140\r
141 return UNIT_TEST_PASSED;\r
142}\r
143\r
144UNIT_TEST_STATUS\r
145EFIAPI\r
146TestSafeUintnToIntn (\r
2f88bd3a 147 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
148 )\r
149{\r
150 EFI_STATUS Status;\r
151 UINTN Operand;\r
152 INTN Result;\r
153\r
154 //\r
155 // If Operand is <= MAX_INTN, then it's a cast\r
156 //\r
157 Operand = 0x5bababab;\r
2f88bd3a
MK
158 Result = 0;\r
159 Status = SafeUintnToIntn (Operand, &Result);\r
160 UT_ASSERT_NOT_EFI_ERROR (Status);\r
161 UT_ASSERT_EQUAL (0x5bababab, Result);\r
e50c2bb3
MK
162\r
163 //\r
164 // Otherwise should result in an error status\r
165 //\r
166 Operand = (0xabababab);\r
2f88bd3a
MK
167 Status = SafeUintnToIntn (Operand, &Result);\r
168 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
169\r
170 return UNIT_TEST_PASSED;\r
171}\r
172\r
173UNIT_TEST_STATUS\r
174EFIAPI\r
175TestSafeUintnToInt64 (\r
2f88bd3a 176 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
177 )\r
178{\r
179 EFI_STATUS Status;\r
180 UINTN Operand;\r
181 INT64 Result;\r
182\r
183 //\r
184 // UINTN is same as UINT32 in IA32, and UINT32 is a subset of\r
185 // INT64, so this is just a cast\r
186 //\r
187 Operand = 0xabababab;\r
2f88bd3a
MK
188 Result = 0;\r
189 Status = SafeUintnToInt64 (Operand, &Result);\r
190 UT_ASSERT_NOT_EFI_ERROR (Status);\r
191 UT_ASSERT_EQUAL (0xabababab, Result);\r
e50c2bb3
MK
192\r
193 return UNIT_TEST_PASSED;\r
194}\r
195\r
196UNIT_TEST_STATUS\r
197EFIAPI\r
198TestSafeInt64ToIntn (\r
2f88bd3a 199 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
200 )\r
201{\r
202 EFI_STATUS Status;\r
203 INT64 Operand;\r
204 INTN Result;\r
205\r
206 //\r
207 // If Operand is between MIN_INTN and MAX_INTN2 inclusive, then it's a cast\r
208 //\r
209 Operand = 0x5bababab;\r
2f88bd3a
MK
210 Result = 0;\r
211 Status = SafeInt64ToIntn (Operand, &Result);\r
212 UT_ASSERT_NOT_EFI_ERROR (Status);\r
213 UT_ASSERT_EQUAL (0x5bababab, Result);\r
e50c2bb3
MK
214\r
215 Operand = (-1537977259);\r
2f88bd3a
MK
216 Status = SafeInt64ToIntn (Operand, &Result);\r
217 UT_ASSERT_NOT_EFI_ERROR (Status);\r
218 UT_ASSERT_EQUAL ((-1537977259), Result);\r
e50c2bb3
MK
219\r
220 //\r
221 // Otherwise should result in an error status\r
222 //\r
223 Operand = (0x5babababefefefef);\r
2f88bd3a
MK
224 Status = SafeInt64ToIntn (Operand, &Result);\r
225 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
226\r
227 Operand = (-6605562033422200815);\r
2f88bd3a
MK
228 Status = SafeInt64ToIntn (Operand, &Result);\r
229 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
230\r
231 return UNIT_TEST_PASSED;\r
232}\r
233\r
234UNIT_TEST_STATUS\r
235EFIAPI\r
236TestSafeInt64ToUintn (\r
2f88bd3a 237 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
238 )\r
239{\r
240 EFI_STATUS Status;\r
241 INT64 Operand;\r
242 UINTN Result;\r
243\r
244 //\r
245 // If Operand is between 0 and MAX_UINTN inclusive, then it's a cast\r
246 //\r
247 Operand = 0xabababab;\r
2f88bd3a
MK
248 Result = 0;\r
249 Status = SafeInt64ToUintn (Operand, &Result);\r
250 UT_ASSERT_NOT_EFI_ERROR (Status);\r
251 UT_ASSERT_EQUAL (0xabababab, Result);\r
e50c2bb3
MK
252\r
253 //\r
254 // Otherwise should result in an error status\r
255 //\r
256 Operand = (0x5babababefefefef);\r
2f88bd3a
MK
257 Status = SafeInt64ToUintn (Operand, &Result);\r
258 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
259\r
260 Operand = (-6605562033422200815);\r
2f88bd3a
MK
261 Status = SafeInt64ToUintn (Operand, &Result);\r
262 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
263\r
264 return UNIT_TEST_PASSED;\r
265}\r
266\r
267UNIT_TEST_STATUS\r
268EFIAPI\r
269TestSafeUint64ToIntn (\r
2f88bd3a 270 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
271 )\r
272{\r
273 EFI_STATUS Status;\r
274 UINT64 Operand;\r
275 INTN Result;\r
276\r
277 //\r
278 // If Operand is <= MAX_INTN, then it's a cast\r
279 //\r
280 Operand = 0x5bababab;\r
2f88bd3a
MK
281 Result = 0;\r
282 Status = SafeUint64ToIntn (Operand, &Result);\r
283 UT_ASSERT_NOT_EFI_ERROR (Status);\r
284 UT_ASSERT_EQUAL (0x5bababab, Result);\r
e50c2bb3
MK
285\r
286 //\r
287 // Otherwise should result in an error status\r
288 //\r
289 Operand = (0xababababefefefef);\r
2f88bd3a
MK
290 Status = SafeUint64ToIntn (Operand, &Result);\r
291 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
292\r
293 return UNIT_TEST_PASSED;\r
294}\r
295\r
296UNIT_TEST_STATUS\r
297EFIAPI\r
298TestSafeUint64ToUintn (\r
2f88bd3a 299 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
300 )\r
301{\r
302 EFI_STATUS Status;\r
303 UINT64 Operand;\r
304 UINTN Result;\r
305\r
306 //\r
307 // If Operand is <= MAX_UINTN, then it's a cast\r
308 //\r
309 Operand = 0xabababab;\r
2f88bd3a
MK
310 Result = 0;\r
311 Status = SafeUint64ToUintn (Operand, &Result);\r
312 UT_ASSERT_NOT_EFI_ERROR (Status);\r
313 UT_ASSERT_EQUAL (0xabababab, Result);\r
e50c2bb3
MK
314\r
315 //\r
316 // Otherwise should result in an error status\r
317 //\r
318 Operand = (0xababababefefefef);\r
2f88bd3a
MK
319 Status = SafeUint64ToUintn (Operand, &Result);\r
320 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
321\r
322 return UNIT_TEST_PASSED;\r
323}\r
324\r
325UNIT_TEST_STATUS\r
326EFIAPI\r
327TestSafeUintnAdd (\r
2f88bd3a 328 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
329 )\r
330{\r
331 EFI_STATUS Status;\r
332 UINTN Augend;\r
333 UINTN Addend;\r
334 UINTN Result;\r
335\r
336 //\r
337 // If the result of addition doesn't overflow MAX_UINTN, then it's addition\r
338 //\r
339 Augend = 0x3a3a3a3a;\r
340 Addend = 0x3a3a3a3a;\r
341 Result = 0;\r
2f88bd3a
MK
342 Status = SafeUintnAdd (Augend, Addend, &Result);\r
343 UT_ASSERT_NOT_EFI_ERROR (Status);\r
344 UT_ASSERT_EQUAL (0x74747474, Result);\r
e50c2bb3
MK
345\r
346 //\r
347 // Otherwise should result in an error status\r
348 //\r
349 Augend = 0xabababab;\r
350 Addend = 0xbcbcbcbc;\r
2f88bd3a
MK
351 Status = SafeUintnAdd (Augend, Addend, &Result);\r
352 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
353\r
354 return UNIT_TEST_PASSED;\r
355}\r
356\r
357UNIT_TEST_STATUS\r
358EFIAPI\r
359TestSafeIntnAdd (\r
2f88bd3a 360 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
361 )\r
362{\r
363 EFI_STATUS Status;\r
364 INTN Augend;\r
365 INTN Addend;\r
366 INTN Result;\r
367\r
368 //\r
369 // If the result of addition doesn't overflow MAX_INTN\r
370 // and doesn't underflow MIN_INTN, then it's addition\r
371 //\r
372 Augend = 0x3a3a3a3a;\r
373 Addend = 0x3a3a3a3a;\r
374 Result = 0;\r
2f88bd3a
MK
375 Status = SafeIntnAdd (Augend, Addend, &Result);\r
376 UT_ASSERT_NOT_EFI_ERROR (Status);\r
377 UT_ASSERT_EQUAL (0x74747474, Result);\r
e50c2bb3
MK
378\r
379 Augend = (-976894522);\r
380 Addend = (-976894522);\r
2f88bd3a
MK
381 Status = SafeIntnAdd (Augend, Addend, &Result);\r
382 UT_ASSERT_NOT_EFI_ERROR (Status);\r
383 UT_ASSERT_EQUAL ((-1953789044), Result);\r
e50c2bb3
MK
384\r
385 //\r
386 // Otherwise should result in an error status\r
387 //\r
388 Augend = 0x5a5a5a5a;\r
389 Addend = 0x5a5a5a5a;\r
2f88bd3a
MK
390 Status = SafeIntnAdd (Augend, Addend, &Result);\r
391 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
392\r
393 Augend = (-1515870810);\r
394 Addend = (-1515870810);\r
2f88bd3a
MK
395 Status = SafeIntnAdd (Augend, Addend, &Result);\r
396 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
397\r
398 return UNIT_TEST_PASSED;\r
399}\r
400\r
401UNIT_TEST_STATUS\r
402EFIAPI\r
403TestSafeUintnSub (\r
2f88bd3a 404 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
405 )\r
406{\r
407 EFI_STATUS Status;\r
408 UINTN Minuend;\r
409 UINTN Subtrahend;\r
410 UINTN Result;\r
411\r
412 //\r
413 // If Minuend >= Subtrahend, then it's subtraction\r
414 //\r
2f88bd3a 415 Minuend = 0x5a5a5a5a;\r
e50c2bb3 416 Subtrahend = 0x3b3b3b3b;\r
2f88bd3a
MK
417 Result = 0;\r
418 Status = SafeUintnSub (Minuend, Subtrahend, &Result);\r
419 UT_ASSERT_NOT_EFI_ERROR (Status);\r
420 UT_ASSERT_EQUAL (0x1f1f1f1f, Result);\r
e50c2bb3
MK
421\r
422 //\r
423 // Otherwise should result in an error status\r
424 //\r
2f88bd3a 425 Minuend = 0x5a5a5a5a;\r
e50c2bb3 426 Subtrahend = 0x6d6d6d6d;\r
2f88bd3a
MK
427 Status = SafeUintnSub (Minuend, Subtrahend, &Result);\r
428 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
429\r
430 return UNIT_TEST_PASSED;\r
431}\r
432\r
433UNIT_TEST_STATUS\r
434EFIAPI\r
435TestSafeIntnSub (\r
2f88bd3a 436 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
437 )\r
438{\r
439 EFI_STATUS Status;\r
440 INTN Minuend;\r
441 INTN Subtrahend;\r
442 INTN Result;\r
443\r
444 //\r
445 // If the result of subtractions doesn't overflow MAX_INTN or\r
446 // underflow MIN_INTN, then it's subtraction\r
447 //\r
2f88bd3a 448 Minuend = 0x5a5a5a5a;\r
e50c2bb3 449 Subtrahend = 0x3a3a3a3a;\r
2f88bd3a
MK
450 Result = 0;\r
451 Status = SafeIntnSub (Minuend, Subtrahend, &Result);\r
452 UT_ASSERT_NOT_EFI_ERROR (Status);\r
453 UT_ASSERT_EQUAL (0x20202020, Result);\r
e50c2bb3 454\r
2f88bd3a 455 Minuend = 0x3a3a3a3a;\r
e50c2bb3 456 Subtrahend = 0x5a5a5a5a;\r
2f88bd3a
MK
457 Status = SafeIntnSub (Minuend, Subtrahend, &Result);\r
458 UT_ASSERT_NOT_EFI_ERROR (Status);\r
459 UT_ASSERT_EQUAL ((-538976288), Result);\r
e50c2bb3
MK
460\r
461 //\r
462 // Otherwise should result in an error status\r
463 //\r
2f88bd3a 464 Minuend = (-2054847098);\r
e50c2bb3 465 Subtrahend = 2054847098;\r
2f88bd3a
MK
466 Status = SafeIntnSub (Minuend, Subtrahend, &Result);\r
467 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3 468\r
2f88bd3a 469 Minuend = (2054847098);\r
e50c2bb3 470 Subtrahend = (-2054847098);\r
2f88bd3a
MK
471 Status = SafeIntnSub (Minuend, Subtrahend, &Result);\r
472 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
473\r
474 return UNIT_TEST_PASSED;\r
475}\r
476\r
477UNIT_TEST_STATUS\r
478EFIAPI\r
479TestSafeUintnMult (\r
2f88bd3a 480 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
481 )\r
482{\r
483 EFI_STATUS Status;\r
484 UINTN Multiplicand;\r
485 UINTN Multiplier;\r
486 UINTN Result;\r
487\r
488 //\r
489 // If the result of multiplication doesn't overflow MAX_UINTN, it will succeed\r
490 //\r
491 Multiplicand = 0xa122a;\r
2f88bd3a
MK
492 Multiplier = 0xd23;\r
493 Result = 0;\r
494 Status = SafeUintnMult (Multiplicand, Multiplier, &Result);\r
495 UT_ASSERT_NOT_EFI_ERROR (Status);\r
496 UT_ASSERT_EQUAL (0x844c9dbe, Result);\r
e50c2bb3
MK
497\r
498 //\r
499 // Otherwise should result in an error status\r
500 //\r
501 Multiplicand = 0xa122a;\r
2f88bd3a
MK
502 Multiplier = 0xed23;\r
503 Status = SafeUintnMult (Multiplicand, Multiplier, &Result);\r
504 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
505\r
506 return UNIT_TEST_PASSED;\r
507}\r
508\r
509UNIT_TEST_STATUS\r
510EFIAPI\r
511TestSafeIntnMult (\r
2f88bd3a 512 IN UNIT_TEST_CONTEXT Context\r
e50c2bb3
MK
513 )\r
514{\r
515 EFI_STATUS Status;\r
516 INTN Multiplicand;\r
517 INTN Multiplier;\r
518 INTN Result;\r
519\r
520 //\r
521 // If the result of multiplication doesn't overflow MAX_INTN and doesn't\r
522 // underflow MIN_UINTN, it will succeed\r
523 //\r
524 Multiplicand = 0x123456;\r
2f88bd3a
MK
525 Multiplier = 0x678;\r
526 Result = 0;\r
527 Status = SafeIntnMult (Multiplicand, Multiplier, &Result);\r
528 UT_ASSERT_NOT_EFI_ERROR (Status);\r
529 UT_ASSERT_EQUAL (0x75c28c50, Result);\r
e50c2bb3
MK
530\r
531 //\r
532 // Otherwise should result in an error status\r
533 //\r
534 Multiplicand = 0x123456;\r
2f88bd3a
MK
535 Multiplier = 0xabc;\r
536 Status = SafeIntnMult (Multiplicand, Multiplier, &Result);\r
537 UT_ASSERT_EQUAL (RETURN_BUFFER_TOO_SMALL, Status);\r
e50c2bb3
MK
538\r
539 return UNIT_TEST_PASSED;\r
540}\r