xml2pib.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. /*====================================================================*
  2. *
  3. * Copyright (c) 2013 Qualcomm Atheros, Inc.
  4. *
  5. * All rights reserved.
  6. *
  7. *====================================================================*/
  8. /*====================================================================*
  9. *
  10. * xml2pib.c -
  11. *
  12. * Contributor(s):
  13. * Charles Maier <cmaier@qca.qualcomm.com>
  14. *
  15. *--------------------------------------------------------------------*/
  16. /*====================================================================*
  17. * system header files;
  18. *--------------------------------------------------------------------*/
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <unistd.h>
  22. #include <fcntl.h>
  23. #include <errno.h>
  24. /*====================================================================*
  25. * custom header files;
  26. *--------------------------------------------------------------------*/
  27. #include "../tools/getoptv.h"
  28. #include "../tools/flags.h"
  29. #include "../tools/error.h"
  30. #include "../tools/files.h"
  31. #include "../nodes/node.h"
  32. #include "../key/HPAVKey.h"
  33. #include "../nvm/nvm.h"
  34. #include "../pib/pib.h"
  35. /*====================================================================*
  36. * custom source files;
  37. *--------------------------------------------------------------------*/
  38. #ifndef MAKEFILE
  39. #include "../tools/getoptv.c"
  40. #include "../tools/putoptv.c"
  41. #include "../tools/version.c"
  42. #include "../tools/checksum32.c"
  43. #include "../tools/fdchecksum32.c"
  44. #include "../tools/checksum32.c"
  45. #include "../tools/hexstring.c"
  46. #include "../tools/hexdecode.c"
  47. #include "../tools/strfbits.c"
  48. #include "../tools/todigit.c"
  49. #include "../tools/output.c"
  50. #include "../tools/emalloc.c"
  51. #include "../tools/error.c"
  52. #endif
  53. #ifndef MAKEFILE
  54. #include "../key/SHA256Reset.c"
  55. #include "../key/SHA256Block.c"
  56. #include "../key/SHA256Write.c"
  57. #include "../key/SHA256Fetch.c"
  58. #include "../key/HPAVKeyNID.c"
  59. #include "../key/keys.c"
  60. #endif
  61. #ifndef MAKEFILE
  62. #include "../nodes/xmlopen.c"
  63. #include "../nodes/xmlnode.c"
  64. #include "../nodes/xmlscan.c"
  65. #include "../nodes/xmledit.c"
  66. #include "../nodes/xmltree.c"
  67. #include "../nodes/xmlfree.c"
  68. #endif
  69. /*====================================================================*
  70. *
  71. * signed pibedit1 (struct node const * node, void * memory, size_t extent);
  72. *
  73. * Contributor(s):
  74. * Charles Maier <cmaier@qca.qualcomm.com>
  75. *
  76. *--------------------------------------------------------------------*/
  77. static signed pibedit1 (struct node const * node, void * memory, size_t extent)
  78. {
  79. struct simple_pib * simple_pib = (struct simple_pib *) (memory);
  80. xmledit (node, memory, extent);
  81. checksum32 (memory, extent, simple_pib->CHECKSUM);
  82. return (0);
  83. }
  84. /*====================================================================*
  85. *
  86. * signed pibedit2 (char const * filename, struct node const * node, char * memory, size_t extent);
  87. *
  88. * search a panther/lynx image chain looking for PIB images and
  89. * verify each one; return 0 on success or -1 on error; errors
  90. * occur due to an invalid image chain or a bad parameter block;
  91. *
  92. * this implementation reads the parameter block from file into
  93. * into memory and checks it there;
  94. *
  95. * Contributor(s):
  96. * Charles Maier <cmaier@qca.qualcomm.com>
  97. *
  98. *--------------------------------------------------------------------*/
  99. static signed pibedit2 (char const * filename, struct node const * node, char * memory, size_t extent)
  100. {
  101. struct panther_nvm_header * header;
  102. uint32_t origin = ~ 0;
  103. uint32_t offset = 0;
  104. unsigned length = 0;
  105. unsigned module = 0;
  106. do
  107. {
  108. header = (struct panther_nvm_header *) (memory + offset);
  109. if (LE16TOH (header->MajorVersion) != 1)
  110. {
  111. error (1, 0, NVM_HDR_VERSION, filename, module);
  112. }
  113. if (LE16TOH (header->MinorVersion) != 1)
  114. {
  115. error (1, 0, NVM_HDR_VERSION, filename, module);
  116. }
  117. if (LE32TOH (header->PrevHeader) != origin)
  118. {
  119. error (1, 0, NVM_HDR_LINK, filename, module);
  120. }
  121. if (checksum32 (header, sizeof (* header), 0))
  122. {
  123. error (1, 0, NVM_HDR_CHECKSUM, filename, module);
  124. }
  125. origin = offset;
  126. offset += sizeof (* header);
  127. extent -= sizeof (* header);
  128. length = LE32TOH (header->ImageLength);
  129. if (checksum32 (memory + offset, length, header->ImageChecksum))
  130. {
  131. error (1, 0, NVM_IMG_CHECKSUM, filename, module);
  132. }
  133. if (LE32TOH (header->ImageType) == NVM_IMAGE_PIB)
  134. {
  135. xmledit (node, memory + offset, length);
  136. header->ImageChecksum = checksum32 (memory + offset, length, 0);
  137. header->HeaderChecksum = checksum32 (header, sizeof (* header), header->HeaderChecksum);
  138. return (0);
  139. }
  140. offset += length;
  141. extent -= length;
  142. module++;
  143. }
  144. while (~ header->NextHeader);
  145. return (- 1);
  146. }
  147. /*====================================================================*
  148. *
  149. * signed function (char const * filename);
  150. *
  151. * determine the type of file and call appropriate functions;
  152. *
  153. * Contributor(s):
  154. * Charles Maier <cmaier@qca.qualcomm.com>
  155. *
  156. *--------------------------------------------------------------------*/
  157. static signed function (char const * filename, struct node const * node)
  158. {
  159. char * memory = 0;
  160. signed extent = 0;
  161. signed fd;
  162. if ((fd = open (filename, O_BINARY | O_RDWR)) == - 1)
  163. {
  164. error (1, errno, FILE_CANTOPEN, filename);
  165. }
  166. if ((extent = lseek (fd, 0, SEEK_END)) == - 1)
  167. {
  168. error (1, errno, FILE_CANTSIZE, filename);
  169. }
  170. if (! (memory = (char *) (malloc (extent))))
  171. {
  172. error (1, errno, FILE_CANTLOAD, filename);
  173. }
  174. if (lseek (fd, 0, SEEK_SET))
  175. {
  176. error (1, errno, FILE_CANTHOME, filename);
  177. }
  178. if (read (fd, memory, extent) != extent)
  179. {
  180. error (1, errno, FILE_CANTREAD, filename);
  181. }
  182. if (LE32TOH (* (uint32_t *) (memory)) == 0x60000000)
  183. {
  184. error (1, 0, FILE_WONTREAD, filename);
  185. }
  186. if (LE32TOH (* (uint32_t *) (memory)) == 0x00010001)
  187. {
  188. pibedit2 (filename, node, memory, extent);
  189. }
  190. else
  191. {
  192. pibedit1 (node, memory, extent);
  193. }
  194. if (lseek (fd, 0, SEEK_SET))
  195. {
  196. error (1, errno, FILE_CANTHOME, filename);
  197. }
  198. if (write (fd, memory, extent) != extent)
  199. {
  200. error (1, errno, FILE_CANTSAVE, filename);
  201. }
  202. close (fd);
  203. return (0);
  204. }
  205. /*====================================================================*
  206. *
  207. * int main (int argc, char const * argv []);
  208. *
  209. *
  210. * Contributor(s):
  211. * Charles Maier <cmaier@qca.qualcomm.com>
  212. *
  213. *--------------------------------------------------------------------*/
  214. int main (int argc, char const * argv [])
  215. {
  216. static char const * optv [] =
  217. {
  218. "f:qv",
  219. "pib-file [pib-file] [...]",
  220. "Qualcomm Atheros PLC Parameter File Editor",
  221. "f f\txmlfile is (f)",
  222. "q\tquiet",
  223. "v\tverbose",
  224. (char const *) (0)
  225. };
  226. struct node * node = (struct node *) (0);
  227. flag_t flags = (flag_t) (0);
  228. signed c;
  229. optind = 1;
  230. while (~ (c = getoptv (argc, argv, optv)))
  231. {
  232. switch (c)
  233. {
  234. case 'f':
  235. node = xmlopen (optarg);
  236. break;
  237. case 'm':
  238. _setbits (flags, PIB_MANIFEST);
  239. break;
  240. case 'q':
  241. _setbits (flags, PIB_SILENCE);
  242. break;
  243. case 'v':
  244. _setbits (flags, PIB_VERBOSE);
  245. break;
  246. default:
  247. break;
  248. }
  249. }
  250. argc -= optind;
  251. argv += optind;
  252. while ((argc) && (* argv))
  253. {
  254. function (* argv, node);
  255. argc--;
  256. argv++;
  257. }
  258. if (_anyset (flags, PIB_VERBOSE))
  259. {
  260. xmltree (node);
  261. }
  262. xmlfree (node);
  263. return (0);
  264. }