brucee@runx.ips.oz (Bruce Evans) (11/26/88)
#! /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 4 (of 7)." # Contents: kernel/db/io.c tools/build.c.cdif # Wrapped by sys@besplex on Sat Nov 26 06:00:22 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'kernel/db/io.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'kernel/db/io.c'\" else echo shar: Extracting \"'kernel/db/io.c'\" \(11682 characters\) sed "s/^X//" >'kernel/db/io.c' <<'END_OF_FILE' X/* io.c */ X X#include "const.h" X#include "type.h" X#include "var.h" X X#define NDEV 3 X#define KEYDEV 0 X#define TTYDEV 1 X#define SCRDEV 2 X X#define IOCCOFF 0 /* cursor on (these s.b. in header file) */ X#define IOCCON 1 /* cursor off */ X#define IOCUSER 2 /* copy user state */ X Xstruct dev X{ X bool_t inopen; X bool_t outopen; X pfv_t close; X pfi_t in; X pfv_t ioctl; X pfv_t open; X pfv_t out; X}; X XPRIVATE struct dev devtable[NDEV] = X{ X { TRUE, FALSE, kbdclose, kbdin, kbdioctl, kbdopen, kbdout }, X { TRUE, FALSE, ttyclose, ttyin, ttyioctl, ttyopen, ttyout }, X { FALSE, TRUE, scrclose, scrin, scrioctl, scropen, scrout } X}; X XPRIVATE bool_t forceupper; XPRIVATE bool_t pause = FALSE; XPRIVATE bool_t someupper = TRUE; XPRIVATE count_t stringcount = 0; XPRIVATE char *string_ptr = NULL; /* stringptr ambiguous at 8th char */ XPRIVATE char *stringstart = NULL; X X/* cancel input device */ X XPUBLIC void can_input( devptr ) Xstruct dev *devptr; X{ X if ( devptr->inopen ) X { X if ( !devptr->outopen ) X (*devptr->close)(); X devptr->inopen = FALSE; X } X} X X/* cancel output device */ X XPUBLIC void can_output( devptr ) Xstruct dev *devptr; X{ X if ( devptr->outopen ) X { X if ( !devptr->inopen ) X (*devptr->close)(); X devptr->outopen = FALSE; X } X} X X/* cancel keyboard device */ X XPUBLIC void can_keyboard() X{ X can_input( &devtable[KEYDEV] ); X} X X/* cancel screen device */ X XPUBLIC void can_screen() X{ X can_output( &devtable[SCRDEV] ); X} X X/* cancel tty input device */ X XPUBLIC void can_itty() X{ X can_input( &devtable[TTYDEV] ); X} X X/* cancel tty output device */ X XPUBLIC void can_otty() X{ X can_output( &devtable[TTYDEV] ); X} X X/* close all devices */ X XPUBLIC void closeio() X{ X struct dev *devptr; X X for ( devptr = &devtable[0]; devptr < &devtable[NDEV]; ++devptr ) X if ( devptr->inopen || devptr->outopen ) X (*devptr->close)(); X} X X/* close string device */ X XPUBLIC void closestring() X{ X stringcount = 0; X stringstart = string_ptr = NULL; X} X X/* enable input device */ X XPUBLIC void enab_input( devptr ) Xstruct dev *devptr; X{ X if ( !devptr->inopen ) X { X if ( !devptr->outopen ) X (*devptr->open)(); X devptr->inopen = TRUE; X } X} X X/* enable output device */ X XPUBLIC void enab_output( devptr ) Xstruct dev *devptr; X{ X if ( !devptr->outopen ) X { X if ( !devptr->inopen ) X (*devptr->open)(); X devptr->outopen = TRUE; X } X} X X/* enable keyboard device */ X XPUBLIC void enab_keyboard() X{ X enab_input( &devtable[KEYDEV] ); X} X X/* enable screen device */ X XPUBLIC void enab_screen() X{ X enab_output( &devtable[SCRDEV] ); X} X X/* enable tty input device */ X XPUBLIC void enab_itty() X{ X enab_input( &devtable[TTYDEV] ); X} X X/* enable tty output device */ X XPUBLIC void enab_otty() X{ X enab_output( &devtable[TTYDEV] ); X} X XPUBLIC void flipcase() X{ X someupper = TRUE - someupper; X} X X/* get 8 bits current instruction pointer and advance pointer */ X XPUBLIC u8_pt get8() X{ X u8_pt temp; X X temp = peek8( &uptr ); X ++uptr.off; X return temp; X} X X/* get 16 bits from current instruction pointer and advance pointer */ X XPUBLIC u16_t get16() X{ X u16_t temp; X X temp = peek16( &uptr ); X uptr.off += 2; X return temp; X} X X/* get 32 bits from current instruction pointer and advance pointer */ X XPUBLIC u32_t get32() X{ X u32_t temp; X X temp = peek32( &uptr ); X uptr.off += 4; X return temp; X} X X/* input char from one of currently open input devices */ X XPUBLIC char16_t inchar() X{ X char16_t ch; X X ioctlio( IOCCON ); X while ( (ch = testchar()) == EOF ) X ; X ioctlio( IOCCOFF ); X return ch; X} X X/* perform ioctl for all devices */ X XPUBLIC void ioctlio( command ) Xbool_pt command; X{ X struct dev *devptr; X X for ( devptr = &devtable[0]; devptr < &devtable[NDEV]; ++devptr ) X if ( devptr->inopen || devptr->outopen ) X (*devptr->ioctl)( command ); X} X X/* convert char to lower case */ X XPUBLIC char_pt mytolower( ch ) Xchar_pt ch; X{ X if ( ch >= 'A' && ch <= 'Z' ) X /* X if ( (ch - 'A') <= 'Z' - 'A' ) X */ X ch += 'a' - 'A'; X return ch; X} X X/* open all devices */ X XPUBLIC void openio() X{ X struct dev *devptr; X X for ( devptr = &devtable[0]; devptr < &devtable[NDEV]; ++devptr ) X if ( devptr->inopen || devptr->outopen ) X (*devptr->open)(); X pause = FALSE; X} X X/* open string device */ X XPUBLIC void openstring( string ) Xchar *string; X{ X stringcount = 0; X stringstart = string_ptr = string; X} X X/* print 2 spaces */ X XPUBLIC void out2space() X{ X outspace(); X outspace(); X} X X/* print char to currently open output devices */ X XPUBLIC void outbyte( byte ) Xchar_pt byte; X{ X struct dev *devptr; X X if ( forceupper && byte >= 'a' && byte <= 'z' ) X byte += 'A' - 'a'; X if ( string_ptr != NULL ) X { X if ( (*string_ptr++ = byte) == '\t' ) X stringcount = 8 * (stringcount / 8 + 1); X else X ++stringcount; X } X else X for ( devptr = &devtable[0]; devptr < &devtable[NDEV]; ++devptr ) X if ( devptr->outopen ) X (*devptr->out)( byte ); X} X X/* print colon */ X XPUBLIC void outcolon() X{ X outbyte( ':' ); X} X X/* print comma */ X XPUBLIC void outcomma() X{ X outbyte( ',' ); X} X X/* get 8 bit offset and print in hex */ X XPUBLIC void outget8() X{ X outh8( get8() ); X} X X/* get 16 bit offset and print in hex */ X XPUBLIC void outget16() X{ X outh16( get16() ); X} X X/* print 4 bits hex */ X XPUBLIC void outh4( num ) Xu4_pt num; X{ X static char hexdigits[] = "0123456789abcdef"; X X forceupper = someupper; X outbyte( hexdigits[num % 16] ); X forceupper = FALSE; X} X X/* print 8 bits hex */ X XPUBLIC void outh8( num ) Xu8_pt num; X{ X outh4( num / 16 ); X outh4( num ); X} X X/* print 8 bits hex and 1 space */ X XPUBLIC void outh8s( num ) Xu8_pt num; X{ X outh8( num ); X outspace(); X} X X/* print 16 bits hex */ X XPUBLIC void outh16( num ) Xu16_t num; X{ X outh8( num / 256 ); X outh8( num ); X} X X/* print 32 bits hex */ X XPUBLIC void outh32( num ) Xu32_t num; X{ X outh16( (u16_t) (num >> 16) ); X outh16( (u16_t) num ); X} X X#ifdef UNUSED_FUNCTIONS X X/* print offset, hex format */ X XPUBLIC void outhex( num ) Xoffset_t num; X{ X#ifdef HEXSTARTCHAR X if ( num >= 10 ) X outbyte( HEXSTARTCHAR ); X#endif X outhexdigs( num ); X#ifdef HEXENDCHAR X if ( num >= 10 ) X outbyte( HEXENDCHAR ); X#endif X} X X#endif X X#ifdef UNUSED_FUNCTIONS X X/* print 8 bit offset, hex format */ X XPUBLIC void outhex8( num ) Xu8_pt num; X{ X#ifdef HEXSTARTCHAR X outbyte( HEXSTARTCHAR ); X#endif X outh8( num ); X#ifdef HEXENDCHAR X outbyte( HEXENDCHAR ); X#endif X} X X#endif X X#ifdef UNUSED_FUNCTIONS X X/* print 16 bit offset, hex format */ X XPUBLIC void outhex16( num ) Xu16_t num; X{ X#ifdef HEXSTARTCHAR X outbyte( HEXSTARTCHAR ); X#endif X outh16( num ); X#ifdef HEXENDCHAR X outbyte( HEXENDCHAR ); X#endif X} X X#endif X X#ifdef UNUSED_FUNCTIONS X X/* print offset, hex format with digits only (no hex designator) */ X XPUBLIC void outhexdigs( num ) Xregister offset_t num; X{ X if ( num >= 16 ) X { X outhexdigs( num / 16 ); X num %= 16; X } X outhdigit( num ); X} X X#endif X X#ifdef UNUSED_FUNCTIONS X X/* print character, then newline */ X XPUBLIC void outnbyte( byte ) Xchar_pt byte; X{ X outbyte( byte ); X outnl(); X} X X#endif X X#ifdef UNUSED_FUNCTIONS X X/* print offset, hex format, then newline */ X XPUBLIC void outnhex( num ) Xoffset_t num; X{ X outhex( num ); X outnl(); X} X X#endif X X/* print newline */ X XPUBLIC bool_pt outnl() X{ X char_pt ch; X X outstr( "\015\012" ); X if ( !pause ) X { X if ( (ch = testchar()) == CAN ) X return FALSE; X if ( ch != XOFF ) X return TRUE; X } X pause = FALSE; X if ( (ch = inchar()) == XOFF ) X pause = TRUE; X return ch - CAN; X} X X/* print string, then newline */ X XPUBLIC bool_pt outnstr( s ) Xchar *s; X{ X outstr( s ); X return outnl(); X} X X#ifdef UNUSED_FUNCTIONS X X/* print plus sign */ X XPUBLIC void outplus() X{ X outbyte( '+' ); X} X X#endif X X/* print segmented address */ X XPUBLIC void outsegadr( adr ) Xstruct adr *adr; X{ X outh16( adr->seg ); X outcolon(); X if ( db_processor == 386 ) X outh32( adr->off ); X else X outh16( (u16_t) adr->off ); X} X X/* print 32 bit segmented address and 2 spaces */ X XPUBLIC void outssegadr( adr ) Xstruct adr *adr; X{ X outsegadr( adr ); X out2space(); X} X X#ifdef UNUSED_FUNCTIONS X X/* print signed, hex format */ X XPUBLIC void outshex( num ) Xoffset_t num; X{ X if ( (soffset_t) num < 0 ) X { X outbyte( '-' ); X num = -num; X } X outhex( num ); X} X X#endif X X/* print space */ X XPUBLIC void outspace() X{ X outbyte( ' ' ); X} X X/* print string */ X XPUBLIC void outstr( s ) Xregister char *s; X{ X while ( *s ) X outbyte( *s++ ); X} X X/* print tab */ X XPUBLIC void outtab() X{ X outbyte( '\t' ); X} X X/* print string, perhaps converting case to upper */ X XPUBLIC void outustr( s ) Xregister char *s; X{ X forceupper = someupper; X while ( *s ) X outbyte( *s++ ); X forceupper = FALSE; X} X X#ifdef UNUSED_FUNCTIONS X X/* print offset, decimal format */ X XPUBLIC void outudec( num ) Xregister offset_t num; X{ X if ( num >= 10 ) X { X register offset_t reduction; X X outudec( reduction = num / 10 ); X num -= 10 * reduction; X } X outbyte( (char_pt) num + '0' ); X} X X#endif X X/* set tty parameters from user */ X XPUBLIC void set_tty() X{ X ioctlio( IOCUSER ); X} X X/* flip to the db screen (flip to user by closing */ X XPUBLIC void show_db_screen() X{ X if ( devtable[SCRDEV].outopen ) X (*devtable[SCRDEV].open)(); X} X X/* flip to the user screen */ X XPUBLIC void show_user_screen() X{ X if ( devtable[SCRDEV].outopen ) X (*devtable[SCRDEV].close)(); X} X X/* return current offset of string device */ X XPUBLIC count_t stringpos() X{ X return string_ptr - stringstart; X} X X/* return current "tab" spot of string device */ X XPUBLIC count_t stringtab() X{ X return stringcount; X} X X/* test for char from one of currently open input devices */ X XPUBLIC char_pt testchar() X{ X char_pt ch; X struct dev *devptr; X X for ( devptr = &devtable[0]; devptr < &devtable[NDEV]; ++devptr ) X if ( devptr->inopen && (ch = (*devptr->in)()) != EOF ) X return ch; X return EOF; X} X X#ifdef LINT X X/* prototypes, perhaps out of date */ X/* prototypes for assembler functions */ X X/* ARGSUSED */ XPUBLIC segment_t codeseg() { return 1; } X/* ARGSUSED */ XPUBLIC segment_t dataseg() { return 1; } X/* ARGSUSED */ XPUBLIC unsigned get_processor() { return 1; } X/* ARGSUSED */ XPUBLIC u8_pt inportb( port ) port_t port; { return 1; } X/* ARGSUSED */ XPUBLIC void oportb( port, val ) port_t port; u8_pt val; {} X/* ARGSUSED */ XPUBLIC u8_pt peek8( adr ) struct adr *adr; { return 1; } X/* ARGSUSED */ XPUBLIC u8_pt peekb( seg, off ) segment_t seg; u8_t *off; { return 1; } X/* ARGSUSED */ XPUBLIC u16_t peek16( adr ) struct adr *adr; { return 1; } X/* ARGSUSED */ XPUBLIC u16_t peekw( seg, off ) segment_t seg; u16_t *off; { return 1; } X/* ARGSUSED */ XPUBLIC u32_t peek32( adr ) struct adr *adr; { return 1; } X/* ARGSUSED */ XPUBLIC void poke8( adr, value ) struct adr *adr; u8_pt value; {} X/* ARGSUSED */ XPUBLIC void pokeb( seg, off, val ) segment_t seg, u8_t *off, u8_pt val; {} X/* ARGSUSED */ XPUBLIC void poke16( adr, value ) struct adr *adr; u16_t value; {} X/* ARGSUSED */ XPUBLIC void pokew( seg, off, val ) segment_t seg, u16_t *off, u16_t val; {} X/* ARGSUSED */ XPUBLIC void poke32( adr, value ) struct adr *adr; u32_t value; {} XPUBLIC void scrclose() {} XPUBLIC char_pt scrin() {} X/* ARGSUSED */ XPUBLIC void scrioctl( c ) char_pt c; {} XPUBLIC void scropen() {} X/* ARGSUSED */ XPUBLIC void scrout( c ) char_pt c; {} XPUBLIC void symswap(); XPUBLIC void symswap( left, right, tableseg, length ) Xstruct nlist *left; struct nlist *right; segment_t tableseg; unsigned length; X{} XPUBLIC void ttyclose() {} XPUBLIC char_pt ttyin() { return (char) 1; } X/* ARGSUSED */ XPUBLIC void ttyioctl( c ) char_pt c; {} XPUBLIC void ttyopen() {} X/* ARGSUSED */ XPUBLIC void ttyout( c ) char_pt c; {} X X/* prototypes for library functions */ X X/* ARGSUSED */ XPUBLIC char *memcpy( t, s, n ) char *s; char *t; unsigned n; { return t; } X/* ARGSUSED */ XPUBLIC int strlen( s ) char *s; { return 1; } X X/* prototypes for Minix kernel functions */ X XPUBLIC segment_t codeseg() { return 1; } XPUBLIC void get_con_state() {} XPUBLIC void map_dmp() {} XPUBLIC void p_dmp() {} XPUBLIC void reset_con_state() {} X X#endif /* LINT */ END_OF_FILE if test 11682 -ne `wc -c <'kernel/db/io.c'`; then echo shar: \"'kernel/db/io.c'\" unpacked with wrong size! fi # end of 'kernel/db/io.c' fi if test -f 'tools/build.c.cdif' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tools/build.c.cdif'\" else echo shar: Extracting \"'tools/build.c.cdif'\" \(10647 characters\) sed "s/^X//" >'tools/build.c.cdif' <<'END_OF_FILE' X*** orig/build.c Wed Aug 3 21:28:56 1988 X--- build.c Mon Nov 21 21:56:38 1988 X*************** X*** 43,44 **** X--- 43,53 ---- 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+ X X*************** X*** 47,48 **** X--- 56,58 ---- 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*** 66,67 **** X--- 76,78 ---- 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*** 87,88 **** X--- 98,100 ---- 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--- 168,174 ---- 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 16, if need be. The X! * individual pieces need not be multiples of 16 bytes, except for the text X! * size when separate I & D is in use. X */ X*************** X*** 165,170 **** X int fd, sepid, bytes_read, count; 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--- 176,179 ---- X int fd, sepid, bytes_read, count; X! unsigned text_bytes, data_bytes, bss_bytes, sym_bytes, rest, filler; X! long tot_bytes; X X*************** X*** 173,175 **** 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--- 182,185 ---- 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*************** X*** 180,182 **** X } X! tot_bytes = (long)text_bytes + data_bytes + bss_bytes; X rest = tot_bytes % 16; X--- 190,192 ---- X } X! tot_bytes = (long) text_bytes + (data_bytes + bss_bytes) + sym_bytes; X rest = tot_bytes % 16; X*************** X*** 192,193 **** X--- 202,204 ---- X sizes[num].bss_size = bss_bytes; X+ sizes[num].sym_size = sym_bytes; X sizes[num].sep_id = sepid; X*************** X*** 203,212 **** 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--- 214,217 ---- X /* Read in the text and data segments, and copy them to output. */ X! copy3(fd, text_bytes, file_name); X! copy3(fd, data_bytes, file_name); X X*************** X*** 215,219 **** X count = (bss_bytes < SECTOR_SIZE ? bss_bytes : SECTOR_SIZE); X! wr_out(zero, count); X! bss_bytes -= count; X! } X close(fd); X--- 220,228 ---- X count = (bss_bytes < SECTOR_SIZE ? bss_bytes : SECTOR_SIZE); X! wr_out(&zero, count); X! bss_bytes -= count; X! } X! X! /* Copy symbol table to output. */ X! copy3(fd, sym_bytes, file_name); X! X close(fd); X*************** X*** 222,226 **** 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--- 231,260 ---- 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*** 243,248 **** X X! long head[12]; X! unsigned short hd[4]; X! int n, header_len; X! X /* Read first 8 bytes of header to get header length. */ X--- 277,310 ---- 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--- 325,328 ---- X *bss_bytes = (unsigned) head[BSS_POS]; X+ *sym_bytes = (unsigned) head[SYM_POS]; X+ #endif X } X*************** X*** 367,368 **** X--- 431,435 ---- 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--- 437,443 ---- 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--- 452,462 ---- 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--- 466,468 ---- X put_byte(data_offset + 4*i + 3L, (data_clicks>>8) & 0377); X+ text_offset += (unsigned long) t + d + b + s; X } X*************** X*** 419,429 **** 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--- 491,503 ---- 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*************** X*** 497,498 **** X--- 571,581 ---- 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+ X END_OF_FILE if test 10647 -ne `wc -c <'tools/build.c.cdif'`; then echo shar: \"'tools/build.c.cdif'\" unpacked with wrong size! fi # end of 'tools/build.c.cdif' fi echo shar: End of archive 4 \(of 7\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 5 6 7 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 7 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 Bruce Evans Internet: brucee@runx.ips.oz.au UUCP: uunet!runx.ips.oz.au!brucee