1*4c67e3eeStedu /* $OpenBSD: build.c,v 1.8 2014/07/12 19:01:50 tedu Exp $ */
2fc382838Sderaadt
3fc382838Sderaadt /*
4fc382838Sderaadt * Copyright (c) 2004 Theo de Raadt <deraadt@openbsd.org>
5fc382838Sderaadt *
6fc382838Sderaadt * Permission to use, copy, modify, and distribute this software for any
7fc382838Sderaadt * purpose with or without fee is hereby granted, provided that the above
8fc382838Sderaadt * copyright notice and this permission notice appear in all copies.
9fc382838Sderaadt *
10fc382838Sderaadt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11fc382838Sderaadt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12fc382838Sderaadt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13fc382838Sderaadt * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14fc382838Sderaadt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15fc382838Sderaadt * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16fc382838Sderaadt * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17fc382838Sderaadt */
18fc382838Sderaadt #include <sys/types.h>
190742c867Skettenis #include <dev/ic/tivar.h>
20b1447b06Smartynas #include <err.h>
21fc382838Sderaadt #include <fcntl.h>
22b1447b06Smartynas #include <stdio.h>
23276f68e7Sderaadt #include <stdlib.h>
24b1447b06Smartynas #include <string.h>
25b1447b06Smartynas #include <unistd.h>
26fc382838Sderaadt
27fc382838Sderaadt #include "ti_fw.h"
28fc382838Sderaadt #include "ti_fw2.h"
29fc382838Sderaadt
30fc382838Sderaadt static void
output(const char * name,const int FwReleaseMajor,const int FwReleaseMinor,const int FwReleaseFix,const u_int32_t FwStartAddr,const u_int32_t FwTextAddr,const int FwTextLen,const u_int32_t FwRodataAddr,const int FwRodataLen,const u_int32_t FwDataAddr,const int FwDataLen,const u_int32_t FwSbssAddr,const int FwSbssLen,const u_int32_t FwBssAddr,const int FwBssLen,const u_int32_t * FwText,int sizetext,const u_int32_t * FwRodata,int sizerodata,const u_int32_t * FwData,int sizedata)31fc382838Sderaadt output(const char *name,
32fc382838Sderaadt const int FwReleaseMajor, const int FwReleaseMinor,
33fc382838Sderaadt const int FwReleaseFix, const u_int32_t FwStartAddr,
34fc382838Sderaadt const u_int32_t FwTextAddr, const int FwTextLen,
35fc382838Sderaadt const u_int32_t FwRodataAddr, const int FwRodataLen,
36fc382838Sderaadt const u_int32_t FwDataAddr, const int FwDataLen,
37fc382838Sderaadt const u_int32_t FwSbssAddr, const int FwSbssLen,
38fc382838Sderaadt const u_int32_t FwBssAddr, const int FwBssLen,
39fc382838Sderaadt const u_int32_t *FwText, int sizetext,
40fc382838Sderaadt const u_int32_t *FwRodata, int sizerodata,
41fc382838Sderaadt const u_int32_t *FwData, int sizedata)
42fc382838Sderaadt {
43fc382838Sderaadt struct tigon_firmware tfproto, *tf;
44bd7b3fffSclaudio int len, fd, i, cnt;
45bd7b3fffSclaudio u_int32_t *b;
46948e15b6Sjason ssize_t rlen;
47fc382838Sderaadt
48bd7b3fffSclaudio len = sizeof(tfproto) - sizeof(tfproto.data) + sizetext +
49bd7b3fffSclaudio sizerodata + sizedata;
50fc382838Sderaadt tf = (struct tigon_firmware *)malloc(len);
51fc382838Sderaadt bzero(tf, len);
52fc382838Sderaadt
53fc382838Sderaadt tf->FwReleaseMajor = FwReleaseMajor;
54fc382838Sderaadt tf->FwReleaseMinor = FwReleaseMinor;
55fc382838Sderaadt tf->FwReleaseFix = FwReleaseFix;
56fc382838Sderaadt tf->FwStartAddr = FwStartAddr;
57fc382838Sderaadt
58fc382838Sderaadt tf->FwTextAddr = FwTextAddr;
59fc382838Sderaadt tf->FwTextLen = FwTextLen;
60fc382838Sderaadt
61fc382838Sderaadt tf->FwRodataAddr = FwRodataAddr;
62fc382838Sderaadt tf->FwRodataLen = FwRodataLen;
63fc382838Sderaadt
64fc382838Sderaadt tf->FwDataAddr = FwDataAddr;
65fc382838Sderaadt tf->FwDataLen = FwDataLen;
66fc382838Sderaadt
67fc382838Sderaadt tf->FwSbssAddr = FwSbssAddr;
68fc382838Sderaadt tf->FwSbssLen = FwSbssLen;
69fc382838Sderaadt
70fc382838Sderaadt tf->FwBssAddr = FwBssAddr;
71fc382838Sderaadt tf->FwBssLen = FwBssLen;
72fc382838Sderaadt
73fc382838Sderaadt tf->FwTextOffset = 0;
74fc382838Sderaadt tf->FwRodataOffset = sizetext;
75fc382838Sderaadt tf->FwDataOffset = sizetext + sizerodata;
76fc382838Sderaadt
77fc382838Sderaadt bcopy(FwText, &tf->data[tf->FwTextOffset], FwTextLen);
78fc382838Sderaadt bcopy(FwRodata, &tf->data[tf->FwRodataOffset], FwRodataLen);
79fc382838Sderaadt bcopy(FwData, &tf->data[tf->FwDataOffset], FwDataLen);
80fc382838Sderaadt
81bd7b3fffSclaudio b = (u_int32_t *)tf;
82bd7b3fffSclaudio cnt = len / sizeof(u_int32_t);
83bd7b3fffSclaudio for (i = 0; i < cnt; i++)
84bd7b3fffSclaudio b[i] = htole32(b[i]);
85bd7b3fffSclaudio
86fc382838Sderaadt printf("creating %s length %d [%d+%d+%d] [%d+%d+%d]\n",
87fc382838Sderaadt name, len, FwTextLen, FwRodataLen, FwDataLen,
88fc382838Sderaadt sizetext, sizerodata, sizedata);
89fc382838Sderaadt fd = open(name, O_WRONLY|O_CREAT|O_TRUNC, 0644);
90fc382838Sderaadt if (fd == -1)
91fc382838Sderaadt err(1, "%s", name);
92fc382838Sderaadt
93948e15b6Sjason rlen = write(fd, tf, len);
94948e15b6Sjason if (rlen == -1)
95948e15b6Sjason err(1, "%s", name);
96948e15b6Sjason if (rlen != len)
97948e15b6Sjason errx(1, "%s: short write", name);
98*4c67e3eeStedu free(tf);
99fc382838Sderaadt close(fd);
100fc382838Sderaadt }
101fc382838Sderaadt
102fc382838Sderaadt
103fc382838Sderaadt int
main(int argc,char * argv[])104fc382838Sderaadt main(int argc, char *argv[])
105fc382838Sderaadt {
106fc382838Sderaadt
107fc382838Sderaadt output("tigon1",
108fc382838Sderaadt tigonFwReleaseMajor, tigonFwReleaseMinor,
109fc382838Sderaadt tigonFwReleaseFix, tigonFwStartAddr,
110fc382838Sderaadt tigonFwTextAddr, tigonFwTextLen,
111fc382838Sderaadt tigonFwRodataAddr, tigonFwRodataLen,
112fc382838Sderaadt tigonFwDataAddr, tigonFwDataLen,
113fc382838Sderaadt tigonFwSbssAddr, tigonFwSbssLen,
114fc382838Sderaadt tigonFwBssAddr, tigonFwBssLen,
115fc382838Sderaadt tigonFwText, sizeof tigonFwText,
116fc382838Sderaadt tigonFwRodata, sizeof tigonFwRodata,
117fc382838Sderaadt tigonFwData, sizeof tigonFwData);
118fc382838Sderaadt
119fc382838Sderaadt output("tigon2",
120fc382838Sderaadt tigon2FwReleaseMajor, tigon2FwReleaseMinor,
121fc382838Sderaadt tigon2FwReleaseFix, tigon2FwStartAddr,
122fc382838Sderaadt tigon2FwTextAddr, tigon2FwTextLen,
123fc382838Sderaadt tigon2FwRodataAddr, tigon2FwRodataLen,
124fc382838Sderaadt tigon2FwDataAddr, tigon2FwDataLen,
125fc382838Sderaadt tigon2FwSbssAddr, tigon2FwSbssLen,
126fc382838Sderaadt tigon2FwBssAddr, tigon2FwBssLen,
127fc382838Sderaadt tigon2FwText, sizeof tigon2FwText,
128fc382838Sderaadt tigon2FwRodata, sizeof tigon2FwRodata,
129fc382838Sderaadt tigon2FwData, sizeof tigon2FwData);
130fc382838Sderaadt
131fc382838Sderaadt return 0;
132fc382838Sderaadt }
133