xref: /openbsd-src/sys/dev/microcode/tigon/build.c (revision 4c67e3ee5807ede0a892aca8723273d72a22354c)
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