• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*++
2 
3 Copyright (c) 2006 - 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 Module Name:
13 
14     EfiScriptLib.c
15 
16 Abstract:
17 
18   Support for EFI script.
19 
20 --*/
21 
22 #include "EfiScriptLib.h"
23 
24 EFI_BOOT_SCRIPT_SAVE_PROTOCOL *mBootScriptSave;
25 
26 UINTN
EfiScriptLibAsciiStrLen(IN CHAR8 * String)27 EfiScriptLibAsciiStrLen (
28   IN CHAR8   *String
29   )
30 /*++
31 
32 Routine Description:
33   Return the number of Ascii characters in String. This is not the same as
34   the length of the string in bytes.
35 
36 Arguments:
37   String - String to process
38 
39 Returns:
40   Number of Ascii characters in String
41 
42 --*/
43 {
44   UINTN Length;
45 
46   for (Length=0; *String; String++, Length++);
47   return Length;
48 }
49 
50 UINTN
EfiScriptLibStrLen(IN CHAR16 * String)51 EfiScriptLibStrLen (
52   IN CHAR16   *String
53   )
54 /*++
55 
56 Routine Description:
57   Return the number of Unicode characters in String. This is not the same as
58   the length of the string in bytes.
59 
60 Arguments:
61   String - String to process
62 
63 Returns:
64   Number of Unicode characters in String
65 
66 --*/
67 {
68   UINTN Length;
69 
70   for (Length=0; *String; String++, Length++);
71   return Length;
72 }
73 
74 EFI_STATUS
75 EFIAPI
BootScriptSaveInitialize(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)76 BootScriptSaveInitialize (
77   IN EFI_HANDLE           ImageHandle,
78   IN EFI_SYSTEM_TABLE     *SystemTable
79   )
80 /*++
81 
82 Routine Description:
83 
84   Intialize Boot Script Lib if it has not yet been initialized.
85 
86 Arguments:
87 
88   (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
89 
90 Returns:
91 
92   EFI_STATUS always returns EFI_SUCCESS
93 
94 --*/
95 // GC_TODO:    ImageHandle - add argument and description to function comment
96 // GC_TODO:    SystemTable - add argument and description to function comment
97 {
98   EFI_STATUS        Status;
99   EFI_BOOT_SERVICES *BS;
100 
101   BS      = SystemTable->BootServices;
102 
103   Status  = BS->LocateProtocol (&gEfiBootScriptSaveGuid, NULL, (VOID **)&mBootScriptSave);
104   if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
105     mBootScriptSave = NULL;
106   }
107 
108   return EFI_SUCCESS;
109 }
110 
111 EFI_STATUS
112 EFIAPI
BootScriptSaveIoWrite(IN UINT16 TableName,IN EFI_BOOT_SCRIPT_WIDTH Width,IN UINT64 Address,IN UINTN Count,IN VOID * Buffer)113 BootScriptSaveIoWrite (
114   IN  UINT16                            TableName,
115   IN  EFI_BOOT_SCRIPT_WIDTH             Width,
116   IN  UINT64                            Address,
117   IN  UINTN                             Count,
118   IN  VOID                              *Buffer
119   )
120 /*++
121 
122 Routine Description:
123 
124   Save I/O write to boot script
125 
126 Arguments:
127 
128   TableName - Desired boot script table
129 
130   (Standard EFI IO write script parameter)
131 
132 Returns:
133 
134   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
135 
136   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
137 
138 --*/
139 // GC_TODO:    Width - add argument and description to function comment
140 // GC_TODO:    Address - add argument and description to function comment
141 // GC_TODO:    Count - add argument and description to function comment
142 // GC_TODO:    Buffer - add argument and description to function comment
143 {
144   if (mBootScriptSave == NULL) {
145     return EFI_NOT_FOUND;
146   }
147 
148   mBootScriptSave->Write (
149                     mBootScriptSave,
150                     TableName,
151                     EFI_BOOT_SCRIPT_IO_WRITE_OPCODE,
152                     Width,
153                     Address,
154                     Count,
155                     Buffer
156                     );
157 
158   return EFI_SUCCESS;
159 }
160 
161 EFI_STATUS
162 EFIAPI
BootScriptSaveIoReadWrite(IN UINT16 TableName,IN EFI_BOOT_SCRIPT_WIDTH Width,IN UINT64 Address,IN VOID * Data,IN VOID * DataMask)163 BootScriptSaveIoReadWrite (
164   IN  UINT16                            TableName,
165   IN  EFI_BOOT_SCRIPT_WIDTH             Width,
166   IN  UINT64                            Address,
167   IN  VOID                              *Data,
168   IN  VOID                              *DataMask
169   )
170 /*++
171 
172 Routine Description:
173 
174   Save I/O write to boot script
175 
176 Arguments:
177 
178   TableName - Desired boot script table
179 
180   (Standard EFI IO read write script parameter)
181 
182 Returns:
183 
184   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
185 
186   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
187 
188 --*/
189 // GC_TODO:    Width - add argument and description to function comment
190 // GC_TODO:    Address - add argument and description to function comment
191 // GC_TODO:    Data - add argument and description to function comment
192 // GC_TODO:    DataMask - add argument and description to function comment
193 {
194   if (mBootScriptSave == NULL) {
195     return EFI_NOT_FOUND;
196   }
197 
198   mBootScriptSave->Write (
199                     mBootScriptSave,
200                     TableName,
201                     EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE,
202                     Width,
203                     Address,
204                     Data,
205                     DataMask
206                     );
207 
208   return EFI_SUCCESS;
209 }
210 
211 EFI_STATUS
212 EFIAPI
BootScriptSaveMemWrite(IN UINT16 TableName,IN EFI_BOOT_SCRIPT_WIDTH Width,IN UINT64 Address,IN UINTN Count,IN VOID * Buffer)213 BootScriptSaveMemWrite (
214   IN  UINT16                            TableName,
215   IN  EFI_BOOT_SCRIPT_WIDTH             Width,
216   IN  UINT64                            Address,
217   IN  UINTN                             Count,
218   IN  VOID                              *Buffer
219   )
220 /*++
221 
222 Routine Description:
223 
224   Save I/O write to boot script
225 
226 Arguments:
227 
228   TableName - Desired boot script table
229 
230   (Standard EFI MEM write script parameter)
231 
232 Returns:
233 
234   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
235 
236   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
237 
238 --*/
239 // GC_TODO:    Width - add argument and description to function comment
240 // GC_TODO:    Address - add argument and description to function comment
241 // GC_TODO:    Count - add argument and description to function comment
242 // GC_TODO:    Buffer - add argument and description to function comment
243 {
244   if (mBootScriptSave == NULL) {
245     return EFI_NOT_FOUND;
246   }
247 
248   mBootScriptSave->Write (
249                     mBootScriptSave,
250                     TableName,
251                     EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE,
252                     Width,
253                     Address,
254                     Count,
255                     Buffer
256                     );
257 
258   return EFI_SUCCESS;
259 }
260 
261 EFI_STATUS
262 EFIAPI
BootScriptSaveMemReadWrite(IN UINT16 TableName,IN EFI_BOOT_SCRIPT_WIDTH Width,IN UINT64 Address,IN VOID * Data,IN VOID * DataMask)263 BootScriptSaveMemReadWrite (
264   IN  UINT16                            TableName,
265   IN  EFI_BOOT_SCRIPT_WIDTH             Width,
266   IN  UINT64                            Address,
267   IN  VOID                              *Data,
268   IN  VOID                              *DataMask
269   )
270 /*++
271 
272 Routine Description:
273 
274   Save I/O write to boot script
275 
276 Arguments:
277 
278   TableName - Desired boot script table
279 
280   (Standard EFI MEM read write script parameter)
281 
282 Returns:
283 
284   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
285 
286   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
287 
288 --*/
289 // GC_TODO:    Width - add argument and description to function comment
290 // GC_TODO:    Address - add argument and description to function comment
291 // GC_TODO:    Data - add argument and description to function comment
292 // GC_TODO:    DataMask - add argument and description to function comment
293 {
294   if (mBootScriptSave == NULL) {
295     return EFI_NOT_FOUND;
296   }
297 
298   mBootScriptSave->Write (
299                     mBootScriptSave,
300                     TableName,
301                     EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE,
302                     Width,
303                     Address,
304                     Data,
305                     DataMask
306                     );
307 
308   return EFI_SUCCESS;
309 }
310 
311 EFI_STATUS
312 EFIAPI
BootScriptSavePciCfgWrite(IN UINT16 TableName,IN EFI_BOOT_SCRIPT_WIDTH Width,IN UINT64 Address,IN UINTN Count,IN VOID * Buffer)313 BootScriptSavePciCfgWrite (
314   IN  UINT16                            TableName,
315   IN  EFI_BOOT_SCRIPT_WIDTH             Width,
316   IN  UINT64                            Address,
317   IN  UINTN                             Count,
318   IN  VOID                              *Buffer
319   )
320 /*++
321 
322 Routine Description:
323 
324   Save I/O write to boot script
325 
326 Arguments:
327 
328   TableName - Desired boot script table
329 
330   (Standard EFI PCI write script parameter)
331 
332 Returns:
333 
334   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
335 
336   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
337 
338 --*/
339 // GC_TODO:    Width - add argument and description to function comment
340 // GC_TODO:    Address - add argument and description to function comment
341 // GC_TODO:    Count - add argument and description to function comment
342 // GC_TODO:    Buffer - add argument and description to function comment
343 {
344   if (mBootScriptSave == NULL) {
345     return EFI_NOT_FOUND;
346   }
347 
348   mBootScriptSave->Write (
349                     mBootScriptSave,
350                     TableName,
351                     EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE,
352                     Width,
353                     Address,
354                     Count,
355                     Buffer
356                     );
357 
358   return EFI_SUCCESS;
359 }
360 
361 EFI_STATUS
362 EFIAPI
BootScriptSavePciCfgReadWrite(IN UINT16 TableName,IN EFI_BOOT_SCRIPT_WIDTH Width,IN UINT64 Address,IN VOID * Data,IN VOID * DataMask)363 BootScriptSavePciCfgReadWrite (
364   IN  UINT16                            TableName,
365   IN  EFI_BOOT_SCRIPT_WIDTH             Width,
366   IN  UINT64                            Address,
367   IN  VOID                              *Data,
368   IN  VOID                              *DataMask
369   )
370 /*++
371 
372 Routine Description:
373 
374   Save I/O write to boot script
375 
376 Arguments:
377 
378   TableName - Desired boot script table
379 
380   (Standard EFI PCI read write script parameter)
381 
382 Returns:
383 
384   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
385 
386   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
387 
388 --*/
389 // GC_TODO:    Width - add argument and description to function comment
390 // GC_TODO:    Address - add argument and description to function comment
391 // GC_TODO:    Data - add argument and description to function comment
392 // GC_TODO:    DataMask - add argument and description to function comment
393 {
394   if (mBootScriptSave == NULL) {
395     return EFI_NOT_FOUND;
396   }
397 
398   mBootScriptSave->Write (
399                     mBootScriptSave,
400                     TableName,
401                     EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE,
402                     Width,
403                     Address,
404                     Data,
405                     DataMask
406                     );
407 
408   return EFI_SUCCESS;
409 }
410 
411 EFI_STATUS
412 EFIAPI
BootScriptSaveSmbusExecute(IN UINT16 TableName,IN EFI_SMBUS_DEVICE_ADDRESS SlaveAddress,IN EFI_SMBUS_DEVICE_COMMAND Command,IN EFI_SMBUS_OPERATION Operation,IN BOOLEAN PecCheck,IN UINTN * Length,IN VOID * Buffer)413 BootScriptSaveSmbusExecute (
414   IN  UINT16                            TableName,
415   IN  EFI_SMBUS_DEVICE_ADDRESS          SlaveAddress,
416   IN  EFI_SMBUS_DEVICE_COMMAND          Command,
417   IN  EFI_SMBUS_OPERATION               Operation,
418   IN  BOOLEAN                           PecCheck,
419   IN  UINTN                             *Length,
420   IN  VOID                              *Buffer
421   )
422 /*++
423 
424 Routine Description:
425 
426   Save I/O write to boot script
427 
428 Arguments:
429 
430   TableName - Desired boot script table
431 
432   (Standard EFI Smbus execute script parameter)
433 
434 Returns:
435 
436   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
437 
438   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
439 
440 --*/
441 // GC_TODO:    SlaveAddress - add argument and description to function comment
442 // GC_TODO:    Command - add argument and description to function comment
443 // GC_TODO:    Operation - add argument and description to function comment
444 // GC_TODO:    PecCheck - add argument and description to function comment
445 // GC_TODO:    Length - add argument and description to function comment
446 // GC_TODO:    Buffer - add argument and description to function comment
447 {
448   if (mBootScriptSave == NULL) {
449     return EFI_NOT_FOUND;
450   }
451 
452   mBootScriptSave->Write (
453                     mBootScriptSave,
454                     TableName,
455                     EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE,
456                     SlaveAddress,
457                     Command,
458                     Operation,
459                     PecCheck,
460                     Length,
461                     Buffer
462                     );
463 
464   return EFI_SUCCESS;
465 }
466 
467 EFI_STATUS
468 EFIAPI
BootScriptSaveStall(IN UINT16 TableName,IN UINTN Duration)469 BootScriptSaveStall (
470   IN  UINT16                            TableName,
471   IN  UINTN                             Duration
472   )
473 /*++
474 
475 Routine Description:
476 
477   Save I/O write to boot script
478 
479 Arguments:
480 
481   TableName - Desired boot script table
482 
483   (Standard EFI stall script parameter)
484 
485 Returns:
486 
487   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
488 
489   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
490 
491 --*/
492 // GC_TODO:    Duration - add argument and description to function comment
493 {
494   if (mBootScriptSave == NULL) {
495     return EFI_NOT_FOUND;
496   }
497 
498   mBootScriptSave->Write (
499                     mBootScriptSave,
500                     TableName,
501                     EFI_BOOT_SCRIPT_STALL_OPCODE,
502                     Duration
503                     );
504 
505   return EFI_SUCCESS;
506 }
507 
508 EFI_STATUS
509 EFIAPI
BootScriptSaveDispatch(IN UINT16 TableName,IN EFI_PHYSICAL_ADDRESS EntryPoint)510 BootScriptSaveDispatch (
511   IN  UINT16                            TableName,
512   IN  EFI_PHYSICAL_ADDRESS              EntryPoint
513   )
514 /*++
515 
516 Routine Description:
517 
518   GC_TODO: Add function description
519 
520 Arguments:
521 
522   TableName   - GC_TODO: add argument description
523   EntryPoint  - GC_TODO: add argument description
524 
525 Returns:
526 
527   EFI_NOT_FOUND - GC_TODO: Add description for return value
528   EFI_SUCCESS - GC_TODO: Add description for return value
529 
530 --*/
531 {
532   if (mBootScriptSave == NULL) {
533     return EFI_NOT_FOUND;
534   }
535 
536   mBootScriptSave->Write (
537                     mBootScriptSave,
538                     TableName,
539                     EFI_BOOT_SCRIPT_DISPATCH_OPCODE,
540                     EntryPoint
541                     );
542 
543   return EFI_SUCCESS;
544 
545 }
546 
547 EFI_STATUS
548 EFIAPI
BootScriptMemPoll(IN UINT16 TableName,IN EFI_BOOT_SCRIPT_WIDTH Width,IN UINT64 Address,IN VOID * BitMask,IN VOID * BitValue,IN UINTN Duration,IN UINTN LoopTimes)549 BootScriptMemPoll (
550   IN  UINT16                            TableName,
551   IN  EFI_BOOT_SCRIPT_WIDTH             Width,
552   IN  UINT64                            Address,
553   IN  VOID                              *BitMask,
554   IN  VOID                              *BitValue,
555   IN  UINTN                             Duration,
556   IN  UINTN                             LoopTimes
557   )
558 /*++
559 
560 Routine Description:
561 
562   Save I/O write to boot script
563 
564 Arguments:
565   TableName - Desired boot script table
566 
567   Width     - The width of the memory operations.
568 
569   Address   - The base address of the memory operations.
570 
571   BitMask   - A pointer to the bit mask to be AND-ed with the data read from the register.
572 
573   BitValue  - A pointer to the data value after to be Masked.
574 
575   Duration  - Duration in microseconds of the stall.
576 
577   LoopTimes - The times of the register polling.
578 
579 Returns:
580 
581   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
582 
583   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
584 
585 --*/
586 {
587   mBootScriptSave->Write (
588                     mBootScriptSave,
589                     TableName,
590                     EFI_BOOT_SCRIPT_MEM_POLL_OPCODE,
591                     Width,
592                     Address,
593                     BitMask,
594                     BitValue,
595                     Duration,
596                     LoopTimes
597                     );
598 
599   return EFI_SUCCESS;
600 }
601 
602 EFI_STATUS
603 EFIAPI
BootScriptSaveInformation(IN UINT16 TableName,IN UINT32 Length,IN EFI_PHYSICAL_ADDRESS Buffer)604 BootScriptSaveInformation (
605   IN  UINT16                                 TableName,
606   IN  UINT32                                 Length,
607   IN  EFI_PHYSICAL_ADDRESS                   Buffer
608   )
609 /*++
610 
611 Routine Description:
612 
613   Save a Information Opcode record in table specified with TableName
614 
615 Arguments:
616 
617   TableName   - Desired boot script table
618   Length         - Length of information in bytes
619   Buffer          - Content of information that will be saved in script table
620 
621 Returns:
622 
623   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
624 
625   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
626 
627 --*/
628 {
629   if (mBootScriptSave == NULL) {
630     return EFI_NOT_FOUND;
631   }
632 
633   mBootScriptSave->Write (
634                     mBootScriptSave,
635                     TableName,
636                     EFI_BOOT_SCRIPT_INFORMATION_OPCODE,
637                     Length,
638                     Buffer
639                     );
640 
641   return EFI_SUCCESS;
642 
643 }
644 
645 EFI_STATUS
646 EFIAPI
BootScriptSaveInformationUnicodeString(IN UINT16 TableName,IN CHAR16 * String)647 BootScriptSaveInformationUnicodeString (
648   IN        UINT16              TableName,
649   IN        CHAR16              *String
650   )
651 /*++
652 
653 Routine Description:
654 
655   Save a Information Opcode record in table specified with TableName, the information
656   is a unicode string.
657 
658 Arguments:
659 
660   TableName   - Desired boot script table
661   String          - The string that will be saved in script table
662 
663 Returns:
664 
665   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
666 
667   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
668 
669 --*/
670 {
671   return BootScriptSaveInformation (
672            TableName,
673            (UINT32) EfiScriptLibStrLen (String) * 2 + 2,
674            (EFI_PHYSICAL_ADDRESS) (UINTN) String
675            );
676 }
677 
678 EFI_STATUS
679 EFIAPI
BootScriptSaveInformationAsciiString(IN UINT16 TableName,IN CHAR8 * String)680 BootScriptSaveInformationAsciiString (
681   IN        UINT16              TableName,
682   IN        CHAR8               *String
683   )
684 /*++
685 
686 Routine Description:
687 
688   Save a Information Opcode record in table specified with TableName, the information
689   is a ascii string.
690 
691 Arguments:
692 
693   TableName   - Desired boot script table
694   String          - The string that will be saved in script table
695 
696 Returns:
697 
698   EFI_NOT_FOUND - BootScriptSave Protocol not exist.
699 
700   EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS
701 
702 --*/
703 {
704   return BootScriptSaveInformation (
705            TableName,
706            (UINT32) EfiScriptLibAsciiStrLen (String) + 1,
707            (EFI_PHYSICAL_ADDRESS) (UINTN) String
708            );
709 }
710 
711