addinitrd.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * addinitrd - program to add a initrd image to an ecoff kernel
  3.  *
  4.  * (C) 1999 Thomas Bogendoerfer
  5.  */
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9. #include <unistd.h>
  10. #include "ecoff.h"
  11. #define MIPS_PAGE_SIZE 4096
  12. #define MIPS_PAGE_MASK (MIPS_PAGE_SIZE-1)
  13. #define swab16(x) 
  14.         ((unsigned short)( 
  15.                 (((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | 
  16.                 (((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
  17. #define swab32(x) 
  18.         ((unsigned int)( 
  19.                 (((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | 
  20.                 (((unsigned int)(x) & (unsigned int)0x0000ff00UL) <<  8) | 
  21.                 (((unsigned int)(x) & (unsigned int)0x00ff0000UL) >>  8) | 
  22.                 (((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
  23. #define SWAB(a) (swab ? swab32(a) : (a))
  24. void die (char *s)
  25. {
  26. perror (s);
  27. exit (1);
  28. }
  29. int main (int argc, char *argv[])
  30. {
  31. int fd_vmlinux,fd_initrd,fd_outfile;
  32. FILHDR efile;
  33. AOUTHDR eaout;
  34. SCNHDR esecs[3];
  35. struct stat st;
  36. char buf[1024];
  37. unsigned long loadaddr;
  38. unsigned long initrd_header[2];
  39. int i;
  40. int swab = 0;
  41. if (argc != 4) {
  42. printf ("Usage: %s <vmlinux> <initrd> <outfile>n",argv[0]);
  43. exit (1);
  44. }
  45. if ((fd_vmlinux = open (argv[1],O_RDWR)) < 0)
  46.  die ("open vmlinux");
  47. if (read (fd_vmlinux, &efile, sizeof efile) != sizeof efile)
  48. die ("read file header");
  49. if (read (fd_vmlinux, &eaout, sizeof eaout) != sizeof eaout)
  50. die ("read aout header");
  51. if (read (fd_vmlinux, esecs, sizeof esecs) != sizeof esecs)
  52. die ("read section headers");
  53. /*
  54.  * check whether the file is good for us
  55.  */
  56. /* TBD */
  57. /*
  58.  * check, if we have to swab words
  59.  */
  60. if (ntohs(0xaa55) == 0xaa55) {
  61. if (efile.f_magic == swab16(MIPSELMAGIC))
  62. swab = 1;
  63. } else {
  64. if (efile.f_magic == swab16(MIPSEBMAGIC))
  65. swab = 1;
  66. }
  67. if ((fd_initrd = open (argv[2], O_RDONLY)) < 0)
  68. die ("open initrd");
  69. if (fstat (fd_initrd, &st) < 0)
  70. die ("fstat initrd");
  71. loadaddr = ((SWAB(esecs[2].s_vaddr) + SWAB(esecs[2].s_size) 
  72. + MIPS_PAGE_SIZE-1) & ~MIPS_PAGE_MASK) - 8;
  73. if (loadaddr < (SWAB(esecs[2].s_vaddr) + SWAB(esecs[2].s_size)))
  74. loadaddr += MIPS_PAGE_SIZE;
  75. initrd_header[0] = SWAB(0x494E5244);
  76. initrd_header[1] = SWAB(st.st_size);
  77. eaout.dsize = esecs[1].s_size = initrd_header[1] = SWAB(st.st_size+8);
  78. eaout.data_start = esecs[1].s_vaddr = esecs[1].s_paddr = SWAB(loadaddr);
  79. if ((fd_outfile = open (argv[3], O_RDWR|O_CREAT|O_TRUNC,0666)) < 0)
  80. die ("open outfile");
  81. if (write (fd_outfile, &efile, sizeof efile) != sizeof efile)
  82. die ("write file header");
  83. if (write (fd_outfile, &eaout, sizeof eaout) != sizeof eaout)
  84. die ("write aout header");
  85. if (write (fd_outfile, esecs, sizeof esecs) != sizeof esecs)
  86. die ("write section headers");
  87. while ((i = read (fd_vmlinux, buf, sizeof buf)) > 0)
  88. if (write (fd_outfile, buf, i) != i)
  89. die ("write vmlinux");
  90. if (write (fd_outfile, initrd_header, sizeof initrd_header) != sizeof initrd_header)
  91. die ("write initrd header");
  92. while ((i = read (fd_initrd, buf, sizeof buf)) > 0)
  93. if (write (fd_outfile, buf, i) != i)
  94. die ("write initrd");
  95. close (fd_vmlinux);
  96. close (fd_initrd);
  97. return 0;
  98. }