2 * addinitrd - program to add a initrd image to an ecoff kernel
4 * (C) 1999 Thomas Bogendoerfer
5 * minor modifications, cleanup: Guido Guenther <agx@sigxcpu.org>
6 * further cleanup: Maciej W. Rozycki
14 #include <netinet/in.h>
18 #define MIPS_PAGE_SIZE 4096
19 #define MIPS_PAGE_MASK (MIPS_PAGE_SIZE-1)
23 (((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \
24 (((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
28 (((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \
29 (((unsigned int)(x) & (unsigned int)0x0000ff00UL) << 8) | \
30 (((unsigned int)(x) & (unsigned int)0x00ff0000UL) >> 8) | \
31 (((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
33 #define SWAB(a) (swab ? swab32(a) : (a))
41 int main(int argc
, char *argv
[])
43 int fd_vmlinux
, fd_initrd
, fd_outfile
;
49 unsigned long loadaddr
;
50 unsigned long initrd_header
[2];
55 printf("Usage: %s <vmlinux> <initrd> <outfile>\n", argv
[0]);
59 if ((fd_vmlinux
= open (argv
[1], O_RDONLY
)) < 0)
61 if (read (fd_vmlinux
, &efile
, sizeof efile
) != sizeof efile
)
62 die("read file header");
63 if (read (fd_vmlinux
, &eaout
, sizeof eaout
) != sizeof eaout
)
64 die("read aout header");
65 if (read (fd_vmlinux
, esecs
, sizeof esecs
) != sizeof esecs
)
66 die("read section headers");
68 * check whether the file is good for us
73 * check, if we have to swab words
75 if (ntohs(0xaa55) == 0xaa55) {
76 if (efile
.f_magic
== swab16(MIPSELMAGIC
))
79 if (efile
.f_magic
== swab16(MIPSEBMAGIC
))
83 /* make sure we have an empty data segment for the initrd */
84 if (eaout
.dsize
|| esecs
[1].s_size
) {
85 fprintf(stderr
, "Data segment not empty. Giving up!\n");
88 if ((fd_initrd
= open (argv
[2], O_RDONLY
)) < 0)
90 if (fstat (fd_initrd
, &st
) < 0)
92 loadaddr
= ((SWAB(esecs
[2].s_vaddr
) + SWAB(esecs
[2].s_size
)
93 + MIPS_PAGE_SIZE
-1) & ~MIPS_PAGE_MASK
) - 8;
94 if (loadaddr
< (SWAB(esecs
[2].s_vaddr
) + SWAB(esecs
[2].s_size
)))
95 loadaddr
+= MIPS_PAGE_SIZE
;
96 initrd_header
[0] = SWAB(0x494E5244);
97 initrd_header
[1] = SWAB(st
.st_size
);
98 eaout
.dsize
= esecs
[1].s_size
= initrd_header
[1] = SWAB(st
.st_size
+8);
99 eaout
.data_start
= esecs
[1].s_vaddr
= esecs
[1].s_paddr
= SWAB(loadaddr
);
101 if ((fd_outfile
= open (argv
[3], O_RDWR
|O_CREAT
|O_TRUNC
, 0666)) < 0)
103 if (write (fd_outfile
, &efile
, sizeof efile
) != sizeof efile
)
104 die("write file header");
105 if (write (fd_outfile
, &eaout
, sizeof eaout
) != sizeof eaout
)
106 die("write aout header");
107 if (write (fd_outfile
, esecs
, sizeof esecs
) != sizeof esecs
)
108 die("write section headers");
110 if(lseek(fd_vmlinux
, SWAB(esecs
[0].s_scnptr
), SEEK_SET
) == (off_t
)-1)
111 die("lseek vmlinux");
112 if(lseek(fd_outfile
, SWAB(esecs
[0].s_scnptr
), SEEK_SET
) == (off_t
)-1)
113 die("lseek outfile");
114 /* copy text segment */
115 cnt
= SWAB(eaout
.tsize
);
117 if ((i
= read (fd_vmlinux
, buf
, sizeof buf
)) <= 0)
119 if (write (fd_outfile
, buf
, i
) != i
)
120 die("write vmlinux");
123 if (write (fd_outfile
, initrd_header
, sizeof initrd_header
) != sizeof initrd_header
)
124 die("write initrd header");
125 while ((i
= read (fd_initrd
, buf
, sizeof buf
)) > 0)
126 if (write (fd_outfile
, buf
, i
) != i
)