Remove eclipse integration from agl-devel
[AGL/meta-agl.git] / scripts / ias_image_app
1 #!/usr/bin/env python
2 #
3 # Copyright (c) 2012, Intel Corporation.
4 # All rights reserved.
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 #    http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 #
19 # The CRC is a python translation of c code generated by (available under MIT license)
20 # pycrc 0.7.1 (http://www.tty1.net/pycrc/). Command line used:
21 # './pycrc.py --model=crc-32c --generate c --algorithm=table-driven'
22 #
23
24 import argparse
25 import os
26 import struct
27 import errno
28
29 __version__ = "0.0.1a"
30
31 #========================================================================
32 # IAS image creation
33 #========================================================================
34
35 MAGIC  = 0x2E6B7069
36 HEADER = struct.Struct('IIIIIII')
37
38 def image (payload, ext_hdr=''):
39
40     payload_len = round_up(len(payload))
41     image_len   = HEADER.size + len(ext_hdr) + payload_len + 4
42     bytes       = bytearray (image_len)
43
44     type = 0x30000
45     version = 0
46     length  = payload_len
47     offset  = HEADER.size + len(ext_hdr)
48     uncomp  = length    ## compression not supported (yet)
49     hcrc    = 0
50     HEADER.pack_into (bytes, 0,
51                       MAGIC, type, version, length, offset, uncomp, hcrc)
52     crc = crc32c_buf (bytes[0:24])
53     struct.pack_into ('I', bytes, 24, crc)
54
55     bytes[HEADER.size:offset] = ext_hdr
56     bytes[offset:offset+len(payload)] = payload
57     crc = crc32c_buf(bytes[HEADER.size:offset+length])
58     struct.pack_into ('I', bytes, offset+length, crc)
59
60     return bytes
61
62 def multi_image (files):
63
64     nfile = len(files)
65
66     subimg = []
67     o = 0
68     for f in files:
69         l = len(f)
70         subimg.append((o, l))
71         o += round_up(l)
72
73     sizes   = bytearray(4*nfile)
74     payload = bytearray(o)
75     for i in range(nfile):
76         o, l = subimg[i]
77         struct.pack_into ('I', sizes, 4*i, l)
78         payload[o:o+l] = files[i]
79
80     return image (payload, sizes)
81
82 # ========================================================================
83 # Support functions.
84 # ========================================================================
85
86 def round_up (value, div=4):
87     """Round VALUE up to the next multiple of DIV (a power of two)."""
88     return (value + div - 1) & ~(div - 1)
89
90 # ========================================================================
91 #
92 #  CRC32C 
93 #
94 # Prehashed table of value to speed script execution
95 #
96 _CRC32C_TABLE = (
97
98     0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
99     0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B, 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
100     0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B, 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
101     0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54, 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
102     0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A, 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
103     0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5, 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
104     0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45, 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
105     0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A, 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
106     0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48, 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
107     0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687, 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
108     0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927, 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
109     0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8, 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
110     0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096, 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
111     0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859, 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
112     0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9, 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
113     0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36, 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
114     0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C, 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
115     0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043, 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
116     0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3, 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
117     0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C, 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
118     0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652, 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
119     0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D, 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
120     0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D, 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
121     0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2, 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
122     0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530, 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
123     0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF, 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
124     0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F, 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
125     0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90, 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
126     0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE, 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
127     0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321, 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
128     0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81, 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
129     0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
130 )
131
132 def crc32c (byte, crc=0xffffffff):
133
134     crc = (crc >> 8) ^ _CRC32C_TABLE[(crc ^ byte) & 0xff]
135     return crc
136
137 def crc32c_buf (buf, crc=0xffffffff):
138
139     for b in buf:
140         crc = crc32c (b, crc)
141     return crc
142
143 # ========================================================================
144
145 #========================================================================
146 # Main program: Argument handling.
147 #========================================================================
148
149 def parse_args():
150     """Parse the command line and return an argparse.Namespace object."""
151
152     parser = argparse.ArgumentParser(description='Create a NON SIGNED IAS image to be used with DEVEL-ABL.')
153
154     parser.add_argument ('-V', '--version',
155                          action='version', version='%(prog)s ' + __version__)
156     parser.add_argument ('-o', '--output',
157                          default='image.bin',
158                          help='write final image to OUTPUT')
159     parser.add_argument ('-i', '--ignore',
160                          default='',
161                          help='provided for script compatibility with full featured ias_image_app',)
162
163     parser.add_argument ('file',
164                          help='add FILE to payload of IMAGE being created',
165                          nargs='+',
166                          metavar='file')
167
168     return parser.parse_args()
169
170 # ------------------------------------------------------------------------
171
172 def main():
173
174     a = parse_args()
175     try:
176         data = [open(f, 'rb').read() for f in a.file]
177     except IOError:
178         print ('error: Cannot open', a.file)
179         exit (1) 
180     print ('Creating NON signed Linux Kernel for ABL')
181     img = multi_image(data)
182     try:
183         open (a.output, 'wb').write (img)
184     except IOError as err:
185         print ('error: Cannot open for write', a.output)
186         exit (2)     
187
188 if __name__ == '__main__':
189     main()
190
191 # ========================================================================