1/* 2 * IxNpeMicrocode.h - Headerfile for compiling the Intel microcode C file 3 * 4 * Copyright (C) 2006 Christian Hohnstaedt <chohnstaedt@innominate.com> 5 * 6 * This file is released under the GPLv2 7 * 8 * 9 * compile with 10 * 11 * gcc -Wall IxNpeMicrocode.c -o IxNpeMicrocode 12 * 13 * Executing the resulting binary on your build-host creates the 14 * "NPE-[ABC].xxxxxxxx" files containing the selected microcode 15 * 16 * fetch the IxNpeMicrocode.c from the Intel Access Library. 17 * It will include this header. 18 * 19 * select Images for every NPE from the following 20 * (used C++ comments for easy uncommenting ....) 21 */ 22 23// #define IX_NPEDL_NPEIMAGE_NPEA_ETH_SPAN_MASK_FIREWALL_VLAN_QOS_HDR_CONV_EXTMIB 24// #define IX_NPEDL_NPEIMAGE_NPEA_ETH_SPAN_VLAN_QOS_HDR_CONV_EXTMIB 25// #define IX_NPEDL_NPEIMAGE_NPEA_ETH_LEARN_FILTER_SPAN_MASK_FIREWALL_VLAN_QOS_EXTMIB 26// #define IX_NPEDL_NPEIMAGE_NPEA_HSS_TSLOT_SWITCH 27#define IX_NPEDL_NPEIMAGE_NPEA_ETH_SPAN_FIREWALL_VLAN_QOS_HDR_CONV 28// #define IX_NPEDL_NPEIMAGE_NPEA_ETH_LEARN_FILTER_SPAN_FIREWALL_VLAN_QOS 29// #define IX_NPEDL_NPEIMAGE_NPEA_ETH_LEARN_FILTER_SPAN_FIREWALL 30#define IX_NPEDL_NPEIMAGE_NPEA_HSS_2_PORT 31// #define IX_NPEDL_NPEIMAGE_NPEA_DMA 32// #define IX_NPEDL_NPEIMAGE_NPEA_ATM_MPHY_12_PORT 33// #define IX_NPEDL_NPEIMAGE_NPEA_HSS0_ATM_MPHY_1_PORT 34// #define IX_NPEDL_NPEIMAGE_NPEA_HSS0_ATM_SPHY_1_PORT 35// #define IX_NPEDL_NPEIMAGE_NPEA_HSS0 36// #define IX_NPEDL_NPEIMAGE_NPEA_WEP 37 38 39// #define IX_NPEDL_NPEIMAGE_NPEB_ETH_SPAN_MASK_FIREWALL_VLAN_QOS_HDR_CONV_EXTMIB 40// #define IX_NPEDL_NPEIMAGE_NPEB_ETH_SPAN_VLAN_QOS_HDR_CONV_EXTMIB 41// #define IX_NPEDL_NPEIMAGE_NPEB_ETH_LEARN_FILTER_SPAN_MASK_FIREWALL_VLAN_QOS_EXTMIB 42// #define IX_NPEDL_NPEIMAGE_NPEB_DMA 43#define IX_NPEDL_NPEIMAGE_NPEB_ETH_SPAN_FIREWALL_VLAN_QOS_HDR_CONV 44// #define IX_NPEDL_NPEIMAGE_NPEB_ETH_LEARN_FILTER_SPAN_FIREWALL_VLAN_QOS 45// #define IX_NPEDL_NPEIMAGE_NPEB_ETH_LEARN_FILTER_SPAN_FIREWALL 46 47 48// #define IX_NPEDL_NPEIMAGE_NPEC_ETH_SPAN_MASK_FIREWALL_VLAN_QOS_HDR_CONV_EXTMIB 49// #define IX_NPEDL_NPEIMAGE_NPEC_ETH_SPAN_VLAN_QOS_HDR_CONV_EXTMIB 50// #define IX_NPEDL_NPEIMAGE_NPEC_ETH_LEARN_FILTER_SPAN_MASK_FIREWALL_VLAN_QOS_EXTMIB 51// #define IX_NPEDL_NPEIMAGE_NPEC_DMA 52// #define IX_NPEDL_NPEIMAGE_NPEC_CRYPTO_AES_ETH_LEARN_FILTER_SPAN 53// #define IX_NPEDL_NPEIMAGE_NPEC_CRYPTO_AES_ETH_LEARN_FILTER_FIREWALL 54#define IX_NPEDL_NPEIMAGE_NPEC_CRYPTO_AES_CCM_ETH 55// #define IX_NPEDL_NPEIMAGE_NPEC_CRYPTO_AES_CCM_EXTSHA_ETH 56// #define IX_NPEDL_NPEIMAGE_NPEC_CRYPTO_ETH_LEARN_FILTER_SPAN_FIREWALL 57// #define IX_NPEDL_NPEIMAGE_NPEC_ETH_SPAN_FIREWALL_VLAN_QOS_HDR_CONV 58// #define IX_NPEDL_NPEIMAGE_NPEC_ETH_LEARN_FILTER_SPAN_FIREWALL_VLAN_QOS 59// #define IX_NPEDL_NPEIMAGE_NPEC_ETH_LEARN_FILTER_SPAN_FIREWALL 60 61 62#include <stdio.h> 63#include <unistd.h> 64#include <stdlib.h> 65#include <netinet/in.h> 66#include <sys/types.h> 67#include <sys/stat.h> 68#include <fcntl.h> 69#include <errno.h> 70#include <endian.h> 71#include <byteswap.h> 72#include <string.h> 73 74#if __BYTE_ORDER == __LITTLE_ENDIAN 75#define to_le32(x) (x) 76#define to_be32(x) bswap_32(x) 77#else 78#define to_be32(x) (x) 79#define to_le32(x) bswap_32(x) 80#endif 81 82struct dl_image { 83 unsigned magic; 84 unsigned id; 85 unsigned size; 86 unsigned data[0]; 87}; 88 89const unsigned IxNpeMicrocode_array[]; 90 91int main(int argc, char *argv[]) 92{ 93 struct dl_image *image = (struct dl_image *)IxNpeMicrocode_array; 94 int imgsiz, i, fd, cnt; 95 const unsigned *arrayptr = IxNpeMicrocode_array; 96 const char *names[] = { "IXP425", "IXP465", "unknown" }; 97 int bigendian = 1; 98 99 if (argc > 1) { 100 if (!strcmp(argv[1], "-le")) 101 bigendian = 0; 102 else if (!strcmp(argv[1], "-be")) 103 bigendian = 1; 104 else { 105 printf("Usage: %s <-le|-be>\n", argv[0]); 106 return EXIT_FAILURE; 107 } 108 } 109 110 for (image = (struct dl_image *)arrayptr, cnt=0; 111 (image->id != 0xfeedf00d) && (image->magic == 0xfeedf00d); 112 image = (struct dl_image *)(arrayptr), cnt++) 113 { 114 unsigned char field[4]; 115 imgsiz = image->size + 3; 116 *(unsigned*)field = to_be32(image->id); 117 char filename[40], slnk[10]; 118 119 sprintf(filename, "NPE-%c.%08x", (field[0] & 0xf) + 'A', 120 image->id); 121 if (image->id == 0x00090000) 122 sprintf(slnk, "NPE-%c-HSS", (field[0] & 0xf) + 'A'); 123 else 124 sprintf(slnk, "NPE-%c", (field[0] & 0xf) + 'A'); 125 126 printf("Writing image: %s.NPE_%c Func: %2x Rev: %02x.%02x " 127 "Size: %5d to: '%s'\n", 128 names[field[0] >> 4], (field[0] & 0xf) + 'A', 129 field[1], field[2], field[3], imgsiz*4, filename); 130 fd = open(filename, O_CREAT | O_RDWR | O_TRUNC, 0644); 131 if (fd >= 0) { 132 for (i=0; i<imgsiz; i++) { 133 *(unsigned*)field = bigendian ? 134 to_be32(arrayptr[i]) : 135 to_le32(arrayptr[i]); 136 write(fd, field, sizeof(field)); 137 } 138 close(fd); 139 unlink(slnk); 140 symlink(filename, slnk); 141 } else { 142 perror(filename); 143 } 144 arrayptr += imgsiz; 145 } 146 close(fd); 147 return 0; 148} 149