]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / Capsule / GenerateWindowsDriver.py
1 ## @file
2 # Generate a capsule windows driver.
3 #
4 # Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
5 # SPDX-License-Identifier: BSD-2-Clause-Patent
6 #
7
8 '''
9 GenerateWindowsDriver
10 '''
11
12 import sys
13 import argparse
14 import uuid
15 import struct
16 import subprocess
17 import os
18 import tempfile
19 import shutil
20 import platform
21 import re
22 import logging
23 from WindowsCapsuleSupportHelper import WindowsCapsuleSupportHelper
24 from Common.Uefi.Capsule.FmpCapsuleHeader import FmpCapsuleHeaderClass
25 from Common.Uefi.Capsule.UefiCapsuleHeader import UefiCapsuleHeaderClass
26
27 #
28 # Globals for help information
29 #
30 __prog__ = 'GenerateWindowsDriver'
31 __version__ = '0.0'
32 __copyright__ = 'Copyright (c) 2019, Intel Corporation. All rights reserved.'
33 __description__ = 'Generate Capsule Windows Driver.\n'
34
35 def GetCapGuid (InputFile):
36 with open(InputFile, 'rb') as File:
37 Buffer = File.read()
38 try:
39 Result = UefiCapsuleHeader.Decode (Buffer)
40 if len (Result) > 0:
41 FmpCapsuleHeader.Decode (Result)
42 for index in range (0, FmpCapsuleHeader.PayloadItemCount):
43 Guid = FmpCapsuleHeader.GetFmpCapsuleImageHeader (index).UpdateImageTypeId
44 return Guid
45 except:
46 print ('GenerateCapsule: error: can not decode capsule')
47 sys.exit (1)
48
49 def ArgCheck(args):
50 Version = args.CapsuleVersion_DotString.split('.')
51
52 if len(Version) != 4:
53 logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)
54 raise ValueError("Name invalid.")
55 for sub in Version:
56 if int(sub, 16) > 65536:
57 logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)
58 raise ValueError("Name exceed limit 65536.")
59
60 if not (re.compile(r'[\a-fA-F0-9]*$')).match(args.CapsuleVersion_DotString):
61 logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)
62 raise ValueError("Name has invalid chars.")
63
64 def CapsuleGuidCheck(InputFile, Guid):
65 CapGuid = GetCapGuid(InputFile)
66 if (str(Guid).lower() != str(CapGuid)):
67 print('GenerateWindowsDriver error: Different Guid from Capsule')
68 sys.exit(1)
69
70 if __name__ == '__main__':
71 def convert_arg_line_to_args(arg_line):
72 for arg in arg_line.split():
73 if not arg.strip():
74 continue
75 yield arg
76
77 parser = argparse.ArgumentParser (
78 prog = __prog__,
79 description = __description__ + __copyright__,
80 conflict_handler = 'resolve',
81 fromfile_prefix_chars = '@'
82 )
83 parser.convert_arg_line_to_args = convert_arg_line_to_args
84 parser.add_argument("--output-folder", dest = 'OutputFolder', help = "firmware resource update driver package output folder.")
85 parser.add_argument("--product-fmp-guid", dest = 'ProductFmpGuid', help = "firmware GUID of resource update driver package")
86 parser.add_argument("--capsuleversion-dotstring", dest = 'CapsuleVersion_DotString', help = "firmware version with date on which update driver package is authored")
87 parser.add_argument("--capsuleversion-hexstring", dest = 'CapsuleVersion_HexString', help = "firmware version in Hex of update driver package")
88 parser.add_argument("--product-fw-provider", dest = 'ProductFwProvider', help = "vendor/provider of entire firmware resource update driver package")
89 parser.add_argument("--product-fw-mfg-name", dest = 'ProductFwMfgName', help = "manufacturer/vendor of firmware resource update driver package")
90 parser.add_argument("--product-fw-desc", dest = "ProductFwDesc", help = "description about resource update driver")
91 parser.add_argument("--capsule-file-name", dest = 'CapsuleFileName', help ="firmware resource image file")
92 parser.add_argument("--pfx-file", dest = 'PfxFile', help = "pfx file path used to sign resource update driver")
93 parser.add_argument("--arch", dest = 'Arch', help = "supported architecture:arm/x64/amd64/arm64/aarch64", default = 'amd64')
94 parser.add_argument("--operating-system-string", dest = 'OperatingSystemString', help = "supported operating system:win10/10/10_au/10_rs2/10_rs3/10_rs4/server10/server2016/serverrs2/serverrs3/serverrs4", default = "win10")
95
96 args = parser.parse_args()
97 InputFile = os.path.join(args.OutputFolder, '') + args.CapsuleFileName
98 UefiCapsuleHeader = UefiCapsuleHeaderClass ()
99 FmpCapsuleHeader = FmpCapsuleHeaderClass ()
100 CapsuleGuidCheck(InputFile, args.ProductFmpGuid)
101 ArgCheck(args)
102 ProductName = os.path.splitext(args.CapsuleFileName)[0]
103 WindowsDriver = WindowsCapsuleSupportHelper ()
104
105 WindowsDriver.PackageWindowsCapsuleFiles (
106 args.OutputFolder,
107 ProductName,
108 args.ProductFmpGuid,
109 args.CapsuleVersion_DotString,
110 args.CapsuleVersion_HexString,
111 args.ProductFwProvider,
112 args.ProductFwMfgName,
113 args.ProductFwDesc,
114 args.CapsuleFileName,
115 args.PfxFile,
116 None,
117 None,
118 args.Arch,
119 args.OperatingSystemString
120 )