]> git.proxmox.com Git - mirror_edk2.git/blame - EmbeddedPkg/Scripts/LauterbachT32/EfiLoadFv.cmm
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / EmbeddedPkg / Scripts / LauterbachT32 / EfiLoadFv.cmm
CommitLineData
98790d81 1;\r
2; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.<BR>\r
3; \r
878b807a 4; SPDX-License-Identifier: BSD-2-Clause-Patent\r
98790d81 5; \r
6\r
7 LOCAL &fvbase &fvsig &fvsig &ffsoffset &ffsfilesize &ffsfileaddr\r
8 ENTRY &fvbase\r
9\r
10 &fvsig=Data.Long(a:&fvbase+0x28)\r
11 if &fvsig!=0x4856465F\r
12 (\r
13 print "FV does not have proper signature, exiting"\r
14 return\r
15 )\r
16 \r
17 print "FV signature found"\r
18 \r
19 &fvlen=Data.Long(a:&fvbase+0x20)\r
20 \r
21 ; first ffs file is after fv header, use headerlength field\r
22 &ffsoffset=(Data.Long(a:&fvbase+0x30)&0xffff)\r
23 \r
24 ; loop through ffs files\r
25 &ffsfilesize=1\r
26 while (&ffsfilesize!=0)&&(&ffsoffset<(&fvlen))\r
27 (\r
28 &ffsfileaddr=&fvbase+&ffsoffset\r
29 ;print "found ffs file at &ffsfileaddr"\r
30 \r
31 ; process ffs file and increment by ffs file size field\r
32 gosub ProcessFfsFile &ffsfileaddr\r
33 \r
34 &ffsfilesize=(Data.Long(a:&ffsfileaddr+0x14)&0x00ffffff)\r
35 ;print "ffsfilesize is &ffsfilesize"\r
36 \r
37 &ffsoffset=&ffsoffset+&ffsfilesize\r
38\r
39 &ffsfilesize=(Data.Long(a:&fvbase+&ffsoffset+0x14)&0x00ffffff)\r
40 ;print "ffsfilesize now is &ffsfilesize"\r
41 if &ffsfilesize==0xffffff\r
42 (\r
43 enddo\r
44 )\r
45 \r
46 ; align to next 8 byte boundary\r
47 if (&ffsoffset&0x7)!=0\r
48 (\r
49 &ffsoffset=&ffsoffset+(0x8-(&ffsoffset&0x7))\r
50 )\r
51 \r
52 ) ; end fv ffs loop\r
53\r
54enddo\r
55\r
56ProcessFfsFile:\r
57 LOCAL &ffsfilestart &ffsfilesize &ffsfiletype &secoffset &secsize\r
58 ENTRY &ffsfilestart\r
59\r
60 ;print "processing ffs file at &ffsfilestart"\r
61 &ffsfilesize=Data.Long(a:&ffsfilestart+0x14)\r
62 &ffsfiletype=(&ffsfilesize&0xff000000)>>24.\r
63 &ffsfilesize=&ffsfilesize&0x00ffffff\r
64\r
65 if &ffsfiletype==0\r
66 (\r
67 return\r
68 )\r
69\r
70 print "ffs file at &ffsfilestart size &ffsfilesize type &ffsfiletype"\r
71\r
72 &secoffset=&ffsfilestart+0x18\r
73 \r
74 ; loop through sections in file\r
75 while &secoffset<(&ffsfilestart+&ffsfilesize)\r
76 (\r
77 print "secoffset at &secoffset"\r
78 \r
79 ; process fv section and increment section offset by size\r
80 &secsize=(Data.Long(a:&secoffset)&0x00ffffff)\r
81 \r
82 gosub ProcessFvSection &secoffset\r
83 \r
84 \r
85 &secoffset=(&secoffset+&secsize)\r
86\r
87 ;print "secsize is &secsize"\r
88 ;print "secoffset at &secoffset"\r
89 \r
90 ; align to next 4 byte boundary\r
91 if (&secoffset&0x3)!=0\r
92 (\r
93 &secoffset=&secoffset+(0x4-(&secoffset&0x3))\r
94 )\r
95 ) ; end section loop\r
96 return\r
97 \r
98 \r
99ProcessFvSection:\r
100 LOCAL &secstart &sectionsize &sectiontype &secoffset &secsize\r
101 ENTRY &secstart\r
102\r
103 &sectionsize=Data.Long(a:&secstart)\r
104 &sectiontype=((&sectionsize&0xff000000)>>24.)\r
105 &sectionsize=&sectionsize&0x00ffffff;\r
106\r
107 print "fv section at &secstart size &sectionsize type &sectiontype"\r
108\r
109 if &sectiontype==0x10 ; PE32\r
110 (\r
111 do EfiProcessPeImage (&secstart+0x4)\r
112 )\r
113 else\r
114 (\r
115 if &sectiontype==0x12 ; TE\r
116 (\r
117 do EfiProcessTeImage (&secstart+0x4)\r
118 )\r
119 else\r
120 (\r
121 print "unknown section type"\r
122 )\r
123 )\r
124 \r
125 return\r