1 /*++ 2 3 Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.<BR> 4 This program and the accompanying materials 5 are licensed and made available under the terms and conditions of the BSD License 6 which accompanies this distribution. The full text of the license may be found at 7 http://opensource.org/licenses/bsd-license.php 8 9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 12 13 Module Name: 14 15 BitField.c 16 17 Abstract: 18 19 Bit field functions of BaseLib. 20 21 --*/ 22 23 #include "BaseLibInternals.h" 24 25 /** 26 Worker function that returns a bit field from Operand 27 28 Returns the bitfield specified by the StartBit and the EndBit from Operand. 29 30 @param Operand Operand on which to perform the bitfield operation. 31 @param StartBit The ordinal of the least significant bit in the bit field. 32 @param EndBit The ordinal of the most significant bit in the bit field. 33 34 @return The bit field read. 35 36 **/ 37 unsigned int 38 BitFieldReadUint ( 39 IN unsigned int Operand, 40 IN UINTN StartBit, 41 IN UINTN EndBit 42 ) 43 { 44 // 45 // ~((unsigned int)-2 << EndBit) is a mask in which bit[0] thru bit[EndBit] 46 // are 1's while bit[EndBit + 1] thru the most significant bit are 0's. 47 // 48 return (Operand & ~((unsigned int)-2 << EndBit)) >> StartBit; 49 } 50 51 /** 52 Worker function that reads a bit field from Operand, performs a bitwise OR, 53 and returns the result. 54 55 Performs a bitwise OR between the bit field specified by StartBit and EndBit 56 in Operand and the value specified by AndData. All other bits in Operand are 57 preserved. The new value is returned. 58 59 @param Operand Operand on which to perform the bitfield operation. 60 @param StartBit The ordinal of the least significant bit in the bit field. 61 @param EndBit The ordinal of the most significant bit in the bit field. 62 @param OrData The value to OR with the read value from the value 63 64 @return The new value. 65 66 **/ 67 unsigned int 68 BitFieldOrUint ( 69 IN unsigned int Operand, 70 IN UINTN StartBit, 71 IN UINTN EndBit, 72 IN unsigned int OrData 73 ) 74 { 75 // 76 // ~((unsigned int)-2 << EndBit) is a mask in which bit[0] thru bit[EndBit] 77 // are 1's while bit[EndBit + 1] thru the most significant bit are 0's. 78 // 79 return Operand | ((OrData << StartBit) & ~((unsigned int) -2 << EndBit)); 80 } 81 82 /** 83 Worker function that reads a bit field from Operand, performs a bitwise AND, 84 and returns the result. 85 86 Performs a bitwise AND between the bit field specified by StartBit and EndBit 87 in Operand and the value specified by AndData. All other bits in Operand are 88 preserved. The new value is returned. 89 90 @param Operand Operand on which to perform the bitfield operation. 91 @param StartBit The ordinal of the least significant bit in the bit field. 92 @param EndBit The ordinal of the most significant bit in the bit field. 93 @param AndData The value to And with the read value from the value 94 95 @return The new value. 96 97 **/ 98 unsigned int 99 BitFieldAndUint ( 100 IN unsigned int Operand, 101 IN UINTN StartBit, 102 IN UINTN EndBit, 103 IN unsigned int AndData 104 ) 105 { 106 // 107 // ~((unsigned int)-2 << EndBit) is a mask in which bit[0] thru bit[EndBit] 108 // are 1's while bit[EndBit + 1] thru the most significant bit are 0's. 109 // 110 return Operand & ~((~AndData << StartBit) & ~((unsigned int) -2 << EndBit)); 111 } 112 113 /** 114 Returns a bit field from an 8-bit value. 115 116 Returns the bitfield specified by the StartBit and the EndBit from Operand. 117 118 If 8-bit operations are not supported, then ASSERT(). 119 If StartBit is greater than 7, then ASSERT(). 120 If EndBit is greater than 7, then ASSERT(). 121 If EndBit is less than StartBit, then ASSERT(). 122 123 @param Operand Operand on which to perform the bitfield operation. 124 @param StartBit The ordinal of the least significant bit in the bit field. 125 Range 0..7. 126 @param EndBit The ordinal of the most significant bit in the bit field. 127 Range 0..7. 128 129 @return The bit field read. 130 131 **/ 132 UINT8 133 EFIAPI 134 BitFieldRead8 ( 135 IN UINT8 Operand, 136 IN UINTN StartBit, 137 IN UINTN EndBit 138 ) 139 { 140 ASSERT (EndBit < sizeof (Operand) * 8); 141 ASSERT (StartBit <= EndBit); 142 return (UINT8)BitFieldReadUint (Operand, StartBit, EndBit); 143 } 144 145 /** 146 Writes a bit field to an 8-bit value, and returns the result. 147 148 Writes Value to the bit field specified by the StartBit and the EndBit in 149 Operand. All other bits in Operand are preserved. The new 8-bit value is 150 returned. 151 152 If 8-bit operations are not supported, then ASSERT(). 153 If StartBit is greater than 7, then ASSERT(). 154 If EndBit is greater than 7, then ASSERT(). 155 If EndBit is less than StartBit, then ASSERT(). 156 157 @param Operand Operand on which to perform the bitfield operation. 158 @param StartBit The ordinal of the least significant bit in the bit field. 159 Range 0..7. 160 @param EndBit The ordinal of the most significant bit in the bit field. 161 Range 0..7. 162 @param Value New value of the bit field. 163 164 @return The new 8-bit value. 165 166 **/ 167 UINT8 168 EFIAPI 169 BitFieldWrite8 ( 170 IN UINT8 Operand, 171 IN UINTN StartBit, 172 IN UINTN EndBit, 173 IN UINT8 Value 174 ) 175 { 176 ASSERT (EndBit < sizeof (Operand) * 8); 177 ASSERT (StartBit <= EndBit); 178 return BitFieldAndThenOr8 (Operand, StartBit, EndBit, 0, Value); 179 } 180 181 /** 182 Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the 183 result. 184 185 Performs a bitwise inclusive OR between the bit field specified by StartBit 186 and EndBit in Operand and the value specified by OrData. All other bits in 187 Operand are preserved. The new 8-bit value is returned. 188 189 If 8-bit operations are not supported, then ASSERT(). 190 If StartBit is greater than 7, then ASSERT(). 191 If EndBit is greater than 7, then ASSERT(). 192 If EndBit is less than StartBit, then ASSERT(). 193 194 @param Operand Operand on which to perform the bitfield operation. 195 @param StartBit The ordinal of the least significant bit in the bit field. 196 Range 0..7. 197 @param EndBit The ordinal of the most significant bit in the bit field. 198 Range 0..7. 199 @param OrData The value to OR with the read value from the value 200 201 @return The new 8-bit value. 202 203 **/ 204 UINT8 205 EFIAPI 206 BitFieldOr8 ( 207 IN UINT8 Operand, 208 IN UINTN StartBit, 209 IN UINTN EndBit, 210 IN UINT8 OrData 211 ) 212 { 213 ASSERT (EndBit < sizeof (Operand) * 8); 214 ASSERT (StartBit <= EndBit); 215 return (UINT8)BitFieldOrUint (Operand, StartBit, EndBit, OrData); 216 } 217 218 /** 219 Reads a bit field from an 8-bit value, performs a bitwise AND, and returns 220 the result. 221 222 Performs a bitwise AND between the bit field specified by StartBit and EndBit 223 in Operand and the value specified by AndData. All other bits in Operand are 224 preserved. The new 8-bit value is returned. 225 226 If 8-bit operations are not supported, then ASSERT(). 227 If StartBit is greater than 7, then ASSERT(). 228 If EndBit is greater than 7, then ASSERT(). 229 If EndBit is less than StartBit, then ASSERT(). 230 231 @param Operand Operand on which to perform the bitfield operation. 232 @param StartBit The ordinal of the least significant bit in the bit field. 233 Range 0..7. 234 @param EndBit The ordinal of the most significant bit in the bit field. 235 Range 0..7. 236 @param AndData The value to AND with the read value from the value. 237 238 @return The new 8-bit value. 239 240 **/ 241 UINT8 242 EFIAPI 243 BitFieldAnd8 ( 244 IN UINT8 Operand, 245 IN UINTN StartBit, 246 IN UINTN EndBit, 247 IN UINT8 AndData 248 ) 249 { 250 ASSERT (EndBit < sizeof (Operand) * 8); 251 ASSERT (StartBit <= EndBit); 252 return (UINT8)BitFieldAndUint (Operand, StartBit, EndBit, AndData); 253 } 254 255 /** 256 Reads a bit field from an 8-bit value, performs a bitwise AND followed by a 257 bitwise OR, and returns the result. 258 259 Performs a bitwise AND between the bit field specified by StartBit and EndBit 260 in Operand and the value specified by AndData, followed by a bitwise 261 inclusive OR with value specified by OrData. All other bits in Operand are 262 preserved. The new 8-bit value is returned. 263 264 If 8-bit operations are not supported, then ASSERT(). 265 If StartBit is greater than 7, then ASSERT(). 266 If EndBit is greater than 7, then ASSERT(). 267 If EndBit is less than StartBit, then ASSERT(). 268 269 @param Operand Operand on which to perform the bitfield operation. 270 @param StartBit The ordinal of the least significant bit in the bit field. 271 Range 0..7. 272 @param EndBit The ordinal of the most significant bit in the bit field. 273 Range 0..7. 274 @param AndData The value to AND with the read value from the value. 275 @param OrData The value to OR with the result of the AND operation. 276 277 @return The new 8-bit value. 278 279 **/ 280 UINT8 281 EFIAPI 282 BitFieldAndThenOr8 ( 283 IN UINT8 Operand, 284 IN UINTN StartBit, 285 IN UINTN EndBit, 286 IN UINT8 AndData, 287 IN UINT8 OrData 288 ) 289 { 290 ASSERT (EndBit < sizeof (Operand) * 8); 291 ASSERT (StartBit <= EndBit); 292 return BitFieldOr8 ( 293 BitFieldAnd8 (Operand, StartBit, EndBit, AndData), 294 StartBit, 295 EndBit, 296 OrData 297 ); 298 } 299 300 /** 301 Returns a bit field from a 16-bit value. 302 303 Returns the bitfield specified by the StartBit and the EndBit from Operand. 304 305 If 16-bit operations are not supported, then ASSERT(). 306 If StartBit is greater than 15, then ASSERT(). 307 If EndBit is greater than 15, then ASSERT(). 308 If EndBit is less than StartBit, then ASSERT(). 309 310 @param Operand Operand on which to perform the bitfield operation. 311 @param StartBit The ordinal of the least significant bit in the bit field. 312 Range 0..15. 313 @param EndBit The ordinal of the most significant bit in the bit field. 314 Range 0..15. 315 316 @return The bit field read. 317 318 **/ 319 UINT16 320 EFIAPI 321 BitFieldRead16 ( 322 IN UINT16 Operand, 323 IN UINTN StartBit, 324 IN UINTN EndBit 325 ) 326 { 327 ASSERT (EndBit < sizeof (Operand) * 8); 328 ASSERT (StartBit <= EndBit); 329 return (UINT16)BitFieldReadUint (Operand, StartBit, EndBit); 330 } 331 332 /** 333 Writes a bit field to a 16-bit value, and returns the result. 334 335 Writes Value to the bit field specified by the StartBit and the EndBit in 336 Operand. All other bits in Operand are preserved. The new 16-bit value is 337 returned. 338 339 If 16-bit operations are not supported, then ASSERT(). 340 If StartBit is greater than 15, then ASSERT(). 341 If EndBit is greater than 15, then ASSERT(). 342 If EndBit is less than StartBit, then ASSERT(). 343 344 @param Operand Operand on which to perform the bitfield operation. 345 @param StartBit The ordinal of the least significant bit in the bit field. 346 Range 0..15. 347 @param EndBit The ordinal of the most significant bit in the bit field. 348 Range 0..15. 349 @param Value New value of the bit field. 350 351 @return The new 16-bit value. 352 353 **/ 354 UINT16 355 EFIAPI 356 BitFieldWrite16 ( 357 IN UINT16 Operand, 358 IN UINTN StartBit, 359 IN UINTN EndBit, 360 IN UINT16 Value 361 ) 362 { 363 ASSERT (EndBit < sizeof (Operand) * 8); 364 ASSERT (StartBit <= EndBit); 365 return BitFieldAndThenOr16 (Operand, StartBit, EndBit, 0, Value); 366 } 367 368 /** 369 Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the 370 result. 371 372 Performs a bitwise inclusive OR between the bit field specified by StartBit 373 and EndBit in Operand and the value specified by OrData. All other bits in 374 Operand are preserved. The new 16-bit value is returned. 375 376 If 16-bit operations are not supported, then ASSERT(). 377 If StartBit is greater than 15, then ASSERT(). 378 If EndBit is greater than 15, then ASSERT(). 379 If EndBit is less than StartBit, then ASSERT(). 380 381 @param Operand Operand on which to perform the bitfield operation. 382 @param StartBit The ordinal of the least significant bit in the bit field. 383 Range 0..15. 384 @param EndBit The ordinal of the most significant bit in the bit field. 385 Range 0..15. 386 @param OrData The value to OR with the read value from the value 387 388 @return The new 16-bit value. 389 390 **/ 391 UINT16 392 EFIAPI 393 BitFieldOr16 ( 394 IN UINT16 Operand, 395 IN UINTN StartBit, 396 IN UINTN EndBit, 397 IN UINT16 OrData 398 ) 399 { 400 ASSERT (EndBit < sizeof (Operand) * 8); 401 ASSERT (StartBit <= EndBit); 402 return (UINT16)BitFieldOrUint (Operand, StartBit, EndBit, OrData); 403 } 404 405 /** 406 Reads a bit field from a 16-bit value, performs a bitwise AND, and returns 407 the result. 408 409 Performs a bitwise AND between the bit field specified by StartBit and EndBit 410 in Operand and the value specified by AndData. All other bits in Operand are 411 preserved. The new 16-bit value is returned. 412 413 If 16-bit operations are not supported, then ASSERT(). 414 If StartBit is greater than 15, then ASSERT(). 415 If EndBit is greater than 15, then ASSERT(). 416 If EndBit is less than StartBit, then ASSERT(). 417 418 @param Operand Operand on which to perform the bitfield operation. 419 @param StartBit The ordinal of the least significant bit in the bit field. 420 Range 0..15. 421 @param EndBit The ordinal of the most significant bit in the bit field. 422 Range 0..15. 423 @param AndData The value to AND with the read value from the value 424 425 @return The new 16-bit value. 426 427 **/ 428 UINT16 429 EFIAPI 430 BitFieldAnd16 ( 431 IN UINT16 Operand, 432 IN UINTN StartBit, 433 IN UINTN EndBit, 434 IN UINT16 AndData 435 ) 436 { 437 ASSERT (EndBit < sizeof (Operand) * 8); 438 ASSERT (StartBit <= EndBit); 439 return (UINT16)BitFieldAndUint (Operand, StartBit, EndBit, AndData); 440 } 441 442 /** 443 Reads a bit field from a 16-bit value, performs a bitwise AND followed by a 444 bitwise OR, and returns the result. 445 446 Performs a bitwise AND between the bit field specified by StartBit and EndBit 447 in Operand and the value specified by AndData, followed by a bitwise 448 inclusive OR with value specified by OrData. All other bits in Operand are 449 preserved. The new 16-bit value is returned. 450 451 If 16-bit operations are not supported, then ASSERT(). 452 If StartBit is greater than 15, then ASSERT(). 453 If EndBit is greater than 15, then ASSERT(). 454 If EndBit is less than StartBit, then ASSERT(). 455 456 @param Operand Operand on which to perform the bitfield operation. 457 @param StartBit The ordinal of the least significant bit in the bit field. 458 Range 0..15. 459 @param EndBit The ordinal of the most significant bit in the bit field. 460 Range 0..15. 461 @param AndData The value to AND with the read value from the value. 462 @param OrData The value to OR with the result of the AND operation. 463 464 @return The new 16-bit value. 465 466 **/ 467 UINT16 468 EFIAPI 469 BitFieldAndThenOr16 ( 470 IN UINT16 Operand, 471 IN UINTN StartBit, 472 IN UINTN EndBit, 473 IN UINT16 AndData, 474 IN UINT16 OrData 475 ) 476 { 477 ASSERT (EndBit < sizeof (Operand) * 8); 478 ASSERT (StartBit <= EndBit); 479 return BitFieldOr16 ( 480 BitFieldAnd16 (Operand, StartBit, EndBit, AndData), 481 StartBit, 482 EndBit, 483 OrData 484 ); 485 } 486 487 /** 488 Returns a bit field from a 32-bit value. 489 490 Returns the bitfield specified by the StartBit and the EndBit from Operand. 491 492 If 32-bit operations are not supported, then ASSERT(). 493 If StartBit is greater than 31, then ASSERT(). 494 If EndBit is greater than 31, then ASSERT(). 495 If EndBit is less than StartBit, then ASSERT(). 496 497 @param Operand Operand on which to perform the bitfield operation. 498 @param StartBit The ordinal of the least significant bit in the bit field. 499 Range 0..31. 500 @param EndBit The ordinal of the most significant bit in the bit field. 501 Range 0..31. 502 503 @return The bit field read. 504 505 **/ 506 UINT32 507 EFIAPI 508 BitFieldRead32 ( 509 IN UINT32 Operand, 510 IN UINTN StartBit, 511 IN UINTN EndBit 512 ) 513 { 514 ASSERT (EndBit < sizeof (Operand) * 8); 515 ASSERT (StartBit <= EndBit); 516 return (UINT32)BitFieldReadUint (Operand, StartBit, EndBit); 517 } 518 519 /** 520 Writes a bit field to a 32-bit value, and returns the result. 521 522 Writes Value to the bit field specified by the StartBit and the EndBit in 523 Operand. All other bits in Operand are preserved. The new 32-bit value is 524 returned. 525 526 If 32-bit operations are not supported, then ASSERT(). 527 If StartBit is greater than 31, then ASSERT(). 528 If EndBit is greater than 31, then ASSERT(). 529 If EndBit is less than StartBit, then ASSERT(). 530 531 @param Operand Operand on which to perform the bitfield operation. 532 @param StartBit The ordinal of the least significant bit in the bit field. 533 Range 0..31. 534 @param EndBit The ordinal of the most significant bit in the bit field. 535 Range 0..31. 536 @param Value New value of the bit field. 537 538 @return The new 32-bit value. 539 540 **/ 541 UINT32 542 EFIAPI 543 BitFieldWrite32 ( 544 IN UINT32 Operand, 545 IN UINTN StartBit, 546 IN UINTN EndBit, 547 IN UINT32 Value 548 ) 549 { 550 ASSERT (EndBit < sizeof (Operand) * 8); 551 ASSERT (StartBit <= EndBit); 552 return BitFieldAndThenOr32 (Operand, StartBit, EndBit, 0, Value); 553 } 554 555 /** 556 Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the 557 result. 558 559 Performs a bitwise inclusive OR between the bit field specified by StartBit 560 and EndBit in Operand and the value specified by OrData. All other bits in 561 Operand are preserved. The new 32-bit value is returned. 562 563 If 32-bit operations are not supported, then ASSERT(). 564 If StartBit is greater than 31, then ASSERT(). 565 If EndBit is greater than 31, then ASSERT(). 566 If EndBit is less than StartBit, then ASSERT(). 567 568 @param Operand Operand on which to perform the bitfield operation. 569 @param StartBit The ordinal of the least significant bit in the bit field. 570 Range 0..31. 571 @param EndBit The ordinal of the most significant bit in the bit field. 572 Range 0..31. 573 @param OrData The value to OR with the read value from the value 574 575 @return The new 32-bit value. 576 577 **/ 578 UINT32 579 EFIAPI 580 BitFieldOr32 ( 581 IN UINT32 Operand, 582 IN UINTN StartBit, 583 IN UINTN EndBit, 584 IN UINT32 OrData 585 ) 586 { 587 ASSERT (EndBit < sizeof (Operand) * 8); 588 ASSERT (StartBit <= EndBit); 589 return (UINT32)BitFieldOrUint (Operand, StartBit, EndBit, OrData); 590 } 591 592 /** 593 Reads a bit field from a 32-bit value, performs a bitwise AND, and returns 594 the result. 595 596 Performs a bitwise AND between the bit field specified by StartBit and EndBit 597 in Operand and the value specified by AndData. All other bits in Operand are 598 preserved. The new 32-bit value is returned. 599 600 If 32-bit operations are not supported, then ASSERT(). 601 If StartBit is greater than 31, then ASSERT(). 602 If EndBit is greater than 31, then ASSERT(). 603 If EndBit is less than StartBit, then ASSERT(). 604 605 @param Operand Operand on which to perform the bitfield operation. 606 @param StartBit The ordinal of the least significant bit in the bit field. 607 Range 0..31. 608 @param EndBit The ordinal of the most significant bit in the bit field. 609 Range 0..31. 610 @param AndData The value to AND with the read value from the value 611 612 @return The new 32-bit value. 613 614 **/ 615 UINT32 616 EFIAPI 617 BitFieldAnd32 ( 618 IN UINT32 Operand, 619 IN UINTN StartBit, 620 IN UINTN EndBit, 621 IN UINT32 AndData 622 ) 623 { 624 ASSERT (EndBit < sizeof (Operand) * 8); 625 ASSERT (StartBit <= EndBit); 626 return (UINT32)BitFieldAndUint (Operand, StartBit, EndBit, AndData); 627 } 628 629 /** 630 Reads a bit field from a 32-bit value, performs a bitwise AND followed by a 631 bitwise OR, and returns the result. 632 633 Performs a bitwise AND between the bit field specified by StartBit and EndBit 634 in Operand and the value specified by AndData, followed by a bitwise 635 inclusive OR with value specified by OrData. All other bits in Operand are 636 preserved. The new 32-bit value is returned. 637 638 If 32-bit operations are not supported, then ASSERT(). 639 If StartBit is greater than 31, then ASSERT(). 640 If EndBit is greater than 31, then ASSERT(). 641 If EndBit is less than StartBit, then ASSERT(). 642 643 @param Operand Operand on which to perform the bitfield operation. 644 @param StartBit The ordinal of the least significant bit in the bit field. 645 Range 0..31. 646 @param EndBit The ordinal of the most significant bit in the bit field. 647 Range 0..31. 648 @param AndData The value to AND with the read value from the value. 649 @param OrData The value to OR with the result of the AND operation. 650 651 @return The new 32-bit value. 652 653 **/ 654 UINT32 655 EFIAPI 656 BitFieldAndThenOr32 ( 657 IN UINT32 Operand, 658 IN UINTN StartBit, 659 IN UINTN EndBit, 660 IN UINT32 AndData, 661 IN UINT32 OrData 662 ) 663 { 664 ASSERT (EndBit < sizeof (Operand) * 8); 665 ASSERT (StartBit <= EndBit); 666 return BitFieldOr32 ( 667 BitFieldAnd32 (Operand, StartBit, EndBit, AndData), 668 StartBit, 669 EndBit, 670 OrData 671 ); 672 } 673 674 /** 675 Returns a bit field from a 64-bit value. 676 677 Returns the bitfield specified by the StartBit and the EndBit from Operand. 678 679 If 64-bit operations are not supported, then ASSERT(). 680 If StartBit is greater than 63, then ASSERT(). 681 If EndBit is greater than 63, then ASSERT(). 682 If EndBit is less than StartBit, then ASSERT(). 683 684 @param Operand Operand on which to perform the bitfield operation. 685 @param StartBit The ordinal of the least significant bit in the bit field. 686 Range 0..63. 687 @param EndBit The ordinal of the most significant bit in the bit field. 688 Range 0..63. 689 690 @return The bit field read. 691 692 **/ 693 UINT64 694 EFIAPI 695 BitFieldRead64 ( 696 IN UINT64 Operand, 697 IN UINTN StartBit, 698 IN UINTN EndBit 699 ) 700 { 701 ASSERT (EndBit < sizeof (Operand) * 8); 702 ASSERT (StartBit <= EndBit); 703 return RShiftU64 (Operand & ~LShiftU64 ((UINT64)-2, EndBit), StartBit); 704 } 705 706 /** 707 Writes a bit field to a 64-bit value, and returns the result. 708 709 Writes Value to the bit field specified by the StartBit and the EndBit in 710 Operand. All other bits in Operand are preserved. The new 64-bit value is 711 returned. 712 713 If 64-bit operations are not supported, then ASSERT(). 714 If StartBit is greater than 63, then ASSERT(). 715 If EndBit is greater than 63, then ASSERT(). 716 If EndBit is less than StartBit, then ASSERT(). 717 718 @param Operand Operand on which to perform the bitfield operation. 719 @param StartBit The ordinal of the least significant bit in the bit field. 720 Range 0..63. 721 @param EndBit The ordinal of the most significant bit in the bit field. 722 Range 0..63. 723 @param Value New value of the bit field. 724 725 @return The new 64-bit value. 726 727 **/ 728 UINT64 729 EFIAPI 730 BitFieldWrite64 ( 731 IN UINT64 Operand, 732 IN UINTN StartBit, 733 IN UINTN EndBit, 734 IN UINT64 Value 735 ) 736 { 737 ASSERT (EndBit < sizeof (Operand) * 8); 738 ASSERT (StartBit <= EndBit); 739 return BitFieldAndThenOr64 (Operand, StartBit, EndBit, 0, Value); 740 } 741 742 /** 743 Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the 744 result. 745 746 Performs a bitwise inclusive OR between the bit field specified by StartBit 747 and EndBit in Operand and the value specified by OrData. All other bits in 748 Operand are preserved. The new 64-bit value is returned. 749 750 If 64-bit operations are not supported, then ASSERT(). 751 If StartBit is greater than 63, then ASSERT(). 752 If EndBit is greater than 63, then ASSERT(). 753 If EndBit is less than StartBit, then ASSERT(). 754 755 @param Operand Operand on which to perform the bitfield operation. 756 @param StartBit The ordinal of the least significant bit in the bit field. 757 Range 0..63. 758 @param EndBit The ordinal of the most significant bit in the bit field. 759 Range 0..63. 760 @param OrData The value to OR with the read value from the value 761 762 @return The new 64-bit value. 763 764 **/ 765 UINT64 766 EFIAPI 767 BitFieldOr64 ( 768 IN UINT64 Operand, 769 IN UINTN StartBit, 770 IN UINTN EndBit, 771 IN UINT64 OrData 772 ) 773 { 774 UINT64 Value1; 775 UINT64 Value2; 776 777 ASSERT (EndBit < sizeof (Operand) * 8); 778 ASSERT (StartBit <= EndBit); 779 780 Value1 = LShiftU64 (OrData, StartBit); 781 Value2 = LShiftU64 ((UINT64) - 2, EndBit); 782 783 return Operand | (Value1 & ~Value2); 784 } 785 786 /** 787 Reads a bit field from a 64-bit value, performs a bitwise AND, and returns 788 the result. 789 790 Performs a bitwise AND between the bit field specified by StartBit and EndBit 791 in Operand and the value specified by AndData. All other bits in Operand are 792 preserved. The new 64-bit value is returned. 793 794 If 64-bit operations are not supported, then ASSERT(). 795 If StartBit is greater than 63, then ASSERT(). 796 If EndBit is greater than 63, then ASSERT(). 797 If EndBit is less than StartBit, then ASSERT(). 798 799 @param Operand Operand on which to perform the bitfield operation. 800 @param StartBit The ordinal of the least significant bit in the bit field. 801 Range 0..63. 802 @param EndBit The ordinal of the most significant bit in the bit field. 803 Range 0..63. 804 @param AndData The value to AND with the read value from the value 805 806 @return The new 64-bit value. 807 808 **/ 809 UINT64 810 EFIAPI 811 BitFieldAnd64 ( 812 IN UINT64 Operand, 813 IN UINTN StartBit, 814 IN UINTN EndBit, 815 IN UINT64 AndData 816 ) 817 { 818 UINT64 Value1; 819 UINT64 Value2; 820 821 ASSERT (EndBit < sizeof (Operand) * 8); 822 ASSERT (StartBit <= EndBit); 823 824 Value1 = LShiftU64 (~AndData, StartBit); 825 Value2 = LShiftU64 ((UINT64)-2, EndBit); 826 827 return Operand & ~(Value1 & ~Value2); 828 } 829 830 /** 831 Reads a bit field from a 64-bit value, performs a bitwise AND followed by a 832 bitwise OR, and returns the result. 833 834 Performs a bitwise AND between the bit field specified by StartBit and EndBit 835 in Operand and the value specified by AndData, followed by a bitwise 836 inclusive OR with value specified by OrData. All other bits in Operand are 837 preserved. The new 64-bit value is returned. 838 839 If 64-bit operations are not supported, then ASSERT(). 840 If StartBit is greater than 63, then ASSERT(). 841 If EndBit is greater than 63, then ASSERT(). 842 If EndBit is less than StartBit, then ASSERT(). 843 844 @param Operand Operand on which to perform the bitfield operation. 845 @param StartBit The ordinal of the least significant bit in the bit field. 846 Range 0..63. 847 @param EndBit The ordinal of the most significant bit in the bit field. 848 Range 0..63. 849 @param AndData The value to AND with the read value from the value. 850 @param OrData The value to OR with the result of the AND operation. 851 852 @return The new 64-bit value. 853 854 **/ 855 UINT64 856 EFIAPI 857 BitFieldAndThenOr64 ( 858 IN UINT64 Operand, 859 IN UINTN StartBit, 860 IN UINTN EndBit, 861 IN UINT64 AndData, 862 IN UINT64 OrData 863 ) 864 { 865 ASSERT (EndBit < sizeof (Operand) * 8); 866 ASSERT (StartBit <= EndBit); 867 return BitFieldOr64 ( 868 BitFieldAnd64 (Operand, StartBit, EndBit, AndData), 869 StartBit, 870 EndBit, 871 OrData 872 ); 873 } 874