Annotation of sys/dev/microcode/bnx/build.c, Revision 1.1
1.1 ! nbrk 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: }
CVSweb