xref: /openbsd/sys/dev/microcode/yds/build.c (revision fc61954a)
1 /*	$OpenBSD: build.c,v 1.6 2014/07/12 19:01:50 tedu 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/ydsvar.h>
20 #include <fcntl.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <err.h>
24 #include <string.h>
25 #include <stdio.h>
26 #include "yds_hwmcode.h"
27 
28 #define FILENAME "yds"
29 
30 void
31 hswapn(u_int32_t *p, int wcount)
32 {
33 	for (; wcount; wcount -=4) {
34 		*p = htonl(*p);
35 		p++;
36 	}
37 }
38 
39 int
40 main(int argc, char *argv[])
41 {
42 	struct	yds_firmware yfproto, *yf;
43 	int len, fd;
44 	ssize_t rlen;
45 
46 	len = sizeof(*yf) - sizeof(yfproto.data) +
47 	    sizeof(yds_dsp_mcode) + sizeof(yds_ds1_ctrl_mcode) +
48 	    sizeof(yds_ds1e_ctrl_mcode);
49 
50 	yf = (struct yds_firmware *)malloc(len);
51 	bzero(yf, len);
52 
53 	yf->dsplen = htonl(sizeof(yds_dsp_mcode));
54 	yf->ds1len = htonl(sizeof(yds_ds1_ctrl_mcode));
55 	yf->ds1elen = htonl(sizeof(yds_ds1e_ctrl_mcode));
56 
57 	bcopy(yds_dsp_mcode, &yf->data[0], sizeof(yds_dsp_mcode));
58 	hswapn((u_int32_t *)&yf->data[0], sizeof(yds_dsp_mcode));
59 
60 	bcopy(yds_ds1_ctrl_mcode, &yf->data[sizeof(yds_dsp_mcode)],
61 	    sizeof(yds_ds1_ctrl_mcode));
62 	hswapn((u_int32_t *)&yf->data[sizeof(yds_dsp_mcode)],
63 	    sizeof(yds_ds1_ctrl_mcode));
64 
65 	bcopy(yds_ds1e_ctrl_mcode,
66 	    &yf->data[sizeof(yds_dsp_mcode) + sizeof(yds_ds1_ctrl_mcode)],
67 	    sizeof(yds_ds1e_ctrl_mcode));
68 	hswapn((u_int32_t *)&yf->data[sizeof(yds_dsp_mcode) +
69 	    sizeof(yds_ds1_ctrl_mcode)],
70 	    sizeof(yds_ds1e_ctrl_mcode));
71 
72 	printf("creating %s length %d [%d+%d+%d]\n",
73 	    FILENAME, len, sizeof(yds_dsp_mcode),
74 	    sizeof(yds_ds1_ctrl_mcode), sizeof(yds_ds1e_ctrl_mcode));
75 	fd = open(FILENAME, O_WRONLY|O_CREAT|O_TRUNC, 0644);
76 	if (fd == -1)
77 		err(1, FILENAME);
78 
79 	rlen = write(fd, yf, len);
80 	if (rlen == -1)
81 		err(1, "%s", FILENAME);
82 	if (rlen != len)
83 		errx(1, "%s: short write", FILENAME);
84 	free(yf);
85 	close(fd);
86 	return 0;
87 }
88