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