Fix non-boolean comparison expression.
[efi/edk2/.git] / edk2 / EdkCompatibilityPkg / Compatibility / PiSmbiosRecordOnDataHubSmbiosRecordThunk / MiscConv.c
1 /** @file\r
2   Routines that support Misc SubClass data records translation.\r
3   \r
4 Copyright (c) 2009 - 2010, Intel Corporation\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution.  The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9 \r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 \r
13 **/\r
14 \r
15 #include "Thunk.h"\r
16 \r
17 /**\r
18   Field Filling Function for Misc SubClass record type 0 -- Bios Information.\r
19   \r
20   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
21   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
22   @param RecordData       RecordData buffer will be filled.\r
23   @param RecordDataSize   The size of RecordData buffer.\r
24   \r
25   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
26 **/\r
27 EFI_STATUS\r
28 SmbiosFldMiscType0 (\r
29   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
30   IN      UINT32                    Offset,\r
31   IN      VOID                      *RecordData,\r
32   IN      UINT32                    RecordDataSize\r
33   )\r
34 {\r
35   EFI_STATUS                 Status;\r
36   EFI_MISC_BIOS_VENDOR_DATA  *BiosInfo;\r
37 \r
38   Status    = EFI_SUCCESS;\r
39   BiosInfo  = NULL;\r
40 \r
41   BiosInfo  = (EFI_MISC_BIOS_VENDOR_DATA *) RecordData;\r
42 \r
43   //\r
44   // Bios Vendor\r
45   //\r
46   SmbiosFldString (\r
47     StructureNode,\r
48     OFFSET_OF (SMBIOS_TABLE_TYPE0, Vendor),\r
49     &(BiosInfo->BiosVendor),\r
50     2 // 64 * sizeof(CHAR16)\r
51     );\r
52 \r
53   //\r
54   // Bios Version\r
55   //\r
56   SmbiosFldString (\r
57     StructureNode,\r
58     OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosVersion),\r
59     &(BiosInfo->BiosVersion),\r
60     2 // 64 * sizeof(CHAR16)\r
61     );\r
62 \r
63   //\r
64   // Bios Release Date\r
65   //\r
66   SmbiosFldString (\r
67     StructureNode,\r
68     OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosReleaseDate),\r
69     &(BiosInfo->BiosReleaseDate),\r
70     2 // 64 * sizeof(CHAR16)\r
71     );\r
72 \r
73   //\r
74   // Bios Starting Address Segment\r
75   //\r
76   CopyMem (\r
77     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSegment),\r
78     &BiosInfo->BiosStartingAddress,\r
79     2\r
80     );\r
81 \r
82   //\r
83   // Bios Physical device size\r
84   //\r
85   SmbiosFldBase2ToByteWith64K (\r
86     StructureNode,\r
87     OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSize),\r
88     &BiosInfo->BiosPhysicalDeviceSize,\r
89     sizeof (EFI_EXP_BASE2_DATA)\r
90     );\r
91   (*(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSize)))--;\r
92 \r
93   //\r
94   // Bios Characteristics\r
95   //\r
96   CopyMem (\r
97     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosCharacteristics),\r
98     &BiosInfo->BiosCharacteristics1,\r
99     4\r
100     );\r
101   \r
102   //\r
103   // Bios Characteristics higher four bytes\r
104   //\r
105   CopyMem (\r
106     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosCharacteristics) + 4,\r
107     &BiosInfo->BiosCharacteristics2,\r
108     4\r
109     ); \r
110 \r
111   //\r
112   // Bios Characteristics Extension1/2\r
113   //\r
114   CopyMem (\r
115     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BIOSCharacteristicsExtensionBytes),\r
116     (UINT8 *) &BiosInfo->BiosCharacteristics1 + 4,\r
117     2\r
118     );\r
119 \r
120   //\r
121   // System BIOS Major Release\r
122   //\r
123   CopyMem (\r
124     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, SystemBiosMajorRelease),\r
125     (UINT8 *) &BiosInfo->BiosMajorRelease,\r
126     1\r
127     );\r
128 \r
129   //\r
130   // System BIOS Minor Release\r
131   //\r
132   CopyMem (\r
133     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, SystemBiosMinorRelease),\r
134     (UINT8 *) &BiosInfo->BiosMinorRelease,\r
135     1\r
136     );\r
137 \r
138   //\r
139   // Embedded Controller Firmware Major Release\r
140   //\r
141   CopyMem (\r
142     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, EmbeddedControllerFirmwareMajorRelease),\r
143     (UINT8 *) &BiosInfo->BiosEmbeddedFirmwareMajorRelease,\r
144     1\r
145     );\r
146 \r
147   //\r
148   // Embedded Controller Firmware Minor Release\r
149   //\r
150   CopyMem (\r
151     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, EmbeddedControllerFirmwareMinorRelease),\r
152     (UINT8 *) &BiosInfo->BiosEmbeddedFirmwareMinorRelease,\r
153     1\r
154     );\r
155 \r
156   return Status;\r
157 }\r
158 \r
159 /**\r
160   Field Filling Function for Misc SubClass record type 1 -- System Information.\r
161   \r
162   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
163   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
164   @param RecordData       RecordData buffer will be filled.\r
165   @param RecordDataSize   The size of RecordData buffer.\r
166   \r
167   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
168 **/\r
169 EFI_STATUS\r
170 SmbiosFldMiscType1 (\r
171   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
172   IN      UINT32                    Offset,\r
173   IN      VOID                      *RecordData,\r
174   IN      UINT32                    RecordDataSize\r
175   )\r
176 {\r
177   EFI_STATUS                         Status;\r
178   EFI_MISC_SYSTEM_MANUFACTURER_DATA  *SystemInfo;\r
179 \r
180   Status      = EFI_SUCCESS;\r
181   SystemInfo  = NULL;\r
182 \r
183   SystemInfo  = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) RecordData;\r
184 \r
185   //\r
186   // System Manufacturer\r
187   //\r
188   SmbiosFldString (\r
189     StructureNode,\r
190     OFFSET_OF (SMBIOS_TABLE_TYPE1, Manufacturer),\r
191     &(SystemInfo->SystemManufacturer),\r
192     2 // 64 * sizeof(CHAR16)\r
193     );\r
194 \r
195   //\r
196   // System Product Name\r
197   //\r
198   SmbiosFldString (\r
199     StructureNode,\r
200     OFFSET_OF (SMBIOS_TABLE_TYPE1, ProductName),\r
201     &(SystemInfo->SystemProductName),\r
202     2 // 64 * sizeof(CHAR16)\r
203     );\r
204 \r
205   //\r
206   // System Version\r
207   //\r
208   SmbiosFldString (\r
209     StructureNode,\r
210     OFFSET_OF (SMBIOS_TABLE_TYPE1, Version),\r
211     &(SystemInfo->SystemVersion),\r
212     2 // 64 * sizeof(CHAR16)\r
213     );\r
214 \r
215   //\r
216   // System Serial Number\r
217   //\r
218   SmbiosFldString (\r
219     StructureNode,\r
220     OFFSET_OF (SMBIOS_TABLE_TYPE1, SerialNumber),\r
221     &(SystemInfo->SystemSerialNumber),\r
222     2 // 64 * sizeof(CHAR16)\r
223     );\r
224 \r
225   //\r
226   // Uuid\r
227   //\r
228   CopyMem (\r
229     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE1, Uuid),\r
230     &SystemInfo->SystemUuid,\r
231     16\r
232     );\r
233 \r
234   //\r
235   // Wakeup Type\r
236   //\r
237   CopyMem (\r
238     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE1, WakeUpType),\r
239     &SystemInfo->SystemWakeupType,\r
240     1\r
241     );\r
242 \r
243   //\r
244   // System SKU Number\r
245   //\r
246   SmbiosFldString (\r
247     StructureNode,\r
248     OFFSET_OF (SMBIOS_TABLE_TYPE1, SKUNumber),\r
249     &(SystemInfo->SystemSKUNumber),\r
250     2 // 64 * sizeof(CHAR16)\r
251     );\r
252 \r
253   //\r
254   // System Family\r
255   //\r
256   SmbiosFldString (\r
257     StructureNode,\r
258     OFFSET_OF (SMBIOS_TABLE_TYPE1, Family),\r
259     &(SystemInfo->SystemFamily),\r
260     2 // 64 * sizeof(CHAR16)\r
261     );\r
262 \r
263   return Status;\r
264 }\r
265 \r
266 /**\r
267   Field Filling Function for record type 2 -- Base Board Manufacture.\r
268   \r
269   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
270   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
271   @param RecordData       RecordData buffer will be filled.\r
272   @param RecordDataSize   The size of RecordData buffer.\r
273   \r
274   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
275 **/\r
276 EFI_STATUS\r
277 SmbiosFldMiscType2 (\r
278   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
279   IN      UINT32                    Offset,\r
280   IN      VOID                      *RecordData,\r
281   IN      UINT32                    RecordDataSize\r
282   )\r
283 {\r
284   EFI_STATUS                             Status;\r
285   EFI_MISC_BASE_BOARD_MANUFACTURER_DATA  *Bbm;\r
286   Status  = EFI_SUCCESS;\r
287   Bbm     = (EFI_MISC_BASE_BOARD_MANUFACTURER_DATA *) RecordData;\r
288 \r
289   //\r
290   // Manufacturer\r
291   //\r
292   SmbiosFldString (\r
293     StructureNode,\r
294     OFFSET_OF (SMBIOS_TABLE_TYPE2, Manufacturer),\r
295     &(Bbm->BaseBoardManufacturer),\r
296     2\r
297     );\r
298 \r
299   //\r
300   // Product\r
301   //\r
302   SmbiosFldString (\r
303     StructureNode,\r
304     OFFSET_OF (SMBIOS_TABLE_TYPE2, ProductName),\r
305     &(Bbm->BaseBoardProductName),\r
306     2\r
307     );\r
308 \r
309   //\r
310   // Version\r
311   //\r
312   SmbiosFldString (\r
313     StructureNode,\r
314     OFFSET_OF (SMBIOS_TABLE_TYPE2, Version),\r
315     &(Bbm->BaseBoardVersion),\r
316     2\r
317     );\r
318 \r
319   //\r
320   // Serial Number\r
321   //\r
322   SmbiosFldString (\r
323     StructureNode,\r
324     OFFSET_OF (SMBIOS_TABLE_TYPE2, SerialNumber),\r
325     &(Bbm->BaseBoardSerialNumber),\r
326     2\r
327     );\r
328 \r
329   //\r
330   // Asset Tag\r
331   //\r
332   SmbiosFldString (\r
333     StructureNode,\r
334     OFFSET_OF (SMBIOS_TABLE_TYPE2, AssetTag),\r
335     &(Bbm->BaseBoardAssetTag),\r
336     2\r
337     );\r
338 \r
339   //\r
340   // Location in Chassis\r
341   //\r
342   SmbiosFldString (\r
343     StructureNode,\r
344     OFFSET_OF (SMBIOS_TABLE_TYPE2, LocationInChassis),\r
345     &(Bbm->BaseBoardChassisLocation),\r
346     2\r
347     );\r
348 \r
349   //\r
350   // Feature Flags\r
351   //\r
352   CopyMem (\r
353     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, FeatureFlag),\r
354     &Bbm->BaseBoardFeatureFlags,\r
355     1\r
356     );\r
357 \r
358   //\r
359   // Board Type\r
360   //\r
361   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, BoardType)) = (UINT8) Bbm->BaseBoardType;\r
362 \r
363   //\r
364   // Chassis Handle\r
365   //\r
366   SmbiosFldInterLink (\r
367     StructureNode,\r
368     (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE2, ChassisHandle),\r
369     3,  // SMBIOS type 3 - System Enclosure or Chassis\r
370     &Bbm->BaseBoardChassisLink,\r
371     &gEfiMiscSubClassGuid\r
372     );\r
373 \r
374   //\r
375   // Number of Contained Object Handles\r
376   //\r
377   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, NumberOfContainedObjectHandles)) = (UINT8) Bbm->BaseBoardNumberLinks;\r
378 \r
379   return Status;\r
380 }\r
381 \r
382 /**\r
383   Field Filling Function for Misc SubClass record type 3 -\r
384   - System Enclosure or Chassis.\r
385   \r
386   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
387   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
388   @param RecordData       RecordData buffer will be filled.\r
389   @param RecordDataSize   The size of RecordData buffer.\r
390   \r
391   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
392 **/\r
393 EFI_STATUS\r
394 SmbiosFldMiscType3 (\r
395   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
396   IN      UINT32                    Offset,\r
397   IN      VOID                      *RecordData,\r
398   IN      UINT32                    RecordDataSize\r
399   )\r
400 {\r
401   EFI_STATUS                         Status;\r
402   EFI_MISC_CHASSIS_MANUFACTURER_DATA *Ec;\r
403   EFI_MISC_ELEMENTS                  *Element;\r
404   UINT16                             Index;\r
405   UINT8                              ContainedElementType;\r
406   Status  = EFI_SUCCESS;\r
407   Ec      = (EFI_MISC_CHASSIS_MANUFACTURER_DATA *) RecordData;\r
408 \r
409   //\r
410   // Chassis Type\r
411   //\r
412   *(UINT8*)((UINT8 *) (StructureNode->Structure) + \r
413             OFFSET_OF (SMBIOS_TABLE_TYPE3, Type)) \r
414             = (UINT8) (Ec->ChassisType.ChassisType | Ec->ChassisType.ChassisLockPresent << 7);\r
415 \r
416 \r
417   //\r
418   // Chassis Bootup State\r
419   //\r
420   CopyMem (\r
421     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, BootupState),\r
422     &Ec->ChassisBootupState,\r
423     1\r
424     );\r
425 \r
426   //\r
427   // Chassis Power Supply State\r
428   //\r
429   CopyMem (\r
430     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, PowerSupplyState),\r
431     &Ec->ChassisPowerSupplyState,\r
432     1\r
433     );\r
434 \r
435   //\r
436   // Chassis Thermal State\r
437   //\r
438   CopyMem (\r
439     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, ThermalState),\r
440     &Ec->ChassisThermalState,\r
441     1\r
442     );\r
443 \r
444   //\r
445   // Chassis Security State\r
446   //\r
447   CopyMem (\r
448     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, SecurityStatus),\r
449     &Ec->ChassisSecurityState,\r
450     1\r
451     );\r
452 \r
453   //\r
454   // Chassis Oem Defined\r
455   //\r
456   CopyMem (\r
457     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, OemDefined),\r
458     &Ec->ChassisOemDefined,\r
459     4\r
460     );\r
461 \r
462   //\r
463   // Chassis Height\r
464   //\r
465   *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
466             OFFSET_OF (SMBIOS_TABLE_TYPE3, Height)) \r
467             = (UINT8)Ec->ChassisHeight;\r
468 \r
469   //\r
470   // Chassis Number Power Cords\r
471   //\r
472   *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
473             OFFSET_OF (SMBIOS_TABLE_TYPE3, NumberofPowerCords)) \r
474             = (UINT8)Ec->ChassisNumberPowerCords;\r
475   \r
476   //\r
477   // Chassis Element Count\r
478   //\r
479   *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
480             OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElementCount)) \r
481             = (UINT8)Ec->ChassisElementCount;\r
482 \r
483   if(Ec->ChassisElementCount > 0) {\r
484     //\r
485     // Element Record Length\r
486     // Current solution covers first 3 bytes; user can extend to meet its requirements.\r
487     //\r
488     *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
489               OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElementRecordLength)) \r
490               = (UINT8)sizeof(CONTAINED_ELEMENT);\r
491 \r
492     //\r
493     // Update the structure's length and StructureSize\r
494     //\r
495     StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
496                                                Ec->ChassisElementCount * sizeof(CONTAINED_ELEMENT));\r
497     Status = SmbiosEnlargeStructureBuffer (\r
498                StructureNode,\r
499                StructureNode->Structure->Length,\r
500                StructureNode->StructureSize,\r
501                StructureNode->StructureSize + Ec->ChassisElementCount * sizeof(CONTAINED_ELEMENT)\r
502                );\r
503     if (EFI_ERROR (Status)) {\r
504       return Status;\r
505     }\r
506     \r
507     //\r
508     // Contained Elements\r
509     //\r
510     for (Index=0, Element = &Ec->ChassisElements; \r
511          Index < Ec->ChassisElementCount; \r
512          Index += 1, Element ++) {\r
513 \r
514       //\r
515       // ContainedElementType\r
516       //\r
517       ContainedElementType = (UINT8)((Element->ChassisElementType.RecordType == 1)\r
518                                       ? (UINT8)(Element->ChassisElementType.RecordType << 7 | Element->ChassisElementType.Type)\r
519                                       : (UINT8)(Element->ChassisBaseBoard));\r
520       *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
521                 OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
522                 Index * sizeof(CONTAINED_ELEMENT) + \r
523                 OFFSET_OF(CONTAINED_ELEMENT,ContainedElementType)) \r
524                 = ContainedElementType;\r
525 \r
526       //\r
527       // ContainedElementMinimum\r
528       //\r
529       *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
530                 OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
531                 Index * sizeof(CONTAINED_ELEMENT) + \r
532                 OFFSET_OF(CONTAINED_ELEMENT,ContainedElementMinimum))\r
533                 = (UINT8)Element->ChassisElementMinimum;\r
534 \r
535       //\r
536       // ContainedElementMaximum\r
537       //\r
538       *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
539                 OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
540                 Index * sizeof(CONTAINED_ELEMENT) + \r
541                 OFFSET_OF(CONTAINED_ELEMENT,ContainedElementMaximum)) \r
542                 = (UINT8)Element->ChassisElementMaximum;\r
543     }\r
544   }\r
545 \r
546   //\r
547   // Move the filling of following four String fields after Contained Elements \r
548   // because they would break SMBIOS table.\r
549   // Chassis Manufacturer\r
550   //\r
551   SmbiosFldString (\r
552     StructureNode,\r
553     OFFSET_OF (SMBIOS_TABLE_TYPE3, Manufacturer),\r
554     &(Ec->ChassisManufacturer),\r
555     2 // 64 * sizeof(CHAR16)\r
556     );\r
557 \r
558   //\r
559   // Chassis Version\r
560   //\r
561   SmbiosFldString (\r
562     StructureNode,\r
563     OFFSET_OF (SMBIOS_TABLE_TYPE3, Version),\r
564     &(Ec->ChassisVersion),\r
565     2 // 64 * sizeof(CHAR16)\r
566     );\r
567 \r
568   //\r
569   // Chassis Serial Number\r
570   //\r
571   SmbiosFldString (\r
572     StructureNode,\r
573     OFFSET_OF (SMBIOS_TABLE_TYPE3, SerialNumber),\r
574     &(Ec->ChassisSerialNumber),\r
575     2 // 64 * sizeof(CHAR16)\r
576     );\r
577 \r
578   //\r
579   // Chassis Asset Tag\r
580   //\r
581   SmbiosFldString (\r
582     StructureNode,\r
583     OFFSET_OF (SMBIOS_TABLE_TYPE3, AssetTag),\r
584     &(Ec->ChassisAssetTag),\r
585     2 // 64 * sizeof(CHAR16)\r
586     );\r
587   \r
588   return Status;\r
589 }\r
590 \r
591 /**\r
592   Field Filling Function for Misc SubClass record type 8 -- Port Connector.\r
593   \r
594   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
595   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
596   @param RecordData       RecordData buffer will be filled.\r
597   @param RecordDataSize   The size of RecordData buffer.\r
598   \r
599   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
600 **/\r
601 EFI_STATUS\r
602 SmbiosFldMiscType8 (\r
603   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
604   IN      UINT32                    Offset,\r
605   IN      VOID                      *RecordData,\r
606   IN      UINT32                    RecordDataSize\r
607   )\r
608 {\r
609   EFI_STATUS                                       Status;\r
610   EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *Picd;\r
611 \r
612   Status  = EFI_SUCCESS;\r
613   Picd    = (EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData;\r
614 \r
615   //\r
616   // Internal Connector Designator\r
617   //\r
618   SmbiosFldString (\r
619     StructureNode,\r
620     OFFSET_OF (SMBIOS_TABLE_TYPE8, InternalReferenceDesignator),\r
621     &(Picd->PortInternalConnectorDesignator),\r
622     2 // 64 * sizeof(CHAR16)\r
623     );\r
624 \r
625   //\r
626   // Internal Connector Type\r
627   //\r
628   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, InternalConnectorType)) = (UINT8) Picd->PortInternalConnectorType;\r
629 \r
630   //\r
631   // External Connector Designator\r
632   //\r
633   SmbiosFldString (\r
634     StructureNode,\r
635     OFFSET_OF (SMBIOS_TABLE_TYPE8, ExternalReferenceDesignator),\r
636     &(Picd->PortExternalConnectorDesignator),\r
637     2 // 64 * sizeof(CHAR16)\r
638     );\r
639 \r
640   //\r
641   // Internal Connector Type\r
642   //\r
643   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, ExternalConnectorType)) = (UINT8) Picd->PortExternalConnectorType;\r
644 \r
645   //\r
646   // Internal Connector Type\r
647   //\r
648   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, PortType)) = (UINT8) Picd->PortType;\r
649 \r
650   return Status;\r
651 }\r
652 \r
653 /**\r
654   Field Filling Function for Misc SubClass record type 9 -- System slot.\r
655   \r
656   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
657   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
658   @param RecordData       RecordData buffer will be filled.\r
659   @param RecordDataSize   The size of RecordData buffer.\r
660   \r
661   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
662 **/\r
663 EFI_STATUS\r
664 SmbiosFldMiscType9 (\r
665   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
666   IN      UINT32                    Offset,\r
667   IN      VOID                      *RecordData,\r
668   IN      UINT32                    RecordDataSize\r
669   )\r
670 {\r
671   EFI_STATUS                             Status;\r
672   EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA  *Slot;\r
673 \r
674   Status  = EFI_SUCCESS;\r
675   Slot    = (EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA *) RecordData;\r
676 \r
677   //\r
678   // Slot Designation\r
679   //\r
680   SmbiosFldString (\r
681     StructureNode,\r
682     OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotDesignation),\r
683     &(Slot->SlotDesignation),\r
684     2 // 64 * sizeof(CHAR16)\r
685     );\r
686 \r
687   //\r
688   // Slot Type\r
689   //\r
690   CopyMem (\r
691     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotType),\r
692     &Slot->SlotType,\r
693     1\r
694     );\r
695 \r
696   //\r
697   // Slot Data Bus Width\r
698   //\r
699   CopyMem (\r
700     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotDataBusWidth),\r
701     &Slot->SlotDataBusWidth,\r
702     1\r
703     );\r
704 \r
705   //\r
706   // Slot Usage\r
707   //\r
708   CopyMem (\r
709     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, CurrentUsage),\r
710     &Slot->SlotUsage,\r
711     1\r
712     );\r
713 \r
714   //\r
715   // Slot Length\r
716   //\r
717   CopyMem (\r
718     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotLength),\r
719     &Slot->SlotLength,\r
720     1\r
721     );\r
722 \r
723   //\r
724   // Slot Id\r
725   //\r
726   CopyMem (\r
727     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotID),\r
728     &Slot->SlotId,\r
729     2\r
730     );\r
731 \r
732   //\r
733   // Slot Characteristics\r
734   //\r
735   CopyMem (\r
736     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotCharacteristics1),\r
737     &Slot->SlotCharacteristics,\r
738     2\r
739     );\r
740 \r
741   return Status;\r
742 }\r
743 \r
744 /**\r
745   Field Filling Function for Misc SubClass record type 10 - Onboard Device.\r
746   \r
747   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
748   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
749   @param RecordData       RecordData buffer will be filled.\r
750   @param RecordDataSize   The size of RecordData buffer.\r
751   \r
752   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
753 **/\r
754 EFI_STATUS\r
755 SmbiosFldMiscType10 (\r
756   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
757   IN      UINT32                    Offset,\r
758   IN      VOID                      *RecordData,\r
759   IN      UINT32                    RecordDataSize\r
760   )\r
761 {\r
762   EFI_STATUS                   Status;\r
763   EFI_MISC_ONBOARD_DEVICE_DATA *OnboardDevice;\r
764   UINTN                        NumberOfDevices;\r
765   UINTN                        Index;\r
766   UINT8                        StatusAndType;\r
767 \r
768   Status          = EFI_SUCCESS;\r
769   OnboardDevice   = (EFI_MISC_ONBOARD_DEVICE_DATA *) RecordData;\r
770 \r
771   NumberOfDevices = (StructureNode->Structure->Length - 4) / 2;\r
772   for (Index = 0; Index < NumberOfDevices; Index += 1) {\r
773     //\r
774     // OnBoard Device Description\r
775     //\r
776     SmbiosFldString (\r
777       StructureNode,\r
778       (UINT32) (OFFSET_OF (SMBIOS_TABLE_TYPE10, Device) + 1 + (2 * Index)),\r
779       &(OnboardDevice->OnBoardDeviceDescription),\r
780       2 // 64 * sizeof(CHAR16)\r
781       );\r
782 \r
783     //\r
784     // Status & Type: Bit 7    Devicen Status, Bits 6:0 Type of Device\r
785     //\r
786     StatusAndType = (UINT8) OnboardDevice->OnBoardDeviceStatus.DeviceType;\r
787     if (OnboardDevice->OnBoardDeviceStatus.DeviceEnabled != 0) {\r
788       StatusAndType |= 0x80;\r
789     } else {\r
790       StatusAndType &= 0x7F;\r
791     }\r
792 \r
793     * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + (OFFSET_OF (SMBIOS_TABLE_TYPE10, Device) + (2 * Index))) = StatusAndType;\r
794   }\r
795 \r
796   return Status;\r
797 }\r
798 \r
799 /**\r
800   Field Filling Function for Misc SubClass record type 11 - OEM Strings.\r
801   \r
802   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
803   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
804   @param RecordData       RecordData buffer will be filled.\r
805   @param RecordDataSize   The size of RecordData buffer.\r
806   \r
807   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
808 **/\r
809 EFI_STATUS\r
810 SmbiosFldMiscType11 (\r
811   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
812   IN      UINT32                    Offset,\r
813   IN      VOID                      *RecordData,\r
814   IN      UINT32                    RecordDataSize\r
815   )\r
816 {\r
817   EFI_MISC_OEM_STRING_DATA *OemString;\r
818 \r
819   OemString = (EFI_MISC_OEM_STRING_DATA *)RecordData;\r
820   //\r
821   // OEM String data\r
822   //\r
823   SmbiosFldString (\r
824     StructureNode,\r
825     OFFSET_OF (SMBIOS_TABLE_TYPE11, StringCount),\r
826     &(OemString->OemStringRef[0]),\r
827     2\r
828     );\r
829   return EFI_SUCCESS;\r
830 }\r
831 \r
832 /**\r
833   Field Filling Function for Misc SubClass record type 12 - System Options.\r
834   \r
835   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
836   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
837   @param RecordData       RecordData buffer will be filled.\r
838   @param RecordDataSize   The size of RecordData buffer.\r
839   \r
840   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
841 **/\r
842 EFI_STATUS\r
843 SmbiosFldMiscType12 (\r
844   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
845   IN      UINT32                    Offset,\r
846   IN      VOID                      *RecordData,\r
847   IN      UINT32                    RecordDataSize\r
848   )\r
849 {\r
850   EFI_STATUS                         Status;\r
851   EFI_MISC_SYSTEM_OPTION_STRING_DATA *Sos;\r
852   UINTN                              NumberOfInstallableLanguages;\r
853   UINTN                              Index;\r
854 \r
855   Status  = EFI_SUCCESS;\r
856   Sos     = (EFI_MISC_SYSTEM_OPTION_STRING_DATA *) RecordData;\r
857 \r
858   //\r
859   // As MiscDataHub spec defines,\r
860   // NumberOfInstallableLanguages should retrieve from Type 13.\r
861   //\r
862   NumberOfInstallableLanguages = (StructureNode->Structure->Length - 4);\r
863   for (Index = 0; Index < NumberOfInstallableLanguages; Index += 1) {\r
864     //\r
865     // OnBoard Device Description\r
866     //\r
867     SmbiosFldString (\r
868       StructureNode,\r
869       (UINT32) (OFFSET_OF (SMBIOS_TABLE_TYPE12, StringCount) + (Index)),\r
870       &(Sos->SystemOptionStringRef[Index]),\r
871       2\r
872       );\r
873   }\r
874 \r
875   return Status;\r
876 }\r
877 \r
878 /**\r
879   Field Filling Function for Misc SubClass record type 13 - BIOS Language.\r
880   \r
881   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
882   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
883   @param RecordData       RecordData buffer will be filled.\r
884   @param RecordDataSize   The size of RecordData buffer.\r
885   \r
886   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
887 **/\r
888 EFI_STATUS\r
889 SmbiosFldMiscType13 (\r
890   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
891   IN      UINT32                    Offset,\r
892   IN      VOID                      *RecordData,\r
893   IN      UINT32                    RecordDataSize\r
894   )\r
895 {\r
896   EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA  *InstallableLanguage;\r
897 \r
898   InstallableLanguage = (EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA *) RecordData;\r
899 \r
900   //\r
901   // Number Of Installable Languages\r
902   //\r
903   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, InstallableLanguages)) = (UINT8) (InstallableLanguage->NumberOfInstallableLanguages);\r
904 \r
905   //\r
906   // Language Flags\r
907   //\r
908   CopyMem (\r
909     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, Flags),\r
910     &InstallableLanguage->LanguageFlags,\r
911     1\r
912     );\r
913 \r
914   //\r
915   // Current Language Number\r
916   //\r
917   SmbiosFldString (\r
918     StructureNode,\r
919     OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
920     &(InstallableLanguage->CurrentLanguageNumber),\r
921     2 // 64 * sizeof(CHAR16)\r
922     );\r
923 \r
924   return EFI_SUCCESS;\r
925 }\r
926 \r
927 /**\r
928   Field Filling Function for Misc SubClass record type 14 - System Language String\r
929   Current solution assumes that EFI_MISC_SYSTEM_LANGUAGE_STRINGs are logged with\r
930   their LanguageId having ascending orders.\r
931   \r
932   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
933   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
934   @param RecordData       RecordData buffer will be filled.\r
935   @param RecordDataSize   The size of RecordData buffer.\r
936   \r
937   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
938 **/\r
939 EFI_STATUS\r
940 SmbiosFldMiscType14 (\r
941   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
942   IN      UINT32                    Offset,\r
943   IN      VOID                      *RecordData,\r
944   IN      UINT32                    RecordDataSize\r
945   )\r
946 {\r
947   UINT16                           CurrentLanguageNumber;\r
948   EFI_MISC_SYSTEM_LANGUAGE_STRING  *LanguageString;\r
949   \r
950   LanguageString = (EFI_MISC_SYSTEM_LANGUAGE_STRING *) RecordData;\r
951 \r
952   //\r
953   // Backup CurrentLanguage\r
954   //\r
955   CopyMem (\r
956     &CurrentLanguageNumber,\r
957     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
958     1\r
959     );\r
960 \r
961   //\r
962   // Clear the field so that SmbiosFldString can be reused\r
963   //\r
964   *(UINT8 *)((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages)) = 0;\r
965   \r
966   SmbiosFldString (\r
967     StructureNode,\r
968     OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
969     &(LanguageString->SystemLanguageString),\r
970     2 // 64 * sizeof(CHAR16)\r
971     );\r
972 \r
973   //\r
974   // Restore CurrentLanguage\r
975   //\r
976   CopyMem (\r
977     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
978     &CurrentLanguageNumber,\r
979     1\r
980     );\r
981 \r
982   return EFI_SUCCESS;\r
983 }\r
984 \r
985 /**\r
986   Field Filling Function for Misc SubClass record type 15 -- System Event Log.\r
987   \r
988   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
989   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
990   @param RecordData       RecordData buffer will be filled.\r
991   @param RecordDataSize   The size of RecordData buffer.\r
992   \r
993   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
994 **/\r
995 EFI_STATUS\r
996 SmbiosFldMiscType15 (\r
997   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
998   IN      UINT32                    Offset,\r
999   IN      VOID                      *RecordData,\r
1000   IN      UINT32                    RecordDataSize\r
1001   )\r
1002 {\r
1003   EFI_STATUS                      Status;\r
1004   EFI_MISC_SYSTEM_EVENT_LOG_DATA  *SystemEventLog;\r
1005 \r
1006   Status          = EFI_SUCCESS;\r
1007   SystemEventLog  = NULL;\r
1008 \r
1009   SystemEventLog  = (EFI_MISC_SYSTEM_EVENT_LOG_DATA *) RecordData;\r
1010 \r
1011   //\r
1012   // Log Area Length\r
1013   //\r
1014   CopyMem (\r
1015     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogAreaLength),\r
1016     &(SystemEventLog->LogAreaLength),\r
1017     2\r
1018     );\r
1019 \r
1020   //\r
1021   // Log Header Start Offset\r
1022   //\r
1023   CopyMem (\r
1024     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogHeaderStartOffset),\r
1025     &(SystemEventLog->LogHeaderStartOffset),\r
1026     2\r
1027     );\r
1028 \r
1029   //\r
1030   // Log Data Start Offset\r
1031   //\r
1032   CopyMem (\r
1033     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogDataStartOffset),\r
1034     &(SystemEventLog->LogDataStartOffset),\r
1035     2\r
1036     );\r
1037 \r
1038   //\r
1039   // Access Method\r
1040   //\r
1041   CopyMem (\r
1042     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, AccessMethod),\r
1043     &(SystemEventLog->AccessMethod),\r
1044     1\r
1045     );\r
1046 \r
1047   //\r
1048   // Log Status\r
1049   //\r
1050   CopyMem (\r
1051     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogStatus),\r
1052     &(SystemEventLog->LogStatus),\r
1053     1\r
1054     );\r
1055 \r
1056   //\r
1057   // Log Change Token\r
1058   //\r
1059   CopyMem (\r
1060     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogChangeToken),\r
1061     &(SystemEventLog->LogChangeToken),\r
1062     4\r
1063     );\r
1064 \r
1065   //\r
1066   // Access Method Address\r
1067   //\r
1068   CopyMem (\r
1069     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, AccessMethodAddress),\r
1070     &(SystemEventLog->AccessMethodAddress),\r
1071     4\r
1072     );\r
1073 \r
1074   //\r
1075   // Log Header Format\r
1076   //\r
1077   CopyMem (\r
1078     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogHeaderFormat),\r
1079     &(SystemEventLog->LogHeaderFormat),\r
1080     1\r
1081     );\r
1082 \r
1083   //\r
1084   // Number of Supported Log Type Descriptors\r
1085   //\r
1086   CopyMem (\r
1087     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, NumberOfSupportedLogTypeDescriptors),\r
1088     &(SystemEventLog->NumberOfSupportedLogType),\r
1089     1\r
1090     );\r
1091 \r
1092   //\r
1093   // Length of each Log Type Descriptor\r
1094   //\r
1095   CopyMem (\r
1096     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LengthOfLogTypeDescriptor),\r
1097     &(SystemEventLog->LengthOfLogDescriptor),\r
1098     1\r
1099     );\r
1100 \r
1101   return Status;\r
1102 }\r
1103 \r
1104 /**\r
1105   Field Filling Function for Misc SubClass record type 21 - Pointing Device.\r
1106   \r
1107   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1108   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1109   @param RecordData       RecordData buffer will be filled.\r
1110   @param RecordDataSize   The size of RecordData buffer.\r
1111   \r
1112   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1113 **/\r
1114 EFI_STATUS\r
1115 SmbiosFldMiscType21 (\r
1116   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1117   IN      UINT32                    Offset,\r
1118   IN      VOID                      *RecordData,\r
1119   IN      UINT32                    RecordDataSize\r
1120   )\r
1121 {\r
1122   EFI_MISC_POINTING_DEVICE_TYPE_DATA *PointingDeviceData;\r
1123 \r
1124   PointingDeviceData = (EFI_MISC_POINTING_DEVICE_TYPE_DATA *) RecordData;\r
1125 \r
1126   //\r
1127   // Pointing Device Type\r
1128   //\r
1129   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, Type)) = (UINT8) (PointingDeviceData->PointingDeviceType);\r
1130 \r
1131   //\r
1132   // Pointing Device Interface\r
1133   //\r
1134   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, Interface)) = (UINT8) (PointingDeviceData->PointingDeviceInterface);\r
1135 \r
1136   //\r
1137   // Number Pointing Device Buttons\r
1138   //\r
1139   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, NumberOfButtons)) = (UINT8) (PointingDeviceData->NumberPointingDeviceButtons);\r
1140 \r
1141   return EFI_SUCCESS;\r
1142 }\r
1143 \r
1144 /**\r
1145   Field Filling Function for Misc SubClass record type 22 - Portable Battery.\r
1146   \r
1147   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1148   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1149   @param RecordData       RecordData buffer will be filled.\r
1150   @param RecordDataSize   The size of RecordData buffer.\r
1151   \r
1152   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1153 **/\r
1154 EFI_STATUS\r
1155 SmbiosFldMiscType22 (\r
1156   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1157   IN      UINT32                    Offset,\r
1158   IN      VOID                      *RecordData,\r
1159   IN      UINT32                    RecordDataSize\r
1160   )\r
1161 {\r
1162   EFI_MISC_PORTABLE_BATTERY *PortableBattery;\r
1163   STRING_REF                Chemistry;\r
1164   PortableBattery = (EFI_MISC_PORTABLE_BATTERY *)RecordData;\r
1165   \r
1166   //\r
1167   // Location\r
1168   // \r
1169   SmbiosFldString (\r
1170     StructureNode,\r
1171     OFFSET_OF (SMBIOS_TABLE_TYPE22, Location),\r
1172     &(PortableBattery->Location),\r
1173     2 // 64 * sizeof(CHAR16)\r
1174     );\r
1175   \r
1176   //\r
1177   // Manufacturer\r
1178   // \r
1179   SmbiosFldString (\r
1180     StructureNode,\r
1181     OFFSET_OF (SMBIOS_TABLE_TYPE22, Manufacturer),\r
1182     &(PortableBattery->Manufacturer),\r
1183     2 \r
1184     );  \r
1185 \r
1186   //\r
1187   // ManufactureDate\r
1188   // \r
1189   SmbiosFldString (\r
1190     StructureNode,\r
1191     OFFSET_OF (SMBIOS_TABLE_TYPE22, ManufactureDate),\r
1192     &(PortableBattery->ManufactureDate),\r
1193     2 \r
1194     );    \r
1195 \r
1196   //\r
1197   // SerialNumber\r
1198   // \r
1199   SmbiosFldString (\r
1200     StructureNode,\r
1201     OFFSET_OF (SMBIOS_TABLE_TYPE22, SerialNumber),\r
1202     &(PortableBattery->SerialNumber),\r
1203     2 \r
1204     );\r
1205 \r
1206   //\r
1207   // DeviceName\r
1208   // \r
1209   SmbiosFldString (\r
1210     StructureNode,\r
1211     OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceName),\r
1212     &(PortableBattery->DeviceName),\r
1213     2 \r
1214   );   \r
1215   \r
1216   //\r
1217   // DeviceChemistry\r
1218   //\r
1219   CopyMem (\r
1220     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceChemistry),\r
1221     &PortableBattery->DeviceChemistry,\r
1222     1\r
1223     );\r
1224 \r
1225   //\r
1226   // DesignCapacity\r
1227   //\r
1228   CopyMem (\r
1229     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceCapacity),\r
1230     &PortableBattery->DesignCapacity,\r
1231     2\r
1232     );\r
1233     \r
1234   //\r
1235   // DesignVoltage\r
1236   //\r
1237   CopyMem (\r
1238     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DesignVoltage),\r
1239     &PortableBattery->DesignVoltage,\r
1240     2\r
1241     );    \r
1242  \r
1243   //\r
1244   // SBDSVersionNumber\r
1245   //\r
1246   SmbiosFldString (\r
1247     StructureNode,\r
1248     OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSVersionNumber),\r
1249     &(PortableBattery->SBDSVersionNumber),\r
1250     2 // 64 * sizeof(CHAR16)\r
1251     );\r
1252 \r
1253   //\r
1254   // MaximumError\r
1255   //\r
1256   CopyMem (\r
1257     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, MaximumErrorInBatteryData),\r
1258     &PortableBattery->MaximumError,\r
1259     1\r
1260     ); \r
1261     \r
1262   //\r
1263   // SBDSSerialNumber\r
1264   //\r
1265   CopyMem (\r
1266     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSSerialNumber),\r
1267     &PortableBattery->SBDSSerialNumber,\r
1268     2\r
1269     );      \r
1270 \r
1271   //\r
1272   // SBDSManufactureDate\r
1273   //\r
1274   CopyMem (\r
1275     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSManufactureDate),\r
1276     &PortableBattery->SBDSManufactureDate,\r
1277     2\r
1278     );\r
1279 \r
1280   //\r
1281   // Avoid alignment issue on IPF\r
1282   //\r
1283   CopyMem (\r
1284     &Chemistry, \r
1285     &PortableBattery->SBDSDeviceChemistry,\r
1286     2\r
1287     );\r
1288 \r
1289   //\r
1290   // SBDSDeviceChemistry\r
1291   //    \r
1292   SmbiosFldString (\r
1293     StructureNode,\r
1294     OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSDeviceChemistry),\r
1295     &Chemistry,\r
1296     2 // 64 * sizeof(CHAR16)\r
1297     ); \r
1298     \r
1299   //\r
1300   // DesignCapacityMultiplier\r
1301   //\r
1302   CopyMem (\r
1303     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DesignCapacityMultiplier),\r
1304     &PortableBattery->DesignCapacityMultiplier,\r
1305     1\r
1306     );             \r
1307  \r
1308   //\r
1309   // OEMSpecific\r
1310   //\r
1311   CopyMem (\r
1312     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, OEMSpecific),\r
1313     &PortableBattery->OEMSpecific,\r
1314     4\r
1315     );\r
1316     \r
1317   return EFI_SUCCESS;\r
1318 }\r
1319 \r
1320 /**\r
1321   Field Filling Function for Misc SubClass record type 23 - System Reset.\r
1322   \r
1323   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1324   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1325   @param RecordData       RecordData buffer will be filled.\r
1326   @param RecordDataSize   The size of RecordData buffer.\r
1327   \r
1328   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1329 **/\r
1330 EFI_STATUS\r
1331 SmbiosFldMiscType23 (\r
1332   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1333   IN      UINT32                    Offset,\r
1334   IN      VOID                      *RecordData,\r
1335   IN      UINT32                    RecordDataSize\r
1336   )\r
1337 {\r
1338   EFI_MISC_RESET_CAPABILITIES_DATA  *SystemResetData;\r
1339 \r
1340   SystemResetData = (EFI_MISC_RESET_CAPABILITIES_DATA *) RecordData;\r
1341 \r
1342   //\r
1343   // Reset Capabilities\r
1344   //\r
1345   CopyMem (\r
1346     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, Capabilities),\r
1347     &(SystemResetData->ResetCapabilities),\r
1348     1\r
1349     );\r
1350 \r
1351   //\r
1352   // Reset Count\r
1353   //\r
1354   CopyMem (\r
1355     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, ResetCount),\r
1356     &(SystemResetData->ResetCount),\r
1357     2\r
1358     );\r
1359 \r
1360   //\r
1361   // Reset Limit\r
1362   //\r
1363   CopyMem (\r
1364     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, ResetLimit),\r
1365     &(SystemResetData->ResetLimit),\r
1366     2\r
1367     );\r
1368 \r
1369   //\r
1370   // Reset Timer Interval\r
1371   //\r
1372   CopyMem (\r
1373     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, TimerInterval),\r
1374     &(SystemResetData->ResetTimerInterval),\r
1375     2\r
1376     );\r
1377 \r
1378   //\r
1379   // Reset Timeout\r
1380   //\r
1381   CopyMem (\r
1382     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, Timeout),\r
1383     &(SystemResetData->ResetTimeout),\r
1384     2\r
1385     );\r
1386 \r
1387   return EFI_SUCCESS;\r
1388 }\r
1389 \r
1390 /**\r
1391   Field Filling Function for Misc SubClass record type 24 - Hardware Security.\r
1392   \r
1393   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1394   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1395   @param RecordData       RecordData buffer will be filled.\r
1396   @param RecordDataSize   The size of RecordData buffer.\r
1397   \r
1398   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1399 **/\r
1400 EFI_STATUS\r
1401 SmbiosFldMiscType24 (\r
1402   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1403   IN      UINT32                    Offset,\r
1404   IN      VOID                      *RecordData,\r
1405   IN      UINT32                    RecordDataSize\r
1406   )\r
1407 {\r
1408   EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA *HardwareSecurity;\r
1409   \r
1410   HardwareSecurity = (EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA *)RecordData;\r
1411   \r
1412   //\r
1413   // Hardware Security Settings\r
1414   //\r
1415   CopyMem (\r
1416     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE24, HardwareSecuritySettings),\r
1417     &HardwareSecurity->HardwareSecuritySettings,\r
1418     1\r
1419     );\r
1420   \r
1421   return EFI_SUCCESS;\r
1422 }\r
1423 \r
1424 /**\r
1425   Field Filling Function for Misc SubClass record type 25 - System Power Controls.\r
1426   \r
1427   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1428   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1429   @param RecordData       RecordData buffer will be filled.\r
1430   @param RecordDataSize   The size of RecordData buffer.\r
1431   \r
1432   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1433 **/\r
1434 EFI_STATUS\r
1435 SmbiosFldMiscType25 (\r
1436   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1437   IN      UINT32                    Offset,\r
1438   IN      VOID                      *RecordData,\r
1439   IN      UINT32                    RecordDataSize\r
1440   )\r
1441 {\r
1442   EFI_MISC_SCHEDULED_POWER_ON_MONTH *PowerOnMonth;\r
1443   \r
1444   PowerOnMonth = (EFI_MISC_SCHEDULED_POWER_ON_MONTH *)RecordData;\r
1445   \r
1446   //\r
1447   // ScheduledPoweronMonth\r
1448   //\r
1449   CopyMem (\r
1450     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnMonth),\r
1451     &PowerOnMonth->ScheduledPoweronMonth,\r
1452     1\r
1453     );\r
1454     \r
1455   //\r
1456   // ScheduledPoweronDayOfMonth\r
1457   //\r
1458   CopyMem (\r
1459     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnDayOfMonth),\r
1460     &PowerOnMonth->ScheduledPoweronDayOfMonth,\r
1461     1\r
1462     );    \r
1463 \r
1464   //\r
1465   // ScheduledPoweronHour\r
1466   //\r
1467   CopyMem (\r
1468     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnHour),\r
1469     &PowerOnMonth->ScheduledPoweronHour,\r
1470     1\r
1471     );   \r
1472 \r
1473   //\r
1474   // ScheduledPoweronMinute\r
1475   //\r
1476   CopyMem (\r
1477     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnMinute),\r
1478     &PowerOnMonth->ScheduledPoweronMinute,\r
1479     1\r
1480     );   \r
1481 \r
1482   //\r
1483   // ScheduledPoweronSecond\r
1484   //\r
1485   CopyMem (\r
1486     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnSecond),\r
1487     &PowerOnMonth->ScheduledPoweronSecond,\r
1488     1\r
1489     );\r
1490   \r
1491   return EFI_SUCCESS;\r
1492 }\r
1493 \r
1494 /**\r
1495   Field Filling Function for Misc SubClass record type 26 - Voltage Probe.\r
1496   \r
1497   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1498   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1499   @param RecordData       RecordData buffer will be filled.\r
1500   @param RecordDataSize   The size of RecordData buffer.\r
1501   \r
1502   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1503 **/\r
1504 EFI_STATUS\r
1505 SmbiosFldMiscType26 (\r
1506   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1507   IN      UINT32                    Offset,\r
1508   IN      VOID                      *RecordData,\r
1509   IN      UINT32                    RecordDataSize\r
1510   )\r
1511 {\r
1512   EFI_MISC_VOLTAGE_PROBE_DESCRIPTION *VoltageProbe;\r
1513   \r
1514   VoltageProbe = (EFI_MISC_VOLTAGE_PROBE_DESCRIPTION *)RecordData;\r
1515   \r
1516   //\r
1517   // VoltageProbe Description\r
1518   //\r
1519   SmbiosFldString (\r
1520     StructureNode,\r
1521     OFFSET_OF (SMBIOS_TABLE_TYPE26, Description),\r
1522     &(VoltageProbe->VoltageProbeDescription),\r
1523     2 // 64 * sizeof(CHAR16)\r
1524     );  \r
1525     \r
1526   //\r
1527   // VoltageProbeLocation\r
1528   //\r
1529   CopyMem (\r
1530     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, LocationAndStatus),\r
1531     &VoltageProbe->VoltageProbeLocation,\r
1532     1\r
1533     );    \r
1534     \r
1535   //\r
1536   // VoltageProbeMaximumValue\r
1537   //\r
1538   CopyMem (\r
1539     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, MaximumValue),\r
1540     &VoltageProbe->VoltageProbeMaximumValue,\r
1541     2\r
1542     );    \r
1543     \r
1544   //\r
1545   // VoltageProbeMinimumValue\r
1546   //\r
1547   CopyMem (\r
1548     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, MinimumValue),\r
1549     &VoltageProbe->VoltageProbeMinimumValue,\r
1550     2\r
1551     );   \r
1552 \r
1553   //\r
1554   // VoltageProbeResolution\r
1555   //\r
1556   CopyMem (\r
1557     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Resolution),\r
1558     &VoltageProbe->VoltageProbeResolution,\r
1559     2\r
1560     );    \r
1561 \r
1562   //\r
1563   // VoltageProbeTolerance\r
1564   //\r
1565   CopyMem (\r
1566     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Tolerance),\r
1567     &VoltageProbe->VoltageProbeTolerance,\r
1568     2\r
1569     );   \r
1570 \r
1571   //\r
1572   // VoltageProbeAccuracy\r
1573   //\r
1574   CopyMem (\r
1575     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Accuracy),\r
1576     &VoltageProbe->VoltageProbeAccuracy,\r
1577     2\r
1578     );  \r
1579     \r
1580   //\r
1581   // VoltageProbeNominalValue\r
1582   //\r
1583   CopyMem (\r
1584     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, NominalValue),\r
1585     &VoltageProbe->VoltageProbeNominalValue,\r
1586     2\r
1587     );   \r
1588 \r
1589   //\r
1590   // VoltageProbeOemDefined\r
1591   //\r
1592   CopyMem (\r
1593     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, OEMDefined),\r
1594     &VoltageProbe->VoltageProbeOemDefined,\r
1595     4\r
1596     );\r
1597   \r
1598   return EFI_SUCCESS;\r
1599 }\r
1600 \r
1601 /**\r
1602   Field Filling Function for Misc SubClass record type 27 - Cooling Device.\r
1603   \r
1604   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1605   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1606   @param RecordData       RecordData buffer will be filled.\r
1607   @param RecordDataSize   The size of RecordData buffer.\r
1608   \r
1609   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1610 **/\r
1611 EFI_STATUS\r
1612 SmbiosFldMiscType27 (\r
1613   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1614   IN      UINT32                    Offset,\r
1615   IN      VOID                      *RecordData,\r
1616   IN      UINT32                    RecordDataSize\r
1617   )\r
1618 {\r
1619   EFI_MISC_COOLING_DEVICE_TEMP_LINK *CoolingDevice;\r
1620   \r
1621   CoolingDevice = (EFI_MISC_COOLING_DEVICE_TEMP_LINK *)RecordData;\r
1622   \r
1623   //\r
1624   // Device Type\r
1625   //\r
1626   CopyMem (\r
1627     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, DeviceTypeAndStatus),\r
1628     &CoolingDevice->CoolingDeviceType,\r
1629     1\r
1630     );\r
1631   \r
1632   //\r
1633   // Temperature Probe\r
1634   //\r
1635   SmbiosFldInterLink (\r
1636     StructureNode,\r
1637     (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE27, TemperatureProbeHandle),\r
1638     28,  // SMBIOS type 28 - Temperature Probe\r
1639     &CoolingDevice->CoolingDeviceTemperatureLink,\r
1640     &gEfiMiscSubClassGuid\r
1641     );\r
1642   \r
1643   //\r
1644   // CoolingDeviceUnitGroup\r
1645   //\r
1646   CopyMem (\r
1647     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, CoolingUnitGroup),\r
1648     &CoolingDevice->CoolingDeviceUnitGroup,\r
1649     1\r
1650     );\r
1651 \r
1652   //\r
1653   // CoolingDeviceUnitGroup\r
1654   //\r
1655   CopyMem (\r
1656     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, OEMDefined),\r
1657     &CoolingDevice->CoolingDeviceOemDefined,\r
1658     4\r
1659     );\r
1660 \r
1661   //\r
1662   // CoolingDeviceNominalSpeed\r
1663   //\r
1664   CopyMem (\r
1665     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, NominalSpeed),\r
1666     &CoolingDevice->CoolingDeviceNominalSpeed,\r
1667     2\r
1668     );\r
1669   \r
1670   return EFI_SUCCESS;\r
1671 }\r
1672 \r
1673 /**\r
1674   Field Filling Function for Misc SubClass record type 28 -- Temperature Probe.\r
1675   \r
1676   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1677   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1678   @param RecordData       RecordData buffer will be filled.\r
1679   @param RecordDataSize   The size of RecordData buffer.\r
1680   \r
1681   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1682 **/\r
1683 EFI_STATUS\r
1684 SmbiosFldMiscType28 (\r
1685   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1686   IN      UINT32                    Offset,\r
1687   IN      VOID                      *RecordData,\r
1688   IN      UINT32                    RecordDataSize\r
1689   )\r
1690 {\r
1691   EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION *TemperatureProbe;\r
1692   \r
1693   TemperatureProbe = (EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION *)RecordData;\r
1694   \r
1695   //\r
1696   // TemperatureProbeDescription\r
1697   //\r
1698   SmbiosFldString (\r
1699     StructureNode,\r
1700     OFFSET_OF (SMBIOS_TABLE_TYPE28, Description),\r
1701     &(TemperatureProbe->TemperatureProbeDescription),\r
1702     2\r
1703     );\r
1704     \r
1705   //\r
1706   // TemperatureProbeLocation\r
1707   //\r
1708   CopyMem (\r
1709     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, LocationAndStatus),\r
1710     &TemperatureProbe->TemperatureProbeLocation,\r
1711     1\r
1712     ); \r
1713     \r
1714   //\r
1715   // TemperatureProbeMaximumValue\r
1716   //\r
1717   CopyMem (\r
1718     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, MaximumValue),\r
1719     &TemperatureProbe->TemperatureProbeMaximumValue,\r
1720     2\r
1721     );        \r
1722 \r
1723   //\r
1724   // TemperatureProbeMinimumValue\r
1725   //\r
1726   CopyMem (\r
1727     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, MinimumValue),\r
1728     &TemperatureProbe->TemperatureProbeMinimumValue,\r
1729     2\r
1730     );  \r
1731 \r
1732   //\r
1733   // TemperatureProbeResolution\r
1734   //\r
1735   CopyMem (\r
1736     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Resolution),\r
1737     &TemperatureProbe->TemperatureProbeResolution,\r
1738     2\r
1739     );  \r
1740   \r
1741 \r
1742   //\r
1743   // TemperatureProbeTolerance\r
1744   //\r
1745   CopyMem (\r
1746     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Tolerance),\r
1747     &TemperatureProbe->TemperatureProbeTolerance,\r
1748     2\r
1749     );  \r
1750 \r
1751   //\r
1752   // TemperatureProbeAccuracy\r
1753   //\r
1754   CopyMem (\r
1755     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Accuracy),\r
1756     &TemperatureProbe->TemperatureProbeAccuracy,\r
1757     2\r
1758     );\r
1759 \r
1760   //\r
1761   // TemperatureProbeNominalValue\r
1762   //\r
1763   CopyMem (\r
1764     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, NominalValue),\r
1765     &TemperatureProbe->TemperatureProbeNominalValue,\r
1766     2\r
1767     );\r
1768 \r
1769   //\r
1770   // TemperatureProbeOemDefined\r
1771   //\r
1772   CopyMem (\r
1773     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, OEMDefined),\r
1774     &TemperatureProbe->TemperatureProbeOemDefined,\r
1775     4\r
1776     );\r
1777   \r
1778   return EFI_SUCCESS;\r
1779 }  \r
1780 \r
1781 /**\r
1782   Field Filling Function for Misc SubClass record type 29 -- Electrical Current Probe.\r
1783   \r
1784   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1785   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1786   @param RecordData       RecordData buffer will be filled.\r
1787   @param RecordDataSize   The size of RecordData buffer.\r
1788   \r
1789   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1790 **/\r
1791 EFI_STATUS\r
1792 SmbiosFldMiscType29 (\r
1793   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1794   IN      UINT32                    Offset,\r
1795   IN      VOID                      *RecordData,\r
1796   IN      UINT32                    RecordDataSize\r
1797   )\r
1798 {\r
1799   EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION *ElectricalProbe;\r
1800   \r
1801   ElectricalProbe = (EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION *)RecordData;\r
1802   \r
1803   //\r
1804   // ElectricalCurrentProbeDescription\r
1805   //\r
1806   SmbiosFldString (\r
1807     StructureNode,\r
1808     OFFSET_OF (SMBIOS_TABLE_TYPE29, Description),\r
1809     &(ElectricalProbe->ElectricalCurrentProbeDescription),\r
1810     2 // 64 * sizeof(CHAR16)\r
1811     );\r
1812     \r
1813   //\r
1814   // ElectricalCurrentProbeLocation\r
1815   //\r
1816   CopyMem (\r
1817     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, LocationAndStatus),\r
1818     &ElectricalProbe->ElectricalCurrentProbeLocation,\r
1819     1\r
1820     );\r
1821     \r
1822   //\r
1823   // ElectricalCurrentProbeMaximumValue\r
1824   //\r
1825   CopyMem (\r
1826     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, MaximumValue),\r
1827     &ElectricalProbe->ElectricalCurrentProbeMaximumValue,\r
1828     2\r
1829     );   \r
1830 \r
1831   //\r
1832   // ElectricalCurrentProbeMinimumValue\r
1833   //\r
1834   CopyMem (\r
1835     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, MinimumValue),\r
1836     &ElectricalProbe->ElectricalCurrentProbeMinimumValue,\r
1837     2\r
1838     );   \r
1839 \r
1840   //\r
1841   // ElectricalCurrentProbeResolution\r
1842   //\r
1843   CopyMem (\r
1844     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Resolution),\r
1845     &ElectricalProbe->ElectricalCurrentProbeResolution,\r
1846     2\r
1847     );     \r
1848 \r
1849   //\r
1850   // ElectricalCurrentProbeTolerance\r
1851   //\r
1852   CopyMem (\r
1853     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Tolerance),\r
1854     &ElectricalProbe->ElectricalCurrentProbeTolerance,\r
1855     2\r
1856     );     \r
1857 \r
1858   //\r
1859   // ElectricalCurrentProbeAccuracy\r
1860   //\r
1861   CopyMem (\r
1862     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Accuracy),\r
1863     &ElectricalProbe->ElectricalCurrentProbeAccuracy,\r
1864     2\r
1865     );   \r
1866   //\r
1867   // ElectricalCurrentProbeNominalValue\r
1868   //\r
1869   CopyMem (\r
1870     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, NominalValue),\r
1871     &ElectricalProbe->ElectricalCurrentProbeNominalValue,\r
1872     2\r
1873     );   \r
1874 \r
1875   //\r
1876   // ElectricalCurrentProbeOemDefined\r
1877   //\r
1878   CopyMem (\r
1879     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, OEMDefined),\r
1880     &ElectricalProbe->ElectricalCurrentProbeOemDefined,\r
1881     4\r
1882     );\r
1883   \r
1884   return EFI_SUCCESS;\r
1885 }\r
1886 \r
1887 /**\r
1888   Field Filling Function for Misc SubClass record type 30 -- Out-of-Band Remote Access.\r
1889   \r
1890   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1891   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1892   @param RecordData       RecordData buffer will be filled.\r
1893   @param RecordDataSize   The size of RecordData buffer.\r
1894   \r
1895   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1896 **/\r
1897 EFI_STATUS\r
1898 SmbiosFldMiscType30 (\r
1899   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1900   IN      UINT32                    Offset,\r
1901   IN      VOID                      *RecordData,\r
1902   IN      UINT32                    RecordDataSize\r
1903   )\r
1904 {\r
1905   EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION *RemoteData;\r
1906   \r
1907   RemoteData = (EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION *)RecordData;\r
1908   \r
1909   //\r
1910   // ManufacturerNameDescription\r
1911   //\r
1912   SmbiosFldString (\r
1913     StructureNode,\r
1914     OFFSET_OF (SMBIOS_TABLE_TYPE30, ManufacturerName),\r
1915     &(RemoteData->RemoteAccessManufacturerNameDescription),\r
1916     2 // 64 * sizeof(CHAR16)\r
1917     );  \r
1918     \r
1919   //\r
1920   // RemoteAccessConnections\r
1921   //\r
1922   CopyMem (\r
1923     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE30, Connections),\r
1924     &RemoteData->RemoteAccessConnections,\r
1925     1\r
1926     );\r
1927   \r
1928   return EFI_SUCCESS;\r
1929 }\r
1930 \r
1931 /**\r
1932   Field Filling Function for Misc SubClass record type 32 -- System Boot Information.\r
1933   \r
1934   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1935   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1936   @param RecordData       RecordData buffer will be filled.\r
1937   @param RecordDataSize   The size of RecordData buffer.\r
1938   \r
1939   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1940 **/\r
1941 EFI_STATUS\r
1942 SmbiosFldMiscType32 (\r
1943   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1944   IN      UINT32                    Offset,\r
1945   IN      VOID                      *RecordData,\r
1946   IN      UINT32                    RecordDataSize\r
1947   )\r
1948 {\r
1949   EFI_STATUS                             Status;\r
1950   EFI_MISC_BOOT_INFORMATION_STATUS_DATA  *BootInfo;\r
1951 \r
1952   Status    = EFI_SUCCESS;\r
1953   BootInfo  = (EFI_MISC_BOOT_INFORMATION_STATUS_DATA *) RecordData;\r
1954 \r
1955   //\r
1956   // Set reserved bytes\r
1957   //\r
1958   ZeroMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, Reserved), 6);\r
1959 \r
1960   //\r
1961   // Set BootInformation Status\r
1962   //\r
1963   CopyMem (\r
1964     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, BootStatus),\r
1965     &BootInfo->BootInformationStatus,\r
1966     1\r
1967     );\r
1968 \r
1969   //\r
1970   // Set Additional Data\r
1971   //\r
1972   CopyMem (\r
1973     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, BootStatus) + 1,\r
1974     &BootInfo->BootInformationData,\r
1975     9\r
1976     );\r
1977 \r
1978   return Status;\r
1979 }\r
1980 \r
1981 /**\r
1982   Field Filling Function for Misc SubClass record type 34 -- Management Device.\r
1983   \r
1984   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1985   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
1986   @param RecordData       RecordData buffer will be filled.\r
1987   @param RecordDataSize   The size of RecordData buffer.\r
1988   \r
1989   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
1990 **/\r
1991 EFI_STATUS\r
1992 SmbiosFldMiscType34 (\r
1993   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
1994   IN      UINT32                    Offset,\r
1995   IN      VOID                      *RecordData,\r
1996   IN      UINT32                    RecordDataSize\r
1997   )\r
1998 {\r
1999   EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION *ManagementDevice;\r
2000   \r
2001   ManagementDevice = (EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION *)RecordData;\r
2002   \r
2003   //\r
2004   // ManagementDeviceDescription\r
2005   //\r
2006   SmbiosFldString (\r
2007     StructureNode,\r
2008     OFFSET_OF (SMBIOS_TABLE_TYPE34, Description),\r
2009     &(ManagementDevice->ManagementDeviceDescription),\r
2010     2 // 64 * sizeof(CHAR16)\r
2011     );  \r
2012     \r
2013   //\r
2014   // ManagementDeviceType\r
2015   //\r
2016   CopyMem (\r
2017     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, Type),\r
2018     &ManagementDevice->ManagementDeviceType,\r
2019     1\r
2020     );    \r
2021 \r
2022   //\r
2023   // ManagementDeviceAddress\r
2024   //\r
2025   CopyMem (\r
2026     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, Address),\r
2027     &ManagementDevice->ManagementDeviceAddress,\r
2028     4\r
2029     );    \r
2030 \r
2031   //\r
2032   // ManagementDeviceAddressType\r
2033   //\r
2034   CopyMem (\r
2035     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, AddressType),\r
2036     &ManagementDevice->ManagementDeviceAddressType,\r
2037     1\r
2038     );  \r
2039   \r
2040   return EFI_SUCCESS;\r
2041 }\r
2042 \r
2043 /**\r
2044   Field Filling Function for Misc SubClass record type 36 -- Management Device Threshold.\r
2045   \r
2046   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
2047   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
2048   @param RecordData       RecordData buffer will be filled.\r
2049   @param RecordDataSize   The size of RecordData buffer.\r
2050   \r
2051   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
2052 **/\r
2053 EFI_STATUS\r
2054 SmbiosFldMiscType36 (\r
2055   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
2056   IN      UINT32                    Offset,\r
2057   IN      VOID                      *RecordData,\r
2058   IN      UINT32                    RecordDataSize\r
2059   )\r
2060 {\r
2061   EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD *DeviceThreshold;\r
2062   \r
2063   DeviceThreshold = (EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD *)RecordData;\r
2064 \r
2065   //\r
2066   // LowerThresNonCritical\r
2067   //\r
2068   CopyMem (\r
2069     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdNonCritical),\r
2070     &DeviceThreshold->LowerThresNonCritical,\r
2071     2\r
2072     );    \r
2073 \r
2074   //\r
2075   // UpperThresNonCritical\r
2076   //\r
2077   CopyMem (\r
2078     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdNonCritical),\r
2079     &DeviceThreshold->UpperThresNonCritical,\r
2080     2\r
2081     );\r
2082     \r
2083   //\r
2084   // LowerThresCritical\r
2085   //\r
2086   CopyMem (\r
2087     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdCritical),\r
2088     &DeviceThreshold->LowerThresCritical,\r
2089     2\r
2090     );          \r
2091 \r
2092   //\r
2093   // UpperThresCritical\r
2094   //\r
2095   CopyMem (\r
2096     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdCritical),\r
2097     &DeviceThreshold->UpperThresCritical,\r
2098     2\r
2099     );   \r
2100 \r
2101   //\r
2102   // LowerThresNonRecover\r
2103   //\r
2104   CopyMem (\r
2105     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdNonRecoverable),\r
2106     &DeviceThreshold->LowerThresNonRecover,\r
2107     2\r
2108     );\r
2109 \r
2110   //\r
2111   // UpperThresNonRecover\r
2112   //\r
2113   CopyMem (\r
2114     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdNonRecoverable),\r
2115     &DeviceThreshold->UpperThresNonRecover,\r
2116     2\r
2117     );          \r
2118   \r
2119   return EFI_SUCCESS;\r
2120 }\r
2121 \r
2122 /**\r
2123   Field Filling Function for Misc SubClass record type 38 -- IPMI device info.\r
2124   \r
2125   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
2126   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
2127   @param RecordData       RecordData buffer will be filled.\r
2128   @param RecordDataSize   The size of RecordData buffer.\r
2129   \r
2130   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
2131 **/\r
2132 EFI_STATUS\r
2133 SmbiosFldMiscType38 (\r
2134   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
2135   IN      UINT32                    Offset,\r
2136   IN      VOID                      *RecordData,\r
2137   IN      UINT32                    RecordDataSize\r
2138   )\r
2139 {\r
2140   EFI_MISC_IPMI_INTERFACE_TYPE_DATA  *IpmiInfo;\r
2141 \r
2142   IpmiInfo  = (EFI_MISC_IPMI_INTERFACE_TYPE_DATA *) RecordData;\r
2143 \r
2144   //\r
2145   // Interface Type\r
2146   //\r
2147   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, InterfaceType)) = (UINT8) (IpmiInfo->IpmiInterfaceType);\r
2148 \r
2149   //\r
2150   // IPMI specification revision\r
2151   //\r
2152   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, IPMISpecificationRevision)) = \r
2153   (UINT8) ((IpmiInfo->IpmiSpecificationRevision.IpmiSpecLeastSignificantDigit) + \\r
2154            (IpmiInfo->IpmiSpecificationRevision.IpmiSpecMostSignificantDigit << 4));\r
2155 \r
2156   //\r
2157   // I2C slave address\r
2158   //\r
2159   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, I2CSlaveAddress)) = (UINT8) (IpmiInfo->IpmiI2CSlaveAddress);\r
2160 \r
2161   //\r
2162   // NV storage device address\r
2163   //\r
2164   *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, NVStorageDeviceAddress)) = (UINT8) (IpmiInfo->IpmiNvDeviceAddress);\r
2165 \r
2166   //\r
2167   // Base address\r
2168   //\r
2169   CopyMem (\r
2170     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, BaseAddress),\r
2171     &IpmiInfo->IpmiBaseAddress,\r
2172     8\r
2173     );\r
2174 \r
2175   return EFI_SUCCESS;\r
2176 }\r
2177 \r
2178 /**\r
2179   Field Filling Function for Misc SubClass record type 39 -- Power supply.\r
2180   \r
2181   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
2182   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
2183   @param RecordData       RecordData buffer will be filled.\r
2184   @param RecordDataSize   The size of RecordData buffer.\r
2185   \r
2186   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
2187 **/\r
2188 EFI_STATUS\r
2189 SmbiosFldMiscType39 (\r
2190   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
2191   IN      UINT32                    Offset,\r
2192   IN      VOID                      *RecordData,\r
2193   IN      UINT32                    RecordDataSize\r
2194   )\r
2195 {\r
2196   EFI_MISC_SYSTEM_POWER_SUPPLY *PowerSupply;\r
2197   \r
2198   PowerSupply = (EFI_MISC_SYSTEM_POWER_SUPPLY *)RecordData;\r
2199   \r
2200   //\r
2201   // PowerUnitGroup\r
2202   //\r
2203   CopyMem (\r
2204     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, PowerUnitGroup),\r
2205     &PowerSupply->PowerUnitGroup,\r
2206     1\r
2207     );  \r
2208     \r
2209   //\r
2210   // PowerSupplyLocation\r
2211   //\r
2212   SmbiosFldString (\r
2213     StructureNode,\r
2214     OFFSET_OF (SMBIOS_TABLE_TYPE39, Location),\r
2215     &(PowerSupply->PowerSupplyLocation),\r
2216     2 // 64 * sizeof(CHAR16)\r
2217     );    \r
2218 \r
2219   //\r
2220   // PowerSupplyDeviceName\r
2221   //\r
2222   SmbiosFldString (\r
2223     StructureNode,\r
2224     OFFSET_OF (SMBIOS_TABLE_TYPE39, DeviceName),\r
2225     &(PowerSupply->PowerSupplyDeviceName),\r
2226     2 // 64 * sizeof(CHAR16)\r
2227     );   \r
2228 \r
2229   //\r
2230   // PowerSupplyManufacturer\r
2231   //\r
2232   SmbiosFldString (\r
2233     StructureNode,\r
2234     OFFSET_OF (SMBIOS_TABLE_TYPE39, Manufacturer),\r
2235     &(PowerSupply->PowerSupplyManufacturer),\r
2236     2 // 64 * sizeof(CHAR16)\r
2237     ); \r
2238 \r
2239   //\r
2240   // PowerSupplySerialNumber\r
2241   //\r
2242   SmbiosFldString (\r
2243     StructureNode,\r
2244     OFFSET_OF (SMBIOS_TABLE_TYPE39, SerialNumber),\r
2245     &(PowerSupply->PowerSupplySerialNumber),\r
2246     2 // 64 * sizeof(CHAR16)\r
2247     );  \r
2248     \r
2249   //\r
2250   // PowerSupplyAssetTagNumber\r
2251   //\r
2252   SmbiosFldString (\r
2253     StructureNode,\r
2254     OFFSET_OF (SMBIOS_TABLE_TYPE39, AssetTagNumber),\r
2255     &(PowerSupply->PowerSupplyAssetTagNumber),\r
2256     2 // 64 * sizeof(CHAR16)\r
2257     );      \r
2258 \r
2259   //\r
2260   // PowerSupplyModelPartNumber\r
2261   //\r
2262   SmbiosFldString (\r
2263     StructureNode,\r
2264     OFFSET_OF (SMBIOS_TABLE_TYPE39, ModelPartNumber),\r
2265     &(PowerSupply->PowerSupplyModelPartNumber),\r
2266     2 // 64 * sizeof(CHAR16)\r
2267     ); \r
2268     \r
2269   //\r
2270   // PowerSupplyRevisionLevel\r
2271   //\r
2272   SmbiosFldString (\r
2273     StructureNode,\r
2274     OFFSET_OF (SMBIOS_TABLE_TYPE39, RevisionLevel),\r
2275     &(PowerSupply->PowerSupplyRevisionLevel),\r
2276     2 // 64 * sizeof(CHAR16)\r
2277     );      \r
2278 \r
2279   //\r
2280   // PowerSupplyMaxPowerCapacity\r
2281   //\r
2282   CopyMem (\r
2283     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, MaxPowerCapacity),\r
2284     &PowerSupply->PowerSupplyMaxPowerCapacity,\r
2285     2\r
2286     );\r
2287 \r
2288   //\r
2289   // PowerSupplyCharacteristics\r
2290   //\r
2291   CopyMem (\r
2292     (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, PowerSupplyCharacteristics),\r
2293     &PowerSupply->PowerSupplyCharacteristics,\r
2294     2\r
2295     );\r
2296     \r
2297   //\r
2298   // PowerSupplyInputVoltageProbeLink\r
2299   //\r
2300   SmbiosFldInterLink (\r
2301     StructureNode,\r
2302     (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, InputVoltageProbeHandle),\r
2303     26,  // SMBIOS type 26 - Voltage Probe\r
2304     &PowerSupply->PowerSupplyInputVoltageProbeLink,\r
2305     &gEfiMiscSubClassGuid\r
2306     );    \r
2307 \r
2308   //\r
2309   // PowerSupplyCoolingDeviceLink\r
2310   //\r
2311   SmbiosFldInterLink (\r
2312     StructureNode,\r
2313     (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, CoolingDeviceHandle),\r
2314     27,  // SMBIOS type 27 - Cooling Device\r
2315     &PowerSupply->PowerSupplyCoolingDeviceLink,\r
2316     &gEfiMiscSubClassGuid\r
2317     );   \r
2318 \r
2319   //\r
2320   // PowerSupplyInputCurrentProbeLink\r
2321   //\r
2322   SmbiosFldInterLink (\r
2323     StructureNode,\r
2324     (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, InputCurrentProbeHandle),\r
2325     29,  // SMBIOS type 29 - Electrical Current Probe\r
2326     &PowerSupply->PowerSupplyInputCurrentProbeLink,\r
2327     &gEfiMiscSubClassGuid\r
2328     );  \r
2329   \r
2330   return EFI_SUCCESS;\r
2331 }\r
2332 \r
2333 /**\r
2334   Field Filling Function for Misc SubClass record type 0x80-0xFF -- OEM.\r
2335   \r
2336   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
2337   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
2338   @param RecordData       RecordData buffer will be filled.\r
2339   @param RecordDataSize   The size of RecordData buffer.\r
2340   \r
2341   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
2342 **/\r
2343 EFI_STATUS\r
2344 SmbiosFldMiscTypeOEM (\r
2345   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
2346   IN      UINT32                    Offset,\r
2347   IN      VOID                      *RecordData,\r
2348   IN      UINT32                    RecordDataSize\r
2349   )\r
2350 {\r
2351   EFI_STATUS                            Status;\r
2352   UINT8                                 *NewRecordData;\r
2353   UINT32                                IncrementDataSize;\r
2354   UINT16                                Handle;\r
2355   INT8                                  Result;\r
2356   UINT32                                StructureSize;\r
2357   UINT8                                 CountOfString;\r
2358   \r
2359   Status             = EFI_SUCCESS;\r
2360   NewRecordData      = NULL;\r
2361 \r
2362   //\r
2363   // Check if OEM structure has included 2 trailing 0s in data record, if not, \r
2364   // we append them at the end to ensure OEM structure is always correct with 2 trailing 0s.\r
2365   //\r
2366   Result = SmbiosCheckTrailingZero (RecordData, RecordDataSize);\r
2367   \r
2368   if (Result != 0) {\r
2369     DEBUG ((EFI_D_ERROR, "OEM SMBIOS type %x is not valid!!\n", ((SMBIOS_STRUCTURE *) RecordData) -> Type));\r
2370     if (Result == -1) {\r
2371       //\r
2372       // No 2 trailing 0s exist\r
2373       //\r
2374       DEBUG ((EFI_D_ERROR, "OEM SMBIOS type has NO 2 trailing 0s!!\n"));\r
2375       IncrementDataSize = 2;\r
2376     } else {\r
2377       //\r
2378       // Only 1 trailing 0 exist at the end\r
2379       //\r
2380       DEBUG ((EFI_D_ERROR, "OEM SMBIOS type has only 1 trailing 0!!\n"));\r
2381       IncrementDataSize = 1;\r
2382     }\r
2383     NewRecordData = AllocateZeroPool (RecordDataSize + IncrementDataSize);\r
2384     ASSERT (NewRecordData != NULL);\r
2385     CopyMem (NewRecordData, RecordData, RecordDataSize);\r
2386     RecordData = NewRecordData;\r
2387     RecordDataSize += IncrementDataSize;\r
2388   }\r
2389   \r
2390   Status = GetSmbiosStructureSize (StructureNode->Structure, &StructureSize, &CountOfString);\r
2391   ASSERT_EFI_ERROR (Status);\r
2392   \r
2393   if (StructureSize < RecordDataSize) {\r
2394     Status = SmbiosEnlargeStructureBuffer (\r
2395                StructureNode,\r
2396                ((EFI_SMBIOS_TABLE_HEADER *)RecordData)->Length,\r
2397                StructureSize,\r
2398                RecordDataSize\r
2399                );\r
2400     if (EFI_ERROR (Status)) {\r
2401       return Status;\r
2402     }\r
2403   }\r
2404   \r
2405   //\r
2406   // Copy the entire data (including the Smbios structure header),\r
2407   // but preserve the handle that is already allocated.\r
2408   //\r
2409   Handle = StructureNode->Structure->Handle;\r
2410   CopyMem (\r
2411     StructureNode->Structure,\r
2412     RecordData,\r
2413     RecordDataSize\r
2414     );\r
2415   StructureNode->Structure->Handle = Handle;\r
2416   StructureNode->StructureSize = RecordDataSize;\r
2417   \r
2418   if (NewRecordData != NULL) {\r
2419     FreePool (NewRecordData);\r
2420   }\r
2421 \r
2422   return Status;\r
2423 }\r
2424 \r
2425 /**\r
2426   Field Filling Function for Misc SubClass record type 127 - End-of-Table.\r
2427   \r
2428   @param StructureNode    Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
2429   @param Offset           Offset of SMBIOS record which RecordData will be filled.\r
2430   @param RecordData       RecordData buffer will be filled.\r
2431   @param RecordDataSize   The size of RecordData buffer.\r
2432   \r
2433   @retval EFI_SUCCESS   Success fill RecordData into SMBIOS's record buffer.\r
2434 **/\r
2435 EFI_STATUS\r
2436 SmbiosFldMiscType127 (\r
2437   IN OUT  SMBIOS_STRUCTURE_NODE     *StructureNode,\r
2438   IN      UINT32                    Offset,\r
2439   IN      VOID                      *RecordData,\r
2440   IN      UINT32                    RecordDataSize\r
2441   )\r
2442 {\r
2443   return EFI_SUCCESS;\r
2444 }\r