root/dev/microcode/bnx/build.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. hswapn
  2. main

    1 /*      $OpenBSD: build.c,v 1.4 2007/01/10 18:09:25 deraadt Exp $       */
    2 
    3 /*
    4  * Copyright (c) 2004 Theo de Raadt <deraadt@openbsd.org>
    5  *
    6  * Permission to use, copy, modify, and distribute this software for any
    7  * purpose with or without fee is hereby granted, provided that the above
    8  * copyright notice and this permission notice appear in all copies.
    9  *
   10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   17  */
   18 #include <sys/types.h>
   19 #include <dev/pci/if_bnxreg.h>
   20 #include <fcntl.h>
   21 #include <stdlib.h>
   22 #include <err.h>
   23 #include <unistd.h>
   24 #include <string.h>
   25 #include <stdio.h>
   26 
   27 #include "bnxfw.h"
   28 
   29 int     bnx_rv2p_proc1len;
   30 int     bnx_rv2p_proc2len;
   31 
   32 #define FILENAME "bnx"
   33 
   34 struct chunks {
   35         void *start;
   36         int *len;
   37 } chunks[] = {
   38         { bnx_COM_b06FwText, &bnx_COM_b06FwTextLen },
   39         { bnx_COM_b06FwData, &bnx_COM_b06FwDataLen },
   40         { bnx_COM_b06FwRodata, &bnx_COM_b06FwRodataLen },
   41         { bnx_COM_b06FwBss, &bnx_COM_b06FwBssLen },
   42         { bnx_COM_b06FwSbss, &bnx_COM_b06FwSbssLen },
   43 
   44         { bnx_RXP_b06FwText, &bnx_RXP_b06FwTextLen },
   45         { bnx_RXP_b06FwData, &bnx_RXP_b06FwDataLen },
   46         { bnx_RXP_b06FwRodata, &bnx_RXP_b06FwRodataLen },
   47         { bnx_RXP_b06FwBss, &bnx_RXP_b06FwBssLen },
   48         { bnx_RXP_b06FwSbss, &bnx_RXP_b06FwSbssLen },
   49 
   50         { bnx_TPAT_b06FwText, &bnx_TPAT_b06FwTextLen },
   51         { bnx_TPAT_b06FwData, &bnx_TPAT_b06FwDataLen },
   52         { bnx_TPAT_b06FwRodata, &bnx_TPAT_b06FwRodataLen },
   53         { bnx_TPAT_b06FwBss, &bnx_TPAT_b06FwBssLen },
   54         { bnx_TPAT_b06FwSbss, &bnx_TPAT_b06FwSbssLen },
   55 
   56         { bnx_TXP_b06FwText, &bnx_TXP_b06FwTextLen },
   57         { bnx_TXP_b06FwData, &bnx_TXP_b06FwDataLen },
   58         { bnx_TXP_b06FwRodata, &bnx_TXP_b06FwRodataLen },
   59         { bnx_TXP_b06FwBss, &bnx_TXP_b06FwBssLen },
   60         { bnx_TXP_b06FwSbss, &bnx_TXP_b06FwSbssLen },
   61 
   62         { bnx_rv2p_proc1, &bnx_rv2p_proc1len },
   63         { bnx_rv2p_proc2, &bnx_rv2p_proc2len }
   64 };
   65 
   66 void
   67 hswapn(u_int32_t *p, int wcount)
   68 {
   69         for (; wcount; wcount -=4) {
   70                 *p = htonl(*p);
   71                 p++;
   72         }
   73 }
   74 
   75 int
   76 main(int argc, char *argv[])
   77 {
   78         struct  bnx_firmware_header bfproto, *bf;
   79         int fd, i, total;
   80         ssize_t rlen;
   81 
   82         bnx_rv2p_proc1len = sizeof bnx_rv2p_proc1;
   83         bnx_rv2p_proc2len = sizeof bnx_rv2p_proc2;
   84 
   85         bf = (struct bnx_firmware_header *)malloc(sizeof *bf);
   86         bzero(bf, sizeof *bf);
   87 
   88         /* initialize the file header */
   89         bf->bnx_COM_b06FwReleaseMajor = htonl(bnx_COM_b06FwReleaseMajor);
   90         bf->bnx_COM_b06FwReleaseMinor = htonl(bnx_COM_b06FwReleaseMinor);
   91         bf->bnx_COM_b06FwReleaseFix = htonl(bnx_COM_b06FwReleaseFix);
   92         bf->bnx_COM_b06FwStartAddr = htonl(bnx_COM_b06FwStartAddr);
   93         bf->bnx_COM_b06FwTextAddr = htonl(bnx_COM_b06FwTextAddr);
   94         bf->bnx_COM_b06FwTextLen = htonl(bnx_COM_b06FwTextLen);
   95         bf->bnx_COM_b06FwDataAddr = htonl(bnx_COM_b06FwDataAddr);
   96         bf->bnx_COM_b06FwDataLen = htonl(bnx_COM_b06FwDataLen);
   97         bf->bnx_COM_b06FwRodataAddr = htonl(bnx_COM_b06FwRodataAddr);
   98         bf->bnx_COM_b06FwRodataLen = htonl(bnx_COM_b06FwRodataLen);
   99         bf->bnx_COM_b06FwBssAddr = htonl(bnx_COM_b06FwBssAddr);
  100         bf->bnx_COM_b06FwBssLen = htonl(bnx_COM_b06FwBssLen);
  101         bf->bnx_COM_b06FwSbssAddr = htonl(bnx_COM_b06FwSbssAddr);
  102         bf->bnx_COM_b06FwSbssLen = htonl(bnx_COM_b06FwSbssLen);
  103 
  104         bf->bnx_RXP_b06FwReleaseMajor = htonl(bnx_RXP_b06FwReleaseMajor);
  105         bf->bnx_RXP_b06FwReleaseMinor = htonl(bnx_RXP_b06FwReleaseMinor);
  106         bf->bnx_RXP_b06FwReleaseFix = htonl(bnx_RXP_b06FwReleaseFix);
  107         bf->bnx_RXP_b06FwStartAddr = htonl(bnx_RXP_b06FwStartAddr);
  108         bf->bnx_RXP_b06FwTextAddr = htonl(bnx_RXP_b06FwTextAddr);
  109         bf->bnx_RXP_b06FwTextLen = htonl(bnx_RXP_b06FwTextLen);
  110         bf->bnx_RXP_b06FwDataAddr = htonl(bnx_RXP_b06FwDataAddr);
  111         bf->bnx_RXP_b06FwDataLen = htonl(bnx_RXP_b06FwDataLen);
  112         bf->bnx_RXP_b06FwRodataAddr = htonl(bnx_RXP_b06FwRodataAddr);
  113         bf->bnx_RXP_b06FwRodataLen = htonl(bnx_RXP_b06FwRodataLen);
  114         bf->bnx_RXP_b06FwBssAddr = htonl(bnx_RXP_b06FwBssAddr);
  115         bf->bnx_RXP_b06FwBssLen = htonl(bnx_RXP_b06FwBssLen);
  116         bf->bnx_RXP_b06FwSbssAddr = htonl(bnx_RXP_b06FwSbssAddr);
  117         bf->bnx_RXP_b06FwSbssLen = htonl(bnx_RXP_b06FwSbssLen);
  118 
  119         bf->bnx_TPAT_b06FwReleaseMajor = htonl(bnx_TPAT_b06FwReleaseMajor);
  120         bf->bnx_TPAT_b06FwReleaseMinor = htonl(bnx_TPAT_b06FwReleaseMinor);
  121         bf->bnx_TPAT_b06FwReleaseFix = htonl(bnx_TPAT_b06FwReleaseFix);
  122         bf->bnx_TPAT_b06FwStartAddr = htonl(bnx_TPAT_b06FwStartAddr);
  123         bf->bnx_TPAT_b06FwTextAddr = htonl(bnx_TPAT_b06FwTextAddr);
  124         bf->bnx_TPAT_b06FwTextLen = htonl(bnx_TPAT_b06FwTextLen);
  125         bf->bnx_TPAT_b06FwDataAddr = htonl(bnx_TPAT_b06FwDataAddr);
  126         bf->bnx_TPAT_b06FwDataLen = htonl(bnx_TPAT_b06FwDataLen);
  127         bf->bnx_TPAT_b06FwRodataAddr = htonl(bnx_TPAT_b06FwRodataAddr);
  128         bf->bnx_TPAT_b06FwRodataLen = htonl(bnx_TPAT_b06FwRodataLen);
  129         bf->bnx_TPAT_b06FwBssAddr = htonl(bnx_TPAT_b06FwBssAddr);
  130         bf->bnx_TPAT_b06FwBssLen = htonl(bnx_TPAT_b06FwBssLen);
  131         bf->bnx_TPAT_b06FwSbssAddr = htonl(bnx_TPAT_b06FwSbssAddr);
  132         bf->bnx_TPAT_b06FwSbssLen = htonl(bnx_TPAT_b06FwSbssLen);
  133 
  134         bf->bnx_TXP_b06FwReleaseMajor = htonl(bnx_TXP_b06FwReleaseMajor);
  135         bf->bnx_TXP_b06FwReleaseMinor = htonl(bnx_TXP_b06FwReleaseMinor);
  136         bf->bnx_TXP_b06FwReleaseFix = htonl(bnx_TXP_b06FwReleaseFix);
  137         bf->bnx_TXP_b06FwStartAddr = htonl(bnx_TXP_b06FwStartAddr);
  138         bf->bnx_TXP_b06FwTextAddr = htonl(bnx_TXP_b06FwTextAddr);
  139         bf->bnx_TXP_b06FwTextLen = htonl(bnx_TXP_b06FwTextLen);
  140         bf->bnx_TXP_b06FwDataAddr = htonl(bnx_TXP_b06FwDataAddr);
  141         bf->bnx_TXP_b06FwDataLen = htonl(bnx_TXP_b06FwDataLen);
  142         bf->bnx_TXP_b06FwRodataAddr = htonl(bnx_TXP_b06FwRodataAddr);
  143         bf->bnx_TXP_b06FwRodataLen = htonl(bnx_TXP_b06FwRodataLen);
  144         bf->bnx_TXP_b06FwBssAddr = htonl(bnx_TXP_b06FwBssAddr);
  145         bf->bnx_TXP_b06FwBssLen = htonl(bnx_TXP_b06FwBssLen);
  146         bf->bnx_TXP_b06FwSbssAddr = htonl(bnx_TXP_b06FwSbssAddr);
  147         bf->bnx_TXP_b06FwSbssLen = htonl(bnx_TXP_b06FwSbssLen);
  148 
  149         bf->bnx_rv2p_proc1len = htonl(bnx_rv2p_proc1len);
  150         bf->bnx_rv2p_proc2len = htonl(bnx_rv2p_proc2len);
  151 
  152         printf("creating %s", FILENAME);
  153         fd = open(FILENAME, O_WRONLY|O_CREAT|O_TRUNC, 0644);
  154         if (fd == -1)
  155                 err(1, FILENAME);
  156 
  157         rlen = write(fd, bf, sizeof *bf);
  158         if (rlen == -1)
  159                 err(1, "%s", FILENAME);
  160         if (rlen != sizeof *bf)
  161                 errx(1, "%s: short write", FILENAME);
  162         total = rlen;
  163         printf(" [%d", total);
  164         fflush(stdout);
  165 
  166         for (i = 0; i < sizeof(chunks) / sizeof(chunks[0]); i++) {
  167                 hswapn(chunks[i].start, *chunks[i].len);
  168                 rlen = write(fd, chunks[i].start, *chunks[i].len);
  169                 if (rlen == -1) {
  170                         printf("\n");
  171                         err(1, "%s", FILENAME);
  172                 }
  173                 if (rlen != *chunks[i].len) {
  174                         printf("\n");
  175                         errx(1, "%s: short write", FILENAME);
  176                 }
  177                 printf("+%d", rlen);
  178                 fflush(stdout);
  179                 total += rlen;
  180         }
  181 
  182         printf("] total %d\n", total);
  183 
  184         free(bf);
  185         close(fd);
  186         return 0;
  187 }

/* [<][>][^][v][top][bottom][index][help] */