diff -Nurd linux86.old/Makefile linux86/Makefile --- linux86.old/Makefile Wed Mar 20 22:56:16 2002 +++ linux86/Makefile Mon Jul 22 22:35:18 2002 @@ -2,7 +2,7 @@ # This file is part of the Linux-8086 Development environment and is # distributed under the GNU General Public License. -VERSION=0.16.3 +VERSION=0.16.4 TARGETS= \ clean bcc unproto copt as86 ld86 elksemu \ diff -Nurd linux86.old/as/alloc.c linux86/as/alloc.c --- linux86.old/as/alloc.c Sat Jun 23 23:37:52 2001 +++ linux86/as/alloc.c Sun May 26 08:17:14 2002 @@ -20,12 +20,13 @@ { #ifdef USE_FIXED_HEAP #ifndef USERMEM -#define USERMEM (unsigned) 0xAC00U +#define USERMEM 0xAC00U #endif #ifdef __AS386_16__ + int stk; heapptr = sbrk(0); - heapend = ((char*)&argc) - STAKSIZ - 16; + heapend = ((char*)&stk) - STAKSIZ - 16; brk(heapend); if(sbrk(0) != heapend) as_abort(NOMEMEORY); @@ -68,8 +69,7 @@ #else rv = malloc(size); #endif - - if (rv == 0) as_abort(NOMEMEORY); + if (rv == 0 && size) as_abort(NOMEMEORY); return rv; } @@ -85,7 +85,7 @@ if ((char*)oldptr+size < heapend) { - heapptr = oldptr + size; + heapptr = (char*)oldptr + size; rv = oldptr; } else diff -Nurd linux86.old/bcc/assign.c linux86/bcc/assign.c --- linux86.old/bcc/assign.c Tue Sep 29 13:15:31 1998 +++ linux86/bcc/assign.c Mon Jul 22 22:31:14 2002 @@ -316,7 +316,7 @@ extend(target); load(target, DREG); target->storage = targreg = getindexreg(); - if (oldscalar & (UNSIGNED | CHAR) || + if (oldscalar & UNSIGNED || target->type->constructor & (ARRAY | FUNCTION | POINTER)) uitol(targreg); else diff -Nurd linux86.old/bcc/bcc.bugs linux86/bcc/bcc.bugs --- linux86.old/bcc/bcc.bugs Mon Nov 9 15:58:42 1992 +++ linux86/bcc/bcc.bugs Thu Jan 1 01:00:00 1970 @@ -1,169 +0,0 @@ -compiler limitations --------------------- - -These are not implemented: - -a. bit fields - kludgily implemented (everything padded to char, int or long; can store - values wider than the specified field width) - -g. signed char type, other ANSI extensions - -compiler bugs -------------- - -6. weird but doable casts are not always done for initializers - -15. calls to a (casted) absolute address produce an immediate prefix. as386 - doesn't mind this but complains about the absolute address. as09 complains - about the prefix but can handle the absolute address - -23. char *f(); &f() is accepted as f() but produces botched nodetype - (calc char **). - -31. null byte in string initialiser should be ignored if it doesn't fit - Non-null bytes which don't fit should be ignored with a warning - -32. static char c = "xyz"; is allowed, and bad FCB is generated - -37. init of union will store multiple comma-separated entries - -38. arrays sizes larger than the amount of memory are accepted - -40. structure and union definitions are confused with each other. So - struct foo may be used in a declaration like "union foo bar;" - -42. pointer arithmetic is performed on pointers to undefined structures - (of unknown size). Size is taken as 0 although alignmask is set early - -59. preprocessor stuff (# lines or macro names) between the identifier for - a label and the colon for the label messes up the label - -60. some things involving switches are now broken for 6809 due to lack of - frame pointer - -61. assembler may get lost on lines of length exactly (?) 256 - -65. expressions in emum lists or not properly checked for overflow. They - should fit in ints. The ordinal number is allowed to overflow - -66. sizeof has type int instead of size_t - -68. "return expr;" in a function returning a void is reported as a compiler - bug not as a semantic error - -69. an argument declared as float is (correctly) promoted to double, but - not demoted to float when it is used - -71. identifiers longer than 64 are botched (scanning of the identifier is - stopped but the remaining characters in the identifier are left to - mess up the input stream - -72. check for too many macro parameters is not working - -74. union { char a, b; } foo; gives the wrong offset for b. Unions work OK - if the declaration lists have length 1 - -75. stack gets cleaned up too early in bee = foo ? bar : baz() where baz() - returns a struct although there is kludge to make plain bee = baz() work - -76. have reintroduced reduced-type bugs, so sizeof(1 ? 1 : 2) is 1 - -78. fix to require comma in arg list may be half-baked - -79. compiler starts trying to load the void expression (i ? (void)0 : (void)0) - -80. (unsigned char *) - (char *) causes error and message is obscure - -81. 'defined' is a reserved word - -82. conditionals with voids don't work - -83. float = 1e100 gets overflow exception - -84. #endif seems to be seen in -#if 1 -foo #endif bar - -85. line numbers from cpp are not quite right. - -bugs that may be fixed ----------------------- - -41. typedef's are not scoped properly - -nonstandard things that are not done quite right ------------------------------------------------- - -3. arguments declared as register are not being dumped by #asm, register - vars anyway not being passed to #asm - -26. should clear label ptrs when starting #asm - -things that have to be be done better -------------------------------------- - -11. push order reversed in genloads.c (temp) - might try to get DP order right - -12. need to clean up handling of sc specs (maybe rename flags to sc) - And local statics and externs - -24. gvarsc is not returned properly for struct/union since the members - affect gvarsc (incorrectly). There should be a flag set when - inside a struct/union definition to disable sc specs. This could - replace the tests in abdeclarator and declselt - Best may be to carry the sc along with the type a bit more (in a - global symbol structure). Also, the symbol should record sc in a better - way than now - -25. need to check stack sometimes. Xenix cc does it when allocating >= 100 - bytes locals and this is essential in Xenix as the stack is grown - dynamically - -68. overflow checking for constants - -things that could be done better --------------------------------- - -4. install new 6809 code for branch patching (after redundancy checks) - -5. can improve code for compare with global adr in non-posindependent case - -6. char *s; long *pl; - code for *s += *pl is poor, for *s += (int) *pl is good - -7. most mov's from to ax would be faster and smaller done by xchg's - -7a. check ptr add/sub operations earlier - -8. tests for against 1 and -1 can sometimes be done with dec's and inc's - -9. __opreg is used unnec when the ptr is already in it - -9a. double indirect ptrs should maybe be made direct rather than singly - indirect by makelessindirect - -10. in cmpsmallconst(), the comparison constant should be incorporated in - the offset if the indcount is 0 and lea() called. It is harmless to - use the lea() trick for non-small constants - -20. when saved registers are popped in assign() they may overwrite the - expression value, anywhere else? May be fixed now - -27. better if loadexpression returned the register used - -28. better if source.c did not #include storage.h - it only references - DEFINITION, in some blank-skipping code which could be moved to - scan.c or preproc.c. preproc.c, scan.c and type.c also #include - storage.h, just to get at the DEFINITION and KEYWORD definitions - -29. need nodetype() to know about all optimisations in advance, including - int % small power of 2 (including 0, 1). Need to delete all type - assignments in final code gen, specially the one that convert short - to int - -30. overflow checking at runtime - -31. Use more than the first char from multiple character constants - -56. --i++ is not detected as an error in the parser diff -Nurd linux86.old/bcc/bcc.c linux86/bcc/bcc.c --- linux86.old/bcc/bcc.c Wed Mar 20 22:33:47 2002 +++ linux86/bcc/bcc.c Tue May 28 23:45:59 2002 @@ -143,6 +143,7 @@ void run_unlink P((void)); void append_file P((char * filename, int ftype)); void append_option P((char * option, int otype)); +void prepend_option P((char * option, int otype)); char * expand_tilde P((char * str)); void * xalloc P((int size)); void Usage P((void)); @@ -182,8 +183,7 @@ #endif "~/lib/", "~/bin/", - "/usr/bin/", - 0 + 0 /* Last chance is contents of $PATH */ }; char * libc = "-lc"; @@ -397,6 +397,7 @@ command_reset(); newfilename(file, !do_link, 'o', 1); command_opt("-r"); + command_opt("-N"); run_command(file); } } @@ -654,7 +655,7 @@ do_unproto = 1; opt_e = 1; /* NOTE I'm setting this to zero, this isn't a _real_ STDC */ - append_option("-D__STDC__=0", 'p'); + prepend_option("-D__STDC__=0", 'p'); } else Usage(); @@ -750,7 +751,7 @@ do_optim=1; break; - case 'G': opt_M = 'G'; break; + case 'G': opt_M = 'g'; break; case 'v': opt_v++; break; case 'V': opt_V++; break; @@ -762,8 +763,8 @@ case 'W': opt_W++; break; - case '0': opt_arch=0; opt_M='x'; break; - case '3': opt_arch=1; opt_M='x'; break; + case '0': opt_arch=0; break; + case '3': opt_arch=1; break; case 'w': /*IGNORED*/ break; case 'g': /*IGNORED*/ break; @@ -809,55 +810,57 @@ if (opt_M==0) opt_M = (opt_arch==1 ?'l':'n'); switch(opt_M) { - case 'n': - append_option("-D__ELKS__", 'p'); - append_option("-D__unix__", 'p'); + case 'n': /* Normal Elks */ + prepend_option("-D__unix__", 'p'); + prepend_option("-D__ELKS__", 'p'); libc="-lc"; break; - case 'f': - append_option("-D__ELKS__", 'p'); - append_option("-D__unix__", 'p'); + case 'f': /* Fast Call Elks */ + prepend_option("-D__unix__", 'p'); + prepend_option("-D__ELKS__", 'p'); append_option("-c", 'p'); append_option("-f", 'p'); libc="-lc_f"; break; - case 'c': - append_option("-D__ELKS__", 'p'); - append_option("-D__unix__", 'p'); + case 'c': /* Caller saves Elks */ + prepend_option("-D__unix__", 'p'); + prepend_option("-D__ELKS__", 'p'); append_option("-c", 'p'); libc="-lc"; break; - case 's': - append_option("-D__STANDALONE__", 'p'); + case 's': /* Standalone 8086 */ + prepend_option("-D__STANDALONE__", 'p'); libc="-lc_s"; break; - case 'd': - append_option("-D__MSDOS__", 'p'); + case 'd': /* DOS COM file */ + prepend_option("-D__MSDOS__", 'p'); libc="-ldos"; append_option("-d", 'l'); append_option("-T100", 'l'); break; - case 'l': + case 'l': /* 386 Linux a.out */ opt_arch=1; - append_option("-D__linux__", 'p'); - append_option("-D__unix__", 'p'); + prepend_option("-D__unix__", 'p'); + prepend_option("-D__linux__", 'p'); libc="-lc"; append_option("-N", 'l'); break; - case 'G': + case 'g': /* 386 Linux object using gcc as linker */ opt_arch = 2; + prepend_option("-D__unix__", 'p'); + prepend_option("-D__linux__", 'p'); break; - case '8': + case '8': /* Use 'c386' program as compiler */ opt_arch = 3; opt_e = 1; break; - case '9': + case '9': /* 6809 compiler */ opt_arch = 4; default_libdir0 = "-L~/lib/bcc/m09/"; optim_rules = "-d~/lib/bcc/m09"; add_prefix("~/lib/bcc/m09/"); break; - case '0': + case '0': /* Plain old Unix V7 style */ opt_arch = 5; opt_e = 1; opt_I = 1; @@ -952,6 +955,20 @@ } } +void +prepend_option (option, otype) +char * option; +int otype; +{ + struct opt_list * newopt = xalloc(sizeof(struct opt_list)); + + newopt->opt = copystr(option); + newopt->opttype = otype; + + newopt->next = options; + options = newopt; +} + char * expand_tilde(str) char * str; { @@ -1039,11 +1056,13 @@ strcpy(temp, s); strcat(temp, "/"); strcat(temp, progname); +#ifndef __BCC__ if( realpath(temp, buf) != 0 ) { free(temp); temp = copystr(buf); } +#endif if( access(temp, X_OK) == 0 ) break; d++; } @@ -1119,7 +1138,10 @@ #ifdef __BCC__ execve(command.fullpath, command.arglist, minienviron); #else - execv(command.fullpath, command.arglist); + if (command.fullpath[0] =='/') + execv(command.fullpath, command.arglist); + else + execvp(command.fullpath, command.arglist); #endif fprintf(stderr, "Unable to execute %s.\n", command.fullpath); exit(1); diff -Nurd linux86.old/bcc/declare.c linux86/bcc/declare.c --- linux86.old/bcc/declare.c Fri Dec 17 17:51:13 1999 +++ linux86/bcc/declare.c Mon Jul 22 21:33:23 2002 @@ -412,12 +412,13 @@ PRIVATE bool_pt declspec() { unsigned nsc; + unsigned nsigned; unsigned ntype; unsigned nunsigned; gvarsc = NULLDECL; gvartype = itype; - nunsigned = ntype = nsc = 0; + nsigned = nunsigned = ntype = nsc = 0; while (TRUE) { switch (sym) @@ -484,6 +485,10 @@ gvartype = gsymptr->type; nextsym(); break; + case SIGNDECL: + ++nsigned; + nextsym(); + break; case UNSIGNDECL: ++nunsigned; nextsym(); @@ -493,6 +498,17 @@ } } break2: + if (nsigned > 0) + { + if (ntype == 0) + { + gvartype = itype; + ntype = 1; + } + gvartype = tosigned(gvartype); + if (nsigned > 1 || nunsigned > 0) + ntype = 2; + } if (nunsigned > 0) { if (ntype == 0) @@ -501,7 +517,7 @@ ntype = 1; } gvartype = tounsigned(gvartype); - if (nunsigned > 1) + if (nunsigned > 1 || nsigned > 0) ntype = 2; } if (nsc > 0) diff -Nurd linux86.old/bcc/patch.file linux86/bcc/patch.file --- linux86.old/bcc/patch.file Thu Jan 1 01:00:00 1970 +++ linux86/bcc/patch.file Fri Jun 7 05:57:16 2002 @@ -0,0 +1,157 @@ +diff -u5 -r bcc~/declare.c bcc/declare.c +--- bcc~/declare.c Fri Dec 17 17:51:13 1999 ++++ bcc/declare.c Thu Jun 6 13:27:00 2002 +@@ -410,16 +410,17 @@ + } + + PRIVATE bool_pt declspec() + { + unsigned nsc; ++ unsigned nsigned; + unsigned ntype; + unsigned nunsigned; + + gvarsc = NULLDECL; + gvartype = itype; +- nunsigned = ntype = nsc = 0; ++ nsigned = nunsigned = ntype = nsc = 0; + while (TRUE) + { + switch (sym) + { + case AUTODECL: +@@ -482,29 +483,37 @@ + goto break2; + ++ntype; + gvartype = gsymptr->type; + nextsym(); + break; ++ case SIGNDECL: ++ ++nsigned; ++ nextsym(); ++ break; + case UNSIGNDECL: + ++nunsigned; + nextsym(); + break; + default: + goto break2; + } + } ++ + break2: ++ if (nsigned > 0) ++ { ++ if (ntype++ == 0) ++ gvartype = itype; ++ else ++ gvartype = tosigned(gvartype); ++ } + if (nunsigned > 0) + { +- if (ntype == 0) +- { ++ if (ntype++ == 0) + gvartype = uitype; +- ntype = 1; +- } +- gvartype = tounsigned(gvartype); +- if (nunsigned > 1) +- ntype = 2; ++ else ++ gvartype = tounsigned(gvartype); + } + if (nsc > 0) + { + if (ntype == 0) + ntype = 1; +diff -u5 -r bcc~/proto.h bcc/proto.h +--- bcc~/proto.h Sun Jan 11 12:18:36 1998 ++++ bcc/proto.h Thu Jun 6 00:46:24 2002 +@@ -360,8 +360,8 @@ + void outntypechar P((struct typestruct *type)); + struct typestruct *pointype P((struct typestruct *type)); + struct typestruct *prefix P((constr_pt constructor, uoffset_T size, + struct typestruct *type)); + struct typestruct *promote P((struct typestruct *type)); ++struct typestruct *tosigned P((struct typestruct *type)); + struct typestruct *tounsigned P((struct typestruct *type)); + void typeinit P((void)); +- +diff -u5 -r bcc~/scan.h bcc/scan.h +--- bcc~/scan.h Sat Jul 24 14:27:42 1999 ++++ bcc/scan.h Thu Jun 6 00:32:20 2002 +@@ -134,10 +134,11 @@ + + #define LASTOP PTRSUBOP + + ENUMDECL, + NULLDECL, ++ SIGNDECL, + STRUCTDECL, + TYPEDECL, + TYPEDEFNAME, + UNIONDECL, + UNSIGNDECL, +diff -u5 -r bcc~/table.c bcc/table.c +--- bcc~/table.c Sun Sep 28 09:57:30 1997 ++++ bcc/table.c Thu Jun 6 00:29:36 2002 +@@ -28,11 +28,11 @@ + #define MAXEXPR 125 + #else + #define MAXEXPR 500 + #endif + #define MAXLOCAL 100 +-#define NKEYWORDS 35 ++#define NKEYWORDS 36 + #ifdef NOFLOAT + #define NSCALTYPES 10 + #else + #define NSCALTYPES 12 + #endif +@@ -88,11 +88,12 @@ + PRIVATE struct keywordstruct keywords[NKEYWORDS] = + { + { "enum", ENUMDECL, }, + { "struct", STRUCTDECL, }, + { "union", UNIONDECL, }, + { "unsigned", UNSIGNDECL, }, ++ { "signed", SIGNDECL, }, + + { "auto", AUTODECL, }, + { "extern", EXTERNDECL, }, + { "register", REGDECL, }, + { "static", STATICDECL, }, +diff -u5 -r bcc~/type.c bcc/type.c +--- bcc~/type.c Sun Jan 11 12:18:37 1998 ++++ bcc/type.c Thu Jun 6 00:49:06 2002 +@@ -155,10 +155,29 @@ + if (type->constructor & FUNCTION) + return pointype(type); + return type; + } + ++PUBLIC struct typestruct *tosigned(type) ++struct typestruct *type; ++{ ++ switch (type->scalar & ~(UNSIGNED | DLONG)) ++ { ++ case CHAR: ++ return sctype; ++ case SHORT: ++ return stype; ++ case INT: ++ return itype; ++ case LONG: ++ return ltype; ++ default: ++ error("signed only applies to integral types"); ++ return type; ++ } ++} ++ + PUBLIC struct typestruct *tounsigned(type) + struct typestruct *type; + { + switch (type->scalar & ~(UNSIGNED | DLONG)) + { diff -Nurd linux86.old/bcc/proto.h linux86/bcc/proto.h --- linux86.old/bcc/proto.h Sun Jan 11 12:18:36 1998 +++ linux86/bcc/proto.h Mon Jul 22 19:29:10 2002 @@ -362,6 +362,6 @@ struct typestruct *prefix P((constr_pt constructor, uoffset_T size, struct typestruct *type)); struct typestruct *promote P((struct typestruct *type)); +struct typestruct *tosigned P((struct typestruct *type)); struct typestruct *tounsigned P((struct typestruct *type)); void typeinit P((void)); - diff -Nurd linux86.old/bcc/q linux86/bcc/q --- linux86.old/bcc/q Thu Jan 1 01:00:00 1970 +++ linux86/bcc/q Mon Jul 22 19:28:57 2002 @@ -0,0 +1,112 @@ +diff -u5 -r bcc~/declare.c bcc/declare.c +--- bcc~/declare.c Fri Dec 17 17:51:13 1999 ++++ bcc/declare.c Thu Jun 6 13:27:00 2002 +@@ -410,16 +410,17 @@ + } + + PRIVATE bool_pt declspec() + { + unsigned nsc; ++ unsigned nsigned; + unsigned ntype; + unsigned nunsigned; + + gvarsc = NULLDECL; + gvartype = itype; +- nunsigned = ntype = nsc = 0; ++ nsigned = nunsigned = ntype = nsc = 0; + while (TRUE) + { + switch (sym) + { + case AUTODECL: +diff -u5 -r bcc~/proto.h bcc/proto.h +--- bcc~/proto.h Sun Jan 11 12:18:36 1998 ++++ bcc/proto.h Thu Jun 6 00:46:24 2002 +@@ -360,8 +360,8 @@ + void outntypechar P((struct typestruct *type)); + struct typestruct *pointype P((struct typestruct *type)); + struct typestruct *prefix P((constr_pt constructor, uoffset_T size, + struct typestruct *type)); + struct typestruct *promote P((struct typestruct *type)); ++struct typestruct *tosigned P((struct typestruct *type)); + struct typestruct *tounsigned P((struct typestruct *type)); + void typeinit P((void)); +- +diff -u5 -r bcc~/scan.h bcc/scan.h +--- bcc~/scan.h Sat Jul 24 14:27:42 1999 ++++ bcc/scan.h Thu Jun 6 00:32:20 2002 +@@ -134,10 +134,11 @@ + + #define LASTOP PTRSUBOP + + ENUMDECL, + NULLDECL, ++ SIGNDECL, + STRUCTDECL, + TYPEDECL, + TYPEDEFNAME, + UNIONDECL, + UNSIGNDECL, +diff -u5 -r bcc~/table.c bcc/table.c +--- bcc~/table.c Sun Sep 28 09:57:30 1997 ++++ bcc/table.c Thu Jun 6 00:29:36 2002 +@@ -28,11 +28,11 @@ + #define MAXEXPR 125 + #else + #define MAXEXPR 500 + #endif + #define MAXLOCAL 100 +-#define NKEYWORDS 35 ++#define NKEYWORDS 36 + #ifdef NOFLOAT + #define NSCALTYPES 10 + #else + #define NSCALTYPES 12 + #endif +@@ -88,11 +88,12 @@ + PRIVATE struct keywordstruct keywords[NKEYWORDS] = + { + { "enum", ENUMDECL, }, + { "struct", STRUCTDECL, }, + { "union", UNIONDECL, }, + { "unsigned", UNSIGNDECL, }, ++ { "signed", SIGNDECL, }, + + { "auto", AUTODECL, }, + { "extern", EXTERNDECL, }, + { "register", REGDECL, }, + { "static", STATICDECL, }, +diff -u5 -r bcc~/type.c bcc/type.c +--- bcc~/type.c Sun Jan 11 12:18:37 1998 ++++ bcc/type.c Thu Jun 6 00:49:06 2002 +@@ -155,10 +155,29 @@ + if (type->constructor & FUNCTION) + return pointype(type); + return type; + } + ++PUBLIC struct typestruct *tosigned(type) ++struct typestruct *type; ++{ ++ switch (type->scalar & ~(UNSIGNED | DLONG)) ++ { ++ case CHAR: ++ return sctype; ++ case SHORT: ++ return stype; ++ case INT: ++ return itype; ++ case LONG: ++ return ltype; ++ default: ++ error("signed only applies to integral types"); ++ return type; ++ } ++} ++ + PUBLIC struct typestruct *tounsigned(type) + struct typestruct *type; + { + switch (type->scalar & ~(UNSIGNED | DLONG)) + { diff -Nurd linux86.old/bcc/scan.h linux86/bcc/scan.h --- linux86.old/bcc/scan.h Sat Jan 12 17:10:33 2002 +++ linux86/bcc/scan.h Mon Jul 22 19:29:10 2002 @@ -136,6 +136,7 @@ ENUMDECL, NULLDECL, + SIGNDECL, STRUCTDECL, TYPEDECL, TYPEDEFNAME, diff -Nurd linux86.old/bcc/table.c linux86/bcc/table.c --- linux86.old/bcc/table.c Sat Mar 16 10:28:26 2002 +++ linux86/bcc/table.c Mon Jul 22 19:29:10 2002 @@ -30,7 +30,7 @@ #define MAXEXPR 500 #endif #define MAXLOCAL 100 -#define NKEYWORDS 35 +#define NKEYWORDS 36 #ifdef NOFLOAT #define NSCALTYPES 10 #else @@ -91,6 +91,7 @@ { "struct", STRUCTDECL, }, { "union", UNIONDECL, }, { "unsigned", UNSIGNDECL, }, + { "signed", SIGNDECL, }, { "auto", AUTODECL, }, { "extern", EXTERNDECL, }, diff -Nurd linux86.old/bcc/type.c linux86/bcc/type.c --- linux86.old/bcc/type.c Sun Jan 11 12:18:37 1998 +++ linux86/bcc/type.c Mon Jul 22 20:58:52 2002 @@ -157,6 +157,25 @@ return type; } +PUBLIC struct typestruct *tosigned(type) +struct typestruct *type; +{ + switch (type->scalar & ~(UNSIGNED | DLONG)) + { + case CHAR: + return sctype; + case SHORT: + return stype; + case INT: + return itype; + case LONG: + return ltype; + default: + error("signed only applies to integral types"); + return type; + } +} + PUBLIC struct typestruct *tounsigned(type) struct typestruct *type; { diff -Nurd linux86.old/bootblocks/Makefile linux86/bootblocks/Makefile --- linux86.old/bootblocks/Makefile Wed Mar 20 22:47:20 2002 +++ linux86/bootblocks/Makefile Sun May 26 14:55:30 2002 @@ -16,26 +16,25 @@ all: bootbin bootsys default tgz -bootsys: bootfile.sys boottar.sys bootminix.sys +bootsys: bootfile.sys boottar.sys bootminix.sys monitor.sys CSRC=minix.c -SSRC=sysboot.s tarboot.s skip.s com_bcc.s tich.s mbr.s msdos.s noboot.s \ - boot_fpy.s killhd.s +SSRC=sysboot.s tarboot.s skip.s mbr.s msdos.s noboot.s \ + boot_fpy.s killhd.s bb_linux.s bb_init1.s bb_init2.s encap: $(SSRC:s=v) $(CSRC:c=v) minixhd.v msdos16.v bootbin: $(SSRC:s=bin) $(CSRC:c=bin) minixhd.bin msdos16.bin minix_elks.bin MOBJ=monitor.o commands.o i86_funcs.o relocate.o help.o bzimage.o \ - trk_buf.o min_buf.o unix.o fs.o fs_tar.o fs_min.o fs_dos.o + buffer.o unix.o fs.o fs_tar.o fs_min.o fs_dos.o MSRC=monitor.c commands.c i86_funcs.c relocate.c help.c bzimage.c \ - trk_buf.c min_buf.c unix.c fs.c fs_tar.c fs_min.c fs_dos.c + buffer.c unix.c fs.c fs_tar.c fs_min.c fs_dos.c MINC=i86_funcs.h readfs.h monitor.h BOOTBLOCKS=sysboot.v noboot.v skip.v msdos.v msdos16.v \ - tarboot.v minix.v minixhd.v mbr.v + tarboot.v minix.v minixhd.v mbr.v killhd.v -EXTRAS=minix.h elf_info.c elf_info.h standalone.c li86.s \ - zimage.s minix_elks.c crc.c lsys.c +EXTRAS=minix.h zimage.s minix_elks.c lsys.c install: @@ -60,12 +59,18 @@ mv monitor.out boottar.sys @rm -f $(MOBJ) -bootminix.sys: $(MSRC) $(MINC) tarboot.bin +bootminix.sys: $(MSRC) $(MINC) minix.bin @rm -f $(MOBJ) make 'CFLAGS=$(CFLAGS) -DMINFLOPPY -i' monitor.out mv monitor.out bootminix.sys @rm -f $(MOBJ) +monitor.sys: $(MSRC) $(MINC) + @rm -f $(MOBJ) + make 'CFLAGS=$(CFLAGS) -DNOMONITOR -i' monitor.out + mv monitor.out monitor.sys + @rm -f $(MOBJ) + monitor: $(MSRC) $(MINC) @rm -f $(MOBJ) make 'CFLAGS=-ansi -H0x8000' monitor.out @@ -96,7 +101,7 @@ $(CC) -Md -O -o lsys.com lsys.c clean realclean: - rm -f bootfile.sys boottar.sys bootminix.sys + rm -f bootfile.sys boottar.sys bootminix.sys monitor.sys rm -f monitor makeboot bootblocks.tar.gz rm -f minix.s minixhd.s minix_elks.s msdos16.s rm -f *.com *.o *.bin *.out *.lst *.sym *.v *.tmp diff -Nurd linux86.old/bootblocks/bb_init1.s linux86/bootblocks/bb_init1.s --- linux86.old/bootblocks/bb_init1.s Thu Jan 1 01:00:00 1970 +++ linux86/bootblocks/bb_init1.s Sat Mar 16 14:26:52 2002 @@ -0,0 +1,25 @@ +ORGADDR=0x0600 + +.org ORGADDR +entry start +public start +start: + xor ax,ax + mov si,#$7C00 + mov di,#ORGADDR + + mov ss,ax + mov sp,di ! Or ax or si + + push ax + pop ds + push ax + pop es + + mov cx,#256 + cld + rep + movsw + jmpi go,#0 +go: + diff -Nurd linux86.old/bootblocks/bb_init2.s linux86/bootblocks/bb_init2.s --- linux86.old/bootblocks/bb_init2.s Thu Jan 1 01:00:00 1970 +++ linux86/bootblocks/bb_init2.s Sat Mar 16 14:22:51 2002 @@ -0,0 +1,17 @@ +ORGADDR=$0500 + +org ORGADDR + cld + mov bx,#$7C00 ! Pointer to start of BB. + xor ax,ax ! Segs all to zero + mov ds,ax + mov es,ax + mov ss,ax + mov sp,bx ! SP Just below BB + mov cx,#$100 ! Move 256 words + mov si,bx ! From default BB + mov di,#ORGADDR ! To the correct address. + rep + movsw + jmpi cont,#0 ! Set CS:IP correct. +cont: diff -Nurd linux86.old/bootblocks/bb_linux.s linux86/bootblocks/bb_linux.s --- linux86.old/bootblocks/bb_linux.s Thu Jan 1 01:00:00 1970 +++ linux86/bootblocks/bb_linux.s Sat Mar 16 17:11:48 2002 @@ -0,0 +1,22 @@ + +INITSEG = $9000 + +org 0 +mov ax,#$07c0 +mov ds,ax +mov ax,#INITSEG +mov es,ax +mov cx,#256 +sub si,si +sub di,di +cld +rep + movsw +jmpi go,INITSEG +go: + +mov di,#0x4000-12 +mov ds,ax +mov ss,ax ! put stack at INITSEG:0x4000-12. +mov sp,di + diff -Nurd linux86.old/bootblocks/boot_fpy.s linux86/bootblocks/boot_fpy.s --- linux86.old/bootblocks/boot_fpy.s Sat Mar 16 16:12:40 2002 +++ linux86/bootblocks/boot_fpy.s Sun May 26 14:21:51 2002 @@ -169,6 +169,12 @@ jnz inc_trk all_loaded: + ! Now it's loaded turn off the floppy motor. + mov dx,#0x3f2 + xor al, al + outb + + ! And start up the program. xor dx,dx ! DX=0 => floppy drive push dx ! CX=0 => partition offset = 0 diff -Nurd linux86.old/bootblocks/buffer.c linux86/bootblocks/buffer.c --- linux86.old/bootblocks/buffer.c Thu Jan 1 01:00:00 1970 +++ linux86/bootblocks/buffer.c Sun May 26 15:30:01 2002 @@ -0,0 +1,142 @@ + +#include "monitor.h" + +#ifndef MAXTRK +#define MAXTRK 18 +#endif + +int disk_drive = 0; +int disk_spt = 7; +int disk_heads = 0; +int disk_cyls = 0; +long disk_partition_offset = 0; + +static long bad_start = -1; +static long buf_start = -1; +static int buf_sec = 0; +static int buf_len = 0; +static char buffer[MAXTRK*512]; /* WARNING: This must be DMAable */ + +void reset_disk() +{ + disk_spt = 7; /* Defaults for reading floppy boot area. */ + disk_heads = 0; + disk_cyls = 0; + bad_start = -1; + disk_partition_offset = 0; + +#ifdef __STANDALONE__ + if( disk_drive == __argr.h.dl && __argr.x.si >= 9 && __argr.x.si <= 63 ) + { + disk_spt = __argr.x.si; + disk_heads = 2; + disk_cyls = 80; + } + if( disk_drive & 0x80 ) + { + /* Hard disk, get parameters from bios */ + long dpt; + int v; + + if( disk_drive == __argr.h.dl ) + disk_partition_offset = __argr.x.cx + ((long)__argr.h.dh<<16); + + dpt = _bios_get_dpt(disk_drive); + v = ((dpt>>16) & 0xFF); + if( v != 0xFF && v > (disk_drive&0x7F) ) + { + disk_spt = (dpt & 0x3F); /* Max sector number 1-63 */ + if( disk_spt == 0 ) disk_spt = 64; /* 1-64 ? */ + disk_heads = ((dpt>>24) & 0xFF) + 1; /* Head count 1-256 */ + disk_cyls = ((dpt>>8) & 0xFF) + ((dpt<<2) & 0x300) + 1; + + /* Cyls count, unchecked, only needs != 0, if AMI 386 bios can be + * upto 4096 cylinder, otherwise BIOS limit is 1024 cyl. + */ + } + } +#endif +} + +char * read_lsector(sectno) +long sectno; +{ + int tries; + int rv = 0; + + int phy_s = 1; + int phy_h = 0; + int phy_c = 0; + + long bstart; + + if( sectno == 0 || disk_heads == 0 ) reset_disk(); + if( disk_partition_offset > 0 ) sectno += disk_partition_offset; + + if( disk_spt < 1 || disk_heads < 1 ) + phy_s = sectno; + else + { + phy_s = sectno%disk_spt; + phy_h = sectno/disk_spt%disk_heads; + phy_c = sectno/disk_spt/disk_heads; + + bstart = (long)phy_c*disk_heads+phy_h; + if (disk_spt > MAXTRK) { + bstart = bstart * (disk_spt+MAXTRK-1)/MAXTRK; + buf_sec = phy_s/MAXTRK; + bstart = bstart + buf_sec; + buf_sec *= MAXTRK; + + if (disk_spt > buf_sec+MAXTRK) buf_len = MAXTRK; + else buf_len = disk_spt-buf_sec; + } else { + buf_sec = 0; + buf_len = disk_spt; + } + + if( bstart != buf_start && bstart != bad_start && buf_len > 1 ) + { + rv = _bios_disk_read(disk_drive,phy_c,phy_h,buf_sec+1,buf_len,buffer); + if( rv == 0 ) + buf_start = bstart; + else { + bad_start = bstart; + buf_start = -1; + } +#ifdef DEBUG + printf("Track read %d,%d,%d,%d,%d,%d -> %d\n", + disk_drive,phy_c,phy_h,buf_sec+1,buf_len,buffer, rv); +#endif + } + + if( bstart == buf_start ) + return buffer + (phy_s-buf_sec) * 512; + } + + tries = 6; + do + { + if( rv && tries<0) { + int v; + printf("Disk error 0x%02x %d:%d:%d:%d[%2d] -> 0x%04x[]\n", + rv, disk_drive, phy_c, phy_h, phy_s+1, 1, buffer); + printf("Retry ?"); v = (getch()&0x7F); printf("\n"); + if (v == 3 || v == 27 || v == 'n' || v == 'N') + return 0; + tries = 6; + } + + if (tries == 3) _bios_disk_reset(disk_drive); + + rv = _bios_disk_read(disk_drive, phy_c, phy_h, phy_s+1, 1, buffer); + tries--; + } + while(rv); +#ifdef DEBUG + printf("Sector read %d,%d,%d,%d,%d,%d -> %d\n", + disk_drive,phy_c,phy_h,phy_s+1,1,buffer, rv); +#endif + + if(rv) return 0; else return buffer; +} diff -Nurd linux86.old/bootblocks/bzimage.c linux86/bootblocks/bzimage.c --- linux86.old/bootblocks/bzimage.c Wed Feb 13 22:23:25 2002 +++ linux86/bootblocks/bzimage.c Sun May 26 14:34:10 2002 @@ -106,10 +106,6 @@ } if( main_mem_top < 3072 ) printf("RTFM warning: Linux needs at least 4MB of memory.\n"); - - len = (len+1023)/1024+1; /* Where to load the RD image (Mb) */ - if (len<6) len=6; /* Default to 6Mb mark */ - initrd_start = len * 4096; /* 256 bytes pages. */ #endif low_sects = buffer[497] + 1; /* setup sects + boot sector */ @@ -214,6 +210,7 @@ if( check_crc() < 0 && !keep_going() ) return -1; #endif +#ifndef NOMONITOR if( x86 < 3 || x86_emu ) { if( x86 < 3 ) @@ -222,6 +219,7 @@ printf("RTFM error: Linux-i386 cannot be run in an emulator.\n"); if( !keep_going() ) return -1; } +#endif printf("linux "); if( linux_command_line ) @@ -229,19 +227,6 @@ printf("\n"); fflush(stdout); - if( a20_closed() ) open_a20(); - if( a20_closed() ) - { - printf("Normal routine for opening A20 Gate failed, Trying PS/2 Bios\n"); - bios_open_a20(); - } - if( a20_closed() ) - { - printf("All routines for opening A20 Gate failed, if I can't open it\n"); - printf("then Linux probably can't either!\n"); - if( !keep_going() ) return -1; - } - __set_es(0x9000); /* Save pointer to command line */ @@ -690,8 +675,6 @@ rd_start = address - rd_len*4; rd_start &= -16; /* Page boundry */ - if (initrd_start && initrd_starthitme - fail! At end_of_code - endif - -.org ((ENDOFF)<<4)-1 -hitme: -.byte 0xFF ! Marker - -magic: .space 2 ! A.out header -btype: .space 2 -headerlen: .space 4 -a_text: .space 4 -a_data: .space 4 -a_bss: .space 4 -a_entry: .space 4 -a_total: .space 4 -a_syms: .space 4 -.org (ENDOFF+2)<<4 ! Code start. diff -Nurd linux86.old/bootblocks/crc.c linux86/bootblocks/crc.c --- linux86.old/bootblocks/crc.c Thu Mar 19 07:01:39 1998 +++ linux86/bootblocks/crc.c Thu Jan 1 01:00:00 1970 @@ -1,216 +0,0 @@ - -#include - -/* crctab calculated by Mark G. Mendel, Network Systems Corporation */ -static unsigned short crctab[256] = { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, - 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, - 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, - 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, - 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, - 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, - 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, - 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, - 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, - 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, - 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, - 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, - 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, - 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 -}; - -/* - * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. - * NOTE: First srgument must be in range 0 to 255. - * Second argument is referenced twice. - * - * Programmers may incorporate any or all code into their programs, - * giving proper credit within the source. Publication of the - * source routines is permitted so long as proper credit is given - * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, - * Omen Technology. - */ - -#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp) - -/* - * Copyright (C) 1986 Gary S. Brown. You may use this program, or - * code or tables extracted from it, as desired without restriction. - */ - -/* First, the polynomial itself and its table of feedback terms. The */ -/* polynomial is */ -/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */ -/* Note that we take it "backwards" and put the highest-order term in */ -/* the lowest-order bit. The X^32 term is "implied"; the LSB is the */ -/* X^31 term, etc. The X^0 term (usually shown as "+1") results in */ -/* the MSB being 1. */ - -/* Note that the usual hardware shift register implementation, which */ -/* is what we're using (we're merely optimizing it by doing eight-bit */ -/* chunks at a time) shifts bits into the lowest-order term. In our */ -/* implementation, that means shifting towards the right. Why do we */ -/* do it this way? Because the calculated CRC must be transmitted in */ -/* order from highest-order term to lowest-order term. UARTs transmit */ -/* characters in order from LSB to MSB. By storing the CRC this way, */ -/* we hand it to the UART in the order low-byte to high-byte; the UART */ -/* sends each low-bit to hight-bit; and the result is transmission bit */ -/* by bit from highest- to lowest-order term without requiring any bit */ -/* shuffling on our part. Reception works similarly. */ - -/* The feedback terms table consists of 256, 32-bit entries. Notes: */ -/* */ -/* The table can be generated at runtime if desired; code to do so */ -/* is shown later. It might not be obvious, but the feedback */ -/* terms simply represent the results of eight shift/xor opera- */ -/* tions for all combinations of data and CRC register values. */ -/* */ -/* The values must be right-shifted by eight bits by the "updcrc" */ -/* logic; the shift must be unsigned (bring in zeroes). On some */ -/* hardware you could probably optimize the shift in assembler by */ -/* using byte-swap instructions. */ - -static long cr3tab[] = { /* CRC polynomial 0xedb88320 */ -0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -#define UPDC32(b, c) (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF)) - -int skip = 0; -int do_16 = 0; -int do_hex = 0; - -main(argc, argv) -int argc; -char ** argv; -{ - int ar; - int done = 0; - for(ar=1; ar= skip ) - { - crc = updcrc(ch, crc); - crc32 = UPDC32(ch, crc32); - } - count++; - } - fclose(fd); - crc32 ^= 0xFFFFFFFF; - - printf("%-14s: %6ld CRC32=0x%08lx (%10lu)", fname, count, crc32, crc32); - printf(" CRC16=0x%04lx (%5u)\n", crc, crc); - -/* - if(do_hex) - { - if(do_16) - printf("%-14s:\t%6ld %04x\n", fname, count, crc); - else - printf("%-14s:\t%6ld %08lx\n", fname, count, crc32); - } - else - { - if(do_16) - printf("%-14s:\t%6ld %5u\n", fname, count, crc); - else - printf("%-14s:\t%6ld %10lu\n", fname, count, crc32); - } -*/ - fflush(stdout); -} - diff -Nurd linux86.old/bootblocks/elf_info.c linux86/bootblocks/elf_info.c --- linux86.old/bootblocks/elf_info.c Sun Jun 30 15:54:26 1996 +++ linux86/bootblocks/elf_info.c Thu Jan 1 01:00:00 1970 @@ -1,189 +0,0 @@ - -#include -#include "elf_info.h" - -Elf32_Ehdr elf_head; -Elf32_Phdr *elf_prog; - -#ifdef TEST -FILE *ifd; - -main(argc, argv) -int argc; -char **argv; -{ - ifd = fopen(argv[1], "r"); - if (ifd == 0) - exit(1); - - read_elfprog(); - write_ram("", -1L, 0); - - fclose(ifd); -} - -read_file(buf, offset, len) -void *buf; -long offset; -int len; -{ - fseek(ifd, offset, 0); - return fread(buf, 1, len, ifd); -} - -write_ram(buf, linear, len) -char *buf; -long linear; -int len; -{ -static long llen = 0; -static long lastlin= -1; - - if( llen > 0 && lastlin + llen != linear ) - { - printf("for %8ld bytes\n", llen); - lastlin= -1; - } - if( lastlin == -1 ) - { - lastlin = linear; - llen = 0; - - if( linear != -1 ) - printf("Write %08lx ", linear); - } - llen += len; - return len; -} - -error(str) -char *str; -{ - printf("Error: %s\n", str); - return -1; -} -#endif - -info_elf() -{ - int i; - - printf("ELF-386 executable, entry = 0x%08lx\n", elf_head.e_entry); - printf("\t\toffset paddr vaddr filesz memsz align\n"); - for (i = 0; i < elf_head.e_phnum; i++) - { - printf(" %d: ", i); - switch ((int) elf_prog[i].p_type) - { - case PT_NULL: - printf("PT_NULL"); - break; - case PT_LOAD: - printf("PT_LOAD"); - break; - case PT_DYNAMIC: - printf("PT_DYNAMIC"); - break; - case PT_INTERP: - printf("PT_INTERP"); - break; - case PT_NOTE: - printf("PT_NOTE"); - break; - case PT_SHLIB: - printf("PT_SHLIB"); - break; - case PT_PHDR: - printf("PT_PHDR"); - break; - default: - printf("PT_(%d)", elf_prog[i].p_type); - break; - } - printf("\t%08lx %08lx %08lx %08lx %08lx %08lx", - elf_prog[i].p_offset, - elf_prog[i].p_paddr, - elf_prog[i].p_vaddr, - elf_prog[i].p_filesz, - elf_prog[i].p_memsz, - elf_prog[i].p_align - ); - printf("\n"); - } -} - -read_elfprog() -{ - static unsigned char elf_ok[] = - {ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, ELFCLASS32, ELFDATA2LSB, EV_CURRENT}; - - int i; - char page_buf[4096]; - - if (read_file(&elf_head, 0L, sizeof(elf_head)) != sizeof(elf_head)) - return error("Can't read ELF header"); - - if (memcmp(elf_head.e_ident, elf_ok, 7) != 0 || - elf_head.e_type != ET_EXEC || - elf_head.e_machine != EM_386 || - elf_head.e_phnum <= 0 || - elf_head.e_phentsize != sizeof(Elf32_Phdr) - ) - return error("Not a 386 executable ELF program"); - - elf_prog = malloc(i = sizeof(Elf32_Phdr) * elf_head.e_phnum); - if (elf_prog == 0) - return error("Out of memory"); - - if (read_file(elf_prog, elf_head.e_phoff, i) != i) - return error("Can't read ELF program header"); - - info_elf(); - - for (i = 0; i < elf_head.e_phnum; i++) - { - long from, to, length, copied; - int chunk; - - switch ((int) elf_prog[i].p_type) - { - case PT_NULL: - case PT_NOTE: - continue; - default: - return error("ELF: Unusable program segment (Must be static)"); - case PT_LOAD: - break; - } - from=elf_prog[i].p_offset; - to=elf_prog[i].p_vaddr; - length=elf_prog[i].p_filesz; - - for(copied=0; copiedcopied+sizeof(page_buf)) chunk=sizeof(page_buf); - else chunk=length-copied; - - if( (chunk=read_file(page_buf, from, chunk)) <= 0 ) - return error("ELF Cannot read executable"); - if( write_ram(page_buf, to, chunk) < 0 ) - return error("Memory save failed"); - copied+=chunk; from+=chunk; to+=chunk; - } - length=elf_prog[i].p_memsz; - if( length > copied ) - { - write_ram("", -1L, 0); - memset(page_buf, '\0', sizeof(page_buf)); - for(; copiedcopied+sizeof(page_buf)) chunk=sizeof(page_buf); - else chunk=length-copied; - - if( write_ram(page_buf, to, chunk) < 0 ) - return error("Memory zap failed"); - copied+=chunk; to+=chunk; - } - } - } -} diff -Nurd linux86.old/bootblocks/elf_info.h linux86/bootblocks/elf_info.h --- linux86.old/bootblocks/elf_info.h Sat Jun 15 12:14:30 1996 +++ linux86/bootblocks/elf_info.h Thu Jan 1 01:00:00 1970 @@ -1,282 +0,0 @@ - -/* ELF layout information */ - -/* NOTE: I'm copying the file format information here because the _format_ - * is standard, but the Linux header files are not and may depend on - * headers not available when compiling Linux-86 code. - */ - -#ifndef _LINUX_ELF_H -#define _LINUX_ELF_H - -typedef unsigned long Elf32_Addr; -typedef unsigned short Elf32_Half; -typedef unsigned long Elf32_Off; -typedef long Elf32_Sword; -typedef unsigned long Elf32_Word; - -/* These constants are for the segment types stored in the image headers */ -#define PT_NULL 0 -#define PT_LOAD 1 -#define PT_DYNAMIC 2 -#define PT_INTERP 3 -#define PT_NOTE 4 -#define PT_SHLIB 5 -#define PT_PHDR 6 -#define PT_LOPROC 0x70000000L -#define PT_HIPROC 0x7fffffffL - -/* These constants define the different elf file types */ -#define ET_NONE 0 -#define ET_REL 1 -#define ET_EXEC 2 -#define ET_DYN 3 -#define ET_CORE 4 -#define ET_LOPROC 5 -#define ET_HIPROC 6 - -/* These constants define the various ELF target machines */ -#define EM_NONE 0 -#define EM_M32 1 -#define EM_SPARC 2 -#define EM_386 3 -#define EM_68K 4 -#define EM_88K 5 -#define EM_486 6 /* Perhaps disused */ -#define EM_860 7 - -/* This is the info that is needed to parse the dynamic section of the file */ -#define DT_NULL 0 -#define DT_NEEDED 1 -#define DT_PLTRELSZ 2 -#define DT_PLTGOT 3 -#define DT_HASH 4 -#define DT_STRTAB 5 -#define DT_SYMTAB 6 -#define DT_RELA 7 -#define DT_RELASZ 8 -#define DT_RELAENT 9 -#define DT_STRSZ 10 -#define DT_SYMENT 11 -#define DT_INIT 12 -#define DT_FINI 13 -#define DT_SONAME 14 -#define DT_RPATH 15 -#define DT_SYMBOLIC 16 -#define DT_REL 17 -#define DT_RELSZ 18 -#define DT_RELENT 19 -#define DT_PLTREL 20 -#define DT_DEBUG 21 -#define DT_TEXTREL 22 -#define DT_JMPREL 23 -#define DT_LOPROC 0x70000000L -#define DT_HIPROC 0x7fffffffL - -/* This info is needed when parsing the symbol table */ -#define STB_LOCAL 0 -#define STB_GLOBAL 1 -#define STB_WEAK 2 - -#define STT_NOTYPE 0 -#define STT_OBJECT 1 -#define STT_FUNC 2 -#define STT_SECTION 3 -#define STT_FILE 4 - -#define ELF32_ST_BIND(x) ((x) >> 4) -#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf) - -/* Symbolic values for the entries in the auxiliary table - put on the initial stack */ -#define AT_NULL 0 /* end of vector */ -#define AT_IGNORE 1 /* entry should be ignored */ -#define AT_EXECFD 2 /* file descriptor of program */ -#define AT_PHDR 3 /* program headers for program */ -#define AT_PHENT 4 /* size of program header entry */ -#define AT_PHNUM 5 /* number of program headers */ -#define AT_PAGESZ 6 /* system page size */ -#define AT_BASE 7 /* base address of interpreter */ -#define AT_FLAGS 8 /* flags */ -#define AT_ENTRY 9 /* entry point of program */ -#define AT_NOTELF 10 /* program is not ELF */ -#define AT_UID 11 /* real uid */ -#define AT_EUID 12 /* effective uid */ -#define AT_GID 13 /* real gid */ -#define AT_EGID 14 /* effective gid */ - - -typedef struct dynamic{ - Elf32_Sword d_tag; - union{ - Elf32_Sword d_val; - Elf32_Addr d_ptr; - } d_un; -} Elf32_Dyn; - -extern Elf32_Dyn _DYNAMIC []; - -/* The following are used with relocations */ -#define ELF32_R_SYM(x) ((x) >> 8) -#define ELF32_R_TYPE(x) ((x) & 0xff) - -#define R_386_NONE 0 -#define R_386_32 1 -#define R_386_PC32 2 -#define R_386_GOT32 3 -#define R_386_PLT32 4 -#define R_386_COPY 5 -#define R_386_GLOB_DAT 6 -#define R_386_JMP_SLOT 7 -#define R_386_RELATIVE 8 -#define R_386_GOTOFF 9 -#define R_386_GOTPC 10 -#define R_386_NUM 11 - -typedef struct elf32_rel { - Elf32_Addr r_offset; - Elf32_Word r_info; -} Elf32_Rel; - -typedef struct elf32_rela{ - Elf32_Addr r_offset; - Elf32_Word r_info; - Elf32_Sword r_addend; -} Elf32_Rela; - -typedef struct elf32_sym{ - Elf32_Word st_name; - Elf32_Addr st_value; - Elf32_Word st_size; - unsigned char st_info; - unsigned char st_other; - Elf32_Half st_shndx; -} Elf32_Sym; - - -#define EI_NIDENT 16 - -typedef struct elfhdr{ - unsigned char e_ident[EI_NIDENT]; - Elf32_Half e_type; - Elf32_Half e_machine; - Elf32_Word e_version; - Elf32_Addr e_entry; /* Entry point */ - Elf32_Off e_phoff; - Elf32_Off e_shoff; - Elf32_Word e_flags; - Elf32_Half e_ehsize; - Elf32_Half e_phentsize; - Elf32_Half e_phnum; - Elf32_Half e_shentsize; - Elf32_Half e_shnum; - Elf32_Half e_shstrndx; -} Elf32_Ehdr; - -/* These constants define the permissions on sections in the program - header, p_flags. */ -#define PF_R 0x4 -#define PF_W 0x2 -#define PF_X 0x1 - -typedef struct elf_phdr{ - Elf32_Word p_type; - Elf32_Off p_offset; - Elf32_Addr p_vaddr; - Elf32_Addr p_paddr; - Elf32_Word p_filesz; - Elf32_Word p_memsz; - Elf32_Word p_flags; - Elf32_Word p_align; -} Elf32_Phdr; - -/* sh_type */ -#define SHT_NULL 0 -#define SHT_PROGBITS 1 -#define SHT_SYMTAB 2 -#define SHT_STRTAB 3 -#define SHT_RELA 4 -#define SHT_HASH 5 -#define SHT_DYNAMIC 6 -#define SHT_NOTE 7 -#define SHT_NOBITS 8 -#define SHT_REL 9 -#define SHT_SHLIB 10 -#define SHT_DYNSYM 11 -#define SHT_NUM 12 -#define SHT_LOPROC 0x70000000L -#define SHT_HIPROC 0x7fffffffL -#define SHT_LOUSER 0x80000000L -#define SHT_HIUSER 0xffffffffL - -/* sh_flags */ -#define SHF_WRITE 0x1 -#define SHF_ALLOC 0x2 -#define SHF_EXECINSTR 0x4 -#define SHF_MASKPROC 0xf0000000L - -/* special section indexes */ -#define SHN_UNDEF 0 -#define SHN_LORESERVE 0xff00L -#define SHN_LOPROC 0xff00L -#define SHN_HIPROC 0xff1fL -#define SHN_ABS 0xfff1L -#define SHN_COMMON 0xfff2L -#define SHN_HIRESERVE 0xffffL - -typedef struct { - Elf32_Word sh_name; - Elf32_Word sh_type; - Elf32_Word sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - Elf32_Word sh_size; - Elf32_Word sh_link; - Elf32_Word sh_info; - Elf32_Word sh_addralign; - Elf32_Word sh_entsize; -} Elf32_Shdr; - -#define EI_MAG0 0 /* e_ident[] indexes */ -#define EI_MAG1 1 -#define EI_MAG2 2 -#define EI_MAG3 3 -#define EI_CLASS 4 -#define EI_DATA 5 -#define EI_VERSION 6 -#define EI_PAD 7 - -#define ELFMAG0 0x7f /* EI_MAG */ -#define ELFMAG1 'E' -#define ELFMAG2 'L' -#define ELFMAG3 'F' -#define ELFMAG "\177ELF" -#define SELFMAG 4 - -#define ELFCLASSNONE 0 /* EI_CLASS */ -#define ELFCLASS32 1 -#define ELFCLASS64 2 -#define ELFCLASSNUM 3 - -#define ELFDATANONE 0 /* e_ident[EI_DATA] */ -#define ELFDATA2LSB 1 -#define ELFDATA2MSB 2 - -#define EV_NONE 0 /* e_version, EI_VERSION */ -#define EV_CURRENT 1 -#define EV_NUM 2 - -/* Notes used in ET_CORE */ -#define NT_PRSTATUS 1 -#define NT_PRFPREG 2 -#define NT_PRPSINFO 3 -#define NT_TASKSTRUCT 4 - -/* Note header in a PT_NOTE section */ -typedef struct elf_note { - Elf32_Word n_namesz; /* Name size */ - Elf32_Word n_descsz; /* Content size */ - Elf32_Word n_type; /* Content type */ -} Elf32_Nhdr; - -#endif /* _LINUX_ELF_H */ diff -Nurd linux86.old/bootblocks/i86_funcs.c linux86/bootblocks/i86_funcs.c --- linux86.old/bootblocks/i86_funcs.c Sat Mar 16 12:31:44 2002 +++ linux86/bootblocks/i86_funcs.c Sun May 26 15:07:22 2002 @@ -1,77 +1,21 @@ #include "monitor.h" -int x86 = 0; /* CPU major number */ +#ifndef NOMONITOR +int x86 = 3; /* CPU major number */ char *x86_name = ""; /* and it's name */ int x86_emu = 0; /* Is this a PC emulator ? */ -int x86_a20_closed = 1; /* Is the A20 gate closed ? */ int x86_fpu = 0; +#endif int x86_test = 0; /* In test mode */ unsigned boot_mem_top = 0x2000; /* Default 128k, the minimum */ long main_mem_top = 0; /* K of extended memory */ -int a20_closed() -{ - register int v, rv = 0; - if (x86_test) return 1; /* If not standalone don't try */ - - __set_es(0); - v = __peek_es(512); - __set_es(0xFFFF); - if (v == __peek_es(512+16)) - { - __set_es(0); - __poke_es(512, v+1); - __set_es(0xFFFF); - if (v+1 == __peek_es(512+16)) - rv = 1; - __set_es(0); - __poke_es(512, v); - } - return x86_a20_closed = rv; -} - -static void asm_open_a20() -{ -#asm - call empty_8042 - mov al,#0xD1 ! command write - out #0x64,al - call empty_8042 - mov al,#0xDF ! A20 on - out #0x60,al -empty_8042: - .word 0x00eb,0x00eb - in al,#0x64 ! 8042 status port - test al,#2 ! is input buffer full? - jnz empty_8042 ! yes - loop, with no timeout! -#endasm -} - -void open_a20() { if(!x86_test) asm_open_a20(); } - -/* This calls the BIOS to open the A20 gate, officially this is only supported - on PS/2s but if the normal routine fails we may as well try this. - */ -void asm_bios_open_a20() -{ -#asm - mov ax,#$2401 - int $15 - jc bios_failed_a20 - xor ax,ax -bios_failed_a20: - mov al,ah - xor ah,ah -#endasm -} - -void bios_open_a20() { if(!x86_test) asm_bios_open_a20(); } - void cpu_check() { +#ifndef NOMONITOR static char *name_808x[] = { "8088", "8086", "80C88", "80C86", "NEC V20", "NEC V30", "808x Clone" @@ -107,8 +51,12 @@ if (c & 0x01) x86_emu = 1; /* Already in protected mode !!! */ } -#ifdef __STANDALONE__ x86_test = x86_emu; + if (x86<3) + x86_test = 1; +#endif + +#ifdef __STANDALONE__ if (__argr.x.cflag) x86_test = 1; #else @@ -118,35 +66,27 @@ void mem_check() { -#ifndef __STANDALONE__ - main_mem_top = 16384; - return; /* If not standalone don't try */ -#else + if (x86_test) { + main_mem_top = 0; + return; + } + #asm int 0x12 ! Amount of boot memory mov cl,#6 sal ax,cl ! In segments mov [_boot_mem_top],ax - ! Next check for extended - mov al,[_x86] ! If we ain't got a 286+ we can't access it anyway - cmp al,#2 - jl is_xt - - mov ah,#0x88 ! + mov ah,#0x88 ! Next check for extended int 0x15 - jnc got_ext ! Error!? This should _not_ happen ... but ... + jnc got_ext ! Error! is_xt: xor ax,ax got_ext: mov word ptr [_main_mem_top+2],#0 mov [_main_mem_top],ax - #endasm - /* Rest are big memory for 80386+ */ - if( x86 < 3 ) return; - /* Try int $15 EAX=$E820 */ { struct e820_dat { @@ -202,8 +142,6 @@ no_e801: #endasm } - -#endif } #define RIGHTS (0x93000000L) diff -Nurd linux86.old/bootblocks/i86_funcs.h linux86/bootblocks/i86_funcs.h --- linux86.old/bootblocks/i86_funcs.h Fri Jul 24 15:58:05 1998 +++ linux86/bootblocks/i86_funcs.h Sun May 26 14:33:22 2002 @@ -5,16 +5,12 @@ extern int x86; /* CPU major number (0-3) */ extern char *x86_name; /* and it's name */ extern int x86_emu; /* Is this a PC emulator ? */ -extern int x86_a20_closed; /* Is the A20 gate closed ? */ extern int x86_fpu; extern int x86_test; /* Running in test mode ? */ extern unsigned boot_mem_top; /* Top of RAM below 1M */ extern long main_mem_top; /* Top of RAM above 1M */ -int a20_closed(); -void open_a20(); -void bios_open_a20(); void cpu_check(); void mem_check(); int ext_put(); diff -Nurd linux86.old/bootblocks/li86.s linux86/bootblocks/li86.s --- linux86.old/bootblocks/li86.s Sat May 12 09:01:21 2001 +++ linux86/bootblocks/li86.s Thu Jan 1 01:00:00 1970 @@ -1,47 +0,0 @@ -!---------------------------------------------------------------------------- -! -! This is a skeleton for creating an impure Linux-8086 executable without -! using the linker. The .text and .data areas are correctly positioned. -! -! This file needs to be compiled using the 3 pass mode (-O) -! eg: as86 -O li86.s -s li86.sym -b li86.bin -! -!---------------------------------------------------------------------------- -.text -org -32 -.word 0x0301 ! Magic -.word 0x0410 ! Btype -.long 0x20 ! header length -.long _etext ! a_text -.long _edata-_etext ! a_data -.long 0 ! a_bss -.long 0 ! a_entry -.long STACK_SIZE ! a_total -.long 0 ! a_syms -.data -.blkb _etext -.even -.text -!---------------------------------------------------------------------------- - -STACK_SIZE = 0x10000 - -.data -var: -.word $1234 - -.text - int $20 - mov ax,var - mov bx,_edata - push ax - ret - -!---------------------------------------------------------------------------- -! This trailer must be at the end of the file. -.text -_etext: -.data -_edata: -END - diff -Nurd linux86.old/bootblocks/makeboot.c linux86/bootblocks/makeboot.c --- linux86.old/bootblocks/makeboot.c Tue Sep 5 19:18:19 2000 +++ linux86/bootblocks/makeboot.c Sat May 25 14:37:43 2002 @@ -9,6 +9,7 @@ #include "msdos.v" #include "msdos16.v" #include "skip.v" +#include "killhd.v" #include "tarboot.v" #include "minix.v" #include "minixhd.v" @@ -58,6 +59,9 @@ { "hdmin","Minix Hard disk FS booter", minixhd_data, minixhd_size, 2, minixhd_bootfile-minixhd_start, FS_ZERO}, +{ "killhd", "Deletes MBR from hard disk when booted", + killhd_data, killhd_size, + 0, 0, FS_ADOS}, #ifdef mbr_Banner { "mbr", "Master boot record for HD (with optional message)", mbr_data,mbr_size, diff -Nurd linux86.old/bootblocks/mbr.s linux86/bootblocks/mbr.s --- linux86.old/bootblocks/mbr.s Sat Mar 16 13:20:31 2002 +++ linux86/bootblocks/mbr.s Sat May 25 14:48:13 2002 @@ -394,7 +394,8 @@ org ORGADDR+0x180 .asciz "ELKS MBR " .asciz "Robert de Bath," -.asciz "Copyright 1996-2000." +.asciz "Copyright " +.asciz "1996-2002. " org partition_start-1 .byte 0xFF endif diff -Nurd linux86.old/bootblocks/min_buf.c linux86/bootblocks/min_buf.c --- linux86.old/bootblocks/min_buf.c Sun Feb 20 07:58:00 2000 +++ linux86/bootblocks/min_buf.c Thu Jan 1 01:00:00 1970 @@ -1,119 +0,0 @@ - -#include "monitor.h" - -#ifdef MINI_BUF -#ifndef MAXTRK -#define MAXTRK 21 -#endif - -int disk_drive = 0; -int disk_spt = 7; -int disk_heads = 0; -int disk_cyls = 0; -int bad_track = -1; - -static int track_no = -1; -static int buf_len = 0; -static char buffer[MAXTRK*512]; /* WARNING: This must be DMAable */ - -void reset_disk() -{ - disk_spt = 7; - disk_heads = 0; - disk_cyls = 0; - bad_track = -1; - -#ifdef __STANDALONE__ - if( disk_drive == __argr.h.dl && __argr.x.si >= 9 && __argr.x.si <= 63 ) - { - disk_spt = __argr.x.si; - disk_heads = 2; - disk_cyls = 80; - } -#endif -} - -char * read_lsector(sectno) -long sectno; -{ - int tries = 5; - int rv = 0; - - int phy_s = 1; - int phy_h = 0; - int phy_c = 0; - int ltrack; - - if( sectno == 0 || disk_heads == 0 ) reset_disk(); - if( buf_len != disk_spt ) track_no = -1; - - if( disk_spt < 1 || disk_heads < 1 ) - phy_s = sectno; - else - { - phy_s = sectno%disk_spt; - phy_h = sectno/disk_spt%disk_heads; - phy_c = sectno/disk_spt/disk_heads; - } - -#ifdef DEBUG - fprintf(stderr, "read_sector(%ld = %d,%d,%d)\n", sectno, phy_c, phy_h, phy_s); -#endif - - ltrack = phy_c*disk_heads+phy_h; - if( disk_spt > 1 && disk_spt <= MAXTRK - && track_no != ltrack && ltrack != bad_track) - { - rv = phy_read(disk_drive, phy_c, phy_h, 1, disk_spt, buffer); - if( rv == 0 ) - { - track_no = ltrack; - buf_len = disk_spt; - } - else - bad_track = ltrack; - } - if( track_no == ltrack ) - return buffer + phy_s * 512; - - do - { - rv = phy_read(disk_drive, phy_c, phy_h, phy_s+1, 1, buffer); - tries--; - } - while(rv && tries > 0); - if( rv ) printf("Disk error 0x%02x %d:%d:%d:%d[%2d] -> 0x%04x[]\n", - rv, disk_drive, phy_c, phy_h, phy_s+1, 1, buffer); - - if(rv) return 0; else return buffer; -} - -#if defined(__MSDOS__) || defined(__STANDALONE__) -phy_read(drive, cyl, head, sect, length, buffer) -{ -#asm - push bp - mov bp,sp - - push ds - pop es - - mov dl,[bp+2+_phy_read.drive] - mov ch,[bp+2+_phy_read.cyl] - mov dh,[bp+2+_phy_read.head] - mov cl,[bp+2+_phy_read.sect] - mov al,[bp+2+_phy_read.length] - mov bx,[bp+2+_phy_read.buffer] - - mov ah,#$02 - int $13 - jc read_err - mov ax,#0 -read_err: - - pop bp -#endasm -} -#endif - -#endif diff -Nurd linux86.old/bootblocks/monitor.c linux86/bootblocks/monitor.c --- linux86.old/bootblocks/monitor.c Wed Mar 20 22:46:57 2002 +++ linux86/bootblocks/monitor.c Sun May 26 14:33:55 2002 @@ -27,7 +27,7 @@ struct t_cmd_list * cptr; #ifdef __STANDALONE__ - printf("\r"); + printf("\r\n"); #endif init_prog(); @@ -151,23 +151,12 @@ cpu_check(); mem_check(); +#ifndef NOMONITOR printf("Processor: %s", x86_name); if(x86_fpu) printf(" with FPU"); if(x86_emu) printf(" in protected mode"); - if(x86 > 1) - { - printf(", A20 gate "); - if( a20_closed() ) - { - open_a20(); - if( a20_closed() ) - printf("won't open!!"); - else - printf("is now open"); - } - else printf("is already open."); - } printf("\n"); +#endif printf("There is %u bytes available", offt-sbrk(0)); printf(", %dk of boot memory", boot_mem_top/64); diff -Nurd linux86.old/bootblocks/monitor.h linux86/bootblocks/monitor.h --- linux86.old/bootblocks/monitor.h Mon Dec 3 22:00:46 2001 +++ linux86/bootblocks/monitor.h Sun May 26 14:38:19 2002 @@ -19,9 +19,6 @@ #ifdef TARFLOPPY #define SINGLEFS -#define NOMONITOR -#define NOCOMMAND -#define MINI_BUF #define open_file tar_open_file #define rewind_file tar_rewind_file @@ -32,9 +29,6 @@ #ifdef MINFLOPPY #define SINGLEFS -#define NOMONITOR -#define NOCOMMAND -#define MINI_BUF #define open_file min_open_file #define rewind_file min_rewind_file @@ -45,16 +39,17 @@ #ifdef DOSFLOPPY #define SINGLEFS -#define NOMONITOR -#define NOCOMMAND -#define MINI_BUF -#define MAXTRK 24 #define open_file dos_open_file #define rewind_file dos_rewind_file #define close_file dos_close_file #define file_length dos_file_length #define read_block dos_read_block +#endif + +#ifdef SINGLEFS +/* #define NOCOMMAND */ +#define NOMONITOR #endif #ifdef __STANDALONE__ diff -Nurd linux86.old/bootblocks/standalone.c linux86/bootblocks/standalone.c --- linux86.old/bootblocks/standalone.c Mon Nov 23 08:26:30 1998 +++ linux86/bootblocks/standalone.c Thu Jan 1 01:00:00 1970 @@ -1,310 +0,0 @@ - -#include -#include -#asm -entry _int_80 ! Tell ld86 we really do need this file. - ! then call the init stuff before main. - - loc 1 ! Make sure the pointer is in the correct segment -auto_func: ! Label for bcc -M to work. - .word _pre_main ! Pointer to the autorun function - .word no_op ! Space filler cause segs are padded to 4 bytes. - .text ! So the function after is also in the correct seg. -#endasm - -void int_80(); - -static void pre_main() -{ - /* Set the int 0x80 pointer to here */ - __set_es(0); - __doke_es(0x80*4+0, int_80); - __doke_es(0x80*4+2, __get_cs()); - bios_coninit(); -} - -void int_80() -{ -#asm -SYS_EXIT=1 -SYS_FORK=2 -SYS_READ=3 -SYS_WRITE=4 -SYS_OPEN=5 -SYS_CLOSE=6 -SYS_CHDIR=12 -SYS_LSEEK=19 -ENOSYS=38 - - push es - push si - push di - push dx - push cx - push bx - cmp ax,#SYS_READ - jne L1 - call _func_read - jmp L0 -L1: - cmp ax,#SYS_WRITE - jne L2 - call _func_write - jmp L0 -L2: - cmp ax,#SYS_LSEEK - jne L3 - call _func_lseek - jmp L0 -L3: - cmp ax,#SYS_EXIT - jne L4 - call _func_exit - jmp L0 -L4: - mov ax,#-ENOSYS -L0: - pop bx - pop cx - pop dx - pop di - pop si - pop es - iret -#endasm -} - -func_lseek() { return -38; } - -func_write(bx,cx,dx,di,si,es) -int bx,dx; -char * cx; -{ - register int v, c; - if(bx == 1 || bx == 2) - { - for(v=dx; v>0; v--) - { - c= *cx++; - if( c == '\n') bios_putc('\r'); - bios_putc(c); - } - return dx; - } - return -EBADF; -} - -func_read(bx,cx,dx,di,si,es) -int bx,dx; -char * cx; -{ - if(bx == 0) return read_line(cx, dx); - return -EBADF; -} - -read_line(buf, len) -char * buf; -int len; -{ - int ch; - int pos=0; - - if( len == 1 ) - { - buf[0]=((ch=bios_getc())&0xFF?ch&0xFF:((ch>>8)&0xFF|0x80)); - return 1; - } - - for(ch=0;;) - { - if(ch != '\003') - { - ch = bios_getc(); - if( pos == 0 && (ch&0xFF) == 0 ) - { - buf[0] = ((ch>>8)|0x80); - return 1; - } - ch &= 0x7F; - } - if( ch == '\r' ) - { - bios_putc('\r'); bios_putc('\n'); - buf[pos++] = '\n'; - return pos; - } - if( ch >= ' ' && ch != 0x7F && pos < len-1) - bios_putc(buf[pos++] = ch); - else if( (ch == '\003' || ch == '\b') && pos > 0 ) - { - bios_putc('\b'); bios_putc(' '); bios_putc('\b'); - pos--; - } - else if( ch == '\003' ) - return 0; - else - bios_putc('\007'); - } -} - -#define CTRL(x) ((x)&0x1F) -static int last_attr = 0x07; -static int con_mode; -static int con_size = 0x184F; -static int con_colour = 0; - -bios_coninit() -{ -#asm - mov ax,#$0F00 - int $10 - mov _con_mode,ax -#endasm - if( (con_mode &0xFF) > 39 ) con_size = (con_size&0xFF00) + (con_mode&0xFF); - if( (con_mode&0xFF00) != 0x700) - con_colour = 1; -} - -bios_putc(c) -int c; -{ -static char tbuf[3]; -static int tcnt=0; - if(tcnt) - { - tbuf[tcnt++] = c; - if( tcnt < 3 && (tbuf[0] != CTRL(']') || tbuf[1] < '`' || tbuf[1] > 'p')) - return; - if( tbuf[0] == CTRL('P') ) - { - if( tbuf[1] >= 32 && tbuf[1] <= 56 - && tbuf[2] >= 32 && tbuf[2] <= 111 ) - asm_cpos((tbuf[1]-32), (tbuf[2]-32)); - } - else - { - if( tbuf[1] >= '`' ) - last_attr = ( (tbuf[1]&0xF) | (last_attr&0xF0)); - else - last_attr = ( (tbuf[2]&0xF) | ((tbuf[1]&0xF)<<4)); - - if( !con_colour ) - last_attr = (last_attr&0x88) + ((last_attr&7)?0x07:0x70); - } - tcnt=0; - return; - } - if( c & 0xE0 ) { asm_colour(last_attr) ; asm_putc(c); } - else switch(c) - { - case CTRL('L'): - asm_cpos(0,0); - asm_cls(); - break; - case CTRL('P'): - case CTRL(']'): - tbuf[tcnt++] = c; - break; - default: - asm_putc(c); - break; - } - return; -} - -static asm_putc(c) -{ -#asm -#if !__FIRST_ARG_IN_AX__ - mov bx,sp - mov ax,[bx+2] -#endif - mov ah,#$0E - mov bx,#7 - int $10 -#endasm -} - -static asm_colour(c) -{ -#asm -#if __FIRST_ARG_IN_AX__ - mov bx,ax -#else - mov bx,sp - mov bx,[bx+2] -#endif - mov ah,#$08 - int $10 - mov ah,#$09 - mov cx,#1 - int $10 -#endasm -} - -static asm_cls() -{ -#asm - push bp ! Bug in some old BIOS's - !mov ax,#$0500 - !int $10 - mov ax,#$0600 - mov bh,_last_attr - mov cx,#$0000 - mov dx,_con_size - int $10 - pop bp -#endasm -} - -static asm_cpos(r,c) -{ -#asm -#if __FIRST_ARG_IN_AX__ - mov bx,sp - mov dh,al - mov ax,[bx+2] - mov dl,al -#else - mov bx,sp - mov ax,[bx+2] - mov dh,al - mov ax,[bx+4] - mov dl,al -#endif - mov ah,#$02 - mov bx,#7 - int $10 -#endasm -} - -bios_getc() -{ -#asm - xor ax,ax - int $16 -#endasm -} - -static void be_safe() -{ -#asm - iret -#endasm -} - -func_exit(bx,cx,dx,di,si,es) /* AKA reboot! */ -{ - __set_es(0); - __doke_es(0xE6*4+2,__get_cs()); - __doke_es(0xE6*4+0,be_safe); -#asm - mov ax,#$FFFF - int $E6 ! Try to exit DOSEMU - mov ax,#$0040 ! If we get here we're not in dosemu. - mov es,ax - seg es - mov [$72],#$1234 ! Warm reboot. - jmpi $0000,$FFFF -#endasm -} diff -Nurd linux86.old/bootblocks/tich.s linux86/bootblocks/tich.s --- linux86.old/bootblocks/tich.s Sat Feb 16 19:18:57 2002 +++ linux86/bootblocks/tich.s Thu Jan 1 01:00:00 1970 @@ -1,39 +0,0 @@ -! - -org 0 - call chk !This chunk allows this code to exist at _any_ click -chk: - pop ax - mov cl,#4 - shr ax,cl - mov bx,cs - add ax,bx - push ax - mov bx,#going - push bx - retf -going: - mov ds,ax - mov es,ax - -! Print 'mesg' - mov ah,#0x03 ! read cursor pos - xor bh,bh - int 0x10 - - mov cx,#(emesg-mesg) - mov bp,#mesg - mov bx,#$7 ! page 0, attribute 7 (normal) - mov ax,#$1301 ! write string, move cursor - int $10 - -nogood: - j nogood - -mesg: -.ascii "Hello world" -emesg: - -! Floppies aren't supposed to need this, oh well. -org 510 - .word $AA55 diff -Nurd linux86.old/bootblocks/trk_buf.c linux86/bootblocks/trk_buf.c --- linux86.old/bootblocks/trk_buf.c Sun Feb 10 13:12:38 2002 +++ linux86/bootblocks/trk_buf.c Thu Jan 1 01:00:00 1970 @@ -1,390 +0,0 @@ - -#include "monitor.h" - -#ifndef MINI_BUF - -/* #define DEBUG 1 /**/ - -int disk_drive = 0; -int disk_spt = 7; -int disk_heads = 0; -int disk_cyls = 0; -long disk_partition_offset = 0; - -int check_motor = 1; - -static int last_drive = -1; -static int data_len = 0; -static long data_trk1 = 0; -static char * data_buf1 = 0; -static long data_trk2 = 0; -static char * data_buf2 = 0; - -static long bad_track = -1; /* Track number of last unsuccesful read */ - -static long get_dpt(); - -void reset_disk() -{ -#ifdef DEBUG - fprintf(stderr, "Reset Disk: "); -#endif - if( data_buf1 ) free(data_buf1); - if( data_buf2 ) free(data_buf2); - data_buf1 = data_buf2 = 0; - last_drive = disk_drive; - bad_track = -1; - - disk_spt = 7; /* Defaults for reading floppy boot area. */ - disk_heads = 0; - disk_cyls = 0; - - if( !(disk_drive & 0x80 ) ) - { -#ifdef __STANDALONE__ - if( disk_drive == __argr.h.dl && __argr.x.si >= 9 && __argr.x.si <= 63 ) - { - disk_spt = __argr.x.si; - disk_heads = 2; - disk_cyls = 80; - } -#endif - - /* Floppy -> no partitions */ - /* Even if there were we couldn't deal with it anyway! */ - disk_partition_offset = 0; - } -#if defined(__MSDOS__) || defined(__STANDALONE__) - else - { - /* Hard disk, get parameters from bios */ - long dpt; - int v; - -#ifdef __STANDALONE__ - if( disk_partition_offset == 0 && disk_drive == __argr.h.dl ) - { - disk_partition_offset = __argr.x.cx + ((long)__argr.h.dh<<16); - } -#endif - - dpt = get_dpt(disk_drive); - v = ((dpt>>16) & 0xFF); - if( v != 0xFF && v > (disk_drive&0x7F) ) - { - disk_spt = (dpt & 0x3F); /* Max sector number 1-63 */ - if( disk_spt == 0 ) disk_spt = 64; /* 1-64 ? */ - disk_heads = ((dpt>>24) & 0xFF) + 1; /* Head count 1-256 */ - disk_cyls = ((dpt>>8) & 0xFF) + ((dpt<<2) & 0x300) + 1; - - /* Cyls count, unchecked, only needs != 0, if AMI 386 bios can be - * upto 4096 cylinder, otherwise BIOS limit is 1024 cyl. - */ - } - } -#endif - -#ifdef DEBUG - fprintf(stderr, "%d/%d/%d\n", disk_spt, disk_heads, disk_cyls); -#endif -} - -char * read_lsector(sectno) -long sectno; -{ - int rv; - - int phy_s = 1; - int phy_h = 0; - int phy_c = 0; - - rv = 0; - if( disk_drive != last_drive ) rv = 1; - else if( check_motor ) rv = ( motor_running() == 0 ); - else if( sectno == 0 ) rv = 1; - if( rv ) reset_disk(); - - if( disk_partition_offset > 0 ) - sectno += disk_partition_offset; - - if( disk_spt < 0 || disk_spt > 63 || disk_heads < 1 ) - { - phy_s = sectno; -#if DEBUG > 1 - fprintf(stderr, "read_sector(%ld = %d,%d,%d)\n", - sectno, phy_c, phy_h, phy_s+1); -#endif - } - else - { - phy_s = sectno%disk_spt; - phy_h = sectno/disk_spt%disk_heads; - phy_c = sectno/disk_spt/disk_heads; - -#if DEBUG > 1 - fprintf(stderr, "read_sector(%ld = %d,%d,%d)\n", - sectno, phy_c, phy_h, phy_s+1); -#endif - - if( fetch_track_buf(phy_c, phy_h, phy_s) >= 0 ) - return data_buf1 + (phy_s % data_len) * 512; - } - - data_len = -1; /* Zap the cache */ - if( data_buf1 == 0 ) - data_buf1 = malloc(512); - if( data_buf1 == 0 ) - { - printf("Cannot allocate memory for disk read!!!\n"); - return 0; - } - -#ifdef DEBUG - fprintf(stderr, "phy_read(%d,%d,%d,%d,%d,0x%x)\n", - disk_drive, phy_c, phy_h, phy_s+1, 1, data_buf1); -#endif - - do - { - int v,tries = 6; - do - { - rv = phy_read(disk_drive, phy_c, phy_h, phy_s+1, 1, data_buf1); - tries--; - } - while(rv && tries > 0); - if( rv ) - { - printf("Disk error 0x%02x %d:%d:%d:%d[%2d] -> 0x%04x[]\nRetry:", - rv, disk_drive, phy_c, phy_h, phy_s+1, 1, data_buf1); - fflush(stdout); - - v = phy_reset(disk_drive); - v = (getch()&0x7F); - printf("\n"); - if( v == 3 || v == 27 ) break; - } - } - while(rv); - - check_motor = motor_running(); - - if(rv) return 0; else return data_buf1; -} - -fetch_track_buf(phy_c, phy_h, phy_s) -int phy_c, phy_h, phy_s; -{ - long trk_no, t; - char * p; - int tries = 6; - int rv, nlen; - - /* Big tracks get us short of memory so limit it. */ - nlen = (disk_spt-1)/24; - nlen = (disk_spt+nlen)/(nlen+1); - /* - trk_no = (long)phy_c*disk_heads*4+phy_h*4+phy_s/nlen+1; - */ - - trk_no = (long)(phy_c*disk_heads+phy_h)*((disk_spt+4)/nlen)+phy_s/nlen+1; - -#if DEBUG > 2 - fprintf(stderr, "Info len=%d,%d trk=%ld,%ld,%ld\n", - data_len,nlen, trk_no,data_trk1,data_trk2); -#endif - - if( data_len != nlen ) - { - if( data_buf1 ) free(data_buf1); - if( data_buf2 ) free(data_buf2); - data_buf1 = data_buf2 = 0; - data_len = nlen; - } - if( trk_no == bad_track ) return -1; - - if( data_buf1 && trk_no == data_trk1 ) return 0; - - /* Two cases: - * 1) buffer2 has the one we want, need to swap to make it most recent - * 2) Neither has it, need to swap to overwrite least recent. - */ - - /* But sequential reads may spoil this so don't swap if we are shifting - * to the next track. - */ - - if( trk_no == data_trk2 || trk_no != data_trk1 + 1 ) - { - p = data_buf1; data_buf1 = data_buf2; data_buf2 = p; - t = data_trk1; data_trk1 = data_trk2; data_trk2 = t; - } - - /* The other one right ? */ - if( data_buf1 && trk_no == data_trk1 ) return 0; - - /* If we get here we have to do a physical read ... */ - /* into data_buf1. */ - - if( data_buf1 == 0 ) - { - data_buf1 = malloc(disk_spt*512); - -#ifdef DEBUG - if( data_buf1 ) - fprintf(stderr, "Allocated buffer to %d\n", data_buf1); - else - fprintf(stderr, "Failed to allocated buffer.\n"); -#endif - } - if( data_buf1 == 0 ) - { - /* Is buf2 allocated ? Yes take it! */ - data_buf1 = data_buf2; data_buf2 = 0; data_trk2 = -1; - } - - data_trk1 = -1; - - /* Not enough memory for track read. */ - if( data_buf1 == 0 ) return -1; - -#ifdef DEBUG - fprintf(stderr, "phy_read(%d,%d,%d,%d,%d,0x%x)\n", - disk_drive, phy_c, phy_h, phy_s/data_len*data_len+1, data_len, data_buf1); -#endif - - do /* the physical read */ - { - rv = phy_read(disk_drive, phy_c, phy_h, phy_s/data_len*data_len+1, data_len, - data_buf1); - tries--; - } - while(rv && tries > 0); - if( rv ) printf("Disk error 0x%02x %d:%d:%d:%d[%2d] -> 0x%04x[]\n", - rv, disk_drive, phy_c, phy_h, phy_s/data_len+1, data_len, data_buf1); - - check_motor = motor_running(); - - /* Disk error, it'll try one at a time, _very_ slowly! */ - if(rv) - { - bad_track = trk_no; - return -1; - } - - /* Yes! */ - data_trk1 = trk_no; - return 0; -} - -#if defined(__MSDOS__) || defined(__STANDALONE__) -phy_read(drive, cyl, head, sect, length, buffer) -{ -#asm - push bp - mov bp,sp - - push es - push ds - pop es - - mov dl,[bp+2+_phy_read.drive] - mov ch,[bp+2+_phy_read.cyl] - mov dh,[bp+2+_phy_read.head] - mov bx,[bp+2+_phy_read.buffer] - - mov ax,[bp+2+_phy_read.cyl] ! Bits 10-11 of cylinder, AMI BIOS. - mov cl,#4 - sar ax,cl - and al,#$C0 - xor dh,al - - mov cl,[bp+2+_phy_read.sect] - and cl,#$3F - mov ax,[bp+2+_phy_read.cyl] ! Bits 8-9 of cylinder. - sar ax,#1 - sar ax,#1 - and al,#$C0 - or cl,al - - mov al,[bp+2+_phy_read.length] - mov ah,#$02 - int $13 - jc read_err - mov ax,#0 -read_err: - xchg ah,al - xor ah,ah - - pop es - pop bp -#endasm -} - -long -get_dpt(drive) -{ -#asm - push bp - mov bp,sp - - push di - push es - - mov dl,[bp+2+_get_dpt.drive] - - mov ah,#$08 - int $13 - jnc func_ok - mov cx,ax - mov dx,#-1 -func_ok: - mov ax,cx - - pop es - pop di - pop bp -#endasm -} - -phy_reset(drive) -{ -#asm - push bp - mov bp,sp - - push di - push es - - mov dl,[bp+2+_phy_reset.drive] - - mov ah,#$08 - int $13 - jnc reset_ok - mov cx,ax - mov dx,#-1 -reset_ok: - mov ax,cx - - pop es - pop di - pop bp -#endasm -} - -motor_running() -{ -#asm - push es - mov ax,#$40 - mov es,ax - seg es - mov al,[$3f] - xor ah,ah - and al,#$0F - pop es -#endasm -} -#endif - -#endif diff -Nurd linux86.old/copt/copt.c linux86/copt/copt.c --- linux86.old/copt/copt.c Sun Feb 17 22:23:36 2002 +++ linux86/copt/copt.c Sat Jun 8 07:44:56 2002 @@ -183,7 +183,7 @@ * has been found in the first column of the input line. All lines with the * 'comment' character in the first position will be skipped. */ -static struct line_s *readlist(FILE *fp, char quit, char comment) +static struct line_s *readlist(FILE *fp, int quit, int comment) { struct line_s *lp; struct line_s *first_line = NULL; @@ -293,7 +293,7 @@ /* * Read input file */ -static void readinfile(char *filename, char comment) +static void readinfile(char *filename, int comment) { FILE *fp; diff -Nurd linux86.old/elksemu/elks_sys.c linux86/elksemu/elks_sys.c --- linux86.old/elksemu/elks_sys.c Fri Jul 2 08:12:13 1999 +++ linux86/elksemu/elks_sys.c Sun May 26 09:18:29 2002 @@ -404,7 +404,7 @@ * * For now we run elksemu ourselves and do token attempts at binary checking. * - * Of course with the Patch in the Linux kernel we could just run the exe. + * Of course if the kernel misc module is confiured we could just run the exe. */ #define sys_execve elks_execve static int elks_execve(int bx,int cx,int dx,int di,int si) diff -Nurd linux86.old/ld/objdump86.c linux86/ld/objdump86.c --- linux86.old/ld/objdump86.c Fri Dec 17 17:44:32 1999 +++ linux86/ld/objdump86.c Sat Jun 8 07:50:28 2002 @@ -318,7 +318,7 @@ cpos = ftell(ifd); fseek(ifd, filepos+str_off, 0); - fread(symtab, 1, (int)str_len, ifd); + fread(symtab, 1, (unsigned int)str_len, ifd); fseek(ifd, cpos, 0); if( !display_mode ) diff -Nurd linux86.old/libc/bios/Makefile linux86/libc/bios/Makefile --- linux86.old/libc/bios/Makefile Sat Mar 16 16:43:17 2002 +++ linux86/libc/bios/Makefile Sun May 26 11:08:20 2002 @@ -14,7 +14,11 @@ CSRC=bios_min.c COBJ=bios_putc.o bios_getc.o -OBJ=$(AOBJ) $(BOBJ) $(COBJ) time.o fileops.o fs_dos.o rawio.o vt52.o ansi.o +DSRC=bios_disk.c +DOBJ=bios_disk_read.o bios_disk_write.o bios_disk_reset.o bios_get_dpt.o + +OBJ=$(AOBJ) $(BOBJ) $(COBJ) $(DOBJ) \ + time.o fileops.o fs_dos.o rawio.o vt52.o ansi.o CFLAGS=$(ARCH) $(CCFLAGS) $(DEFS) @@ -30,6 +34,10 @@ $(AR) $(ARFLAGS) $@ $*.o $(LIBC)($(COBJ)): $(CSRC) + $(CC) $(CFLAGS) -DL_$* $< -c -o $*.o + $(AR) $(ARFLAGS) $@ $*.o + +$(LIBC)($(DOBJ)): $(DSRC) $(CC) $(CFLAGS) -DL_$* $< -c -o $*.o $(AR) $(ARFLAGS) $@ $*.o else diff -Nurd linux86.old/libc/bios/bios_disk.c linux86/libc/bios/bios_disk.c --- linux86.old/libc/bios/bios_disk.c Thu Jan 1 01:00:00 1970 +++ linux86/libc/bios/bios_disk.c Sun May 26 13:27:02 2002 @@ -0,0 +1,158 @@ + +#if !__FIRST_ARG_IN_AX__ +#ifdef __AS386_16__ + +#include +#include + +#ifdef L_bios_disk_read +_bios_disk_read(drive, cyl, head, sect, length, buffer) +{ +#asm + push bp + mov bp,sp + + push es + push ds + pop es + + mov dl,[bp+2+__bios_disk_read.drive] + mov ch,[bp+2+__bios_disk_read.cyl] + mov dh,[bp+2+__bios_disk_read.head] + mov bx,[bp+2+__bios_disk_read.buffer] + +#if 0 + mov ax,[bp+2+__bios_disk_read.cyl] ! Bits 10-11 of cylinder, AMI BIOS. + mov cl,#4 + sar ax,cl + and al,#$C0 + xor dh,al +#endif + + mov cl,[bp+2+__bios_disk_read.sect] + and cl,#$3F + mov ax,[bp+2+__bios_disk_read.cyl] ! Bits 8-9 of cylinder. + sar ax,#1 + sar ax,#1 + and al,#$C0 + or cl,al + + mov al,[bp+2+__bios_disk_read.length] + mov ah,#$02 + int $13 + jc read_err1 + mov ax,#0 +read_err1: + xchg ah,al + xor ah,ah + + pop es + pop bp +#endasm +} +#endif + +#ifdef L_bios_disk_write +_bios_disk_write(drive, cyl, head, sect, length, buffer) +{ +#asm + push bp + mov bp,sp + + push es + push ds + pop es + + mov dl,[bp+2+__bios_disk_write.drive] + mov ch,[bp+2+__bios_disk_write.cyl] + mov dh,[bp+2+__bios_disk_write.head] + mov bx,[bp+2+__bios_disk_write.buffer] + +#if 0 + mov ax,[bp+2+__bios_disk_write.cyl] ! Bits 10-11 of cylinder, AMI BIOS. + mov cl,#4 + sar ax,cl + and al,#$C0 + xor dh,al +#endif + + mov cl,[bp+2+__bios_disk_write.sect] + and cl,#$3F + mov ax,[bp+2+__bios_disk_write.cyl] ! Bits 8-9 of cylinder. + sar ax,#1 + sar ax,#1 + and al,#$C0 + or cl,al + + mov al,[bp+2+__bios_disk_write.length] + mov ah,#$03 + int $13 + jc read_err2 + mov ax,#0 +read_err2: + xchg ah,al + xor ah,ah + + pop es + pop bp +#endasm +} +#endif + +#ifdef L_bios_get_dpt +long +_bios_get_dpt(drive) +{ +#asm + push bp + mov bp,sp + + push di + push es + + mov dl,[bp+2+__bios_get_dpt.drive] + + mov ah,#$08 + int $13 + jnc func_ok + mov cx,ax + mov dx,#-1 +func_ok: + mov ax,cx + + pop es + pop di + pop bp +#endasm +} +#endif + +#ifdef L_bios_disk_reset +_bios_disk_reset(drive) +{ +#asm + push bp + mov bp,sp + + push di + push es + + mov dl,[bp+2+__bios_disk_reset.drive] + + mov ah,#$08 + int $13 + jnc reset_ok + mov cx,ax + mov dx,#-1 +reset_ok: + mov ax,cx + + pop es + pop di + pop bp +#endasm +} +#endif + +#endif +#endif diff -Nurd linux86.old/libc/bios/fs_dos.c linux86/libc/bios/fs_dos.c --- linux86.old/libc/bios/fs_dos.c Sat Nov 21 10:18:18 1998 +++ linux86/libc/bios/fs_dos.c Sun May 26 10:29:45 2002 @@ -1,13 +1,14 @@ +#ifdef DEBUG #include +#endif + #include #include #include #include "io.h" #include "rawio.h" -#define DONT_BUFFER_FAT - #define DOS_SECT(P) get_uint(P,0x0B) #define DOS_CLUST(P) get_byte(P,0x0D) #define DOS_RESV(P) get_uint(P,0x0E) @@ -22,6 +23,7 @@ #define DOS4_MAXSECT(P) get_long(P,0x20) #define DOS4_PHY_DRIVE(P) get_byte(P,0x24) #define DOS4_SERIAL(P) get_long(P,0x27) +#define DOS4_FATTYPE(P) get_uint(P,0x39) /* These assume alignment is not a problem */ #define get_byte(P,Off) *((unsigned char*)((char*)(P)+(Off))) @@ -33,15 +35,11 @@ static int dos_clust0, dos_spc, dos_fatpos; static int last_serial = 0; -#ifdef BUFFER_FAT -static char * fat_buf = 0; -#endif - struct filestatus { char fname[12]; unsigned short first_cluster; unsigned short cur_cluster; - unsigned short sector_no; + unsigned short sector_no; /* Max filesize = 32M */ long file_length; }; @@ -61,11 +59,10 @@ char conv_name[12]; char *d, *s; int i; - int dodir = 0; struct filestatus* cur_file; #ifdef DEBUG - printf("fsdos_open_file(%x, %s, %d, %d, %d)\n", + fprintf(stderr, "fsdos_open_file(%x, %s, %d, %d, %d)\n", iob, fname, flags, mode, sizeof(iob)); #endif iob->block_read = fsdos_read_block; @@ -74,9 +71,6 @@ /* Get the superblock */ if( read_bootblock() < 0 ) return -1; - if(strcmp(fname, ".") == 0) - dodir = 1; - else { /* Convert the name to MSDOS directory format */ strcpy(conv_name, " "); @@ -97,38 +91,7 @@ } } #ifdef DEBUG - printf("fsdos_open_file: converted filename=<%s>\n", conv_name); -#endif - -#ifdef BUFFER_FAT - rawio_read_sector(0, sect); - - if( !dodir ) - { - /* Read in and buffer the FAT */ - if( fat_buf ) free(fat_buf); - fat_buf = malloc(DOS_FATLEN(sect) * 512); - if( fat_buf == 0 ) - { - errno = ENOMEM; - return -1; - } - else - { - int fatsec = DOS_RESV(sect); - int nsec = DOS_FATLEN(sect); - - for(i=0; i\n", conv_name); #endif /* Scan the root directory for the file */ @@ -141,37 +104,7 @@ return -1; } d = s + (i%16)*32; - if( dodir ) - { - char dtime[20]; - char lbuf[90]; - *lbuf = 0; - - sprintf(dtime, " %02d/%02d/%04d %02d:%02d", - (get_uint(d,24)&0x1F), - ((get_uint(d,24)>>5)&0xF), - ((get_uint(d,24)>>9)&0x7F)+1980, - ((get_uint(d,22)>>11)&0x1F), - ((get_uint(d,22)>>5)&0x3F) - ); - if( *d > ' ' && *d <= '~' ) switch(d[11]&0x18) - { - case 0: - printf("%-8.8s %-3.3s %10ld%s\n", d, d+8, get_long(d,28), dtime); - break; - case 0x10: - printf("%-8.8s %-3.3s %s\n", d, d+8, dtime); - break; - case 8: - if( (d[11] & 7) == 0 ) - printf("%-11.11s %s\n", d, dtime); - break; - } -#if 0 - if( more_strn(lbuf, sizeof(lbuf)) < 0 ) break; -#endif - } - else if( memcmp(d, conv_name, 11) == 0 && (d[11]&0x18) == 0 ) + if( memcmp(d, conv_name, 11) == 0 && (d[11]&0x18) == 0 ) { /* Name matches and is normal file */ #ifdef DEBUG @@ -233,11 +166,6 @@ free(cur_file); iob->context = NULL; -#ifdef BUFFER_FAT - if( fat_buf ) free(fat_buf); - fat_buf = 0; -#endif - rawio_reset_disk(); return 0; } @@ -278,7 +206,9 @@ #endif if (iob == NULL || iob->context == NULL) { +#ifdef DEBUG fprintf(stderr, "rb: no context\n"); +#endif errno = EBADF; return -1; } @@ -345,9 +275,6 @@ unsigned int val, val2; val = cur_file->cur_cluster + (cur_file->cur_cluster>>1); -#ifdef BUFFER_FAT - val2 = get_uint(fat_buf, val); -#else if (rawio_read_sector(dos_fatpos+(val/512), sect) <= 0) return -1; if( val%512 == 511 ) { @@ -357,7 +284,6 @@ } else val2 = get_uint(sect, (val%512)); -#endif if( odd ) val2>>=4; @@ -380,7 +306,7 @@ int rv, media_byte = 0; #ifdef DEBUG - printf("fs_dos:read_bootblock:\n"); + fprintf(stderr, "fs_dos:read_bootblock:\n"); #endif if (rawio_read_sector(1, sect) <= 0) return -1; media_byte = *(unsigned char*)sect; @@ -412,7 +338,7 @@ } #ifdef DEBUG - printf("read_bootblock: heads(%d), spt(%d), dir_sect(%d)\n", + fprintf(stderr, "read_bootblock: heads(%d), spt(%d), dir_sect(%d)\n", rawio_disk_heads, rawio_disk_spt, dir_sect); diff -Nurd linux86.old/libc/bios/rawio.c linux86/libc/bios/rawio.c --- linux86.old/libc/bios/rawio.c Mon Nov 23 08:24:12 1998 +++ linux86/libc/bios/rawio.c Sun May 26 10:32:20 2002 @@ -2,7 +2,10 @@ * rawio.c - plagiarised from ../../bootblocks/trk_buf.c */ +#ifdef DEBUG #include +#endif + #include #include #include @@ -124,18 +127,24 @@ data_buf1 = malloc(512); if( data_buf1 == 0 ) { +#ifdef DEBUG fprintf(stderr, "Cannot allocate memory for disk read!!!\n"); +#endif return 0; } +#ifdef DEBUG fprintf(stderr, "WARNING: Single sector read\n"); +#endif do { rv = rawio_phy_read(rawio_disk_drive, phy_c, phy_h, phy_s+1, 1, data_buf1); tries--; +#ifdef DEBUG if( rv ) fprintf(stderr, "Error in phy_read(%d,%d,%d,%d,%d,%d);\n", rawio_disk_drive, phy_c, phy_h, phy_s+1, 1, data_buf1); +#endif } while(rv && tries > 0); @@ -239,8 +248,10 @@ rv = rawio_phy_read(rawio_disk_drive, phy_c, phy_h, phy_s/data_len+1, data_len, data_buf1); tries--; +#ifdef DEBUG if( rv ) fprintf(stderr, "Error in phy_read(%d,%d,%d,%d,%d,%d);\n", rawio_disk_drive, phy_c, phy_h, phy_s/data_len+1, data_len, data_buf1); +#endif } while(rv && tries > 0); diff -Nurd linux86.old/libc/include/bios.h linux86/libc/include/bios.h --- linux86.old/libc/include/bios.h Sun Feb 10 12:49:25 2002 +++ linux86/libc/include/bios.h Sun May 26 11:14:57 2002 @@ -22,6 +22,7 @@ int __deek_es __P((unsigned int off)); #define movedata __movedata +long _bios_get_dpt(drive); #ifdef __LIBC__ diff -Nurd linux86.old/libc/include/ctype.h linux86/libc/include/ctype.h --- linux86.old/libc/include/ctype.h Tue Mar 19 10:10:08 2002 +++ linux86/libc/include/ctype.h Sat May 25 13:57:30 2002 @@ -15,8 +15,9 @@ #define __CT_p 0x20 /* punctuation */ #define __CT_x 0x40 /* hexadecimal */ -#define toupper(c) (islower(c) ? (c)^0x20 : (c)) -#define tolower(c) (isupper(c) ? (c)^0x20 : (c)) +/* Define these as simple old style ascii versions */ +#define toupper(c) (((c)>='a'&&(c)<='z') ? (c)^0x20 : (c)) +#define tolower(c) (((c)>='A'&&(c)<='Z') ? (c)^0x20 : (c)) #define _toupper(c) ((c)^0x20) #define _tolower(c) ((c)^0x20) #define toascii(c) ((c)&0x7F) diff -Nurd linux86.old/libc/include/stdio.h linux86/libc/include/stdio.h --- linux86.old/libc/include/stdio.h Mon Feb 1 08:36:35 1999 +++ linux86/libc/include/stdio.h Thu May 30 19:53:49 2002 @@ -111,11 +111,14 @@ extern int fclose __P((FILE*)); extern int fflush __P((FILE*)); extern char *fgets __P((char*, size_t, FILE*)); -extern FILE *__fopen __P((char*, int, FILE*, char*)); -#define fopen(__file, __mode) __fopen((__file), -1, (FILE*)0, (__mode)) -#define freopen(__file, __mode, __fp) __fopen((__file), -1, (__fp), (__mode)) -#define fdopen(__file, __mode) __fopen((char*)0, (__file), (FILE*)0, (__mode)) +extern FILE *fopen __P((char*, char*)); +extern FILE *fdopen __P((int, char*)); +extern FILE *freopen __P((char*, char*, FILE*)); + +#ifdef __LIBC__ +extern FILE *__fopen __P((char*, int, FILE*, char*)); +#endif extern int fputs __P((char*, FILE*)); extern int puts __P((char*)); diff -Nurd linux86.old/libc/misc/Makefile linux86/libc/misc/Makefile --- linux86.old/libc/misc/Makefile Fri Feb 6 08:20:54 1998 +++ linux86/libc/misc/Makefile Sat May 25 14:03:30 2002 @@ -10,7 +10,7 @@ EOBJ=on_exit.o atexit.o __do_exit.o GOBJ=atoi.o atol.o ltoa.o ltostr.o \ - ctype.o qsort.o bsearch.o rand.o lsearch.o getopt.o \ + ctype.o ctypefn.o qsort.o bsearch.o rand.o lsearch.o getopt.o \ itoa.o cputype.o strtol.o crypt.o UOBJ=getenv.o putenv.o popen.o system.o setenv.o getcwd.o tmpnam.o diff -Nurd linux86.old/libc/misc/crypt.c linux86/libc/misc/crypt.c --- linux86.old/libc/misc/crypt.c Sun Oct 19 17:30:46 1997 +++ linux86/libc/misc/crypt.c Thu May 30 22:05:11 2002 @@ -6,7 +6,7 @@ /* * I've: * Compared the TEA implementation to a reference source - OK - * Noted the cycles count at 64 is twice the suggested value. + * Reduced the cycles count from 64 to 32 (the suggested value) * Changed the types of 'n' and 'i' for better code with bcc. * Removed a possible overrun of rkey by looping the values, it's now * possible to _choose_ every bit of the 128bit PW with a 32 character word. @@ -26,7 +26,7 @@ k is the key, v is the data to be encrypted. */ unsigned long v[2], sum=0, delta=0x9e3779b9, k[4]; - int n=64, i, j; + int n=32, i, j; static char rkey[16]; /* Our constant string will be a string of zeros .. */ diff -Nurd linux86.old/libc/misc/ctype.c linux86/libc/misc/ctype.c --- linux86.old/libc/misc/ctype.c Tue Mar 19 10:10:21 2002 +++ linux86/libc/misc/ctype.c Sat May 25 14:04:20 2002 @@ -9,9 +9,6 @@ #include -#undef toupper -#undef tolower - unsigned char __ctype[257] = { 0, /* -1 */ @@ -56,14 +53,3 @@ __CT_p, __CT_p, __CT_p, __CT_c /* 0x7C..0x7F */ }; -int toupper(c) -int c; -{ - return(islower(c) ? (c ^ 0x20) : (c)); -} - -int tolower(c) -int c; -{ - return(isupper(c) ? (c ^ 0x20) : (c)); -} diff -Nurd linux86.old/libc/misc/ctypefn.c linux86/libc/misc/ctypefn.c --- linux86.old/libc/misc/ctypefn.c Thu Jan 1 01:00:00 1970 +++ linux86/libc/misc/ctypefn.c Sat May 25 14:04:31 2002 @@ -0,0 +1,25 @@ +/* Copyright (C) 1995,1996 Robert de Bath + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ + +/* + * CTYPE.C Character classification and conversion + */ + +#include + +#undef toupper +#undef tolower + +int toupper(c) +int c; +{ + return(islower(c) ? (c ^ 0x20) : (c)); +} + +int tolower(c) +int c; +{ + return(isupper(c) ? (c ^ 0x20) : (c)); +} diff -Nurd linux86.old/libc/stdio/Makefile linux86/libc/stdio/Makefile --- linux86.old/libc/stdio/Makefile Sat Mar 8 20:16:05 1997 +++ linux86/libc/stdio/Makefile Thu May 30 19:55:17 2002 @@ -7,9 +7,9 @@ endif ASRC=stdio.c -AOBJ=_stdio_init.o fputc.o fgetc.o fflush.o fgets.o gets.o fputs.o \ - puts.o fread.o fwrite.o fopen.o fclose.o fseek.o rewind.o ftell.o \ - setbuffer.o setvbuf.o ungetc.o +AOBJ=_stdio_init.o fputc.o fgetc.o fflush.o fgets.o gets.o fputs.o \ + puts.o fread.o fwrite.o fopen.o fdopen.o freopen.o __fopen.o \ + fclose.o fseek.o rewind.o ftell.o setbuffer.o setvbuf.o ungetc.o PSRC=printf.c POBJ=printf.o sprintf.o fprintf.o vprintf.o vsprintf.o vfprintf.o diff -Nurd linux86.old/libc/stdio/stdio.c linux86/libc/stdio/stdio.c --- linux86.old/libc/stdio/stdio.c Tue Mar 9 14:54:35 1999 +++ linux86/libc/stdio/stdio.c Thu May 30 19:52:09 2002 @@ -582,9 +582,39 @@ #endif #ifdef L_fopen +FILE * +fopen(file, mode) +char * file; +char * mode; +{ + return __fopen(file, -1, (FILE*)0, mode); +} +#endif + +#ifdef L_freopen +FILE * +freopen(file, mode, fp) +char * file; +char * mode; +FILE * fp; +{ + return __fopen(file, -1, fp, mode); +} +#endif + +#ifdef L_fdopen +FILE * +fdopen(file, mode) +int file; +char * mode; +{ + return __fopen((char*)0, file, (FILE*)0, mode); +} +#endif + +#ifdef L___fopen /* - * This Fopen is all three of fopen, fdopen and freopen. The macros in - * stdio.h show the other names. + * This is the common code for all three of fopen, fdopen and freopen. */ FILE * __fopen(fname, fd, fp, mode) diff -Nurd linux86.old/libc/stdio/stdio.h linux86/libc/stdio/stdio.h --- linux86.old/libc/stdio/stdio.h Mon Feb 1 08:36:35 1999 +++ linux86/libc/stdio/stdio.h Thu May 30 19:53:49 2002 @@ -111,11 +111,14 @@ extern int fclose __P((FILE*)); extern int fflush __P((FILE*)); extern char *fgets __P((char*, size_t, FILE*)); -extern FILE *__fopen __P((char*, int, FILE*, char*)); -#define fopen(__file, __mode) __fopen((__file), -1, (FILE*)0, (__mode)) -#define freopen(__file, __mode, __fp) __fopen((__file), -1, (__fp), (__mode)) -#define fdopen(__file, __mode) __fopen((char*)0, (__file), (FILE*)0, (__mode)) +extern FILE *fopen __P((char*, char*)); +extern FILE *fdopen __P((int, char*)); +extern FILE *freopen __P((char*, char*, FILE*)); + +#ifdef __LIBC__ +extern FILE *__fopen __P((char*, int, FILE*, char*)); +#endif extern int fputs __P((char*, FILE*)); extern int puts __P((char*)); diff -Nurd linux86.old/libc/syscall/syscall.dev86 linux86/libc/syscall/syscall.dev86 --- linux86.old/libc/syscall/syscall.dev86 Fri May 25 14:57:42 2001 +++ linux86/libc/syscall/syscall.dev86 Sun May 26 09:27:47 2002 @@ -4,17 +4,15 @@ # ELKSemu and elks itself. Changes to this may require changes in # all three of those packages. # -# . = Ok, with comment -# * = Needs libc code (Prefix __) -# - = Obsolete/not required -# @ = May be required later +# '.' = Ok, with comment +# '*' = Needs libc code (Prefix __) +# '-' = Obsolete/not required +# '@' = May be required later +# '=' = Depends on stated config variable # # An initial plus on the call number specifies that this call is # implemented in the kernel. # -# Package versions are matched. -# Dev86/Elksemu version - 0.13.1 -# Elks version - 0.0.66 # # Name No Args Flag, comment # @@ -69,7 +67,7 @@ getinfo 49 1 @ possible? gets pid,ppid,uid,euid etc fcntl +50 3 acct 51 1 @ Accounting to named file (off if null) -phys 52 3 - Replaced my mmap() +phys 52 3 - Replaced by mmap() lock 53 1 @ Prevent swapping for this proc if flg!=0 ioctl +54 3 . make this and fcntl the same ? reboot +55 3 . the magic number is 0xfee1,0xdead,... @@ -82,7 +80,7 @@ gettimeofday +62 2 select +63 5 . 5 paramaters is possible readdir +64 3 * -insmod +65 1 +insmod 65 1 - Removed support for modules fchown +66 3 dlload +67 2 setsid +68 0 @@ -91,6 +89,7 @@ listen +71 2 accept +72 3 connect +73 3 +knlvsn +74 1 = CONFIG_SYS_VERSION # # Name No Args Flag&comment # diff -Nurd linux86.old/makefile.in linux86/makefile.in --- linux86.old/makefile.in Wed Mar 20 21:26:53 2002 +++ linux86/makefile.in Mon Jul 22 21:36:07 2002 @@ -32,15 +32,15 @@ #ifdef __GNUC__ # unproto is yukky, I've included '-w' in the local makefile. -WALL =-Wtraditional -Wshadow -Wid-clash-14 -Wpointer-arith \ +WALL =-Wall -Wtraditional -Wshadow -Wid-clash-14 -Wpointer-arith \ -Wcast-qual -Wcast-align -Wconversion -Waggregate-return \ -Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls \ -Wnested-externs -Winline -WALL =-Wstrict-prototypes +WALL =-Wall -Wstrict-prototypes -CC =gcc -CFLAGS =$(GCCFLAG) -Wall $(WALL) -O2 -g +CC =%CC% +CFLAGS =$(GCCFLAG) $(WALL) -O2 -g #endif #ifndef GNUMAKE diff -Nurd linux86.old/man/bcc.1 linux86/man/bcc.1 --- linux86.old/man/bcc.1 Mon Dec 3 22:42:24 2001 +++ linux86/man/bcc.1 Tue May 28 20:51:10 2002 @@ -71,7 +71,7 @@ produce preprocessor output to standard out. .TP .B -G -produce GCC objects (only useful for i386 code) +produce GCC objects (Same as -Mg) .TP .B -Ixyz include search 'xyz' path @@ -115,6 +115,11 @@ This configuration accepts the .B -z flag to generate QMAGIC a.out files instead of the normal OMAGIC. +.TP +.B -Mg +switches to i386-Linux code generator and generates OMAGIC object files +that can be linked with some versions of gcc; unfortunatly the most recent +versions use 'collect2' to link and this crashes. .TP .B -N makes the linker produce a native a.out file (Linux OMAGIC) if combined diff -Nurd linux86.old/tests/Makefile linux86/tests/Makefile --- linux86.old/tests/Makefile Wed Dec 30 11:38:46 1998 +++ linux86/tests/Makefile Thu May 30 20:50:15 2002 @@ -6,10 +6,10 @@ CC=$(BCC) CFLAGS=-O -SRC=env.c ft.c hd.c size.c sync.c compr.c ucomp.c ouch.c lines.c \ +SRC=env.c ft.c hd.c sync.c compr.c ucomp.c ouch.c lines.c \ wc.c line2.c rand.c grab.c OBJ= -EXE=env ft hd size sync compr ucomp ouch lines wc line2 rand grab +EXE=env ft hd sync compr ucomp ouch lines wc line2 rand grab LINK_FILES=cat chgrp chmod chown cp install ln mkdir mkfifo mknod mv rm Binary files linux86.old/tests/a.out and linux86/tests/a.out differ diff -Nurd linux86.old/tests/ft.c linux86/tests/ft.c --- linux86.old/tests/ft.c Sun Mar 14 12:19:09 1999 +++ linux86/tests/ft.c Thu May 30 20:51:01 2002 @@ -42,7 +42,7 @@ #define PR(x) () #endif -void main PR((int argc, char ** argv)); +int main PR((int argc, char ** argv)); int select_command PR((char * argv)); void do_prep PR((void)); void do_post PR((void)); @@ -156,7 +156,7 @@ int done_something = 0; -void +int main(argc, argv) int argc; char ** argv; { @@ -261,7 +261,7 @@ else Usage(); } - exit(0); + return 0; } int select_command(argv) diff -Nurd linux86.old/tests/hd.c linux86/tests/hd.c --- linux86.old/tests/hd.c Thu Jul 3 22:31:15 1997 +++ linux86/tests/hd.c Thu May 30 20:45:22 2002 @@ -1,7 +1,27 @@ +/* + * This is a Xenix style hex dump command. + * + * The 'reverse hex dump' option is an addition that allows a simple + * method of editing binary files. + * + * The overkill Linux 'hexdump' command can be configured to generate + * the same format as this command by this shell macro: + * + * hd() { hexdump -e '"%06.6_ax:" 8/1 " %02x" " " 8/1 " %02x" " " ' \ + * -e '16/1 "%_p" "\n"' \ + * "$@" + * } + * + */ #include #include #include +#ifndef MSDOS +#ifndef __BCC__ +#include +#endif +#endif int lastnum[16] = {-1}; long lastaddr = -1; @@ -9,7 +29,7 @@ FILE *fd; -FILE * ofd = stdout; +FILE * ofd; char * outfile = 0; int reverse = 0; @@ -21,6 +41,14 @@ int ar; int aflag = 1; +#ifndef MSDOS +#ifndef __BCC__ + setlocale(LC_CTYPE, ""); +#endif +#endif + + ofd = stdout; + for (ar = 1; ar < argc; ar++) if (aflag && argv[ar][0] == '-') switch (argv[ar][1]) @@ -119,7 +147,7 @@ break; num[j] = ch; - if (isascii(ch) && isprint(ch)) + if (isprint(ch)) buf[j] = ch; else buf[j] = '.'; @@ -195,8 +223,12 @@ ptr = str; if( *ptr == '*' ) zap_last = 0; - if( !isxdigit(*ptr) ) continue; - addr = strtol(ptr, &ptr, 16); + if( *ptr != ':' ) { + if( !isxdigit(*ptr) ) continue; + addr = strtol(ptr, &ptr, 16); + } + else + addr = nxtaddr; if( *ptr == ':' ) ptr++; if (nxtaddr == 0) diff -Nurd linux86.old/tests/size.c linux86/tests/size.c --- linux86.old/tests/size.c Sun Jan 5 11:07:42 1997 +++ linux86/tests/size.c Thu Jan 1 01:00:00 1970 @@ -1,83 +0,0 @@ -#include -#include - -int verbose = 0; - -void size(filename) - char *filename; -{ - int f; - struct exec ex; - long total; - int cc; - - if ((f = open(filename, O_RDONLY)) < 0 ) - { - perror(filename); - return; - } - cc = read(f, &ex, sizeof(ex)); - - if (cc == sizeof(ex) && !BADMAG(ex)) - { - total = ex.a_text + ex.a_data + ex.a_bss; - if( verbose ) - { - printf("Text segment of %s = %5ld (0x%lx)\n", - filename, ex.a_text, ex.a_text); - printf("Init data of %s = %5ld (0x%lx)\n", - filename, ex.a_data, ex.a_data); - printf("Uninit data of %s = %5ld (0x%lx)\n", - filename, ex.a_bss, ex.a_bss); - printf("Data segment of %s = %5ld (0x%lx)\n", - filename, ex.a_total, ex.a_total); - printf("Minimum size of %s = %5ld (0x%lx)\n", - filename, total, total); - - total = ex.a_total; - if( ex.a_flags & A_SEP ) - total += ex.a_text; - printf("Maximum size of %s = %5ld (0x%lx)\n", - filename, total, total); - } - else - printf("%-ld\t%-ld\t%-ld\t%-ld\t%-lx\t%s\n", - ex.a_text, ex.a_data, ex.a_bss, total, total, - filename); - } - else if( cc > 16 && memcmp(&ex, "\243\206\001\000*", 5) == 0 ) - { /* *.o file */ - total = ((unsigned char*)&ex)[9] + - ((unsigned char*)&ex)[10] * 256; - if( verbose ) - printf("Size of object %s = %5ld (0x%lx)\n", - filename, total, total); - else - printf("\t\t\t%-ld\t%-lx\t%s\n", - total, total, filename); - } - else - printf("%s: Not an a.out file\n", filename); - close(f); -} - -int main(argc, argv) - int argc; - char **argv; -{ - if (argc > 1 && strcmp(argv[1], "-v") == 0 ) - { - verbose++; - argc--, argv++; - } - if (argc < 2) - { - printf("Usage: %s [-v] file\n", argv[0]); - exit(1); - } - if(!verbose) - printf("text\tdata\tbss\tdec\thex\tfilename\n"); - for (--argc, ++argv; argc > 0; --argc, ++argv) - size(*argv); - exit(0); -} diff -Nurd linux86.old/unproto/Makefile linux86/unproto/Makefile --- linux86.old/unproto/Makefile Sat Jan 6 12:37:21 2001 +++ linux86/unproto/Makefile Sat Jun 8 09:03:22 2002 @@ -38,7 +38,7 @@ # 7. Specify a string constant with exactly three octal digits. If you # change this definition, you will have to update the example.out file. # -BELL = -DBELL=\"007\" +# BELL = -DBELL=\"007\" # Some C compilers have problems with "void". The nature of the problems # depends on the age of the compiler. diff -Nurd linux86.old/unproto/unproto.c linux86/unproto/unproto.c --- linux86.old/unproto/unproto.c Thu Apr 24 20:21:33 1997 +++ linux86/unproto/unproto.c Sat Jun 8 09:06:36 2002 @@ -220,6 +220,9 @@ cpp_pid = pipe_stdin_through_cpp(argv); #endif #ifdef REOPEN +#ifdef PIPE_THROUGH_CPP +#error Defines REOPEN and PIPE_THROUGH_CPP are incompatible. +#endif if ( argc > 1 ) { if( freopen(argv[1], "r", stdin) == 0 ) { fprintf(stderr, "Cannot open '%s'\n", argv[1]);