[comp.os.minix] Protected mode MINIX for 80286 Part 10

worsley@ditmela.oz (Andrew Worsley) (05/18/89)

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 10 (of 10)."
# Contents:  toolsdif/build.c.cdif
# Wrapped by sys@besplex on Sun Mar 26 06:34:43 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'toolsdif/build.c.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'toolsdif/build.c.cdif'\"
else
echo shar: Extracting \"'toolsdif/build.c.cdif'\" \(16217 characters\)
sed "s/^X//" >'toolsdif/build.c.cdif' <<'END_OF_FILE'
X*** tools-1.3/build.c	Tue Nov 22 03:39:10 1988
X--- tools/build.c	Wed Mar 22 04:55:54 1989
X***************
X*** 13,17 ****
X   * begins directly after it.  The kernel, mm, fs, init, and fsck are each
X!  * padded out to a multiple of 16 bytes, and then concatenated into a
X   * single file beginning 512 bytes into the file.  The first byte of sector 1
X   * contains executable code for the kernel.  There is no header present.
X   *
X--- 13,19 ----
X   * begins directly after it.  The kernel, mm, fs, init, and fsck are each
X!  * padded out to a multiple of clicksize bytes, and then concatenated into a
X   * single file beginning 512 bytes into the file.  The first byte of sector 1
X   * contains executable code for the kernel.  There is no header present.
X+  * Clicksize is the CLICK_SIZE which the kernel, mm and fs files were
X+  * compiled with, and is encoded in bytes 2-3 of the kernel code segment.
X   *
X***************
X*** 43,45 ****
X--- 45,59 ----
X  
X+ /* Modified by Bruce Evans, 21 Nov 88 to load symbol tables for debugger.
X+    For each piece of the kernel, the symbol table is loaded at the end of
X+    the bss. A pointer to it is placed in the spare word at location 2 in
X+    the code segment. The sizes array is adjusted so that the symbol table
X+    is effectively part of the data segment.
X+    It would be better for everything to load the exec headers and chain
X+    them together.
X  
X+    BDE 8 Feb 89. CLICK_SIZE 256 instead of 16.
X+    BDE 2 Mar 89. CLICK_SIZE and CLICK_SHIFT variables clicksize, click_shift.
X+  */
X+ 
X+ 
X  #define PROGRAMS 5              /* kernel + mm + fs + init + fsck = 5 */
X***************
X*** 47,48 ****
X--- 61,63 ----
X  #define DS_OFFSET 4L            /* position of DS written in kernel text seg */
X+ #define SYM_OFFSET 2L		/* position of syms writ in kernel text seg */
X  #define SECTOR_SIZE 512         /* size of buf */
X***************
X*** 51,53 ****
X  #define FS_D_MAGIC 0xDADA	/* identifies fs data space */
X! #define CLICK_SHIFT 4
X  #define KERN 0
X--- 66,69 ----
X  #define FS_D_MAGIC 0xDADA	/* identifies fs data space */
X! #define DATA_ALIGNMENT 16	/* minimum alignment of separate I&D data */
X! #define HCLICK_SHIFT 4
X  #define KERN 0
X***************
X*** 66,67 ****
X--- 82,84 ----
X  #define BSS_POS 2               /* where is bss size in header */
X+ #define SYM_POS 5               /* where is sym size in header */
X  #define SEP_ID_BIT 0x20         /* bit that tells if file is separate I & D */
X***************
X*** 83,84 ****
X--- 100,105 ----
X  
X+ unsigned click_shift;		/* CLICK_SHIFT used to compile kernel/mm/fs */
X+ unsigned clicksize;		/* CLICK_SIZE used to compile kernel/mm/fs */
X+ 				/* grrr, click_size would be ambiguous */
X+ 
X  struct sizes {
X***************
X*** 87,88 ****
X--- 108,110 ----
X    unsigned bss_size;            /* size in bytes */
X+   unsigned sym_size;            /* size in bytes */
X    int sep_id;                   /* 1 if separate, 0 if not */
X***************
X*** 156,163 ****
X  /* Open and read a file, copying it to output.  First read the header,
X!  * to get the text, data, and bss sizes.  Also see if it is separate I & D.
X!  * write the text, data, and bss to output.  The sum of these three pieces
X!  * must be padded upwards to a multiple of 16, if need be.  The individual
X!  * pieces need not be multiples of 16 bytes, except for the text size when
X!  * separate I & D is in use.  The total size must be less than 64K, even
X!  * when separate I & D space is used.
X   */
X--- 178,184 ----
X  /* Open and read a file, copying it to output.  First read the header,
X!  * to get the text, data, bss and symbol sizes.  Also see if it is separate
X!  * I & D.  Write the text, data, bss and symbols to output.  The sum of these
X!  * four pieces must be padded upwards to a multiple of clicksize, if need
X!  * be.  The individual pieces need not be multiples of clicksize bytes,
X!  * except for the text size when separate I & D is in use.
X   */
X***************
X*** 166,170 ****
X    unsigned text_bytes, data_bytes, bss_bytes, rest, filler;
X    long tot_bytes;
X-   unsigned left_to_read;
X-   char inbuf[READ_UNIT];
X    
X--- 187,190 ----
X    unsigned text_bytes, data_bytes, bss_bytes, rest, filler;
X+   unsigned file_text_bytes, sym_bytes;
X    long tot_bytes;
X    
X***************
X*** 173,178 ****
X    /* Read the header to see how big the segments are. */
X!   read_header(fd, &sepid, &text_bytes, &data_bytes, &bss_bytes, file_name);
X  
X!   /* Pad the total size to a 16-byte multiple, if needed. */
X!   if (sepid && ((text_bytes % 16) != 0) ) {
X          pexit("separate I & D but text size not multiple of 16 bytes.  File: ", 
X--- 193,216 ----
X    /* Read the header to see how big the segments are. */
X!   read_header(fd, &sepid, &text_bytes, &data_bytes, &bss_bytes, &sym_bytes,
X!               file_name);
X  
X!   /* If the kernel, determine click_shift and clicksize. */
X!   if (num == 0) {
X! 	long lseek();
X! 	unsigned char click_buf[4];
X! 
X! 	if (read(fd, click_buf, sizeof click_buf) != sizeof click_buf)
X! 		pexit("can't read click_shift in ", file_name);
X! 	if (lseek(fd, (long) -sizeof click_buf, 1) < 0)
X! 		pexit("can't seek before click_shift in ", file_name);
X! 	click_shift = click_buf[2] + (click_buf[3] << 8);
X! 	if (click_shift == 0)
X! 		click_shift = HCLICK_SHIFT;	/* old kernel */
X! 	else if (click_shift < HCLICK_SHIFT)
X! 		pexit("kernel click_shift must be >= 4", "");
X! 	clicksize = 1 << click_shift;
X!   }
X! 
X!   /* Pad the total size to a clicksize-byte multiple, if needed. */
X!   if (sepid && ((text_bytes % DATA_ALIGNMENT) != 0) ) {
X          pexit("separate I & D but text size not multiple of 16 bytes.  File: ", 
X***************
X*** 180,184 ****
X    }
X!   tot_bytes = (long)text_bytes + data_bytes + bss_bytes;
X!   rest = tot_bytes % 16;
X!   filler = (rest > 0 ? 16 - rest : 0);
X    bss_bytes += filler;
X--- 218,225 ----
X    }
X!   file_text_bytes = text_bytes;
X!   if (sepid)
X! 	text_bytes = (text_bytes + clicksize - 1) & ~(clicksize - 1);
X!   tot_bytes = (long) text_bytes + (data_bytes + bss_bytes) + sym_bytes;
X!   rest = tot_bytes % clicksize;
X!   filler = (rest > 0 ? clicksize - rest : 0);
X    bss_bytes += filler;
X***************
X*** 192,193 ****
X--- 233,235 ----
X    sizes[num].bss_size  = bss_bytes;
X+   sizes[num].sym_size  = sym_bytes;
X    sizes[num].sep_id    = sepid;
X***************
X*** 203,213 ****
X    /* Read in the text and data segments, and copy them to output. */
X!   left_to_read = text_bytes + data_bytes;
X!   while (left_to_read > 0) {
X!         count = (left_to_read < READ_UNIT ? left_to_read : READ_UNIT);
X!         bytes_read = read(fd, inbuf, count);
X!         if (bytes_read < 0) pexit("read error on file ", file_name);
X!         if (bytes_read > 0) wr_out(inbuf, bytes_read);
X!         left_to_read -= count;
X!   }
X  
X    /* Write the bss to output. */
X--- 245,257 ----
X    /* Read in the text and data segments, and copy them to output. */
X!   copy3(fd, file_text_bytes, file_name);
X  
X+   /* Oops, pad the text segment in the middle of this. */
X+   text_bytes -= file_text_bytes;	/* remainder now */
X+   while (text_bytes != 0) {
X+         count = (text_bytes < SECTOR_SIZE ? text_bytes : SECTOR_SIZE);
X+         wr_out(zero, count);
X+         text_bytes -= count;
X+   }
X+   copy3(fd, data_bytes, file_name);
X+ 
X    /* Write the bss to output. */
X***************
X*** 218,219 ****
X--- 262,267 ----
X    }
X+ 
X+   /* Copy symbol table to output. */
X+   copy3(fd, sym_bytes, file_name);
X+ 
X    close(fd);
X***************
X*** 222,228 ****
X  
X! read_header(fd, sepid, text_bytes, data_bytes, bss_bytes, file_name)
X! int fd, *sepid;
X! unsigned *text_bytes, *data_bytes, *bss_bytes;
X  char *file_name;
X  {
X  /* Read the header and check the magic number.  The standard Monix header 
X--- 270,301 ----
X  
X! copy3(fd, left_to_read, file_name)
X! int fd;
X! unsigned left_to_read;
X  char *file_name;
X  {
X+   int bytes_read;
X+   int count;
X+   char inbuf[READ_UNIT];
X+ 
X+   while (left_to_read != 0)
X+   {
X+     if ( (unsigned) (count = left_to_read) > READ_UNIT)
X+       count = READ_UNIT;
X+     if ( (bytes_read = read(fd, inbuf, count)) <= 0)
X+       pexit("read error on file ", file_name);
X+     wr_out(inbuf, bytes_read);
X+     left_to_read -= count;
X+   }
X+ }
X+ 
X+ 
X+ #ifdef XENIX_HEADER
X+ # include </usr/include/sys/a.out.h>
X+ #endif
X+ 
X+ read_header(fd, sepid, text_bytes, data_bytes, bss_bytes, sym_bytes,file_name)
X+ int fd, *sepid;
X+ unsigned *text_bytes, *data_bytes, *bss_bytes, *sym_bytes;
X+ char *file_name;
X+ {
X  /* Read the header and check the magic number.  The standard Monix header 
X***************
X*** 243,248 ****
X--- 316,349 ----
X  
X+ #ifdef XENIX_HEADER
X+   struct  aexec a_header;
X+ #else
X    long head[12];
X    unsigned short hd[4];
X+ #endif
X    int n, header_len;
X  
X+ #ifdef XENIX_HEADER
X+   /*
X+     Do it right, read header *structure* to get header length.
X+     Fortunately header has no longs so we don't have to worry about
X+     swapped words, not to mention swapped bytes.
X+   */
X+   if ((n = read(fd, &a_header, sizeof a_header)) != sizeof a_header)
X+   {
X+     printf("expected %d, got %d\n", sizeof a_header, n);
X+     pexit("file header too short: ", file_name);
X+   }
X+   if (a_header.xa_magic == FMAGIC)
X+     *sepid = 0;
X+   else if (a_header.xa_magic == IMAGIC)
X+     *sepid = 1;
X+   else
X+     pexit("not Xenix a.out FMAGIC or IMAGIC. FIle: ", file_name);
X+   if (a_header.xa_entry != 0)
X+     pexit("nonzero entry point. FIle: ", file_name);
X+   *text_bytes = a_header.xa_text;
X+   *data_bytes = a_header.xa_data;
X+   *bss_bytes  = a_header.xa_bss;
X+   *sym_bytes  = a_header.xa_syms;
X+ #else
X    /* Read first 8 bytes of header to get header length. */
X***************
X*** 263,264 ****
X--- 364,367 ----
X    *bss_bytes  = (unsigned) head[BSS_POS];
X+   *sym_bytes  = (unsigned) head[SYM_POS];
X+ #endif
X  }
X***************
X*** 333,340 ****
X  
X!   if (cum_size % 16 != 0) pexit("MINIX is not multiple of 16 bytes", "");
X    fsck_org = PROG_ORG + cum_size;       /* where does fsck begin */
X    ip = 0;
X!   cs = fsck_org >> CLICK_SHIFT;
X    if (sizes[FSCK].sep_id)
X!      ds = cs + (sizes[FSCK].text_size >> CLICK_SHIFT);
X    else
X--- 436,444 ----
X  
X!   if (cum_size % clicksize != 0)
X! 	pexit("MINIX is not multiple of clicksize bytes", "");
X    fsck_org = PROG_ORG + cum_size;       /* where does fsck begin */
X    ip = 0;
X!   cs = fsck_org >> HCLICK_SHIFT;
X    if (sizes[FSCK].sep_id)
X!      ds = cs + (sizes[FSCK].text_size >> HCLICK_SHIFT);
X    else
X***************
X*** 344,348 ****
X    sectrs = (unsigned) (all_size / 512L);
X  
X    read_block(0, ubuf);          /* read in boot block */
X!   ubuf[(SECTOR_SIZE/2) - 4] = sectrs + 1;
X    ubuf[(SECTOR_SIZE/2) - 3] = ds;
X--- 448,454 ----
X    sectrs = (unsigned) (all_size / 512L);
X+   if (all_size % 512 != 0)
X+      ++sectrs;
X  
X    read_block(0, ubuf);          /* read in boot block */
X!   ubuf[(SECTOR_SIZE/2) - 4] = sectrs;
X    ubuf[(SECTOR_SIZE/2) - 3] = ds;
X***************
X*** 367,368 ****
X--- 473,477 ----
X   * can't load DS from data space, but it can load DS from text space.
X+  * Write the offset of the symbol table for each progam into location 2 of
X+  * its code space, for the debugger. No one was expecting this, but is is
X+  * the only available unused space.
X   */
X***************
X*** 370,375 ****
X    int i, j;
X!   unsigned short t, d, b, text_clicks, data_clicks, ds;
X!   long data_offset;
X  
X    /* See if the magic number is where it should be in the kernel. */
X    data_offset = 512L + (long)sizes[KERN].text_size;    /* start of kernel data */
X--- 479,485 ----
X    int i, j;
X!   unsigned short t, d, b, s, text_clicks, data_clicks, ds;
X!   long text_offset, data_offset;
X  
X    /* See if the magic number is where it should be in the kernel. */
X+   text_offset = 512L;
X    data_offset = 512L + (long)sizes[KERN].text_size;    /* start of kernel data */
X***************
X*** 384,391 ****
X          b = sizes[i].bss_size;
X          if (sizes[i].sep_id) {
X!                 text_clicks = t >> CLICK_SHIFT;
X!                 data_clicks = ((unsigned long)d + b) >> CLICK_SHIFT;
X          } else {
X                  text_clicks = 0;
X!                 data_clicks = ((unsigned long)t + d + b) >> CLICK_SHIFT;
X          }
X--- 494,504 ----
X          b = sizes[i].bss_size;
X+ 	s = sizes[i].sym_size;
X          if (sizes[i].sep_id) {
X!                 text_clicks = t >> click_shift;
X!                 data_clicks = ((unsigned long) d + b + s) >> click_shift;
X! 		put_word(text_offset + SYM_OFFSET, d + b);
X          } else {
X                  text_clicks = 0;
X!                 data_clicks = ((unsigned long) t + d + b + s) >> click_shift;
X! 		put_word(text_offset + SYM_OFFSET, t + d + b);
X          }
X***************
X*** 395,396 ****
X--- 508,510 ----
X          put_byte(data_offset + 4*i + 3L, (data_clicks>>8) & 0377);
X+         text_offset += (unsigned long) t + d + b + s;
X    }
X***************
X*** 399,403 ****
X    if (sizes[KERN].sep_id == 0)
X!         ds = PROG_ORG >> CLICK_SHIFT;   /* combined I & D space */
X    else
X!         ds = (PROG_ORG + sizes[KERN].text_size) >> CLICK_SHIFT; /* separate */
X    put_byte(512L + DS_OFFSET, ds & 0377);
X--- 513,517 ----
X    if (sizes[KERN].sep_id == 0)
X!         ds = PROG_ORG >> HCLICK_SHIFT;	/* combined I & D space */
X    else
X!         ds = (PROG_ORG + sizes[KERN].text_size) >> HCLICK_SHIFT; /* separate */
X    put_byte(512L + DS_OFFSET, ds & 0377);
X***************
X*** 419,430 ****
X    init_org  = PROG_ORG;
X!   init_org += (long)sizes[KERN].text_size+sizes[KERN].data_size+sizes[KERN].bss_size;
X    mm_data = init_org - PROG_ORG +512L;	/* offset of mm in file */
X    mm_data += (long) sizes[MM].text_size;
X!   init_org += (long)sizes[MM].text_size + sizes[MM].data_size + sizes[MM].bss_size;
X!   fs_org = init_org - PROG_ORG + 512L;   /* offset of fs-text into file */
X    fs_org +=  (long) sizes[FS].text_size;
X!   init_org += (long)sizes[FS].text_size + sizes[FS].data_size + sizes[FS].bss_size;
X    init_text_size = sizes[INIT].text_size;
X!   init_data_size = sizes[INIT].data_size + sizes[INIT].bss_size;
X!   init_org  = init_org >> CLICK_SHIFT;  /* convert to clicks */
X    if (sizes[INIT].sep_id == 0) {
X--- 533,546 ----
X    init_org  = PROG_ORG;
X!   init_org += (long)sizes[KERN].text_size+sizes[KERN].data_size+sizes[KERN].bss_size + sizes[KERN].sym_size;
X!   /* this code was awful and is worse after adding sym_sizes */
X    mm_data = init_org - PROG_ORG +512L;	/* offset of mm in file */
X    mm_data += (long) sizes[MM].text_size;
X!   init_org += (long)sizes[MM].text_size + sizes[MM].data_size + sizes[MM].bss_size + sizes[MM].sym_size;
X!   fs_org = init_org - PROG_ORG + 512L;	/* offset of fs-text into file */
X    fs_org +=  (long) sizes[FS].text_size;
X!   init_org += (long)sizes[FS].text_size + sizes[FS].data_size + sizes[FS].bss_size + sizes[FS].sym_size;
X    init_text_size = sizes[INIT].text_size;
X!   init_data_size = sizes[INIT].data_size + sizes[INIT].bss_size
X!                  + sizes[INIT].sym_size;
X!   init_org  = init_org >> click_shift;	/* convert to clicks */
X    if (sizes[INIT].sep_id == 0) {
X***************
X*** 433,436 ****
X    }
X!   init_text_size = init_text_size >> CLICK_SHIFT;
X!   init_data_size = init_data_size >> CLICK_SHIFT;
X  
X--- 549,552 ----
X    }
X!   init_text_size = init_text_size >> click_shift;
X!   init_data_size = init_data_size >> click_shift;
X  
X***************
X*** 450,453 ****
X--- 566,575 ----
X    if (mag != FS_D_MAGIC) pexit("mm data space: no magic #","");
X+   mag = (get_byte(mm_data+3L) << 8) + get_byte(mm_data+2L);
X+   if (mag == 0) mag = HCLICK_SHIFT;	/* old mm */
X+   if (mag != click_shift) pexit("mm click_shift does not match kernel's", "");
X    mag = (get_byte(fbase+1L) << 8) + get_byte(fbase+0L);
X    if (mag != FS_D_MAGIC) pexit("fs data space: no magic #","");
X+   mag = (get_byte(fbase+3L) << 8) + get_byte(fbase+2L);
X+   if (mag == 0) mag = HCLICK_SHIFT;	/* old fs */
X+   if (mag != click_shift) pexit("fs click_shift does not match kernel's", "");
X  
X***************
X*** 496,497 ****
X--- 618,628 ----
X  
X+ 
X+ /* this should be used instead of paired put_byte()'s */
X+ put_word(offset, word_value)
X+ long offset;
X+ unsigned word_value;
X+ {
X+   put_byte(offset, word_value % 256);
X+   put_byte(offset + 1, word_value / 256);
X+ }
X  
END_OF_FILE
if test 16217 -ne `wc -c <'toolsdif/build.c.cdif'`; then
    echo shar: \"'toolsdif/build.c.cdif'\" unpacked with wrong size!
fi
# end of 'toolsdif/build.c.cdif'
fi
echo shar: End of archive 10 \(of 10\).
cp /dev/null ark10isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 10 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Division of Information Technology (Melbourne), Phone +61 3 347 8644
C.S.I.R.O.                                      Fax  +61 3 347 8987
55 Barry St.                                    Telex AA 152914
Carlton, Vic, 3053, Australia                   E-mail: worsley@ditmela.oz.au