1 /*++ 2 3 Copyright (c) 2004 - 2011, 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 Module Name: 13 14 EfiRuntimeLib.h 15 16 Abstract: 17 18 Light weight lib to support EFI drivers. 19 20 --*/ 21 22 #ifndef _EFI_RUNTIME_LIB_H_ 23 #define _EFI_RUNTIME_LIB_H_ 24 #define MAX_FVB_COUNT 16 25 #include "EfiStatusCode.h" 26 #include "EfiCommonLib.h" 27 28 #include "LinkedList.h" 29 #include "GetImage.h" 30 #include "RtDevicePath.h" 31 32 #include EFI_GUID_DEFINITION (DxeServices) 33 #include EFI_GUID_DEFINITION (EventGroup) 34 #include EFI_GUID_DEFINITION (EventLegacyBios) 35 #include EFI_PROTOCOL_DEFINITION (CpuIo) 36 #include EFI_PROTOCOL_DEFINITION (FirmwareVolume) 37 #include EFI_PROTOCOL_DEFINITION (FirmwareVolume2) 38 #include EFI_PROTOCOL_DEFINITION (FirmwareVolumeBlock) 39 #include EFI_PROTOCOL_DEFINITION (FvbExtension) 40 #include "ProcDep.h" 41 42 typedef struct { 43 EFI_HANDLE Handle; 44 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb; 45 EFI_FVB_EXTENSION_PROTOCOL *FvbExtension; 46 } FVB_ENTRY; 47 48 // 49 // Driver Lib Globals. 50 // 51 extern EFI_BOOT_SERVICES *gBS; 52 extern EFI_SYSTEM_TABLE *gST; 53 extern EFI_DXE_SERVICES *gDS; 54 extern UINTN gRtErrorLevel; 55 extern FVB_ENTRY *mFvbEntry; 56 57 #if defined(__GNUC__) && defined(ECP_CPU_IPF) 58 59 VOID 60 EFIAPI 61 EcpEfiBreakPoint ( 62 VOID 63 ) 64 /*++ 65 66 Routine Description: 67 68 Generates a breakpoint on the CPU. 69 70 Generates a breakpoint on the CPU. The breakpoint must be implemented such 71 that code can resume normal execution after the breakpoint. 72 73 Arguments: 74 75 VOID 76 77 Returns: 78 79 VOID 80 81 --*/ 82 ; 83 84 VOID 85 EFIAPI 86 EcpMemoryFence ( 87 VOID 88 ) 89 /*++ 90 91 Routine Description: 92 93 Used to serialize load and store operations. 94 95 All loads and stores that proceed calls to this function are guaranteed to be 96 globally visible when this function returns. 97 98 Arguments: 99 100 VOID 101 102 Returns: 103 104 VOID 105 106 --*/ 107 ; 108 109 #endif 110 111 VOID 112 EFIAPI 113 EfiRuntimeLibFvbVirtualNotifyEvent ( 114 IN EFI_EVENT Event, 115 IN VOID *Context 116 ) 117 /*++ 118 119 Routine Description: 120 121 Notify function to convert pointers to Fvb functions after ExitBootServices 122 123 Arguments: 124 125 Event - Event whose notification function is being invoked. 126 Context - Pointer to the notification function's context, which is 127 implementation-dependent. 128 129 Returns: 130 131 None 132 133 --*/ 134 ; 135 136 EFI_STATUS 137 EfiInitializeRuntimeDriverLib ( 138 IN EFI_HANDLE ImageHandle, 139 IN EFI_SYSTEM_TABLE *SystemTable, 140 IN EFI_EVENT_NOTIFY RuntimeNotifyEventHandler 141 ) 142 /*++ 143 144 Routine Description: 145 146 Intialize Runtime Driver Lib if it has not yet been initialized. 147 148 Arguments: 149 150 ImageHandle - The firmware allocated handle for the EFI image. 151 152 SystemTable - A pointer to the EFI System Table. 153 154 RuntimeNotifyEventHandler - Virtual address change notification event 155 156 Returns: 157 158 EFI_STATUS always returns EFI_SUCCESS 159 160 --*/ 161 ; 162 163 EFI_STATUS 164 EfiShutdownRuntimeDriverLib ( 165 VOID 166 ) 167 /*++ 168 169 Routine Description: 170 171 This routine will free some resources which have been allocated in 172 EfiInitializeRuntimeDriverLib(). If a runtime driver exits with an error, 173 it must call this routine to free the allocated resource before the exiting. 174 175 Arguments: 176 177 None 178 179 Returns: 180 181 EFI_SUCCESS - Shotdown the Runtime Driver Lib successfully 182 EFI_UNSUPPORTED - Runtime Driver lib was not initialized at all 183 184 --*/ 185 ; 186 187 EFI_STATUS 188 EfiInitializeSmmDriverLib ( 189 IN EFI_HANDLE ImageHandle, 190 IN EFI_SYSTEM_TABLE *SystemTable 191 ) 192 /*++ 193 194 Routine Description: 195 196 Intialize Smm Driver Lib if it has not yet been initialized. 197 198 Arguments: 199 200 ImageHandle - The firmware allocated handle for the EFI image. 201 202 SystemTable - A pointer to the EFI System Table. 203 204 Returns: 205 206 EFI_STATUS always returns EFI_SUCCESS 207 208 --*/ 209 ; 210 211 EFI_STATUS 212 EfiLibGetSystemConfigurationTable ( 213 IN EFI_GUID *TableGuid, 214 IN OUT VOID **Table 215 ) 216 /*++ 217 218 Routine Description: 219 220 Return the EFI 1.0 System Tabl entry with TableGuid 221 222 Arguments: 223 224 TableGuid - Name of entry to return in the system table 225 Table - Pointer in EFI system table associated with TableGuid 226 227 Returns: 228 229 EFI_SUCCESS - Table returned; 230 EFI_NOT_FOUND - TableGuid not in EFI system table 231 232 --*/ 233 ; 234 235 BOOLEAN 236 EfiAtRuntime ( 237 VOID 238 ) 239 /*++ 240 241 Routine Description: 242 243 Am I at runtime? 244 245 Arguments: 246 247 None 248 249 Returns: 250 251 TRUE - At runtime 252 FALSE - Not at runtime 253 254 --*/ 255 ; 256 257 BOOLEAN 258 EfiGoneVirtual ( 259 VOID 260 ) 261 /*++ 262 263 Routine Description: 264 Return TRUE if SetVirtualAddressMap () has been called 265 266 Arguments: 267 NONE 268 269 Returns: 270 TRUE - If SetVirtualAddressMap () has been called 271 FALSE - If SetVirtualAddressMap () has not been called 272 273 --*/ 274 ; 275 276 EFI_STATUS 277 EfiLibGetSystemConfigurationTable ( 278 IN EFI_GUID *TableGuid, 279 IN OUT VOID **Table 280 ) 281 /*++ 282 283 284 285 Routine Description: 286 287 288 289 Get table from configuration table by name 290 291 292 293 Arguments: 294 295 296 297 TableGuid - Table name to search 298 299 300 301 Table - Pointer to the table caller wants 302 303 304 305 Returns: 306 307 308 309 EFI_NOT_FOUND - Not found the table 310 311 312 313 EFI_SUCCESS - Found the table 314 315 316 317 --*/ 318 319 ; 320 321 EFI_EVENT 322 RtEfiLibCreateProtocolNotifyEvent ( 323 IN EFI_GUID *ProtocolGuid, 324 IN EFI_TPL NotifyTpl, 325 IN EFI_EVENT_NOTIFY NotifyFunction, 326 IN VOID *NotifyContext, 327 OUT VOID **Registration 328 ) 329 /*++ 330 331 Routine Description: 332 333 Create a protocol notification event and return it. 334 335 Arguments: 336 337 ProtocolGuid - Protocol to register notification event on. 338 339 NotifyTpl - Maximum TPL to single the NotifyFunction. 340 341 NotifyFunction - EFI notification routine. 342 343 NotifyContext - Context passed into Event when it is created. 344 345 Registration - Registration key returned from RegisterProtocolNotify(). 346 347 Returns: 348 349 The EFI_EVENT that has been registered to be signaled when a ProtocolGuid 350 is added to the system. 351 352 --*/ 353 ; 354 355 // 356 // Lock.c 357 // 358 typedef struct { 359 EFI_TPL Tpl; 360 EFI_TPL OwnerTpl; 361 UINTN Lock; 362 } EFI_LOCK; 363 364 VOID 365 EfiInitializeLock ( 366 IN OUT EFI_LOCK *Lock, 367 IN EFI_TPL Priority 368 ) 369 /*++ 370 371 Routine Description: 372 373 Initialize a basic mutual exclusion lock. Each lock 374 provides mutual exclusion access at it's task priority 375 level. Since there is no-premption (at any TPL) or 376 multiprocessor support, acquiring the lock only consists 377 of raising to the locks TPL. 378 379 Note on a check build ASSERT()s are used to ensure proper 380 lock usage. 381 382 Arguments: 383 384 Lock - The EFI_LOCK structure to initialize 385 386 Priority - The task priority level of the lock 387 388 389 Returns: 390 391 An initialized Efi Lock structure. 392 393 --*/ 394 ; 395 396 // 397 // Macro to initialize the state of a lock when a lock variable is declared 398 // 399 #define EFI_INITIALIZE_LOCK_VARIABLE(Tpl) {Tpl,0,0} 400 401 402 VOID 403 EfiAcquireLock ( 404 IN EFI_LOCK *Lock 405 ) 406 /*++ 407 408 Routine Description: 409 410 Raising to the task priority level of the mutual exclusion 411 lock, and then acquires ownership of the lock. 412 413 Arguments: 414 415 Lock - The lock to acquire 416 417 Returns: 418 419 Lock owned 420 421 --*/ 422 ; 423 424 EFI_STATUS 425 EfiAcquireLockOrFail ( 426 IN EFI_LOCK *Lock 427 ) 428 /*++ 429 430 Routine Description: 431 432 Initialize a basic mutual exclusion lock. Each lock 433 provides mutual exclusion access at it's task priority 434 level. Since there is no-premption (at any TPL) or 435 multiprocessor support, acquiring the lock only consists 436 of raising to the locks TPL. 437 438 Arguments: 439 440 Lock - The EFI_LOCK structure to initialize 441 442 Returns: 443 444 EFI_SUCCESS - Lock Owned. 445 EFI_ACCESS_DENIED - Reentrant Lock Acquisition, Lock not Owned. 446 447 --*/ 448 ; 449 450 VOID 451 EfiReleaseLock ( 452 IN EFI_LOCK *Lock 453 ) 454 /*++ 455 456 Routine Description: 457 458 Releases ownership of the mutual exclusion lock, and 459 restores the previous task priority level. 460 461 Arguments: 462 463 Lock - The lock to release 464 465 Returns: 466 467 None 468 469 --*/ 470 ; 471 472 #define EfiCopyMem EfiCommonLibCopyMem 473 #define EfiSetMem EfiCommonLibSetMem 474 #define EfiZeroMem EfiCommonLibZeroMem 475 476 INTN 477 EfiCompareMem ( 478 IN VOID *MemOne, 479 IN VOID *MemTwo, 480 IN UINTN Len 481 ) 482 /*++ 483 484 Routine Description: 485 486 Compares two memory buffers of a given length. 487 488 Arguments: 489 490 MemOne - First memory buffer 491 492 MemTwo - Second memory buffer 493 494 Len - Length of Mem1 and Mem2 memory regions to compare 495 496 Returns: 497 498 = 0 if MemOne == MemTwo 499 500 > 0 if MemOne > MemTwo 501 502 < 0 if MemOne < MemTwo 503 504 --*/ 505 ; 506 507 // 508 // Debug.c init 509 // 510 EFI_STATUS 511 EfiDebugAssertInit ( 512 VOID 513 ) 514 /*++ 515 516 Routine Description: 517 518 Locate Debug Assert Protocol and set as mDebugAssert 519 520 Arguments: 521 522 None 523 524 Returns: 525 526 Status code 527 528 --*/ 529 ; 530 531 // 532 // Wrapper for EFI runtime functions 533 // 534 VOID 535 EfiResetSystem ( 536 IN EFI_RESET_TYPE ResetType, 537 IN EFI_STATUS ResetStatus, 538 IN UINTN DataSize, 539 IN CHAR16 *ResetData 540 ) 541 /*++ 542 543 Routine Description: 544 545 Resets the entire platform. 546 547 Arguments: 548 549 ResetType - The type of reset to perform. 550 ResetStatus - The status code for the reset. 551 DataSize - The size, in bytes, of ResetData. 552 ResetData - A data buffer that includes a Null-terminated Unicode string, optionally 553 followed by additional binary data. 554 555 Returns: 556 557 None 558 559 --*/ 560 ; 561 562 EFI_STATUS 563 EfiGetNextHighMonotonicCount ( 564 OUT UINT32 *HighCount 565 ) 566 /*++ 567 568 Routine Description: 569 570 Returns the next high 32 bits of the platform's monotonic counter. 571 572 Arguments: 573 574 HighCount - Pointer to returned value. 575 576 Returns: 577 578 Status code 579 580 --*/ 581 ; 582 583 EFI_STATUS 584 EfiGetTime ( 585 OUT EFI_TIME *Time, 586 OUT EFI_TIME_CAPABILITIES *Capabilities 587 ) 588 /*++ 589 590 Routine Description: 591 592 Returns the current time and date information, and the time-keeping 593 capabilities of the hardware platform. 594 595 Arguments: 596 597 Time - A pointer to storage to receive a snapshot of the current time. 598 Capabilities - An optional pointer to a buffer to receive the real time clock device's 599 capabilities. 600 601 Returns: 602 603 Status code 604 605 --*/ 606 ; 607 608 EFI_STATUS 609 EfiSetTime ( 610 OUT EFI_TIME *Time 611 ) 612 /*++ 613 614 Routine Description: 615 616 Sets the current local time and date information. 617 618 Arguments: 619 620 Time - A pointer to the current time. 621 622 Returns: 623 624 Status code 625 626 --*/ 627 ; 628 629 EFI_STATUS 630 EfiGetWakeupTime ( 631 OUT BOOLEAN *Enabled, 632 OUT BOOLEAN *Pending, 633 OUT EFI_TIME *Time 634 ) 635 /*++ 636 637 Routine Description: 638 639 Returns the current wakeup alarm clock setting. 640 641 Arguments: 642 643 Enabled - Indicates if the alarm is currently enabled or disabled. 644 Pending - Indicates if the alarm signal is pending and requires acknowledgement. 645 Time - The current alarm setting. 646 647 Returns: 648 649 Status code 650 651 --*/ 652 ; 653 654 EFI_STATUS 655 EfiSetWakeupTime ( 656 IN BOOLEAN Enable, 657 IN EFI_TIME *Time 658 ) 659 /*++ 660 661 Routine Description: 662 663 Sets the system wakeup alarm clock time. 664 665 Arguments: 666 667 Enable - Enable or disable the wakeup alarm. 668 Time - If Enable is TRUE, the time to set the wakeup alarm for. 669 If Enable is FALSE, then this parameter is optional, and may be NULL. 670 671 Returns: 672 673 Status code 674 675 --*/ 676 ; 677 678 EFI_STATUS 679 EfiGetVariable ( 680 IN CHAR16 *VariableName, 681 IN EFI_GUID * VendorGuid, 682 OUT UINT32 *Attributes OPTIONAL, 683 IN OUT UINTN *DataSize, 684 OUT VOID *Data 685 ) 686 /*++ 687 688 Routine Description: 689 690 Returns the value of a variable. 691 692 Arguments: 693 694 VariableName - A Null-terminated Unicode string that is the name of the 695 vendor's variable. 696 VendorGuid - A unique identifier for the vendor. 697 Attributes - If not NULL, a pointer to the memory location to return the 698 attributes bitmask for the variable. 699 DataSize - On input, the size in bytes of the return Data buffer. 700 On output the size of data returned in Data. 701 Data - The buffer to return the contents of the variable. 702 703 Returns: 704 705 Status code 706 707 --*/ 708 ; 709 710 EFI_STATUS 711 EfiGetNextVariableName ( 712 IN OUT UINTN *VariableNameSize, 713 IN OUT CHAR16 *VariableName, 714 IN OUT EFI_GUID *VendorGuid 715 ) 716 /*++ 717 718 Routine Description: 719 720 Enumerates the current variable names. 721 722 Arguments: 723 724 VariableNameSize - The size of the VariableName buffer. 725 VariableName - On input, supplies the last VariableName that was returned 726 by GetNextVariableName(). 727 On output, returns the Nullterminated Unicode string of the 728 current variable. 729 VendorGuid - On input, supplies the last VendorGuid that was returned by 730 GetNextVariableName(). 731 On output, returns the VendorGuid of the current variable. 732 733 Returns: 734 735 Status code 736 737 --*/ 738 ; 739 740 EFI_STATUS 741 EfiSetVariable ( 742 IN CHAR16 *VariableName, 743 IN EFI_GUID *VendorGuid, 744 IN UINT32 Attributes, 745 IN UINTN DataSize, 746 IN VOID *Data 747 ) 748 /*++ 749 750 Routine Description: 751 752 Sets the value of a variable. 753 754 Arguments: 755 756 VariableName - A Null-terminated Unicode string that is the name of the 757 vendor's variable. 758 VendorGuid - A unique identifier for the vendor. 759 Attributes - Attributes bitmask to set for the variable. 760 DataSize - The size in bytes of the Data buffer. 761 Data - The contents for the variable. 762 763 Returns: 764 765 Status code 766 767 --*/ 768 ; 769 770 #if (EFI_SPECIFICATION_VERSION >= 0x00020000) 771 772 EFI_STATUS 773 EfiQueryVariableInfo ( 774 IN UINT32 Attributes, 775 OUT UINT64 *MaximumVariableStorageSize, 776 OUT UINT64 *RemainingVariableStorageSize, 777 OUT UINT64 *MaximumVariableSize 778 ) 779 /*++ 780 781 Routine Description: 782 783 This code returns information about the EFI variables. 784 785 Arguments: 786 787 Attributes Attributes bitmask to specify the type of variables 788 on which to return information. 789 MaximumVariableStorageSize Pointer to the maximum size of the storage space available 790 for the EFI variables associated with the attributes specified. 791 RemainingVariableStorageSize Pointer to the remaining size of the storage space available 792 for the EFI variables associated with the attributes specified. 793 MaximumVariableSize Pointer to the maximum size of the individual EFI variables 794 associated with the attributes specified. 795 796 Returns: 797 798 Status code 799 800 --*/ 801 ; 802 #endif 803 804 805 EFI_STATUS 806 EfiReportStatusCode ( 807 IN EFI_STATUS_CODE_TYPE CodeType, 808 IN EFI_STATUS_CODE_VALUE Value, 809 IN UINT32 Instance, 810 IN EFI_GUID * CallerId, 811 IN EFI_STATUS_CODE_DATA * Data OPTIONAL 812 ) 813 /*++ 814 815 Routine Description: 816 817 Status Code reporter 818 819 Arguments: 820 821 CodeType - Type of Status Code. 822 823 Value - Value to output for Status Code. 824 825 Instance - Instance Number of this status code. 826 827 CallerId - ID of the caller of this status code. 828 829 Data - Optional data associated with this status code. 830 831 Returns: 832 833 Status code 834 835 --*/ 836 ; 837 838 EFI_STATUS 839 EfiConvertPointer ( 840 IN UINTN DebugDisposition, 841 IN OUT VOID *Address 842 ) 843 /*++ 844 845 Routine Description: 846 847 Determines the new virtual address that is to be used on subsequent memory accesses. 848 849 Arguments: 850 851 DebugDisposition - Supplies type information for the pointer being converted. 852 Address - A pointer to a pointer that is to be fixed to be the value needed 853 for the new virtual address mappings being applied. 854 855 Returns: 856 857 Status code 858 859 --*/ 860 ; 861 862 EFI_STATUS 863 EfiConvertList ( 864 IN UINTN DebugDisposition, 865 IN OUT EFI_LIST_ENTRY *ListHead 866 ) 867 /*++ 868 869 Routine Description: 870 871 Conver the standard Lib double linked list to a virtual mapping. 872 873 Arguments: 874 875 DebugDisposition - Argument to EfiConvertPointer (EFI 1.0 API) 876 877 ListHead - Head of linked list to convert 878 879 Returns: 880 881 EFI_SUCCESS 882 883 --*/ 884 ; 885 886 // 887 // Base IO Class Functions 888 // 889 EFI_STATUS 890 EfiIoRead ( 891 IN EFI_CPU_IO_PROTOCOL_WIDTH Width, 892 IN UINT64 Address, 893 IN UINTN Count, 894 IN OUT VOID *Buffer 895 ) 896 /*++ 897 898 Routine Description: 899 Perform an IO read into Buffer. 900 901 Arguments: 902 Width - Width of read transaction, and repeat operation to use 903 Address - IO address to read 904 Count - Number of times to read the IO address. 905 Buffer - Buffer to read data into. size is Width * Count 906 907 Returns: 908 Status code 909 910 --*/ 911 ; 912 913 UINT8 914 IoRead8 ( 915 IN UINT64 Address 916 ) 917 /*++ 918 919 Routine Description: 920 Do a one byte IO read 921 922 Arguments: 923 Address - IO address to read 924 925 Returns: 926 Data read 927 928 --*/ 929 ; 930 931 UINT16 932 IoRead16 ( 933 IN UINT64 Address 934 ) 935 /*++ 936 937 Routine Description: 938 Do a two byte IO read 939 940 Arguments: 941 Address - IO address to read 942 943 Returns: 944 Data read 945 946 --*/ 947 ; 948 949 UINT32 950 IoRead32 ( 951 IN UINT64 Address 952 ) 953 /*++ 954 955 Routine Description: 956 Do a four byte IO read 957 958 Arguments: 959 Address - IO address to read 960 961 Returns: 962 Data read 963 964 --*/ 965 ; 966 967 EFI_STATUS 968 EfiIoWrite ( 969 IN EFI_CPU_IO_PROTOCOL_WIDTH Width, 970 IN UINT64 Address, 971 IN UINTN Count, 972 IN OUT VOID *Buffer 973 ) 974 /*++ 975 976 Routine Description: 977 Perform an IO write into Buffer. 978 979 Arguments: 980 Width - Width of write transaction, and repeat operation to use 981 Address - IO address to write 982 Count - Number of times to write the IO address. 983 Buffer - Buffer to write data from. size is Width * Count 984 985 Returns: 986 Status code 987 988 --*/ 989 ; 990 991 VOID 992 IoWrite8 ( 993 IN UINT64 Address, 994 IN UINT8 Data 995 ) 996 /*++ 997 998 Routine Description: 999 Do a one byte IO write 1000 1001 Arguments: 1002 Address - IO address to write 1003 Data - Data to write to Address 1004 1005 Returns: 1006 NONE 1007 1008 --*/ 1009 ; 1010 1011 VOID 1012 IoWrite16 ( 1013 IN UINT64 Address, 1014 IN UINT16 Data 1015 ) 1016 /*++ 1017 1018 Routine Description: 1019 Do a two byte IO write 1020 1021 Arguments: 1022 Address - IO address to write 1023 Data - Data to write to Address 1024 1025 Returns: 1026 NONE 1027 1028 --*/ 1029 ; 1030 1031 VOID 1032 IoWrite32 ( 1033 IN UINT64 Address, 1034 IN UINT32 Data 1035 ) 1036 /*++ 1037 1038 Routine Description: 1039 Do a four byte IO write 1040 1041 Arguments: 1042 Address - IO address to write 1043 Data - Data to write to Address 1044 1045 Returns: 1046 NONE 1047 1048 --*/ 1049 ; 1050 1051 EFI_STATUS 1052 EfiMemRead ( 1053 IN EFI_CPU_IO_PROTOCOL_WIDTH Width, 1054 IN UINT64 Address, 1055 IN UINTN Count, 1056 IN OUT VOID *Buffer 1057 ) 1058 /*++ 1059 1060 Routine Description: 1061 Perform a Memory mapped IO read into Buffer. 1062 1063 Arguments: 1064 Width - Width of each read transaction. 1065 Address - Memory mapped IO address to read 1066 Count - Number of Width quanta to read 1067 Buffer - Buffer to read data into. size is Width * Count 1068 1069 Returns: 1070 Status code 1071 1072 --*/ 1073 ; 1074 1075 UINT8 1076 MemRead8 ( 1077 IN UINT64 Address 1078 ) 1079 /*++ 1080 1081 Routine Description: 1082 Do a one byte Memory mapped IO read 1083 1084 Arguments: 1085 Address - Memory mapped IO address to read 1086 1087 Returns: 1088 Data read 1089 1090 --*/ 1091 ; 1092 1093 UINT16 1094 MemRead16 ( 1095 IN UINT64 Address 1096 ) 1097 /*++ 1098 1099 Routine Description: 1100 Do a two byte Memory mapped IO read 1101 1102 Arguments: 1103 Address - Memory mapped IO address to read 1104 1105 Returns: 1106 Data read 1107 1108 --*/ 1109 ; 1110 1111 UINT32 1112 MemRead32 ( 1113 IN UINT64 Address 1114 ) 1115 /*++ 1116 1117 Routine Description: 1118 Do a four byte Memory mapped IO read 1119 1120 Arguments: 1121 Address - Memory mapped IO address to read 1122 1123 Returns: 1124 Data read 1125 1126 --*/ 1127 ; 1128 1129 UINT64 1130 MemRead64 ( 1131 IN UINT64 Address 1132 ) 1133 /*++ 1134 1135 Routine Description: 1136 Do a eight byte Memory mapped IO read 1137 1138 Arguments: 1139 Address - Memory mapped IO address to read 1140 1141 Returns: 1142 Data read 1143 1144 --*/ 1145 ; 1146 1147 EFI_STATUS 1148 EfiMemWrite ( 1149 IN EFI_CPU_IO_PROTOCOL_WIDTH Width, 1150 IN UINT64 Address, 1151 IN UINTN Count, 1152 IN OUT VOID *Buffer 1153 ) 1154 /*++ 1155 1156 Routine Description: 1157 Perform a memory mapped IO write into Buffer. 1158 1159 Arguments: 1160 Width - Width of write transaction, and repeat operation to use 1161 Address - IO address to write 1162 Count - Number of times to write the IO address. 1163 Buffer - Buffer to write data from. size is Width * Count 1164 1165 Returns: 1166 Status code 1167 1168 --*/ 1169 ; 1170 1171 VOID 1172 MemWrite8 ( 1173 IN UINT64 Address, 1174 IN UINT8 Data 1175 ) 1176 /*++ 1177 1178 Routine Description: 1179 Do a one byte Memory mapped IO write 1180 1181 Arguments: 1182 Address - Memory mapped IO address to write 1183 Data - Data to write to Address 1184 1185 Returns: 1186 NONE 1187 1188 --*/ 1189 ; 1190 1191 VOID 1192 MemWrite16 ( 1193 IN UINT64 Address, 1194 IN UINT16 Data 1195 ) 1196 /*++ 1197 1198 Routine Description: 1199 Do a two byte Memory mapped IO write 1200 1201 Arguments: 1202 Address - Memory mapped IO address to write 1203 Data - Data to write to Address 1204 1205 Returns: 1206 NONE 1207 1208 --*/ 1209 ; 1210 1211 VOID 1212 MemWrite32 ( 1213 IN UINT64 Address, 1214 IN UINT32 Data 1215 ) 1216 /*++ 1217 1218 Routine Description: 1219 Do a four byte Memory mapped IO write 1220 1221 Arguments: 1222 Address - Memory mapped IO address to write 1223 Data - Data to write to Address 1224 1225 Returns: 1226 NONE 1227 1228 --*/ 1229 ; 1230 1231 VOID 1232 MemWrite64 ( 1233 IN UINT64 Address, 1234 IN UINT64 Data 1235 ) 1236 /*++ 1237 1238 Routine Description: 1239 Do a eight byte Memory mapped IO write 1240 1241 Arguments: 1242 Address - Memory mapped IO address to write 1243 Data - Data to write to Address 1244 1245 Returns: 1246 NONE 1247 1248 --*/ 1249 ; 1250 1251 // 1252 // Platform specific functions 1253 // 1254 UINT8 1255 PciRead8 ( 1256 UINT8 Segment, 1257 UINT8 Bus, 1258 UINT8 DevFunc, 1259 UINT8 Register 1260 ) 1261 /*++ 1262 1263 Routine Description: 1264 Perform an one byte PCI config cycle read 1265 1266 Arguments: 1267 Segment - PCI Segment ACPI _SEG 1268 Bus - PCI Bus 1269 DevFunc - PCI Device(7:3) and Func(2:0) 1270 Register - PCI config space register 1271 1272 Returns: 1273 Data read from PCI config space 1274 1275 --*/ 1276 ; 1277 1278 UINT16 1279 PciRead16 ( 1280 UINT8 Segment, 1281 UINT8 Bus, 1282 UINT8 DevFunc, 1283 UINT8 Register 1284 ) 1285 /*++ 1286 1287 Routine Description: 1288 Perform an two byte PCI config cycle read 1289 1290 Arguments: 1291 Segment - PCI Segment ACPI _SEG 1292 Bus - PCI Bus 1293 DevFunc - PCI Device(7:3) and Func(2:0) 1294 Register - PCI config space register 1295 1296 Returns: 1297 Data read from PCI config space 1298 1299 --*/ 1300 ; 1301 1302 UINT32 1303 PciRead32 ( 1304 UINT8 Segment, 1305 UINT8 Bus, 1306 UINT8 DevFunc, 1307 UINT8 Register 1308 ) 1309 /*++ 1310 1311 Routine Description: 1312 Perform an four byte PCI config cycle read 1313 1314 Arguments: 1315 Segment - PCI Segment ACPI _SEG 1316 Bus - PCI Bus 1317 DevFunc - PCI Device(7:3) and Func(2:0) 1318 Register - PCI config space register 1319 1320 Returns: 1321 Data read from PCI config space 1322 1323 --*/ 1324 ; 1325 1326 VOID 1327 PciWrite8 ( 1328 UINT8 Segment, 1329 UINT8 Bus, 1330 UINT8 DevFunc, 1331 UINT8 Register, 1332 UINT8 Data 1333 ) 1334 /*++ 1335 1336 Routine Description: 1337 Perform an one byte PCI config cycle write 1338 1339 Arguments: 1340 Segment - PCI Segment ACPI _SEG 1341 Bus - PCI Bus 1342 DevFunc - PCI Device(7:3) and Func(2:0) 1343 Register - PCI config space register 1344 Data - Data to write 1345 1346 Returns: 1347 NONE 1348 1349 --*/ 1350 ; 1351 1352 VOID 1353 PciWrite16 ( 1354 UINT8 Segment, 1355 UINT8 Bus, 1356 UINT8 DevFunc, 1357 UINT8 Register, 1358 UINT16 Data 1359 ) 1360 /*++ 1361 1362 Routine Description: 1363 Perform an two byte PCI config cycle write 1364 1365 Arguments: 1366 Segment - PCI Segment ACPI _SEG 1367 Bus - PCI Bus 1368 DevFunc - PCI Device(7:3) and Func(2:0) 1369 Register - PCI config space register 1370 Data - Data to write 1371 1372 Returns: 1373 NONE 1374 1375 --*/ 1376 ; 1377 1378 VOID 1379 PciWrite32 ( 1380 UINT8 Segment, 1381 UINT8 Bus, 1382 UINT8 DevFunc, 1383 UINT8 Register, 1384 UINT32 Data 1385 ) 1386 /*++ 1387 1388 Routine Description: 1389 Perform an four byte PCI config cycle write 1390 1391 Arguments: 1392 Segment - PCI Segment ACPI _SEG 1393 Bus - PCI Bus 1394 DevFunc - PCI Device(7:3) and Func(2:0) 1395 Register - PCI config space register 1396 Data - Data to write 1397 1398 Returns: 1399 NONE 1400 1401 --*/ 1402 ; 1403 1404 VOID 1405 EfiStall ( 1406 IN UINTN Microseconds 1407 ) 1408 /*++ 1409 1410 Routine Description: 1411 Delay for at least the request number of microseconds 1412 1413 Arguments: 1414 Microseconds - Number of microseconds to delay. 1415 1416 Returns: 1417 NONE 1418 1419 --*/ 1420 ; 1421 1422 // 1423 // FVB Services. 1424 // 1425 EFI_STATUS 1426 EfiFvbInitialize ( 1427 VOID 1428 ) 1429 /*++ 1430 1431 Routine Description: 1432 Initialize globals and register Fvb Protocol notification function. 1433 1434 Arguments: 1435 None 1436 1437 Returns: 1438 EFI_SUCCESS 1439 1440 --*/ 1441 ; 1442 1443 EFI_STATUS 1444 EfiFvbShutdown ( 1445 VOID 1446 ) 1447 /*++ 1448 1449 Routine Description: 1450 Release resources allocated in EfiFvbInitialize. 1451 1452 Arguments: 1453 None 1454 1455 Returns: 1456 EFI_SUCCESS 1457 1458 --*/ 1459 ; 1460 1461 EFI_STATUS 1462 EfiFvbReadBlock ( 1463 IN UINTN Instance, 1464 IN EFI_LBA Lba, 1465 IN UINTN Offset, 1466 IN OUT UINTN *NumBytes, 1467 IN UINT8 *Buffer 1468 ) 1469 /*++ 1470 1471 Routine Description: 1472 Reads specified number of bytes into a buffer from the specified block 1473 1474 Arguments: 1475 Instance - The FV instance to be read from 1476 Lba - The logical block address to be read from 1477 Offset - Offset into the block at which to begin reading 1478 NumBytes - Pointer that on input contains the total size of 1479 the buffer. On output, it contains the total number 1480 of bytes read 1481 Buffer - Pointer to a caller allocated buffer that will be 1482 used to hold the data read 1483 1484 Returns: 1485 Status code 1486 1487 --*/ 1488 ; 1489 1490 EFI_STATUS 1491 EfiFvbWriteBlock ( 1492 IN UINTN Instance, 1493 IN EFI_LBA Lba, 1494 IN UINTN Offset, 1495 IN OUT UINTN *NumBytes, 1496 IN UINT8 *Buffer 1497 ) 1498 /*++ 1499 1500 Routine Description: 1501 Writes specified number of bytes from the input buffer to the block 1502 1503 Arguments: 1504 Instance - The FV instance to be written to 1505 Lba - The starting logical block index to write to 1506 Offset - Offset into the block at which to begin writing 1507 NumBytes - Pointer that on input contains the total size of 1508 the buffer. On output, it contains the total number 1509 of bytes actually written 1510 Buffer - Pointer to a caller allocated buffer that contains 1511 the source for the write 1512 1513 Returns: 1514 Status code 1515 1516 --*/ 1517 ; 1518 1519 EFI_STATUS 1520 EfiFvbEraseBlock ( 1521 IN UINTN Instance, 1522 IN EFI_LBA Lba 1523 ) 1524 /*++ 1525 1526 Routine Description: 1527 Erases and initializes a firmware volume block 1528 1529 Arguments: 1530 Instance - The FV instance to be erased 1531 Lba - The logical block index to be erased 1532 1533 Returns: 1534 Status code 1535 1536 --*/ 1537 ; 1538 1539 EFI_STATUS 1540 EfiFvbGetVolumeAttributes ( 1541 IN UINTN Instance, 1542 OUT EFI_FVB_ATTRIBUTES *Attributes 1543 ) 1544 /*++ 1545 1546 Routine Description: 1547 Retrieves attributes, insures positive polarity of attribute bits, returns 1548 resulting attributes in output parameter 1549 1550 Arguments: 1551 Instance - The FV instance whose attributes is going to be 1552 returned 1553 Attributes - Output buffer which contains attributes 1554 1555 Returns: 1556 Status code 1557 1558 --*/ 1559 ; 1560 1561 EFI_STATUS 1562 EfiFvbSetVolumeAttributes ( 1563 IN UINTN Instance, 1564 IN EFI_FVB_ATTRIBUTES Attributes 1565 ) 1566 /*++ 1567 1568 Routine Description: 1569 Modifies the current settings of the firmware volume according to the 1570 input parameter. 1571 1572 Arguments: 1573 Instance - The FV instance whose attributes is going to be 1574 modified 1575 Attributes - It is a pointer to EFI_FVB_ATTRIBUTES 1576 containing the desired firmware volume settings. 1577 1578 Returns: 1579 Status code 1580 1581 --*/ 1582 ; 1583 1584 EFI_STATUS 1585 EfiFvbGetPhysicalAddress ( 1586 IN UINTN Instance, 1587 OUT EFI_PHYSICAL_ADDRESS *Address 1588 ) 1589 /*++ 1590 1591 Routine Description: 1592 Retrieves the physical address of a memory mapped FV 1593 1594 Arguments: 1595 Instance - The FV instance whose base address is going to be 1596 returned 1597 Address - Pointer to a caller allocated EFI_PHYSICAL_ADDRESS 1598 that on successful return, contains the base address 1599 of the firmware volume. 1600 1601 Returns: 1602 Status code 1603 1604 --*/ 1605 ; 1606 1607 EFI_STATUS 1608 EfiFvbGetBlockSize ( 1609 IN UINTN Instance, 1610 IN EFI_LBA Lba, 1611 OUT UINTN *BlockSize, 1612 OUT UINTN *NumOfBlocks 1613 ) 1614 /*++ 1615 1616 Routine Description: 1617 Retrieve the size of a logical block 1618 1619 Arguments: 1620 Instance - The FV instance whose block size is going to be 1621 returned 1622 Lba - Indicates which block to return the size for. 1623 BlockSize - A pointer to a caller allocated UINTN in which 1624 the size of the block is returned 1625 NumOfBlocks - a pointer to a caller allocated UINTN in which the 1626 number of consecutive blocks starting with Lba is 1627 returned. All blocks in this range have a size of 1628 BlockSize 1629 1630 Returns: 1631 EFI_SUCCESS - The firmware volume was read successfully and 1632 contents are in Buffer 1633 1634 --*/ 1635 ; 1636 EFI_STATUS 1637 EfiFvbEraseCustomBlockRange ( 1638 IN UINTN Instance, 1639 IN EFI_LBA StartLba, 1640 IN UINTN OffsetStartLba, 1641 IN EFI_LBA LastLba, 1642 IN UINTN OffsetLastLba 1643 ) 1644 /*++ 1645 1646 Routine Description: 1647 Erases and initializes a specified range of a firmware volume 1648 1649 Arguments: 1650 Instance - The FV instance to be erased 1651 StartLba - The starting logical block index to be erased 1652 OffsetStartLba - Offset into the starting block at which to 1653 begin erasing 1654 LastLba - The last logical block index to be erased 1655 OffsetLastLba - Offset into the last block at which to end erasing 1656 1657 Returns: 1658 Status code 1659 1660 --*/ 1661 ; 1662 1663 EFI_STATUS 1664 EfiCpuFlushCache ( 1665 IN EFI_PHYSICAL_ADDRESS Start, 1666 IN UINT64 Length 1667 ) 1668 /*++ 1669 1670 Routine Description: 1671 1672 Flush cache with specified range. 1673 1674 Arguments: 1675 1676 Start - Start address 1677 Length - Length in bytes 1678 1679 Returns: 1680 1681 Status code 1682 1683 --*/ 1684 ; 1685 1686 EFI_STATUS 1687 EFIAPI 1688 RtEfiCreateEventLegacyBoot ( 1689 IN EFI_TPL NotifyTpl, 1690 IN EFI_EVENT_NOTIFY NotifyFunction, 1691 IN VOID *NotifyContext, 1692 OUT EFI_EVENT *LegacyBootEvent 1693 ) 1694 /*++ 1695 1696 Routine Description: 1697 Create a Legacy Boot Event. 1698 Tiano extended the CreateEvent Type enum to add a legacy boot event type. 1699 This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was 1700 added and now it's possible to not voilate the UEFI specification by 1701 declaring a GUID for the legacy boot event class. This library supports 1702 the EFI 1.10 form and UEFI 2.0 form and allows common code to work both ways. 1703 1704 Arguments: 1705 LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) 1706 1707 Returns: 1708 EFI_SUCCESS Event was created. 1709 Other Event was not created. 1710 1711 --*/ 1712 ; 1713 1714 EFI_STATUS 1715 EFIAPI 1716 RtEfiCreateEventReadyToBoot ( 1717 IN EFI_TPL NotifyTpl, 1718 IN EFI_EVENT_NOTIFY NotifyFunction, 1719 IN VOID *NotifyContext, 1720 OUT EFI_EVENT *ReadyToBootEvent 1721 ) 1722 /*++ 1723 1724 Routine Description: 1725 Create a Read to Boot Event. 1726 1727 Tiano extended the CreateEvent Type enum to add a ready to boot event type. 1728 This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was 1729 added and now it's possible to not voilate the UEFI specification and use 1730 the ready to boot event class defined in UEFI 2.0. This library supports 1731 the EFI 1.10 form and UEFI 2.0 form and allows common code to work both ways. 1732 1733 Arguments: 1734 ReadyToBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) 1735 1736 Return: 1737 EFI_SUCCESS - Event was created. 1738 Other - Event was not created. 1739 1740 --*/ 1741 ; 1742 1743 #endif 1744