|
|
1.1.1.2 root 1: /*
2: * linux/tools/build.c
3: *
1.1.1.7 root 4: * Copyright (C) 1991, 1992 Linus Torvalds
1.1.1.2 root 5: */
6:
7: /*
8: * This file builds a disk-image from three different files:
9: *
10: * - bootsect: max 510 bytes of 8086 machine code, loads the rest
11: * - setup: max 4 sectors of 8086 machine code, sets up system parm
12: * - system: 80386 code for actual system
13: *
14: * It does some checking that all files are of the correct type, and
15: * just writes the result to stdout, removing headers and padding to
16: * the right amount. It also writes some system data to stderr.
17: */
18:
1.1.1.3 root 19: /*
20: * Changes by tytso to allow root device specification
21: */
22:
1.1 root 23: #include <stdio.h> /* fprintf */
1.1.1.2 root 24: #include <string.h>
1.1 root 25: #include <stdlib.h> /* contains exit */
26: #include <sys/types.h> /* unistd.h needs this */
1.1.1.2 root 27: #include <sys/stat.h>
1.1.1.7 root 28: #include <sys/sysmacros.h>
1.1 root 29: #include <unistd.h> /* contains read/write */
30: #include <fcntl.h>
31:
32: #define MINIX_HEADER 32
33: #define GCC_HEADER 1024
34:
1.1.1.8 ! root 35: #define SYS_SIZE 0x7000
1.1.1.3 root 36:
1.1.1.5 root 37: #define DEFAULT_MAJOR_ROOT 0
38: #define DEFAULT_MINOR_ROOT 0
1.1.1.4 root 39:
1.1.1.2 root 40: /* max nr of sectors of setup: don't change unless you also change
41: * bootsect etc */
42: #define SETUP_SECTS 4
43:
44: #define STRINGIFY(x) #x
45:
1.1 root 46: void die(char * str)
47: {
48: fprintf(stderr,"%s\n",str);
49: exit(1);
50: }
51:
52: void usage(void)
53: {
1.1.1.3 root 54: die("Usage: build bootsect setup system [rootdev] [> image]");
1.1 root 55: }
56:
57: int main(int argc, char ** argv)
58: {
59: int i,c,id;
60: char buf[1024];
1.1.1.2 root 61: char major_root, minor_root;
62: struct stat sb;
1.1 root 63:
1.1.1.5 root 64: if ((argc < 4) || (argc > 5))
1.1 root 65: usage();
1.1.1.4 root 66: if (argc > 4) {
1.1.1.2 root 67: if (strcmp(argv[4], "FLOPPY")) {
68: if (stat(argv[4], &sb)) {
69: perror(argv[4]);
70: die("Couldn't stat root device.");
71: }
1.1.1.7 root 72: major_root = major(sb.st_rdev);
73: minor_root = minor(sb.st_rdev);
1.1.1.2 root 74: } else {
75: major_root = 0;
76: minor_root = 0;
77: }
78: } else {
79: major_root = DEFAULT_MAJOR_ROOT;
80: minor_root = DEFAULT_MINOR_ROOT;
81: }
82: fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
1.1 root 83: for (i=0;i<sizeof buf; i++) buf[i]=0;
84: if ((id=open(argv[1],O_RDONLY,0))<0)
85: die("Unable to open 'boot'");
86: if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
87: die("Unable to read header of 'boot'");
88: if (((long *) buf)[0]!=0x04100301)
89: die("Non-Minix header of 'boot'");
90: if (((long *) buf)[1]!=MINIX_HEADER)
91: die("Non-Minix header of 'boot'");
92: if (((long *) buf)[3]!=0)
93: die("Illegal data segment in 'boot'");
94: if (((long *) buf)[4]!=0)
95: die("Illegal bss in 'boot'");
96: if (((long *) buf)[5] != 0)
97: die("Non-Minix header of 'boot'");
98: if (((long *) buf)[7] != 0)
99: die("Illegal symbol table in 'boot'");
100: i=read(id,buf,sizeof buf);
101: fprintf(stderr,"Boot sector %d bytes.\n",i);
1.1.1.2 root 102: if (i != 512)
103: die("Boot block must be exactly 512 bytes");
104: if ((*(unsigned short *)(buf+510)) != 0xAA55)
105: die("Boot block hasn't got boot flag (0xAA55)");
106: buf[508] = (char) minor_root;
107: buf[509] = (char) major_root;
1.1 root 108: i=write(1,buf,512);
109: if (i!=512)
110: die("Write call failed");
111: close (id);
112:
113: if ((id=open(argv[2],O_RDONLY,0))<0)
1.1.1.2 root 114: die("Unable to open 'setup'");
115: if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
116: die("Unable to read header of 'setup'");
117: if (((long *) buf)[0]!=0x04100301)
118: die("Non-Minix header of 'setup'");
119: if (((long *) buf)[1]!=MINIX_HEADER)
120: die("Non-Minix header of 'setup'");
121: if (((long *) buf)[3]!=0)
122: die("Illegal data segment in 'setup'");
123: if (((long *) buf)[4]!=0)
124: die("Illegal bss in 'setup'");
125: if (((long *) buf)[5] != 0)
126: die("Non-Minix header of 'setup'");
127: if (((long *) buf)[7] != 0)
128: die("Illegal symbol table in 'setup'");
129: for (i=0 ; (c=read(id,buf,sizeof buf))>0 ; i+=c )
130: if (write(1,buf,c)!=c)
131: die("Write call failed");
132: close (id);
133: if (i > SETUP_SECTS*512)
134: die("Setup exceeds " STRINGIFY(SETUP_SECTS)
135: " sectors - rewrite build/boot/setup");
136: fprintf(stderr,"Setup is %d bytes.\n",i);
137: for (c=0 ; c<sizeof(buf) ; c++)
138: buf[c] = '\0';
139: while (i<SETUP_SECTS*512) {
140: c = SETUP_SECTS*512-i;
141: if (c > sizeof(buf))
142: c = sizeof(buf);
143: if (write(1,buf,c) != c)
144: die("Write call failed");
145: i += c;
146: }
147:
148: if ((id=open(argv[3],O_RDONLY,0))<0)
1.1 root 149: die("Unable to open 'system'");
150: if (read(id,buf,GCC_HEADER) != GCC_HEADER)
151: die("Unable to read header of 'system'");
152: if (((long *) buf)[5] != 0)
153: die("Non-GCC header of 'system'");
154: for (i=0 ; (c=read(id,buf,sizeof buf))>0 ; i+=c )
155: if (write(1,buf,c)!=c)
156: die("Write call failed");
157: close(id);
1.1.1.2 root 158: fprintf(stderr,"System is %d bytes.\n",i);
1.1.1.3 root 159: if (i > SYS_SIZE*16)
160: die("System is too big");
1.1 root 161: return(0);
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.