/* * linux/tools/build.c * * (C) 1991 Linus Torvalds */ /* * This file builds a disk-image from three different files: * * - bootsect: max 510 bytes of 8086 machine code, loads the rest * - setup: max 4 sectors of 8086 machine code, sets up system parm * - system: 80386 code for actual system * * It does some checking that all files are of the correct type, and * just writes the result to stdout, removing headers and padding to * the right amount. It also writes some system data to stderr. */ /* * Changes by tytso to allow root device specification */ #include /* fprintf */ #include #include /* contains exit */ #include /* unistd.h needs this */ #include #include #include /* contains read/write */ #include #define MAJOR(a) (((unsigned)(a))>>8) #define MINOR(a) ((a)&0xff) #define MINIX_HEADER 32 #define GCC_HEADER 0x80 /* 0x1000 */ /* by wyj */ #define SYS_SIZE 0x3000 #define DEFAULT_MAJOR_ROOT 0x03 //0x02 /* by wyj */ #define DEFAULT_MINOR_ROOT 0x00 //0x1d /* max nr of sectors of setup: don't change unless you also change * bootsect etc */ #define SETUP_SECTS 4 #define STRINGIFY(x) #x void die(char * str) { fprintf(stderr,"%s\n",str); exit(1); } void usage(void) { die("Usage: build bootsect setup system [rootdev] [> image]"); } int main(int argc, char ** argv) { int i,c,id; char buf[1024*4]; /* by wyj */ char major_root, minor_root; struct stat sb; if ((argc != 4) && (argc != 5)) usage(); if (argc == 5) { if (strcmp(argv[4], "FLOPPY")) { if (stat(argv[4], &sb)) { perror(argv[4]); die("Couldn't stat root device."); } major_root = MAJOR(sb.st_rdev); minor_root = MINOR(sb.st_rdev); } else { major_root = 0; minor_root = 0; } } else { major_root = DEFAULT_MAJOR_ROOT; minor_root = DEFAULT_MINOR_ROOT; } fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root); if ((major_root != 2) && (major_root != 3) && (major_root != 0)) { fprintf(stderr, "Illegal root device (major = %d)\n", major_root); die("Bad root device --- major #"); } for (i=0;i0 ; i+=c ) if (write(1,buf,c)!=c) die("Write call failed"); close (id); if (i > SETUP_SECTS*512) die("Setup exceeds " STRINGIFY(SETUP_SECTS) " sectors - rewrite build/boot/setup"); fprintf(stderr,"Setup is %d bytes.\n",i); for (c=0 ; c sizeof(buf)) c = sizeof(buf); if (write(1,buf,c) != c) die("Write call failed"); i += c; } if ((id=open(argv[3],O_RDONLY,0))<0) die("Unable to open 'system'"); if (read(id,buf,GCC_HEADER) != GCC_HEADER) die("Unable to read header of 'system'"); // if (((long *) buf)[5] != 0) // die("Non-GCC header of 'system'"); for (i=0 ; (c=read(id,buf,sizeof buf))>0 ; i+=c ) if (write(1,buf,c)!=c) die("Write call failed"); close(id); fprintf(stderr,"System is %d bytes.\n",i); if (i > SYS_SIZE*16) die("System is too big"); return(0); }