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 } 188