1; 2; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.<BR> 3; 4; This program and the accompanying materials 5; are licensed and made available under the terms and conditions of the BSD License 6; which accompanies this distribution. The full text of the license may be found at 7; http://opensource.org/licenses/bsd-license.php 8; 9; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11; 12 13 LOCAL &fvbase &fvsig &fvsig &ffsoffset &ffsfilesize &ffsfileaddr 14 ENTRY &fvbase 15 16 &fvsig=Data.Long(a:&fvbase+0x28) 17 if &fvsig!=0x4856465F 18 ( 19 print "FV does not have proper signature, exiting" 20 return 21 ) 22 23 print "FV signature found" 24 25 &fvlen=Data.Long(a:&fvbase+0x20) 26 27 ; first ffs file is after fv header, use headerlength field 28 &ffsoffset=(Data.Long(a:&fvbase+0x30)&0xffff) 29 30 ; loop through ffs files 31 &ffsfilesize=1 32 while (&ffsfilesize!=0)&&(&ffsoffset<(&fvlen)) 33 ( 34 &ffsfileaddr=&fvbase+&ffsoffset 35 ;print "found ffs file at &ffsfileaddr" 36 37 ; process ffs file and increment by ffs file size field 38 gosub ProcessFfsFile &ffsfileaddr 39 40 &ffsfilesize=(Data.Long(a:&ffsfileaddr+0x14)&0x00ffffff) 41 ;print "ffsfilesize is &ffsfilesize" 42 43 &ffsoffset=&ffsoffset+&ffsfilesize 44 45 &ffsfilesize=(Data.Long(a:&fvbase+&ffsoffset+0x14)&0x00ffffff) 46 ;print "ffsfilesize now is &ffsfilesize" 47 if &ffsfilesize==0xffffff 48 ( 49 enddo 50 ) 51 52 ; align to next 8 byte boundary 53 if (&ffsoffset&0x7)!=0 54 ( 55 &ffsoffset=&ffsoffset+(0x8-(&ffsoffset&0x7)) 56 ) 57 58 ) ; end fv ffs loop 59 60enddo 61 62ProcessFfsFile: 63 LOCAL &ffsfilestart &ffsfilesize &ffsfiletype &secoffset &secsize 64 ENTRY &ffsfilestart 65 66 ;print "processing ffs file at &ffsfilestart" 67 &ffsfilesize=Data.Long(a:&ffsfilestart+0x14) 68 &ffsfiletype=(&ffsfilesize&0xff000000)>>24. 69 &ffsfilesize=&ffsfilesize&0x00ffffff 70 71 if &ffsfiletype==0 72 ( 73 return 74 ) 75 76 print "ffs file at &ffsfilestart size &ffsfilesize type &ffsfiletype" 77 78 &secoffset=&ffsfilestart+0x18 79 80 ; loop through sections in file 81 while &secoffset<(&ffsfilestart+&ffsfilesize) 82 ( 83 print "secoffset at &secoffset" 84 85 ; process fv section and increment section offset by size 86 &secsize=(Data.Long(a:&secoffset)&0x00ffffff) 87 88 gosub ProcessFvSection &secoffset 89 90 91 &secoffset=(&secoffset+&secsize) 92 93 ;print "secsize is &secsize" 94 ;print "secoffset at &secoffset" 95 96 ; align to next 4 byte boundary 97 if (&secoffset&0x3)!=0 98 ( 99 &secoffset=&secoffset+(0x4-(&secoffset&0x3)) 100 ) 101 ) ; end section loop 102 return 103 104 105ProcessFvSection: 106 LOCAL &secstart §ionsize §iontype &secoffset &secsize 107 ENTRY &secstart 108 109 §ionsize=Data.Long(a:&secstart) 110 §iontype=((§ionsize&0xff000000)>>24.) 111 §ionsize=§ionsize&0x00ffffff; 112 113 print "fv section at &secstart size §ionsize type §iontype" 114 115 if §iontype==0x10 ; PE32 116 ( 117 do EfiProcessPeImage (&secstart+0x4) 118 ) 119 else 120 ( 121 if §iontype==0x12 ; TE 122 ( 123 do EfiProcessTeImage (&secstart+0x4) 124 ) 125 else 126 ( 127 print "unknown section type" 128 ) 129 ) 130 131 return 132