Home | History | Annotate | Download | only in LauterbachT32
      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 
     60 enddo
     61 
     62 ProcessFfsFile:
     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   
    105 ProcessFvSection:
    106   LOCAL &secstart &sectionsize &sectiontype &secoffset &secsize
    107   ENTRY &secstart
    108 
    109 	&sectionsize=Data.Long(a:&secstart)
    110   &sectiontype=((&sectionsize&0xff000000)>>24.)
    111   &sectionsize=&sectionsize&0x00ffffff;
    112 
    113 	print "fv section at &secstart size &sectionsize type &sectiontype"
    114 
    115 	if &sectiontype==0x10 ; PE32
    116   (
    117     do EfiProcessPeImage (&secstart+0x4)
    118 	)
    119 	else
    120 	(
    121 	  if &sectiontype==0x12 ; TE
    122 	  (
    123 		  do EfiProcessTeImage (&secstart+0x4)
    124  	  )
    125  	  else
    126     (
    127       print "unknown section type"
    128     )
    129  	)
    130   
    131   return
    132