1 /*++ 2 3 Copyright (c) 2004 - 2010, 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 RuntimeService.c 16 17 Abstract: 18 19 Runtime Lib 20 21 --*/ 22 23 #include "../RuntimeLibInternal.h" 24 25 VOID 26 EFIAPI 27 EfiResetSystem ( 28 IN EFI_RESET_TYPE ResetType, 29 IN EFI_STATUS ResetStatus, 30 IN UINTN DataSize, 31 IN CHAR16 *ResetData 32 ) 33 /*++ 34 35 Routine Description: 36 37 Resets the entire platform. 38 39 Arguments: 40 41 ResetType - The type of reset to perform. 42 ResetStatus - The status code for the reset. 43 DataSize - The size, in bytes, of ResetData. 44 ResetData - A data buffer that includes a Null-terminated Unicode string, optionally 45 followed by additional binary data. 46 47 Returns: 48 49 None 50 51 --*/ 52 { 53 EFI_GUID Guid; 54 55 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_RESET_SERVICES_PROTOCOL_GUID_LO; 56 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_RESET_SERVICES_PROTOCOL_GUID_HI; 57 58 EfiCallEsalService ( 59 &Guid, 60 ResetSystem, 61 (UINT64) ResetType, 62 (UINT64) ResetStatus, 63 (UINT64) DataSize, 64 (UINT64) ResetData, 65 0, 66 0, 67 0 68 ); 69 } 70 71 72 // 73 // The following functions hide the mRTEdkDxeRuntimeDriverLib local global from the call to 74 // runtime service in the EFI system table. 75 // 76 EFI_STATUS 77 EFIAPI 78 EfiGetTime ( 79 OUT EFI_TIME *Time, 80 OUT EFI_TIME_CAPABILITIES *Capabilities 81 ) 82 /*++ 83 84 Routine Description: 85 86 Returns the current time and date information, and the time-keeping 87 capabilities of the hardware platform. 88 89 Arguments: 90 91 Time - A pointer to storage to receive a snapshot of the current time. 92 Capabilities - An optional pointer to a buffer to receive the real time clock device's 93 capabilities. 94 95 Returns: 96 97 Status code 98 99 --*/ 100 { 101 SAL_RETURN_REGS ReturnReg; 102 EFI_GUID Guid; 103 104 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_LO; 105 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_HI; 106 107 ReturnReg = EfiCallEsalService (&Guid, GetTime, (UINT64) Time, (UINT64) Capabilities, 0, 0, 0, 0, 0); 108 return ReturnReg.Status; 109 } 110 111 EFI_STATUS 112 EFIAPI 113 EfiSetTime ( 114 IN EFI_TIME *Time 115 ) 116 /*++ 117 118 Routine Description: 119 120 Sets the current local time and date information. 121 122 Arguments: 123 124 Time - A pointer to the current time. 125 126 Returns: 127 128 Status code 129 130 --*/ 131 { 132 SAL_RETURN_REGS ReturnReg; 133 EFI_GUID Guid; 134 135 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_LO; 136 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_HI; 137 138 ReturnReg = EfiCallEsalService (&Guid, SetTime, (UINT64) Time, 0, 0, 0, 0, 0, 0); 139 return ReturnReg.Status; 140 } 141 142 EFI_STATUS 143 EFIAPI 144 EfiGetWakeupTime ( 145 OUT BOOLEAN *Enabled, 146 OUT BOOLEAN *Pending, 147 OUT EFI_TIME *Time 148 ) 149 /*++ 150 151 Routine Description: 152 153 Returns the current wakeup alarm clock setting. 154 155 Arguments: 156 157 Enabled - Indicates if the alarm is currently enabled or disabled. 158 Pending - Indicates if the alarm signal is pending and requires acknowledgement. 159 Time - The current alarm setting. 160 161 Returns: 162 163 Status code 164 165 --*/ 166 { 167 SAL_RETURN_REGS ReturnReg; 168 EFI_GUID Guid; 169 170 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_LO; 171 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_HI; 172 173 ReturnReg = EfiCallEsalService (&Guid, GetWakeupTime, (UINT64) Enabled, (UINT64) Pending, (UINT64) Time, 0, 0, 0, 0); 174 return ReturnReg.Status; 175 } 176 177 EFI_STATUS 178 EFIAPI 179 EfiSetWakeupTime ( 180 IN BOOLEAN Enable, 181 IN EFI_TIME *Time 182 ) 183 /*++ 184 185 Routine Description: 186 187 Sets the system wakeup alarm clock time. 188 189 Arguments: 190 191 Enable - Enable or disable the wakeup alarm. 192 Time - If Enable is TRUE, the time to set the wakeup alarm for. 193 If Enable is FALSE, then this parameter is optional, and may be NULL. 194 195 Returns: 196 197 Status code 198 199 --*/ 200 { 201 SAL_RETURN_REGS ReturnReg; 202 EFI_GUID Guid; 203 204 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_LO; 205 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_HI; 206 207 ReturnReg = EfiCallEsalService (&Guid, SetWakeupTime, (UINT64) Enable, (UINT64) Time, 0, 0, 0, 0, 0); 208 return ReturnReg.Status; 209 } 210 211 EFI_STATUS 212 EFIAPI 213 EfiGetVariable ( 214 IN CHAR16 *VariableName, 215 IN EFI_GUID * VendorGuid, 216 OUT UINT32 *Attributes OPTIONAL, 217 IN OUT UINTN *DataSize, 218 OUT VOID *Data 219 ) 220 /*++ 221 222 Routine Description: 223 224 Returns the value of a variable. 225 226 Arguments: 227 228 VariableName - A Null-terminated Unicode string that is the name of the 229 vendor's variable. 230 VendorGuid - A unique identifier for the vendor. 231 Attributes - If not NULL, a pointer to the memory location to return the 232 attributes bitmask for the variable. 233 DataSize - On input, the size in bytes of the return Data buffer. 234 On output the size of data returned in Data. 235 Data - The buffer to return the contents of the variable. 236 237 Returns: 238 239 Status code 240 241 --*/ 242 { 243 SAL_RETURN_REGS ReturnReg; 244 EFI_GUID Guid; 245 246 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_LO; 247 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_HI; 248 249 ReturnReg = EfiCallEsalService ( 250 &Guid, 251 EsalGetVariable, 252 (UINT64) VariableName, 253 (UINT64) VendorGuid, 254 (UINT64) Attributes, 255 (UINT64) DataSize, 256 (UINT64) Data, 257 0, 258 0 259 ); 260 return (EFI_STATUS) ReturnReg.Status; 261 } 262 263 EFI_STATUS 264 EFIAPI 265 EfiGetNextVariableName ( 266 IN OUT UINTN *VariableNameSize, 267 IN OUT CHAR16 *VariableName, 268 IN OUT EFI_GUID *VendorGuid 269 ) 270 /*++ 271 272 Routine Description: 273 274 Enumerates the current variable names. 275 276 Arguments: 277 278 VariableNameSize - The size of the VariableName buffer. 279 VariableName - On input, supplies the last VariableName that was returned 280 by GetNextVariableName(). 281 On output, returns the Nullterminated Unicode string of the 282 current variable. 283 VendorGuid - On input, supplies the last VendorGuid that was returned by 284 GetNextVariableName(). 285 On output, returns the VendorGuid of the current variable. 286 287 Returns: 288 289 Status code 290 291 --*/ 292 { 293 SAL_RETURN_REGS ReturnReg; 294 EFI_GUID Guid; 295 296 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_LO; 297 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_HI; 298 299 ReturnReg = EfiCallEsalService ( 300 &Guid, 301 EsalGetNextVariableName, 302 (UINT64) VariableNameSize, 303 (UINT64) VariableName, 304 (UINT64) VendorGuid, 305 0, 306 0, 307 0, 308 0 309 ); 310 return (EFI_STATUS) ReturnReg.Status; 311 } 312 313 EFI_STATUS 314 EFIAPI 315 EfiSetVariable ( 316 IN CHAR16 *VariableName, 317 IN EFI_GUID *VendorGuid, 318 IN UINT32 Attributes, 319 IN UINTN DataSize, 320 IN VOID *Data 321 ) 322 /*++ 323 324 Routine Description: 325 326 Sets the value of a variable. 327 328 Arguments: 329 330 VariableName - A Null-terminated Unicode string that is the name of the 331 vendor's variable. 332 VendorGuid - A unique identifier for the vendor. 333 Attributes - Attributes bitmask to set for the variable. 334 DataSize - The size in bytes of the Data buffer. 335 Data - The contents for the variable. 336 337 Returns: 338 339 Status code 340 341 --*/ 342 { 343 SAL_RETURN_REGS ReturnReg; 344 EFI_GUID Guid; 345 346 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_LO; 347 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_HI; 348 349 ReturnReg = EfiCallEsalService ( 350 &Guid, 351 EsalSetVariable, 352 (UINT64) VariableName, 353 (UINT64) VendorGuid, 354 (UINT64) Attributes, 355 (UINT64) DataSize, 356 (UINT64) Data, 357 0, 358 0 359 ); 360 return (EFI_STATUS) ReturnReg.Status; 361 } 362 363 EFI_STATUS 364 EFIAPI 365 EfiGetNextHighMonotonicCount ( 366 OUT UINT32 *HighCount 367 ) 368 /*++ 369 370 Routine Description: 371 372 Returns the next high 32 bits of the platform's monotonic counter. 373 374 Arguments: 375 376 HighCount - Pointer to returned value. 377 378 Returns: 379 380 Status code 381 382 --*/ 383 { 384 SAL_RETURN_REGS ReturnReg; 385 EFI_GUID Guid; 386 387 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_MTC_SERVICES_PROTOCOL_GUID_LO; 388 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_MTC_SERVICES_PROTOCOL_GUID_HI; 389 390 ReturnReg = EfiCallEsalService (&Guid, GetNextHighMonotonicCount, (UINT64) HighCount, 0, 0, 0, 0, 0, 0); 391 return (EFI_STATUS) ReturnReg.Status; 392 } 393 394 EFI_STATUS 395 EFIAPI 396 EfiConvertPointer ( 397 IN UINTN DebugDisposition, 398 IN OUT VOID **Address 399 ) 400 /*++ 401 402 Routine Description: 403 404 Determines the new virtual address that is to be used on subsequent memory accesses. 405 406 Arguments: 407 408 DebugDisposition - Supplies type information for the pointer being converted. 409 Address - A pointer to a pointer that is to be fixed to be the value needed 410 for the new virtual address mappings being applied. 411 412 Returns: 413 414 Status code 415 416 --*/ 417 { 418 return mRTEdkDxeRuntimeDriverLib->ConvertPointer (DebugDisposition, Address); 419 } 420 421 EFI_STATUS 422 EFIAPI 423 EfiConvertList ( 424 IN UINTN DebugDisposition, 425 IN OUT LIST_ENTRY *ListHead 426 ) 427 /*++ 428 429 Routine Description: 430 431 Conver the standard Lib double linked list to a virtual mapping. 432 433 Arguments: 434 435 DebugDisposition - Argument to EfiConvertPointer (EFI 1.0 API) 436 437 ListHead - Head of linked list to convert 438 439 Returns: 440 441 EFI_SUCCESS 442 443 --*/ 444 { 445 LIST_ENTRY *Link; 446 LIST_ENTRY *NextLink; 447 448 // 449 // Convert all the ForwardLink & BackLink pointers in the list 450 // 451 Link = ListHead; 452 do { 453 NextLink = Link->ForwardLink; 454 455 EfiConvertPointer ( 456 Link->ForwardLink == ListHead ? DebugDisposition : 0, 457 (VOID **) &Link->ForwardLink 458 ); 459 460 EfiConvertPointer ( 461 Link->BackLink == ListHead ? DebugDisposition : 0, 462 (VOID **) &Link->BackLink 463 ); 464 465 Link = NextLink; 466 } while (Link != ListHead); 467 return EFI_SUCCESS; 468 } 469 470 471 /** 472 Change the runtime addressing mode of EFI firmware from physical to virtual. 473 474 @param MemoryMapSize The size in bytes of VirtualMap. 475 @param DescriptorSize The size in bytes of an entry in the VirtualMap. 476 @param DescriptorVersion The version of the structure entries in VirtualMap. 477 @param VirtualMap An array of memory descriptors which contain new virtual 478 address mapping information for all runtime ranges. Type 479 EFI_MEMORY_DESCRIPTOR is defined in the 480 GetMemoryMap() function description. 481 482 @retval EFI_SUCCESS The virtual address map has been applied. 483 @retval EFI_UNSUPPORTED EFI firmware is not at runtime, or the EFI firmware is already in 484 virtual address mapped mode. 485 @retval EFI_INVALID_PARAMETER DescriptorSize or DescriptorVersion is 486 invalid. 487 @retval EFI_NO_MAPPING A virtual address was not supplied for a range in the memory 488 map that requires a mapping. 489 @retval EFI_NOT_FOUND A virtual address was supplied for an address that is not found 490 in the memory map. 491 **/ 492 EFI_STATUS 493 EFIAPI 494 EfiSetVirtualAddressMap ( 495 IN UINTN MemoryMapSize, 496 IN UINTN DescriptorSize, 497 IN UINT32 DescriptorVersion, 498 IN CONST EFI_MEMORY_DESCRIPTOR *VirtualMap 499 ) 500 { 501 SAL_RETURN_REGS ReturnReg; 502 EFI_GUID Guid; 503 504 *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_VIRTUAL_SERVICES_PROTOCOL_GUID_LO; 505 *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_VIRTUAL_SERVICES_PROTOCOL_GUID_HI; 506 507 ReturnReg = EfiCallEsalService ( 508 &Guid, 509 SetVirtualAddress, 510 (UINT64) MemoryMapSize, 511 (UINT64) DescriptorSize, 512 (UINT64) DescriptorVersion, 513 (UINT64) VirtualMap, 514 0, 515 0, 516 0 517 ); 518 519 return ReturnReg.Status; 520 } 521 522 523 EFI_STATUS 524 EFIAPI 525 EfiUpdateCapsule ( 526 IN UEFI_CAPSULE_HEADER **CapsuleHeaderArray, 527 IN UINTN CapsuleCount, 528 IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL 529 ) 530 { 531 return EFI_UNSUPPORTED; 532 } 533 534 EFI_STATUS 535 EFIAPI 536 EfiQueryCapsuleCapabilities ( 537 IN UEFI_CAPSULE_HEADER **CapsuleHeaderArray, 538 IN UINTN CapsuleCount, 539 OUT UINT64 *MaximumCapsuleSize, 540 OUT EFI_RESET_TYPE *ResetType 541 ) 542 { 543 return EFI_UNSUPPORTED; 544 } 545 546 547 EFI_STATUS 548 EFIAPI 549 EfiQueryVariableInfo ( 550 IN UINT32 Attributes, 551 OUT UINT64 *MaximumVariableStorageSize, 552 OUT UINT64 *RemainingVariableStorageSize, 553 OUT UINT64 *MaximumVariableSize 554 ) 555 { 556 return EFI_UNSUPPORTED; 557 } 558