More cleaning up
This commit is contained in:
parent
1ead18e447
commit
3fb8cb760c
54 changed files with 24 additions and 4200 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
.include <bsd.own.mk>
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
SUBDIR= add_route arp ash at autil awk \
|
SUBDIR= add_route arp ash at awk \
|
||||||
backup badblocks banner basename \
|
backup badblocks banner basename \
|
||||||
btrace cal calendar \
|
btrace cal calendar \
|
||||||
cat cawf cd cdprobe checkhier \
|
cat cawf cd cdprobe checkhier \
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
# Makefile for commands/autil
|
|
||||||
|
|
||||||
PROGS= anm asize
|
|
||||||
SRCS.anm= anm.c rd.c rd_arhdr.c rd_bytes.c rd_unsig2.c
|
|
||||||
SRCS.asize= asize.c
|
|
||||||
CPPFLAGS+= -I${.CURDIR}
|
|
||||||
MAN.anm=
|
|
||||||
MAN.asize=
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
|
@ -1,340 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
** print symbol tables for
|
|
||||||
** ACK object files
|
|
||||||
**
|
|
||||||
** anm [-gopruns] [name ...]
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "out.h"
|
|
||||||
#include "arch.h"
|
|
||||||
#include "ranlib.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
int numsort_flg;
|
|
||||||
int sectsort_flg;
|
|
||||||
int undef_flg;
|
|
||||||
int revsort_flg = 1;
|
|
||||||
int globl_flg;
|
|
||||||
int nosort_flg;
|
|
||||||
int arch_flg;
|
|
||||||
int prep_flg;
|
|
||||||
int read_error;
|
|
||||||
struct outhead hbuf;
|
|
||||||
struct outsect sbuf;
|
|
||||||
long off;
|
|
||||||
char *malloc();
|
|
||||||
char *realloc();
|
|
||||||
long s_base[S_MAX]; /* for specially encoded bases */
|
|
||||||
char *filename;
|
|
||||||
int narg;
|
|
||||||
|
|
||||||
main(argc, argv)
|
|
||||||
char **argv;
|
|
||||||
{
|
|
||||||
|
|
||||||
if (--argc>0 && argv[1][0]=='-' && argv[1][1]!=0) {
|
|
||||||
argv++;
|
|
||||||
while (*++*argv) switch (**argv) {
|
|
||||||
case 'n': /* sort numerically */
|
|
||||||
numsort_flg++;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 's': /* sort in section order */
|
|
||||||
sectsort_flg++;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 'g': /* globl symbols only */
|
|
||||||
globl_flg++;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 'u': /* undefined symbols only */
|
|
||||||
undef_flg++;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 'r': /* sort in reverse order */
|
|
||||||
revsort_flg = -1;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 'p': /* don't sort -- symbol table order */
|
|
||||||
nosort_flg++;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 'o': /* prepend a name to each line */
|
|
||||||
prep_flg++;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
default: /* oops */
|
|
||||||
fprintf(stderr, "anm: invalid argument -%c\n", *argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
argc--;
|
|
||||||
}
|
|
||||||
if (argc == 0) {
|
|
||||||
argc = 1;
|
|
||||||
argv[1] = "a.out";
|
|
||||||
}
|
|
||||||
narg = argc;
|
|
||||||
|
|
||||||
while(argc--) {
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
filename = *++argv;
|
|
||||||
if ((fd = open(filename, 0)) < 0) {
|
|
||||||
fprintf(stderr, "anm: cannot open %s\n", filename);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
process(fd);
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern int rd_unsigned2();
|
|
||||||
extern long lseek();
|
|
||||||
extern char *strncpy();
|
|
||||||
|
|
||||||
void do_file(int fd);
|
|
||||||
|
|
||||||
process(fd)
|
|
||||||
int fd;
|
|
||||||
{
|
|
||||||
unsigned int magic;
|
|
||||||
long nextpos;
|
|
||||||
struct ar_hdr archive_header;
|
|
||||||
static char buf[sizeof(archive_header.ar_name)+1];
|
|
||||||
|
|
||||||
if (narg > 1) printf("\n%s:\n", filename);
|
|
||||||
|
|
||||||
magic = rd_unsigned2(fd);
|
|
||||||
switch(magic) {
|
|
||||||
case O_MAGIC:
|
|
||||||
lseek(fd, 0L, 0);
|
|
||||||
do_file(fd);
|
|
||||||
break;
|
|
||||||
case ARMAG:
|
|
||||||
case AALMAG:
|
|
||||||
while (rd_arhdr(fd, &archive_header)) {
|
|
||||||
nextpos = lseek(fd, 0L, 1) + archive_header.ar_size;
|
|
||||||
if (nextpos & 1) nextpos++;
|
|
||||||
strncpy(buf,archive_header.ar_name,sizeof(archive_header.ar_name));
|
|
||||||
filename = buf;
|
|
||||||
if ( strcmp(filename, SYMDEF)) {
|
|
||||||
printf("\n%s:\n", filename);
|
|
||||||
do_file(fd);
|
|
||||||
}
|
|
||||||
lseek(fd, nextpos, 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "anm: %s -- bad format\n", filename);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_file(fd)
|
|
||||||
int fd;
|
|
||||||
{
|
|
||||||
struct outname *nbufp = NULL;
|
|
||||||
struct outname nbuf;
|
|
||||||
char *cbufp;
|
|
||||||
long fi_to_co;
|
|
||||||
long n;
|
|
||||||
unsigned readcount;
|
|
||||||
int i,j;
|
|
||||||
int compare();
|
|
||||||
|
|
||||||
read_error = 0;
|
|
||||||
rd_fdopen(fd);
|
|
||||||
|
|
||||||
rd_ohead(&hbuf);
|
|
||||||
if (read_error) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (BADMAGIC(hbuf)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
n = hbuf.oh_nname;
|
|
||||||
if (n == 0) {
|
|
||||||
fprintf(stderr, "anm: %s -- no name list\n", filename);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hbuf.oh_nchar == 0) {
|
|
||||||
fprintf(stderr, "anm: %s -- no names\n", filename);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((readcount = hbuf.oh_nchar) != hbuf.oh_nchar) {
|
|
||||||
fprintf(stderr, "anm: string area too big in %s\n", filename);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* store special section bases ??? */
|
|
||||||
if (hbuf.oh_flags & HF_8086) {
|
|
||||||
rd_sect(&sbuf, hbuf.oh_nsect);
|
|
||||||
if (read_error) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (i=0; i<hbuf.oh_nsect; i++) {
|
|
||||||
s_base[i+S_MIN] =
|
|
||||||
(sbuf.os_base>>12) & 03777760;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((cbufp = (char *)malloc(readcount)) == NULL) {
|
|
||||||
fprintf(stderr, "anm: out of memory on %s\n", filename);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
rd_string(cbufp, hbuf.oh_nchar);
|
|
||||||
if (read_error) {
|
|
||||||
free(cbufp);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fi_to_co = (long) (cbufp - OFF_CHAR(hbuf));
|
|
||||||
i = 0;
|
|
||||||
while (--n >= 0) {
|
|
||||||
rd_name(&nbuf, 1);
|
|
||||||
if (read_error) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (globl_flg && (nbuf.on_type&S_EXT)==0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (undef_flg
|
|
||||||
&&
|
|
||||||
((nbuf.on_type&S_TYP)!=S_UND || (nbuf.on_type&S_ETC)!=0))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (nbuf.on_foff == 0) nbuf.on_mptr = 0;
|
|
||||||
else nbuf.on_mptr = (char *) (nbuf.on_foff + fi_to_co);
|
|
||||||
|
|
||||||
/* adjust value for specially encoded bases */
|
|
||||||
if (hbuf.oh_flags & HF_8086) {
|
|
||||||
if (((nbuf.on_type&S_ETC) == 0) ||
|
|
||||||
((nbuf.on_type&S_ETC) == S_SCT)) {
|
|
||||||
j = nbuf.on_type&S_TYP;
|
|
||||||
if ((j>=S_MIN) && (j<=S_MAX))
|
|
||||||
nbuf.on_valu += s_base[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nbufp == NULL)
|
|
||||||
nbufp = (struct outname *)malloc(sizeof(struct outname));
|
|
||||||
else
|
|
||||||
nbufp = (struct outname *)realloc(nbufp, (i+1)*sizeof(struct outname));
|
|
||||||
if (nbufp == NULL) {
|
|
||||||
fprintf(stderr, "anm: out of memory on %s\n", filename);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
nbufp[i++] = nbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nbufp && nosort_flg==0)
|
|
||||||
qsort(nbufp, i, sizeof(struct outname), compare);
|
|
||||||
|
|
||||||
for (n=0; n<i; n++) {
|
|
||||||
char cs1[4];
|
|
||||||
char cs2[4];
|
|
||||||
|
|
||||||
if (prep_flg)
|
|
||||||
printf("%s:", filename);
|
|
||||||
|
|
||||||
switch(nbufp[n].on_type&S_ETC) {
|
|
||||||
case S_SCT:
|
|
||||||
sprintf(cs1, "%2d", (nbufp[n].on_type&S_TYP) - S_MIN);
|
|
||||||
sprintf(cs2, " S");
|
|
||||||
break;
|
|
||||||
case S_FIL:
|
|
||||||
sprintf(cs1, " -");
|
|
||||||
sprintf(cs2, " F");
|
|
||||||
break;
|
|
||||||
case S_MOD:
|
|
||||||
sprintf(cs1, " -");
|
|
||||||
sprintf(cs2, " M");
|
|
||||||
break;
|
|
||||||
case S_COM:
|
|
||||||
sprintf(cs1, " C");
|
|
||||||
if (nbufp[n].on_type&S_EXT)
|
|
||||||
sprintf(cs2, " E");
|
|
||||||
else
|
|
||||||
sprintf(cs2, " -");
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
if (nbufp[n].on_type&S_EXT)
|
|
||||||
sprintf(cs2, " E");
|
|
||||||
else
|
|
||||||
sprintf(cs2, " -");
|
|
||||||
|
|
||||||
switch(nbufp[n].on_type&S_TYP) {
|
|
||||||
case S_UND:
|
|
||||||
sprintf(cs1, " U");
|
|
||||||
break;
|
|
||||||
case S_ABS:
|
|
||||||
sprintf(cs1, " A");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sprintf(cs1, "%2d", (nbufp[n].on_type&S_TYP) - S_MIN);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sprintf(cs1, "??");
|
|
||||||
sprintf(cs2, " ?");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%8lx %s %s %s\n",nbufp[n].on_valu,cs1,cs2,nbufp[n].on_mptr ? nbufp[n].on_mptr : "(NULL)");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nbufp)
|
|
||||||
free((char *)nbufp);
|
|
||||||
if (cbufp)
|
|
||||||
free((char *)cbufp);
|
|
||||||
}
|
|
||||||
|
|
||||||
compare(p1, p2)
|
|
||||||
struct outname *p1, *p2;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (sectsort_flg) {
|
|
||||||
if ((p1->on_type&S_TYP) > (p2->on_type&S_TYP))
|
|
||||||
return(revsort_flg);
|
|
||||||
if ((p1->on_type&S_TYP) < (p2->on_type&S_TYP))
|
|
||||||
return(-revsort_flg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numsort_flg) {
|
|
||||||
if (p1->on_valu > p2->on_valu)
|
|
||||||
return(revsort_flg);
|
|
||||||
if (p1->on_valu < p2->on_valu)
|
|
||||||
return(-revsort_flg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! p1->on_mptr) {
|
|
||||||
if (! p2->on_mptr) return 0;
|
|
||||||
return -revsort_flg;
|
|
||||||
}
|
|
||||||
if (! p2->on_mptr) return revsort_flg;
|
|
||||||
|
|
||||||
i = strcmp(p1->on_mptr, p2->on_mptr);
|
|
||||||
|
|
||||||
if (i > 0)
|
|
||||||
return(revsort_flg);
|
|
||||||
if (i < 0)
|
|
||||||
return(-revsort_flg);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
rd_fatal()
|
|
||||||
{
|
|
||||||
fprintf(stderr,"read error on %s\n", filename);
|
|
||||||
read_error = 1;
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __ARCH_H_INCLUDED
|
|
||||||
#define __ARCH_H_INCLUDED
|
|
||||||
|
|
||||||
#define ARMAG 0177545
|
|
||||||
#define AALMAG 0177454
|
|
||||||
|
|
||||||
struct ar_hdr {
|
|
||||||
char ar_name[14];
|
|
||||||
long ar_date;
|
|
||||||
char ar_uid;
|
|
||||||
char ar_gid;
|
|
||||||
short ar_mode;
|
|
||||||
long ar_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define AR_TOTAL 26
|
|
||||||
#define AR_SIZE 22
|
|
||||||
|
|
||||||
#endif /* __ARCH_H_INCLUDED */
|
|
|
@ -1,93 +0,0 @@
|
||||||
/* @(#)asize.c 1.4 */
|
|
||||||
#define ushort unsigned short
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "out.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
asize -- determine object size
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
main(argc, argv)
|
|
||||||
char **argv;
|
|
||||||
{
|
|
||||||
struct outhead buf;
|
|
||||||
struct outsect sbuf;
|
|
||||||
ushort nrsect;
|
|
||||||
long sum;
|
|
||||||
int gorp;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
if (--argc == 0) {
|
|
||||||
argc = 1;
|
|
||||||
argv[1] = "a.out";
|
|
||||||
}
|
|
||||||
gorp = argc;
|
|
||||||
|
|
||||||
while(argc--) {
|
|
||||||
if ((f = fopen(*++argv, "r"))==NULL) {
|
|
||||||
fprintf(stderr, "asize: cannot open %s\n", *argv);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
getofmt ((char *)&buf, SF_HEAD , f);
|
|
||||||
if(BADMAGIC(buf)) {
|
|
||||||
fprintf(stderr, "asize: %s-- bad format\n", *argv);
|
|
||||||
fclose(f);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
nrsect = buf.oh_nsect;
|
|
||||||
if (nrsect == 0) {
|
|
||||||
fprintf(stderr, "asize: %s-- no sections\n", *argv);
|
|
||||||
fclose(f);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (gorp > 1)
|
|
||||||
printf("%s: ", *argv);
|
|
||||||
|
|
||||||
sum = 0;
|
|
||||||
while (nrsect-- > 0) {
|
|
||||||
getofmt ((char *)&sbuf, SF_SECT , f);
|
|
||||||
printf("%ld", sbuf.os_size);
|
|
||||||
sum += sbuf.os_size;
|
|
||||||
if (nrsect > 0)
|
|
||||||
putchar('+');
|
|
||||||
}
|
|
||||||
printf(" = %ld = 0x%lx\n", sum, sum);
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getofmt(p, s, f)
|
|
||||||
register char *p;
|
|
||||||
register char *s;
|
|
||||||
register FILE *f;
|
|
||||||
{
|
|
||||||
register i;
|
|
||||||
register long l;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
switch (*s++) {
|
|
||||||
/* case '0': p++; continue; */
|
|
||||||
case '1':
|
|
||||||
*p++ = getc(f);
|
|
||||||
continue;
|
|
||||||
case '2':
|
|
||||||
i = getc(f);
|
|
||||||
i |= (getc(f) << 8);
|
|
||||||
*((short *)p) = i; p += sizeof(short);
|
|
||||||
continue;
|
|
||||||
case '4':
|
|
||||||
l = (long)getc(f);
|
|
||||||
l |= ((long)getc(f) << 8);
|
|
||||||
l |= ((long)getc(f) << 16);
|
|
||||||
l |= ((long)getc(f) << 24);
|
|
||||||
*((long *)p) = l; p += sizeof(long);
|
|
||||||
continue;
|
|
||||||
default:
|
|
||||||
case '\0':
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
#include <local.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <out.h>
|
|
||||||
#include <ranlib.h>
|
|
||||||
#include <arch.h>
|
|
||||||
#include "object.h"
|
|
||||||
|
|
||||||
#if ! defined(CHAR_UNSIGNED)
|
|
||||||
#define CHAR_UNSIGNED 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CHAR_UNSIGNED
|
|
||||||
#define Xchar(ch) (ch)
|
|
||||||
#else
|
|
||||||
#define Xchar(ch) ((ch) & 0377)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ! defined(BYTE_ORDER)
|
|
||||||
#define BYTE_ORDER 0x3210
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (BYTE_ORDER == 0x3210 || BYTE_ORDER == 0x1032)
|
|
||||||
#define uget2(c) (Xchar((c)[0]) | ((unsigned) Xchar((c)[1]) << 8))
|
|
||||||
#define Xput2(i, c) (((c)[0] = (i)), ((c)[1] = (i) >> 8))
|
|
||||||
#define put2(i, c) { register int j = (i); Xput2(j, c); }
|
|
||||||
#else
|
|
||||||
#define uget2(c) (* ((unsigned short *) (c)))
|
|
||||||
#define Xput2(i, c) (* ((short *) (c)) = (i))
|
|
||||||
#define put2(i, c) Xput2(i, c)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define get2(c) ((short) uget2(c))
|
|
||||||
|
|
||||||
#if BYTE_ORDER != 0x0123
|
|
||||||
#define get4(c) (uget2(c) | ((long) uget2((c)+2) << 16))
|
|
||||||
#define put4(l, c) { register long x=(l); \
|
|
||||||
Xput2((int)x,c); \
|
|
||||||
Xput2((int)(x>>16),(c)+2); \
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define get4(c) (* ((long *) (c)))
|
|
||||||
#define put4(l, c) (* ((long *) (c)) = (l))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SECTCNT 3 /* number of sections with own output buffer */
|
|
||||||
#if BIGMACHINE
|
|
||||||
#define WBUFSIZ (8*BUFSIZ)
|
|
||||||
#else
|
|
||||||
#define WBUFSIZ BUFSIZ
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct fil {
|
|
||||||
int cnt;
|
|
||||||
char *pnow;
|
|
||||||
char *pbegin;
|
|
||||||
long currpos;
|
|
||||||
int fd;
|
|
||||||
char pbuf[WBUFSIZ];
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct fil __parts[];
|
|
||||||
|
|
||||||
#define PARTEMIT 0
|
|
||||||
#define PARTRELO (PARTEMIT+SECTCNT)
|
|
||||||
#define PARTNAME (PARTRELO+1)
|
|
||||||
#define PARTCHAR (PARTNAME+1)
|
|
||||||
#ifdef SYMDBUG
|
|
||||||
#define PARTDBUG (PARTCHAR+1)
|
|
||||||
#else
|
|
||||||
#define PARTDBUG (PARTCHAR+0)
|
|
||||||
#endif
|
|
||||||
#define NPARTS (PARTDBUG + 1)
|
|
||||||
|
|
||||||
#define getsect(s) (PARTEMIT+((s)>=(SECTCNT-1)?(SECTCNT-1):(s)))
|
|
|
@ -1,44 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <minix/ansi.h>
|
|
||||||
|
|
||||||
#ifndef __OBJECT_INCLUDED__
|
|
||||||
#define __OBJECT_INCLUDED__
|
|
||||||
|
|
||||||
_PROTOTYPE(int wr_open, (char *f));
|
|
||||||
_PROTOTYPE(void wr_close, (void));
|
|
||||||
_PROTOTYPE(void wr_ohead, (struct outhead *h));
|
|
||||||
_PROTOTYPE(void wr_sect, (struct outsect *s, unsigned int c));
|
|
||||||
_PROTOTYPE(void wr_outsect, (int sectno));
|
|
||||||
_PROTOTYPE(void wr_emit, (char *b, long c));
|
|
||||||
_PROTOTYPE(void wr_putc, (int c));
|
|
||||||
_PROTOTYPE(void wr_relo, (struct outrelo *r, unsigned int c));
|
|
||||||
_PROTOTYPE(void wr_name, (struct outname *n, unsigned int c));
|
|
||||||
_PROTOTYPE(void wr_string, (char *s, long c));
|
|
||||||
_PROTOTYPE(void wr_arhdr, (int fd, struct ar_hdr *a));
|
|
||||||
_PROTOTYPE(void wr_ranlib, (int fd, struct ranlib *r, long cnt));
|
|
||||||
_PROTOTYPE(void wr_int2, (int fd, int i));
|
|
||||||
_PROTOTYPE(void wr_long, (int fd, long l));
|
|
||||||
_PROTOTYPE(void wr_bytes, (int fd, char *buf, long l));
|
|
||||||
_PROTOTYPE(int rd_open, (char *f));
|
|
||||||
_PROTOTYPE(int rd_fdopen, (int f));
|
|
||||||
_PROTOTYPE(void rd_close, (void));
|
|
||||||
_PROTOTYPE(void rd_ohead, (struct outhead *h));
|
|
||||||
_PROTOTYPE(void rd_sect, (struct outsect *s, unsigned int c));
|
|
||||||
_PROTOTYPE(void rd_outsect, (int sectno));
|
|
||||||
_PROTOTYPE(void rd_emit, (char *b, long c));
|
|
||||||
_PROTOTYPE(void rd_relo, (struct outrelo *r, unsigned int c));
|
|
||||||
_PROTOTYPE(void rd_rew_relo, (struct outhead *head));
|
|
||||||
_PROTOTYPE(void rd_name, (struct outname *n, unsigned int c));
|
|
||||||
_PROTOTYPE(void rd_string, (char *s, long c));
|
|
||||||
_PROTOTYPE(int rd_arhdr, (int fd, struct ar_hdr *a));
|
|
||||||
_PROTOTYPE(void rd_ranlib, (int fd, struct ranlib *r, long cnt));
|
|
||||||
_PROTOTYPE(int rd_int2, (int fd));
|
|
||||||
_PROTOTYPE(long rd_long, (int fd));
|
|
||||||
_PROTOTYPE(void rd_bytes, (int fd, char *buf, long l));
|
|
||||||
_PROTOTYPE(int rd_fd, (void));
|
|
||||||
|
|
||||||
#endif /* __OBJECT_INCLUDED__ */
|
|
|
@ -1,126 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
/* $Header$ */
|
|
||||||
|
|
||||||
#ifndef __OUT_H_INCLUDED
|
|
||||||
#define __OUT_H_INCLUDED
|
|
||||||
/*
|
|
||||||
* output format for ACK assemblers
|
|
||||||
*/
|
|
||||||
#ifndef ushort
|
|
||||||
#define ushort unsigned short
|
|
||||||
#endif /* ushort */
|
|
||||||
|
|
||||||
struct outhead {
|
|
||||||
ushort oh_magic; /* magic number */
|
|
||||||
ushort oh_stamp; /* version stamp */
|
|
||||||
ushort oh_flags; /* several format flags */
|
|
||||||
ushort oh_nsect; /* number of outsect structures */
|
|
||||||
ushort oh_nrelo; /* number of outrelo structures */
|
|
||||||
ushort oh_nname; /* number of outname structures */
|
|
||||||
long oh_nemit; /* sum of all os_flen */
|
|
||||||
long oh_nchar; /* size of string area */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define O_MAGIC 0x0201 /* magic number of output file */
|
|
||||||
#define O_STAMP 0 /* version stamp */
|
|
||||||
#define MAXSECT 64 /* Maximum number of sections */
|
|
||||||
|
|
||||||
#define HF_LINK 0x0004 /* unresolved references left */
|
|
||||||
#define HF_8086 0x0008 /* os_base specially encoded */
|
|
||||||
|
|
||||||
struct outsect {
|
|
||||||
long os_base; /* startaddress in machine */
|
|
||||||
long os_size; /* section size in machine */
|
|
||||||
long os_foff; /* startaddress in file */
|
|
||||||
long os_flen; /* section size in file */
|
|
||||||
long os_lign; /* section alignment */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct outrelo {
|
|
||||||
char or_type; /* type of reference */
|
|
||||||
char or_sect; /* referencing section */
|
|
||||||
ushort or_nami; /* referenced symbol index */
|
|
||||||
long or_addr; /* referencing address */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct outname {
|
|
||||||
union {
|
|
||||||
char *on_ptr; /* symbol name (in core) */
|
|
||||||
long on_off; /* symbol name (in file) */
|
|
||||||
} on_u;
|
|
||||||
#define on_mptr on_u.on_ptr
|
|
||||||
#define on_foff on_u.on_off
|
|
||||||
ushort on_type; /* symbol type */
|
|
||||||
ushort on_desc; /* debug info */
|
|
||||||
long on_valu; /* symbol value */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* relocation type bits
|
|
||||||
*/
|
|
||||||
#define RELSZ 0x07 /* relocation length */
|
|
||||||
#define RELO1 1 /* 1 byte */
|
|
||||||
#define RELO2 2 /* 2 bytes */
|
|
||||||
#define RELO4 4 /* 4 bytes */
|
|
||||||
#define RELPC 0x08 /* pc relative */
|
|
||||||
#define RELBR 0x10 /* High order byte lowest address. */
|
|
||||||
#define RELWR 0x20 /* High order word lowest address. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* section type bits and fields
|
|
||||||
*/
|
|
||||||
#define S_TYP 0x007F /* undefined, absolute or relative */
|
|
||||||
#define S_EXT 0x0080 /* external flag */
|
|
||||||
#define S_ETC 0x7F00 /* for symbolic debug, bypassing 'as' */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* S_TYP field values
|
|
||||||
*/
|
|
||||||
#define S_UND 0x0000 /* undefined item */
|
|
||||||
#define S_ABS 0x0001 /* absolute item */
|
|
||||||
#define S_MIN 0x0002 /* first user section */
|
|
||||||
#define S_MAX (S_TYP-1) /* last user section */
|
|
||||||
#define S_CRS S_TYP /* on_valu is symbol index which contains value */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* S_ETC field values
|
|
||||||
*/
|
|
||||||
#define S_SCT 0x0100 /* section names */
|
|
||||||
#define S_LIN 0x0200 /* hll source line item */
|
|
||||||
#define S_FIL 0x0300 /* hll source file item */
|
|
||||||
#define S_MOD 0x0400 /* ass source file item */
|
|
||||||
#define S_COM 0x1000 /* Common name. */
|
|
||||||
#define S_STB 0xe000 /* entries with any of these bits set are
|
|
||||||
reserved for debuggers
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* structure format strings
|
|
||||||
*/
|
|
||||||
#define SF_HEAD "22222244"
|
|
||||||
#define SF_SECT "44444"
|
|
||||||
#define SF_RELO "1124"
|
|
||||||
#define SF_NAME "4224"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* structure sizes (bytes in file; add digits in SF_*)
|
|
||||||
*/
|
|
||||||
#define SZ_HEAD 20
|
|
||||||
#define SZ_SECT 20
|
|
||||||
#define SZ_RELO 8
|
|
||||||
#define SZ_NAME 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* file access macros
|
|
||||||
*/
|
|
||||||
#define BADMAGIC(x) ((x).oh_magic!=O_MAGIC)
|
|
||||||
#define OFF_SECT(x) SZ_HEAD
|
|
||||||
#define OFF_EMIT(x) (OFF_SECT(x) + ((long)(x).oh_nsect * SZ_SECT))
|
|
||||||
#define OFF_RELO(x) (OFF_EMIT(x) + (x).oh_nemit)
|
|
||||||
#define OFF_NAME(x) (OFF_RELO(x) + ((long)(x).oh_nrelo * SZ_RELO))
|
|
||||||
#define OFF_CHAR(x) (OFF_NAME(x) + ((long)(x).oh_nname * SZ_NAME))
|
|
||||||
|
|
||||||
#endif /* __OUT_H_INCLUDED */
|
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __RANLIB_H_INCLUDED
|
|
||||||
#define __RANLIB_H_INCLUDED
|
|
||||||
|
|
||||||
#ifndef SYMDEF
|
|
||||||
# define SYMDEF "__.SYMDEF"
|
|
||||||
#endif /* SYMDEF */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Structure of the SYMDEF table of contents for an archive.
|
|
||||||
* SYMDEF begins with a long giving the number of ranlib
|
|
||||||
* structures that immediately follow, and then continues with a string
|
|
||||||
* table consisting of a long giving the number of bytes of
|
|
||||||
* strings that follow and then the strings themselves.
|
|
||||||
*/
|
|
||||||
struct ranlib {
|
|
||||||
union {
|
|
||||||
char *ran__ptr; /* symbol name (in core) */
|
|
||||||
long ran__off; /* symbol name (in file) */
|
|
||||||
} ran_u;
|
|
||||||
#define ran_ptr ran_u.ran__ptr
|
|
||||||
#define ran_off ran_u.ran__off
|
|
||||||
long ran_pos; /* library member is at this position */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SZ_RAN 8
|
|
||||||
#define SF_RAN "44"
|
|
||||||
|
|
||||||
#endif /* __RANLIB_H_INCLUDED */
|
|
|
@ -1,259 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
#include "obj.h"
|
|
||||||
|
|
||||||
extern long lseek();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parts of the output file.
|
|
||||||
*/
|
|
||||||
#undef PARTEMIT
|
|
||||||
#undef PARTRELO
|
|
||||||
#undef PARTNAME
|
|
||||||
#undef PARTCHAR
|
|
||||||
#undef PARTDBUG
|
|
||||||
#undef NPARTS
|
|
||||||
|
|
||||||
#define PARTEMIT 0
|
|
||||||
#define PARTRELO 1
|
|
||||||
#define PARTNAME 2
|
|
||||||
#define PARTCHAR 3
|
|
||||||
#ifdef SYMDBUG
|
|
||||||
#define PARTDBUG 4
|
|
||||||
#else
|
|
||||||
#define PARTDBUG 3
|
|
||||||
#endif
|
|
||||||
#define NPARTS (PARTDBUG + 1)
|
|
||||||
|
|
||||||
static long offset[MAXSECT];
|
|
||||||
|
|
||||||
static int outfile;
|
|
||||||
static long outseek[NPARTS];
|
|
||||||
static long currpos;
|
|
||||||
static long rd_base;
|
|
||||||
#define OUTSECT(i) \
|
|
||||||
(outseek[PARTEMIT] = offset[i])
|
|
||||||
#define BEGINSEEK(p, o) \
|
|
||||||
(outseek[(p)] = (o))
|
|
||||||
|
|
||||||
static int sectionnr;
|
|
||||||
|
|
||||||
static void
|
|
||||||
OUTREAD(p, b, n)
|
|
||||||
char *b;
|
|
||||||
long n;
|
|
||||||
{
|
|
||||||
register long l = outseek[p];
|
|
||||||
|
|
||||||
if (currpos != l) {
|
|
||||||
lseek(outfile, l, 0);
|
|
||||||
}
|
|
||||||
rd_bytes(outfile, b, n);
|
|
||||||
l += n;
|
|
||||||
currpos = l;
|
|
||||||
outseek[p] = l;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Open the output file according to the chosen strategy.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
rd_open(f)
|
|
||||||
char *f;
|
|
||||||
{
|
|
||||||
|
|
||||||
if ((outfile = open(f, 0)) < 0)
|
|
||||||
return 0;
|
|
||||||
return rd_fdopen(outfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int offcnt;
|
|
||||||
|
|
||||||
int
|
|
||||||
rd_fdopen(fd)
|
|
||||||
{
|
|
||||||
register int i;
|
|
||||||
|
|
||||||
for (i = 0; i < NPARTS; i++) outseek[i] = 0;
|
|
||||||
offcnt = 0;
|
|
||||||
rd_base = lseek(fd, 0L, 1);
|
|
||||||
if (rd_base < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
currpos = rd_base;
|
|
||||||
outseek[PARTEMIT] = currpos;
|
|
||||||
outfile = fd;
|
|
||||||
sectionnr = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rd_close()
|
|
||||||
{
|
|
||||||
|
|
||||||
close(outfile);
|
|
||||||
outfile = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
rd_fd()
|
|
||||||
{
|
|
||||||
return outfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rd_ohead(head)
|
|
||||||
register struct outhead *head;
|
|
||||||
{
|
|
||||||
register long off;
|
|
||||||
|
|
||||||
OUTREAD(PARTEMIT, (char *) head, (long) SZ_HEAD);
|
|
||||||
#if BYTE_ORDER == 0x0123
|
|
||||||
if (sizeof(struct outhead) != SZ_HEAD)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
register char *c = (char *) head + (SZ_HEAD-4);
|
|
||||||
|
|
||||||
head->oh_nchar = get4(c);
|
|
||||||
c -= 4; head->oh_nemit = get4(c);
|
|
||||||
c -= 2; head->oh_nname = uget2(c);
|
|
||||||
c -= 2; head->oh_nrelo = uget2(c);
|
|
||||||
c -= 2; head->oh_nsect = uget2(c);
|
|
||||||
c -= 2; head->oh_flags = uget2(c);
|
|
||||||
c -= 2; head->oh_stamp = uget2(c);
|
|
||||||
c -= 2; head->oh_magic = uget2(c);
|
|
||||||
}
|
|
||||||
off = OFF_RELO(*head) + rd_base;
|
|
||||||
BEGINSEEK(PARTRELO, off);
|
|
||||||
off += (long) head->oh_nrelo * SZ_RELO;
|
|
||||||
BEGINSEEK(PARTNAME, off);
|
|
||||||
off += (long) head->oh_nname * SZ_NAME;
|
|
||||||
BEGINSEEK(PARTCHAR, off);
|
|
||||||
#ifdef SYMDBUG
|
|
||||||
off += head->oh_nchar;
|
|
||||||
BEGINSEEK(PARTDBUG, off);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rd_rew_relos(head)
|
|
||||||
register struct outhead *head;
|
|
||||||
{
|
|
||||||
register long off = OFF_RELO(*head) + rd_base;
|
|
||||||
|
|
||||||
BEGINSEEK(PARTRELO, off);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rd_sect(sect, cnt)
|
|
||||||
register struct outsect *sect;
|
|
||||||
register unsigned int cnt;
|
|
||||||
{
|
|
||||||
register char *c = (char *) sect + cnt * SZ_SECT;
|
|
||||||
|
|
||||||
OUTREAD(PARTEMIT, (char *) sect, (long)cnt * SZ_SECT);
|
|
||||||
sect += cnt;
|
|
||||||
offcnt += cnt;
|
|
||||||
while (cnt--) {
|
|
||||||
sect--;
|
|
||||||
#if BYTE_ORDER == 0x0123
|
|
||||||
if (sizeof(struct outsect) != SZ_SECT)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
c -= 4; sect->os_lign = get4(c);
|
|
||||||
c -= 4; sect->os_flen = get4(c);
|
|
||||||
c -= 4; sect->os_foff = get4(c);
|
|
||||||
c -= 4; sect->os_size = get4(c);
|
|
||||||
c -= 4; sect->os_base = get4(c);
|
|
||||||
}
|
|
||||||
offset[--offcnt] = sect->os_foff + rd_base;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rd_outsect(s)
|
|
||||||
{
|
|
||||||
OUTSECT(s);
|
|
||||||
sectionnr = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We don't have to worry about byte order here.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
rd_emit(emit, cnt)
|
|
||||||
char *emit;
|
|
||||||
long cnt;
|
|
||||||
{
|
|
||||||
OUTREAD(PARTEMIT, emit, cnt);
|
|
||||||
offset[sectionnr] += cnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rd_relo(relo, cnt)
|
|
||||||
register struct outrelo *relo;
|
|
||||||
register unsigned int cnt;
|
|
||||||
{
|
|
||||||
|
|
||||||
OUTREAD(PARTRELO, (char *) relo, (long) cnt * SZ_RELO);
|
|
||||||
#if BYTE_ORDER == 0x0123
|
|
||||||
if (sizeof(struct outrelo) != SZ_RELO)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
register char *c = (char *) relo + (long) cnt * SZ_RELO;
|
|
||||||
|
|
||||||
relo += cnt;
|
|
||||||
while (cnt--) {
|
|
||||||
relo--;
|
|
||||||
c -= 4; relo->or_addr = get4(c);
|
|
||||||
c -= 2; relo->or_nami = uget2(c);
|
|
||||||
relo->or_sect = *--c;
|
|
||||||
relo->or_type = *--c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rd_name(name, cnt)
|
|
||||||
register struct outname *name;
|
|
||||||
register unsigned int cnt;
|
|
||||||
{
|
|
||||||
|
|
||||||
OUTREAD(PARTNAME, (char *) name, (long) cnt * SZ_NAME);
|
|
||||||
#if BYTE_ORDER == 0x0123
|
|
||||||
if (sizeof(struct outname) != SZ_NAME)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
register char *c = (char *) name + (long) cnt * SZ_NAME;
|
|
||||||
|
|
||||||
name += cnt;
|
|
||||||
while (cnt--) {
|
|
||||||
name--;
|
|
||||||
c -= 4; name->on_valu = get4(c);
|
|
||||||
c -= 2; name->on_desc = uget2(c);
|
|
||||||
c -= 2; name->on_type = uget2(c);
|
|
||||||
c -= 4; name->on_foff = get4(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rd_string(addr, len)
|
|
||||||
char *addr;
|
|
||||||
long len;
|
|
||||||
{
|
|
||||||
|
|
||||||
OUTREAD(PARTCHAR, addr, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SYMDBUG
|
|
||||||
void
|
|
||||||
rd_dbug(buf, size)
|
|
||||||
char *buf;
|
|
||||||
long size;
|
|
||||||
{
|
|
||||||
OUTREAD(PARTDBUG, buf, size);
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
#include "obj.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
rd_arhdr(fd, arhdr)
|
|
||||||
register struct ar_hdr *arhdr;
|
|
||||||
{
|
|
||||||
char buf[AR_TOTAL];
|
|
||||||
register char *c = buf;
|
|
||||||
register char *p = arhdr->ar_name;
|
|
||||||
register int i;
|
|
||||||
|
|
||||||
i = read(fd, c, AR_TOTAL);
|
|
||||||
if (i == 0) return 0;
|
|
||||||
if (i != AR_TOTAL) {
|
|
||||||
rd_fatal();
|
|
||||||
}
|
|
||||||
i = 14;
|
|
||||||
while (i--) {
|
|
||||||
*p++ = *c++;
|
|
||||||
}
|
|
||||||
arhdr->ar_date = ((long) get2(c)) << 16; c += 2;
|
|
||||||
arhdr->ar_date |= ((long) get2(c)) & 0xffff; c += 2;
|
|
||||||
arhdr->ar_uid = *c++;
|
|
||||||
arhdr->ar_gid = *c++;
|
|
||||||
arhdr->ar_mode = get2(c); c += 2;
|
|
||||||
arhdr->ar_size = (long) get2(c) << 16; c += 2;
|
|
||||||
arhdr->ar_size |= (long) get2(c) & 0xffff;
|
|
||||||
return 1;
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "obj.h"
|
|
||||||
|
|
||||||
#define MININT (1 << (sizeof(int) * 8 - 1))
|
|
||||||
#define MAXCHUNK (~MININT) /* Highest count we read(2). */
|
|
||||||
/* Unfortunately, MAXCHUNK is too large with some compilers. Put it in
|
|
||||||
an int!
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int maxchunk = MAXCHUNK;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We don't have to worry about byte order here.
|
|
||||||
* Just read "cnt" bytes from file-descriptor "fd".
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
rd_bytes(fd, string, cnt)
|
|
||||||
register char *string;
|
|
||||||
register long cnt;
|
|
||||||
{
|
|
||||||
|
|
||||||
while (cnt) {
|
|
||||||
register int n = cnt >= maxchunk ? maxchunk : cnt;
|
|
||||||
|
|
||||||
if (read(fd, string, n) != n)
|
|
||||||
rd_fatal();
|
|
||||||
string += n;
|
|
||||||
cnt -= n;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
#include "obj.h"
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
rd_unsigned2(fd)
|
|
||||||
{
|
|
||||||
char buf[2];
|
|
||||||
|
|
||||||
rd_bytes(fd, buf, 2L);
|
|
||||||
return uget2(buf);
|
|
||||||
}
|
|
0
commands/grep/grep.1
Executable file → Normal file
0
commands/grep/grep.1
Executable file → Normal file
0
commands/grep/grep.c
Executable file → Normal file
0
commands/grep/grep.c
Executable file → Normal file
|
@ -9,9 +9,6 @@
|
||||||
#include <machine/bios.h>
|
#include <machine/bios.h>
|
||||||
#include <minix/portio.h>
|
#include <minix/portio.h>
|
||||||
#include <minix/cpufeature.h>
|
#include <minix/cpufeature.h>
|
||||||
#if !defined(__ELF__)
|
|
||||||
#include <a.out.h>
|
|
||||||
#endif
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <machine/vm.h>
|
#include <machine/vm.h>
|
||||||
|
@ -184,19 +181,6 @@ PUBLIC __dead void arch_shutdown(int how)
|
||||||
NOT_REACHABLE;
|
NOT_REACHABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(__ELF__)
|
|
||||||
/* address of a.out headers, set in mpx386.s */
|
|
||||||
phys_bytes aout;
|
|
||||||
|
|
||||||
PUBLIC void arch_get_aout_headers(const int i, struct exec *h)
|
|
||||||
{
|
|
||||||
/* The bootstrap loader created an array of the a.out headers at
|
|
||||||
* absolute address 'aout'. Get one element to h.
|
|
||||||
*/
|
|
||||||
phys_copy(aout + i * A_MINHDR, vir2phys(h), (phys_bytes) A_MINHDR);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PUBLIC void fpu_init(void)
|
PUBLIC void fpu_init(void)
|
||||||
{
|
{
|
||||||
unsigned short cw, sw;
|
unsigned short cw, sw;
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
/*
|
/* This file is part of the lowest layer of the MINIX kernel. (The other part
|
||||||
* This file is part of the lowest layer of the MINIX kernel. (The other part
|
|
||||||
* is "proc.c".) The lowest layer does process switching and message handling.
|
* is "proc.c".) The lowest layer does process switching and message handling.
|
||||||
* Furthermore it contains the assembler startup code for Minix and the 32-bit
|
* Furthermore it contains the assembler startup code for Minix and the 32-bit
|
||||||
* interrupt handlers. It cooperates with the code in "start.c" to set up a
|
* interrupt handlers. It cooperates with the code in "start.c" to set up a
|
||||||
|
@ -83,23 +82,8 @@ IMPORT(multiboot_init)
|
||||||
MINIX:
|
MINIX:
|
||||||
/* this is the entry point for the MINIX kernel */
|
/* this is the entry point for the MINIX kernel */
|
||||||
|
|
||||||
#if defined(__ELF__)
|
|
||||||
jmp _C_LABEL(multiboot_init)
|
jmp _C_LABEL(multiboot_init)
|
||||||
#endif
|
|
||||||
|
|
||||||
jmp over_flags /* skip over the next few bytes */
|
|
||||||
.short CLICK_SHIFT /* for the monitor: memory granularity */
|
|
||||||
|
|
||||||
flags:
|
|
||||||
/* boot monitor flags:
|
|
||||||
* call in 386 mode, make bss, make stack,
|
|
||||||
* load high, don't patch, will return,
|
|
||||||
* uses generic INT, memory vector,
|
|
||||||
* new boot code return
|
|
||||||
*/
|
|
||||||
.short 0x03FD
|
|
||||||
nop /* extra byte to sync up disassembler */
|
|
||||||
|
|
||||||
/* Multiboot header here*/
|
/* Multiboot header here*/
|
||||||
|
|
||||||
.balign 8
|
.balign 8
|
||||||
|
@ -125,11 +109,6 @@ multiboot_height:
|
||||||
multiboot_depth:
|
multiboot_depth:
|
||||||
.long 0
|
.long 0
|
||||||
|
|
||||||
over_flags:
|
|
||||||
/* Set up a C stack frame on the monitor stack. (The monitor sets cs and ds */
|
|
||||||
/* right. The ss descriptor still references the monitor data segment.) */
|
|
||||||
movzwl %sp, %esp /* monitor stack is a 16 bit stack */
|
|
||||||
|
|
||||||
.globl kernel_init
|
.globl kernel_init
|
||||||
kernel_init: /* after pre-init*/
|
kernel_init: /* after pre-init*/
|
||||||
push %ebp
|
push %ebp
|
||||||
|
@ -165,9 +144,6 @@ copygdt:
|
||||||
mov 8(%ebp), %ebx /* boot parameters offset */
|
mov 8(%ebp), %ebx /* boot parameters offset */
|
||||||
mov 12(%ebp), %edx /* boot parameters length */
|
mov 12(%ebp), %edx /* boot parameters length */
|
||||||
mov 16(%ebp), %eax /* address of a.out headers */
|
mov 16(%ebp), %eax /* address of a.out headers */
|
||||||
#if !defined(__ELF__)
|
|
||||||
movl %eax, _C_LABEL(aout)
|
|
||||||
#endif
|
|
||||||
mov %ds, %ax /* kernel data */
|
mov %ds, %ax /* kernel data */
|
||||||
mov %ax, %es
|
mov %ax, %es
|
||||||
mov %ax, %fs
|
mov %ax, %fs
|
||||||
|
|
|
@ -117,12 +117,6 @@ PUBLIC int main(void)
|
||||||
register struct proc *rp; /* process pointer */
|
register struct proc *rp; /* process pointer */
|
||||||
register int i, j;
|
register int i, j;
|
||||||
size_t argsz; /* size of arguments passed to crtso on stack */
|
size_t argsz; /* size of arguments passed to crtso on stack */
|
||||||
#if !defined(__ELF__)
|
|
||||||
vir_clicks text_clicks, data_clicks, st_clicks;
|
|
||||||
phys_clicks text_base;
|
|
||||||
int hdrindex; /* index to array of a.out headers */
|
|
||||||
struct exec e_hdr; /* for a copy of an a.out header */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
BKL_LOCK();
|
BKL_LOCK();
|
||||||
/* Global value to test segment sanity. */
|
/* Global value to test segment sanity. */
|
||||||
|
@ -209,7 +203,6 @@ PUBLIC int main(void)
|
||||||
/* Don't let the process run for now. */
|
/* Don't let the process run for now. */
|
||||||
RTS_SET(rp, RTS_NO_PRIV | RTS_NO_QUANTUM);
|
RTS_SET(rp, RTS_NO_PRIV | RTS_NO_QUANTUM);
|
||||||
}
|
}
|
||||||
#if defined(__ELF__)
|
|
||||||
rp->p_memmap[T].mem_vir = ABS2CLICK(ip->memmap.text_vaddr);
|
rp->p_memmap[T].mem_vir = ABS2CLICK(ip->memmap.text_vaddr);
|
||||||
rp->p_memmap[T].mem_phys = ABS2CLICK(ip->memmap.text_paddr);
|
rp->p_memmap[T].mem_phys = ABS2CLICK(ip->memmap.text_paddr);
|
||||||
rp->p_memmap[T].mem_len = ABS2CLICK(ip->memmap.text_bytes);
|
rp->p_memmap[T].mem_len = ABS2CLICK(ip->memmap.text_bytes);
|
||||||
|
@ -223,38 +216,6 @@ PUBLIC int main(void)
|
||||||
ip->memmap.data_bytes +
|
ip->memmap.data_bytes +
|
||||||
ip->memmap.stack_bytes);
|
ip->memmap.stack_bytes);
|
||||||
rp->p_memmap[S].mem_len = 0;
|
rp->p_memmap[S].mem_len = 0;
|
||||||
#else
|
|
||||||
if (iskerneln(proc_nr)) { /* part of the kernel? */
|
|
||||||
hdrindex = 0; /* all use the first a.out header */
|
|
||||||
} else {
|
|
||||||
hdrindex = 1 + i-NR_TASKS; /* system/user processes */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Architecture-specific way to find out aout header of this
|
|
||||||
* boot process.
|
|
||||||
*/
|
|
||||||
arch_get_aout_headers(hdrindex, &e_hdr);
|
|
||||||
|
|
||||||
/* Convert addresses to clicks and build process memory map */
|
|
||||||
text_base = e_hdr.a_syms >> CLICK_SHIFT;
|
|
||||||
text_clicks = (vir_clicks) (CLICK_CEIL(e_hdr.a_text) >> CLICK_SHIFT);
|
|
||||||
data_clicks = (vir_clicks) (CLICK_CEIL(e_hdr.a_data
|
|
||||||
+ e_hdr.a_bss) >> CLICK_SHIFT);
|
|
||||||
st_clicks = (vir_clicks) (CLICK_CEIL(e_hdr.a_total) >> CLICK_SHIFT);
|
|
||||||
if (!(e_hdr.a_flags & A_SEP))
|
|
||||||
{
|
|
||||||
data_clicks = (vir_clicks) (CLICK_CEIL(e_hdr.a_text +
|
|
||||||
e_hdr.a_data + e_hdr.a_bss) >> CLICK_SHIFT);
|
|
||||||
text_clicks = 0; /* common I&D */
|
|
||||||
}
|
|
||||||
rp->p_memmap[T].mem_phys = text_base;
|
|
||||||
rp->p_memmap[T].mem_len = text_clicks;
|
|
||||||
rp->p_memmap[D].mem_phys = text_base + text_clicks;
|
|
||||||
rp->p_memmap[D].mem_len = data_clicks;
|
|
||||||
rp->p_memmap[S].mem_phys = text_base + text_clicks + st_clicks;
|
|
||||||
rp->p_memmap[S].mem_vir = st_clicks;
|
|
||||||
rp->p_memmap[S].mem_len = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Set initial register values. The processor status word for tasks
|
/* Set initial register values. The processor status word for tasks
|
||||||
* is different from that of other processes because tasks can
|
* is different from that of other processes because tasks can
|
||||||
|
|
|
@ -196,9 +196,6 @@ _PROTOTYPE( int is_fpu, (void) );
|
||||||
_PROTOTYPE( void ser_putc, (char) );
|
_PROTOTYPE( void ser_putc, (char) );
|
||||||
_PROTOTYPE( __dead void arch_shutdown, (int) );
|
_PROTOTYPE( __dead void arch_shutdown, (int) );
|
||||||
_PROTOTYPE( __dead void arch_monitor, (void) );
|
_PROTOTYPE( __dead void arch_monitor, (void) );
|
||||||
#if !defined(__ELF__)
|
|
||||||
_PROTOTYPE( void arch_get_aout_headers, (int i, struct exec *h) );
|
|
||||||
#endif
|
|
||||||
_PROTOTYPE( void restore_user_context, (struct proc * p) );
|
_PROTOTYPE( void restore_user_context, (struct proc * p) );
|
||||||
_PROTOTYPE( void read_tsc, (u32_t *high, u32_t *low) );
|
_PROTOTYPE( void read_tsc, (u32_t *high, u32_t *low) );
|
||||||
_PROTOTYPE( int arch_init_profile_clock, (u32_t freq) );
|
_PROTOTYPE( int arch_init_profile_clock, (u32_t freq) );
|
||||||
|
|
|
@ -48,9 +48,6 @@ PUBLIC int do_getinfo(struct proc * caller, message * m_ptr)
|
||||||
int nr_e, nr, r;
|
int nr_e, nr, r;
|
||||||
int wipe_rnd_bin = -1;
|
int wipe_rnd_bin = -1;
|
||||||
struct proc *p;
|
struct proc *p;
|
||||||
#if !defined(__ELF__)
|
|
||||||
struct exec e_hdr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Set source address and length based on request type. */
|
/* Set source address and length based on request type. */
|
||||||
switch (m_ptr->I_REQUEST) {
|
switch (m_ptr->I_REQUEST) {
|
||||||
|
@ -189,23 +186,6 @@ PUBLIC int do_getinfo(struct proc * caller, message * m_ptr)
|
||||||
src_vir = (vir_bytes) &idl->p_cycles;
|
src_vir = (vir_bytes) &idl->p_cycles;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if !defined(__ELF__)
|
|
||||||
case GET_AOUTHEADER: {
|
|
||||||
int hdrindex, index = m_ptr->I_VAL_LEN2_E;
|
|
||||||
if(index < 0 || index >= NR_BOOT_PROCS) {
|
|
||||||
return EINVAL;
|
|
||||||
}
|
|
||||||
if (iskerneln(_ENDPOINT_P(image[index].endpoint))) {
|
|
||||||
hdrindex = 0;
|
|
||||||
} else {
|
|
||||||
hdrindex = 1 + index-NR_TASKS;
|
|
||||||
}
|
|
||||||
arch_get_aout_headers(hdrindex, &e_hdr);
|
|
||||||
length = sizeof(e_hdr);
|
|
||||||
src_vir = (vir_bytes) &e_hdr;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
default:
|
default:
|
||||||
printf("do_getinfo: invalid request %d\n", m_ptr->I_REQUEST);
|
printf("do_getinfo: invalid request %d\n", m_ptr->I_REQUEST);
|
||||||
return(EINVAL);
|
return(EINVAL);
|
||||||
|
|
14
lib/README
14
lib/README
|
@ -1,14 +0,0 @@
|
||||||
ack_build.sh - for ACK library building
|
|
||||||
gnu_build.sh - for GNU library building
|
|
||||||
|
|
||||||
ack_build.sh obj - create objdirs for gnu libraries
|
|
||||||
ack_build.sh depend - find dependencies of ack libraries
|
|
||||||
ack_build.sh all - compile ack libraries
|
|
||||||
ack_build.sh install - compile and install ack libraries
|
|
||||||
ack_build.sh clean - clean for ack libraries
|
|
||||||
|
|
||||||
gnu_build.sh obj - create objdirs for gnu libraries
|
|
||||||
gnu_build.sh depend - find dependencies of gnu libraries
|
|
||||||
gnu_build.sh all - compile gnu libraries
|
|
||||||
gnu_build.sh install - compile and install gnu libraries
|
|
||||||
gnu_build.sh clean - clean for gnu libraries
|
|
|
@ -1,9 +1,5 @@
|
||||||
.include <bsd.own.mk>
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
.if ${OBJECT_FMT} == "a.out"
|
|
||||||
SUBDIR=${ARCH}-aout
|
|
||||||
.elif ${OBJECT_FMT} == "ELF"
|
|
||||||
SUBDIR=${ARCH}-elf
|
SUBDIR=${ARCH}-elf
|
||||||
.endif
|
|
||||||
|
|
||||||
.include <bsd.subdir.mk>
|
.include <bsd.subdir.mk>
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
.include <bsd.own.mk>
|
|
||||||
|
|
||||||
SRCS= crtso.S
|
|
||||||
OBJS= crtso.o
|
|
||||||
|
|
||||||
realall: ${OBJS}
|
|
||||||
|
|
||||||
FILES=${OBJS}
|
|
||||||
FILESDIR=${LIBDIR}
|
|
||||||
CLEANFILES=${OBJS}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
|
@ -1,129 +0,0 @@
|
||||||
/* This is the C run-time start-off routine. It's job is to take the */
|
|
||||||
/* arguments as put on the stack by EXEC, and to parse them and set them up the */
|
|
||||||
/* way _main expects them. */
|
|
||||||
/* It also initializes environ when this variable isn't defined by the */
|
|
||||||
/* programmer. The detection of whether environ belong to us is rather */
|
|
||||||
/* simplistic. We simply check for some magic value, but there is no other */
|
|
||||||
/* way. */
|
|
||||||
|
|
||||||
#include <machine/vm.h>
|
|
||||||
|
|
||||||
|
|
||||||
.globl begtext, begdata, begbss
|
|
||||||
.text
|
|
||||||
begtext:
|
|
||||||
#ifdef __ACK__
|
|
||||||
.rom
|
|
||||||
#else
|
|
||||||
.data
|
|
||||||
#endif
|
|
||||||
begrom:
|
|
||||||
.data
|
|
||||||
begdata:
|
|
||||||
.bss
|
|
||||||
begbss:
|
|
||||||
|
|
||||||
#ifdef __ACK__
|
|
||||||
.globl __minix_datastart
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.globl crtso, __penviron, __penvp, ___prognamep, ___argc
|
|
||||||
.globl __minix_mainjump, __minix_unmapzero
|
|
||||||
.extern _main, _exit
|
|
||||||
|
|
||||||
#if defined(__ELF__)
|
|
||||||
.section .init
|
|
||||||
#else
|
|
||||||
.text
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__ELF__)
|
|
||||||
.globl __start
|
|
||||||
__start:
|
|
||||||
#endif
|
|
||||||
crtso:
|
|
||||||
xorl %ebp, %ebp /* clear for backtrace of core files */
|
|
||||||
movl (%esp), %eax /* argc */
|
|
||||||
leal 4(%esp), %edx /* argv */
|
|
||||||
leal 8(%esp,%eax,4), %ecx /* envp */
|
|
||||||
|
|
||||||
/* Test if environ is in the initialized data area and is set to our */
|
|
||||||
/* magic number. If so then it is not redefined by the user. */
|
|
||||||
movl $_environ, %ebx
|
|
||||||
cmpl $__edata, %ebx /* within initialized data? */
|
|
||||||
jae 0f
|
|
||||||
testb $3, %bl /* aligned? */
|
|
||||||
jne 0f
|
|
||||||
cmpl $0x53535353, (%ebx) /* is it our environ? */
|
|
||||||
jne 0f
|
|
||||||
movl %ebx, __penviron /* _penviron = &environ; */
|
|
||||||
0:
|
|
||||||
movl __penviron, %ebx
|
|
||||||
movl %ecx, (%ebx) /* *_penviron = envp; */
|
|
||||||
|
|
||||||
/* Save argv[] and argc. This is so that we can return
|
|
||||||
* argv[0] in the future, without having to check whether
|
|
||||||
* argv can be dereferenced safely now.
|
|
||||||
*/
|
|
||||||
mov %edx, (___prognamep)
|
|
||||||
mov %eax, (___argc)
|
|
||||||
|
|
||||||
push %ecx /* push envp */
|
|
||||||
push %edx /* push argv */
|
|
||||||
push %eax /* push argc */
|
|
||||||
|
|
||||||
jmp __minix_mainjump
|
|
||||||
|
|
||||||
.balign I386_PAGE_SIZE
|
|
||||||
__minix_mainjump:
|
|
||||||
/* unmap zero pages */
|
|
||||||
call __minix_unmapzero
|
|
||||||
|
|
||||||
call _main /* main(argc, argv, envp) */
|
|
||||||
|
|
||||||
push %eax /* push exit status */
|
|
||||||
call _exit
|
|
||||||
|
|
||||||
hlt /* force a trap if exit fails */
|
|
||||||
|
|
||||||
__minix_unmapzero:
|
|
||||||
|
|
||||||
/* unmap 0-page code */
|
|
||||||
push $I386_PAGE_SIZE
|
|
||||||
push $crtso
|
|
||||||
call _minix_munmap_text /* unmap_text(crtso, I386_PAGE_SIZE) */
|
|
||||||
add $8, %esp
|
|
||||||
|
|
||||||
#ifdef __ACK__
|
|
||||||
/*
|
|
||||||
* ack uses separate segments for text and data by default. We have a
|
|
||||||
* common segment when compiling using any other compiler
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* unmap 0-page data */
|
|
||||||
push $I386_PAGE_SIZE
|
|
||||||
push $romstart
|
|
||||||
call _minix_munmap /* munmap(romstart, I386_PAGE_SIZE) */
|
|
||||||
add $8, %esp
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
#ifdef __ACK__
|
|
||||||
.rom
|
|
||||||
romstart:
|
|
||||||
.space I386_PAGE_SIZE
|
|
||||||
__minix_datastart:
|
|
||||||
.space 4
|
|
||||||
#endif
|
|
||||||
.data
|
|
||||||
__penviron:
|
|
||||||
.long __penvp /* Pointer to environ, or hidden pointer */
|
|
||||||
.bss
|
|
||||||
___prognamep:
|
|
||||||
.space 4
|
|
||||||
___argc:
|
|
||||||
.space 4
|
|
||||||
.lcomm __penvp, 4 /* Hidden environment vector */
|
|
||||||
|
|
||||||
.extern endtext /* Force loading of end labels. */
|
|
35
man/man1/M.1
35
man/man1/M.1
|
@ -1,35 +0,0 @@
|
||||||
.TH M 1
|
|
||||||
.SH NAME
|
|
||||||
M, U \- conveniently mount and unmount
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBM \fIdevice\fR [\fB\-r\fR]\fR
|
|
||||||
.br
|
|
||||||
\fBU \fIdevice\fR\fR
|
|
||||||
.br
|
|
||||||
.de FL
|
|
||||||
.TP
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
\\$2
|
|
||||||
..
|
|
||||||
.de EX
|
|
||||||
.TP 20
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
# \\$2
|
|
||||||
..
|
|
||||||
.SH OPTIONS
|
|
||||||
.FL "\-r" "Mount read-only"
|
|
||||||
.SH EXAMPLES
|
|
||||||
.EX "M root" "Mount the RAM image on /root"
|
|
||||||
.EX "M 0" "Mount /dev/fd0 on /fd0"
|
|
||||||
.EX "U fd1" "Unmount /dev/fd1 from /fd1"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
\fIM\fR and \fIU\fR allow easy mounting and unmounting of a device by using
|
|
||||||
only an abbreviated device name or keyword. Special keywords are
|
|
||||||
\fBroot\fR, \fBtmp\fR, and \fBusr\fR for the three hard disk partitions
|
|
||||||
MINIX 3 runs in. Floppy devices are mounted on \fB/fd0\fR or \fB/fd1\fR. You
|
|
||||||
can use \fB0\fR and \fB1\fR instead of \fBfd0\fR and \fBfd1\fP. A device it
|
|
||||||
doesn't know about is mounted on \fB/mnt\fR.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR mount (1),
|
|
||||||
.BR umount (1).
|
|
|
@ -1,7 +1,7 @@
|
||||||
MAN= acd.1 anm.1 ar.1 ash.1 asize.1 at.1 banner.1 basename.1 \
|
MAN= ash.1 at.1 banner.1 basename.1 \
|
||||||
bsfilt.1 cal.1 \
|
bsfilt.1 cal.1 \
|
||||||
calendar.1 cat.1 cawf.1 chgrp.1 \
|
calendar.1 cat.1 cawf.1 chgrp.1 \
|
||||||
chmem.1 chmod.1 cksum.1 clear.1 cmp.1 comm.1 compress.1 \
|
chmod.1 cksum.1 clear.1 cmp.1 comm.1 compress.1 \
|
||||||
cp.1 crc.1 crontab.1 ctags.1 dd.1 dev2name.1 \
|
cp.1 crc.1 crontab.1 ctags.1 dd.1 dev2name.1 \
|
||||||
df.1 dhrystone.1 dosdir.1 dosread.1 doswrite.1 du.1 \
|
df.1 dhrystone.1 dosdir.1 dosread.1 doswrite.1 du.1 \
|
||||||
dumpcore.1 echo.1 ed.1 eject.1 elvis.1 elvrec.1 \
|
dumpcore.1 echo.1 ed.1 eject.1 elvis.1 elvrec.1 \
|
||||||
|
@ -10,14 +10,14 @@ MAN= acd.1 anm.1 ar.1 ash.1 asize.1 at.1 banner.1 basename.1 \
|
||||||
fsck.mfs.1 head.1 host.1 hostaddr.1 ifdef.1 \
|
fsck.mfs.1 head.1 host.1 hostaddr.1 ifdef.1 \
|
||||||
install.1 isodir.1 isoinfo.1 isoread.1 join.1 kill.1 \
|
install.1 isodir.1 isoinfo.1 isoread.1 join.1 kill.1 \
|
||||||
last.1 leave.1 loadfont.1 loadkeys.1 logger.1 login.1 \
|
last.1 leave.1 loadfont.1 loadkeys.1 logger.1 login.1 \
|
||||||
look.1 lp.1 ls.1 lspci.1 M.1 mail.1 \
|
look.1 lp.1 ls.1 lspci.1 mail.1 \
|
||||||
mesg.1 mixer.1 ackmkdep.1 mkfs.1 \
|
mesg.1 mixer.1 mkfs.1 \
|
||||||
mkproto.1 modem.1 mount.1 mt.1 nice.1 nm.1 nohup.1 od.1 \
|
mkproto.1 modem.1 mount.1 mt.1 nice.1 nm.1 nohup.1 od.1 \
|
||||||
paste.1 ping.1 playwave.1 postmort.1 pr.1 prep.1 \
|
paste.1 ping.1 playwave.1 pr.1 prep.1 \
|
||||||
profile.1 ps.1 pwd.1 rcp.1 readall.1 recwave.1 \
|
profile.1 ps.1 pwd.1 rcp.1 readall.1 recwave.1 \
|
||||||
ref.1 remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \
|
ref.1 remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \
|
||||||
shar.1 acksize.1 sleep.1 sort.1 spell.1 \
|
shar.1 acksize.1 sleep.1 sort.1 spell.1 \
|
||||||
split.1 strip.1 stty.1 su.1 sum.1 svc.1 \
|
split.1 stty.1 su.1 sum.1 svc.1 \
|
||||||
synctree.1 sysenv.1 sz.1 tail.1 tee.1 telnet.1 template.1 \
|
synctree.1 sysenv.1 sz.1 tail.1 tee.1 telnet.1 template.1 \
|
||||||
term.1 termcap.1 tget.1 time.1 tr.1 true.1 \
|
term.1 termcap.1 tget.1 time.1 tr.1 true.1 \
|
||||||
truncate.1 tsort.1 tty.1 umount.1 uname.1 unexpand.1 \
|
truncate.1 tsort.1 tty.1 umount.1 uname.1 unexpand.1 \
|
||||||
|
@ -25,7 +25,6 @@ MAN= acd.1 anm.1 ar.1 ash.1 asize.1 at.1 banner.1 basename.1 \
|
||||||
who.1 write.1 xargs.1 yap.1 yes.1 linkfarm.1 pkg_view.1
|
who.1 write.1 xargs.1 yap.1 yes.1 linkfarm.1 pkg_view.1
|
||||||
|
|
||||||
MLINKS += ash.1 sh.1
|
MLINKS += ash.1 sh.1
|
||||||
MLINKS += ash.1 bigsh.1
|
|
||||||
MLINKS += ash.1 ..1
|
MLINKS += ash.1 ..1
|
||||||
MLINKS += ash.1 break.1
|
MLINKS += ash.1 break.1
|
||||||
MLINKS += ash.1 case.1
|
MLINKS += ash.1 case.1
|
||||||
|
|
860
man/man1/acd.1
860
man/man1/acd.1
|
@ -1,860 +0,0 @@
|
||||||
.TH ACD 1
|
|
||||||
.SH NAME
|
|
||||||
acd \- a compiler driver
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B acd
|
|
||||||
\fB\-v\fR[\fIn\fR]
|
|
||||||
\fB\-vn\fR[\fIn\fR]
|
|
||||||
.BI \-name " name"
|
|
||||||
.BI \-descr " descr"
|
|
||||||
.BI \-T " dir"
|
|
||||||
.RI [ arg " ...]"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.de SP
|
|
||||||
.if t .sp 0.4
|
|
||||||
.if n .sp
|
|
||||||
..
|
|
||||||
.B Acd
|
|
||||||
is a compiler driver, a program that calls the several passes that are needed
|
|
||||||
to compile a source file. It keeps track of all the temporary files used
|
|
||||||
between the passes. It also defines the interface of the compiler, the
|
|
||||||
options the user gets to see.
|
|
||||||
.PP
|
|
||||||
This text only describes
|
|
||||||
.B acd
|
|
||||||
itself, it says nothing about the different options the C-compiler accepts.
|
|
||||||
(It has nothing to do with any language, other than being a tool to give
|
|
||||||
a compiler a user interface.)
|
|
||||||
.SH OPTIONS
|
|
||||||
.B Acd
|
|
||||||
itself takes five options:
|
|
||||||
.TP
|
|
||||||
\fB\-v\fR[\fIn\fR]
|
|
||||||
Sets the diagnostic level to
|
|
||||||
.I n
|
|
||||||
(by default
|
|
||||||
.BR 2 ).
|
|
||||||
The higher
|
|
||||||
.I n
|
|
||||||
is, the more output
|
|
||||||
.B acd
|
|
||||||
generates:
|
|
||||||
.B \-v0
|
|
||||||
does not produce any output.
|
|
||||||
.B \-v1
|
|
||||||
prints the basenames of the programs called.
|
|
||||||
.B \-v2
|
|
||||||
prints names and arguments of the programs called.
|
|
||||||
.B \-v3
|
|
||||||
shows the commands executed from the description file too.
|
|
||||||
.B \-v4
|
|
||||||
shows the program read from the description file too. Levels 3 and 4 use
|
|
||||||
backspace overstrikes that look good when viewing the output with a smart
|
|
||||||
pager.
|
|
||||||
.TP
|
|
||||||
\fB\-vn\fR[\fIn\fR]
|
|
||||||
Like
|
|
||||||
.B \-v
|
|
||||||
except that no command is executed. The driver is just play-acting.
|
|
||||||
.TP
|
|
||||||
.BI \-name " name"
|
|
||||||
.B Acd
|
|
||||||
is normally linked to the name the compiler is to be called with by the
|
|
||||||
user. The basename of this, say
|
|
||||||
.BR cc ,
|
|
||||||
is the call name of the driver. It plays a role in selecting the proper
|
|
||||||
description file. With the
|
|
||||||
.B \-name
|
|
||||||
option one can change this.
|
|
||||||
.B Acd \-name cc
|
|
||||||
has the same effect as calling the program as
|
|
||||||
.BR cc .
|
|
||||||
.TP
|
|
||||||
.BI \-descr " descr"
|
|
||||||
Allows one to choose the pass description file of the driver. By default
|
|
||||||
.I descr
|
|
||||||
is the same as
|
|
||||||
.IR name ,
|
|
||||||
the call name of the program. If
|
|
||||||
.I descr
|
|
||||||
doesn't start with
|
|
||||||
.BR / ,
|
|
||||||
.BR ./ ,
|
|
||||||
or
|
|
||||||
.BR ../
|
|
||||||
then the file
|
|
||||||
.BI /usr/lib/ descr /descr
|
|
||||||
will be used for the description, otherwise
|
|
||||||
.I descr
|
|
||||||
itself. Thus
|
|
||||||
.B cc \-descr newcc
|
|
||||||
calls the C-compiler with a different description file without changing the
|
|
||||||
call name. Finally, if
|
|
||||||
.I descr
|
|
||||||
is \fB"\-"\fP, standard input is read. (The default lib directory
|
|
||||||
.BR /usr/lib ,
|
|
||||||
may be changed to
|
|
||||||
.I dir
|
|
||||||
at compile time by \fB\-DLIB=\e"\fP\fIdir\fP\fB\e"\fP. The default
|
|
||||||
.I descr
|
|
||||||
may be set with \fB\-DDESCR=\e"\fP\fIdescr\fP\fB\e"\fP for simple
|
|
||||||
installations on a system without symlinks.)
|
|
||||||
.TP
|
|
||||||
.BI \-T " dir"
|
|
||||||
Temporary files are made in
|
|
||||||
.B /tmp
|
|
||||||
by default, which may be overridden by the environment variable
|
|
||||||
.BR TMPDIR ,
|
|
||||||
which may be overridden by the
|
|
||||||
.B \-T
|
|
||||||
option.
|
|
||||||
.SH "THE DESCRIPTION FILE"
|
|
||||||
The description file is a program interpreted by the driver. It has variables,
|
|
||||||
lists of files, argument parsing commands, and rules for transforming input
|
|
||||||
files.
|
|
||||||
.SS Syntax
|
|
||||||
There are four simple objects:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
Words, Substitutions, Letters, and Operators.
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
And there are two ways to group objects:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
Lists, forming sequences of anything but letters,
|
|
||||||
.SP
|
|
||||||
Strings, forming sequences of anything but Words and Operators.
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
Each object has the following syntax:
|
|
||||||
.IP Words
|
|
||||||
They are sequences of characters, like
|
|
||||||
.BR cc ,
|
|
||||||
.BR \-I/usr/include ,
|
|
||||||
.BR /lib/cpp .
|
|
||||||
No whitespace and no special characters. The backslash character
|
|
||||||
.RB ( \e )
|
|
||||||
may be used to make special characters common, except whitespace. A backslash
|
|
||||||
followed by whitespace is completely removed from the input. The sequence
|
|
||||||
.B \en
|
|
||||||
is changed to a newline.
|
|
||||||
.IP Substitutions
|
|
||||||
A substitution (henceforth called 'subst') is formed with a
|
|
||||||
.BR $ ,
|
|
||||||
e.g.
|
|
||||||
.BR $opt ,
|
|
||||||
.BR $PATH ,
|
|
||||||
.BR ${lib} ,
|
|
||||||
.BR $\(** .
|
|
||||||
The variable name after the
|
|
||||||
.B $
|
|
||||||
is made of letters, digits and underscores, or any sequence of characters
|
|
||||||
between parentheses or braces, or a single other character. A subst indicates
|
|
||||||
that the value of the named variable must be substituted in the list or string
|
|
||||||
when fully evaluated.
|
|
||||||
.IP Letters
|
|
||||||
Letters are the single characters that would make up a word.
|
|
||||||
.IP Operators
|
|
||||||
The characters
|
|
||||||
.BR = ,
|
|
||||||
.BR + ,
|
|
||||||
.BR \- ,
|
|
||||||
.BR \(** ,
|
|
||||||
.BR < ,
|
|
||||||
and
|
|
||||||
.B >
|
|
||||||
are the operators. The first four must be surrounded by whitespace if they
|
|
||||||
are to be seen as special (they are often used in arguments). The last two
|
|
||||||
are always special.
|
|
||||||
.IP Lists
|
|
||||||
One line of objects in the description file forms a list. Put parentheses
|
|
||||||
around it and you have a sublist. The values of variables are lists.
|
|
||||||
.IP Strings
|
|
||||||
Anything that is not yet a word is a string. All it needs is that the substs
|
|
||||||
in it are evaluated, e.g.
|
|
||||||
.BR $LIBPATH/lib$key.a .
|
|
||||||
A single subst doesn't make a string, it expands to a list. You need at
|
|
||||||
least one letter or other subst next to it. Strings (and words) may also
|
|
||||||
be formed by enclosing them in double quotes. Only
|
|
||||||
.B \e
|
|
||||||
and
|
|
||||||
.B $
|
|
||||||
keep their special meaning within quotes.
|
|
||||||
.SS Evaluation
|
|
||||||
One thing has to be carefully understood: Substitutions are delayed until
|
|
||||||
the last possible moment, and description files make heavy use of this.
|
|
||||||
Only if a subst is tainted, either because its variable is declared local, or
|
|
||||||
because a subst in its variable's value is tainted, is it immediately
|
|
||||||
substituted. So if a list is assigned to a variable then this list is only
|
|
||||||
checked for tainted substs. Those substs are replaced by the value
|
|
||||||
of their variable. This is called partial evaluation.
|
|
||||||
.PP
|
|
||||||
Full evaluation expands all substs, the list is flattened, i.e. all
|
|
||||||
parentheses are removed from sublists.
|
|
||||||
.PP
|
|
||||||
Implosive evaluation is the last that has to be done to a list before it
|
|
||||||
can be used as a command to execute. The substs within a string have been
|
|
||||||
evaluated to lists after full expansion, but a string must be turned into
|
|
||||||
a single word, not a list. To make this happen, a string is first exploded
|
|
||||||
to all possible combinations of words choosing one member of the lists within
|
|
||||||
the string. These words are tried one by one to see if they exist as a
|
|
||||||
file. The first one that exists is taken, if none exists than the first
|
|
||||||
choice is used. As an example, assume
|
|
||||||
.B LIBPATH
|
|
||||||
equals
|
|
||||||
.BR "(/lib /usr/lib)" ,
|
|
||||||
.B key
|
|
||||||
is
|
|
||||||
.B (c)
|
|
||||||
and
|
|
||||||
.B key
|
|
||||||
happens to be local. Then we have:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
\fB"$LIBPATH/lib$key.a"\fP
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
before evaluation,
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
\fB"$LIBPATH/lib(c).a"\fP
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
after partial evaluation,
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
\fB"(/lib/libc.a /usr/lib/libc.a)"\fP
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
after full evaluation, and finally
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.B /usr/lib/libc.a
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
after implosion, if the file exists.
|
|
||||||
.SS Operators
|
|
||||||
The operators modify the way evaluation is done and perform a special
|
|
||||||
function on a list:
|
|
||||||
.TP
|
|
||||||
.B \(**
|
|
||||||
Forces full evaluation on all the list elements following it. Use it to
|
|
||||||
force substitution of the current value of a variable. This is the only
|
|
||||||
operator that forces immediate evaluation.
|
|
||||||
.TP
|
|
||||||
.B +
|
|
||||||
When a
|
|
||||||
.B +
|
|
||||||
exists in a list that is fully evaluated, then all the elements before the
|
|
||||||
.B +
|
|
||||||
are imploded and all elements after the
|
|
||||||
.B +
|
|
||||||
are imploded and added to the list if they are not already in the list. So
|
|
||||||
this operator can be used either for set addition, or to force implosive
|
|
||||||
expansion within a sublist.
|
|
||||||
.TP
|
|
||||||
.B \-
|
|
||||||
Like
|
|
||||||
.BR + ,
|
|
||||||
except that elements after the
|
|
||||||
.B \-
|
|
||||||
are removed from the list.
|
|
||||||
.PP
|
|
||||||
The set operators can be used to gather options that exclude each other
|
|
||||||
or for their side effect of implosive expansion. You may want to write:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
\fBcpp \-I$LIBPATH/include\fP
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
to call cpp with an extra include directory, but
|
|
||||||
.B $LIBPATH
|
|
||||||
is expanded using a filename starting with
|
|
||||||
.B \-I
|
|
||||||
so this won't work. Given that any problem in Computer Science can be solved
|
|
||||||
with an extra level of indirection, use this instead:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.ft B
|
|
||||||
cpp \-I$INCLUDE
|
|
||||||
.br
|
|
||||||
INCLUDE = $LIBPATH/include +
|
|
||||||
.ft P
|
|
||||||
.RE
|
|
||||||
.SS "Special Variables"
|
|
||||||
There are three special variables used in a description file:
|
|
||||||
.BR $\(** ,
|
|
||||||
.BR $< ,
|
|
||||||
and
|
|
||||||
.BR $> .
|
|
||||||
These variables are always local and mostly read-only. They will be
|
|
||||||
explained later.
|
|
||||||
.SS "A Program"
|
|
||||||
The lists in a description file form a program that is executed from the
|
|
||||||
first to the last list. The first word in a list may be recognized as a
|
|
||||||
builtin command (only if the first list element is indeed simply a word.)
|
|
||||||
If it is not a builtin command then the list is imploded and used as a
|
|
||||||
\s-2UNIX\s+2 command with arguments.
|
|
||||||
.PP
|
|
||||||
Indentation (by tabs or spaces) is not just makeup for a program, but are
|
|
||||||
used to group lines together. Some builtin commands need a body. These
|
|
||||||
bodies are simply lines at a deeper indentation.
|
|
||||||
.PP
|
|
||||||
Empty lines are not ignored either, they have the same indentation level as
|
|
||||||
the line before it. Comments (starting with a
|
|
||||||
.B #
|
|
||||||
and ending at end of line) have an indentation of their own and can be used
|
|
||||||
as null commands.
|
|
||||||
.PP
|
|
||||||
.B Acd
|
|
||||||
will complain about unexpected indentation shifts and empty bodies. Commands
|
|
||||||
can share the same body by placing them at the same indentation level before
|
|
||||||
the indented body. They are then "guards" to the same body, and are tried
|
|
||||||
one by one until one succeeds, after which the body is executed.
|
|
||||||
.PP
|
|
||||||
Semicolons may be used to separate commands instead of newlines. The commands
|
|
||||||
are then all at the indentation level of the first.
|
|
||||||
.SS "Execution phases"
|
|
||||||
The driver runs in three phases: Initialization, Argument scanning, and
|
|
||||||
Compilation. Not all commands work in all phases. This is further explained
|
|
||||||
below.
|
|
||||||
.SS "The Commands"
|
|
||||||
The commands accept arguments that are usually generic expressions that
|
|
||||||
implode to a word or a list of words. When
|
|
||||||
.I var
|
|
||||||
is specified, then a single word or subst needs to be given, so
|
|
||||||
an assignment can be either
|
|
||||||
.I name
|
|
||||||
.B =
|
|
||||||
.IR value ,
|
|
||||||
or
|
|
||||||
.BI $ name
|
|
||||||
.B =
|
|
||||||
.IR value .
|
|
||||||
.TP
|
|
||||||
.IB "var " = " expr ..."
|
|
||||||
The partially evaluated list of expressions is assigned to
|
|
||||||
.IR var .
|
|
||||||
During the evaluation is
|
|
||||||
.I var
|
|
||||||
marked as local, and after the assignment set from undefined to defined.
|
|
||||||
.TP
|
|
||||||
.BI unset " var"
|
|
||||||
.I Var
|
|
||||||
is set to null and is marked as undefined.
|
|
||||||
.TP
|
|
||||||
.BI import " var"
|
|
||||||
If
|
|
||||||
.I var
|
|
||||||
is defined in the environment of
|
|
||||||
.B acd
|
|
||||||
then it is assigned to
|
|
||||||
.IR var .
|
|
||||||
The environment variable is split into words at whitespace and colons. Empty
|
|
||||||
space between two colons
|
|
||||||
.RB ( :: )
|
|
||||||
is changed to a dot.
|
|
||||||
.TP
|
|
||||||
.BI mktemp " var " [ suffix ]
|
|
||||||
Assigns to
|
|
||||||
.I var
|
|
||||||
the name of a new temporary file, usually something like /tmp/acd12345x. If
|
|
||||||
.I suffix
|
|
||||||
is present then it will be added to the temporary file's name. (Use it
|
|
||||||
because some programs require it, or just because it looks good.)
|
|
||||||
.B Acd
|
|
||||||
remembers this file, and will delete it as soon as you stop referencing it.
|
|
||||||
.TP
|
|
||||||
.BI temporary " word"
|
|
||||||
Mark the file named by
|
|
||||||
.I word
|
|
||||||
as a temporary file. You have to make sure that the name is stored in some
|
|
||||||
list in imploded form, and not just temporarily created when
|
|
||||||
.I word
|
|
||||||
is evaluated, because then it will be immediately removed and forgotten.
|
|
||||||
.TP
|
|
||||||
.BI stop " suffix"
|
|
||||||
Sets the target suffix for the compilation phase. Something like
|
|
||||||
.B stop .o
|
|
||||||
means that the source files must be compiled to object files. At least one
|
|
||||||
.B stop
|
|
||||||
command must be executed before the compilation phase begins. It may not be
|
|
||||||
changed during the compilation phase. (Note: There is no restriction on
|
|
||||||
.IR suffix ,
|
|
||||||
it need not start with a dot.)
|
|
||||||
.TP
|
|
||||||
.BI treat " file suffix"
|
|
||||||
Marks the file as having the given suffix for the compile phase. Useful
|
|
||||||
for sending a
|
|
||||||
.B \-l
|
|
||||||
option directly to the loader by treating it as having the
|
|
||||||
.B .a
|
|
||||||
suffix.
|
|
||||||
.TP
|
|
||||||
.BI numeric " arg"
|
|
||||||
Checks if
|
|
||||||
.I arg
|
|
||||||
is a number. If not then
|
|
||||||
.B acd
|
|
||||||
will exit with a nice error message.
|
|
||||||
.TP
|
|
||||||
.BI error " expr ..."
|
|
||||||
Makes the driver print the error message
|
|
||||||
.I "expr ..."
|
|
||||||
and exit.
|
|
||||||
.TP
|
|
||||||
.BI if " expr " = " expr"
|
|
||||||
.B If
|
|
||||||
tests if the two expressions are equal using set comparison, i.e. each
|
|
||||||
expression should contain all the words in the other expression. If the
|
|
||||||
test succeeds then the if-body is executed.
|
|
||||||
.TP
|
|
||||||
.BI ifdef " var"
|
|
||||||
Executes the ifdef-body if
|
|
||||||
.I var
|
|
||||||
is defined.
|
|
||||||
.TP
|
|
||||||
.BI ifndef " var"
|
|
||||||
Executes the ifndef-body if
|
|
||||||
.I var
|
|
||||||
is undefined.
|
|
||||||
.TP
|
|
||||||
.BI iftemp " arg"
|
|
||||||
Executes the iftemp-body if
|
|
||||||
.I arg
|
|
||||||
is a temporary file. Use it when a command has the same file as input and
|
|
||||||
output and you don't want to clobber the source file:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
.ft B
|
|
||||||
transform .o .o
|
|
||||||
iftemp $\(**
|
|
||||||
$> = $\(**
|
|
||||||
else
|
|
||||||
cp $\(** $>
|
|
||||||
optimize $>
|
|
||||||
.ft P
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.TP
|
|
||||||
.BI ifhash " arg"
|
|
||||||
Executes the ifhash-body if
|
|
||||||
.I arg
|
|
||||||
is an existing file with a '\fB#\fP' as the very first character. This
|
|
||||||
usually indicates that the file must be pre-processed:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
.ft B
|
|
||||||
transform .s .o
|
|
||||||
ifhash $\(**
|
|
||||||
mktemp ASM .s
|
|
||||||
$CPP $\(** > $ASM
|
|
||||||
else
|
|
||||||
ASM = $\(**
|
|
||||||
$AS \-o $> $ASM
|
|
||||||
unset ASM
|
|
||||||
.ft P
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.TP
|
|
||||||
.B else
|
|
||||||
Executes the else-body if the last executed
|
|
||||||
.BR if ,
|
|
||||||
.BR ifdef ,
|
|
||||||
.BR ifndef ,
|
|
||||||
.BR iftemp ,
|
|
||||||
or
|
|
||||||
.B ifhash
|
|
||||||
was unsuccessful. Note that
|
|
||||||
.B else
|
|
||||||
need not immediately follow an if, but you are advised not to make use of
|
|
||||||
this. It is a "feature" that may not last.
|
|
||||||
.TP
|
|
||||||
.BI apply " suffix1 suffix2"
|
|
||||||
Executed inside a transform rule body to transform the input file according
|
|
||||||
to another transform rule that has the given input and output suffixes. The
|
|
||||||
file under
|
|
||||||
.B $\(**
|
|
||||||
will be replaced by the new file. So if there is a
|
|
||||||
.B .c .i
|
|
||||||
preprocessor rule then the example of
|
|
||||||
.B ifhash
|
|
||||||
can be replaced by:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
.ft B
|
|
||||||
transform .s .o
|
|
||||||
ifhash $\(**
|
|
||||||
apply .c .i
|
|
||||||
$AS \-o $> $*
|
|
||||||
.ft P
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.TP
|
|
||||||
.BI include " descr"
|
|
||||||
Reads another description file and replaces the
|
|
||||||
.B include
|
|
||||||
with it. Execution continues with the first list in the new program. The
|
|
||||||
search for
|
|
||||||
.I descr
|
|
||||||
is the same as used for the
|
|
||||||
.B \-descr
|
|
||||||
option. Use
|
|
||||||
.B include
|
|
||||||
to switch in different front ends or back ends, or to call a shared
|
|
||||||
description file with a different initialization. Note that
|
|
||||||
.I descr
|
|
||||||
is only evaluated the first time the
|
|
||||||
.B include
|
|
||||||
is called. After that the
|
|
||||||
.B include
|
|
||||||
has been replaced with the included program, so changing its argument won't
|
|
||||||
get you a different file.
|
|
||||||
.TP
|
|
||||||
.BI arg " string ..."
|
|
||||||
.B Arg
|
|
||||||
may be executed in the initialization and scanning phase to post an argument
|
|
||||||
scanning rule, that's all the command itself does. Like an
|
|
||||||
.B if
|
|
||||||
that fails it allows more guards to share the same body.
|
|
||||||
.TP
|
|
||||||
.BI transform " suffix1 suffix2"
|
|
||||||
.BR Transform ,
|
|
||||||
like
|
|
||||||
.BR arg ,
|
|
||||||
only posts a rule to transform a file with the suffix
|
|
||||||
.I suffix1
|
|
||||||
into a file with the suffix
|
|
||||||
.IR suffix2 .
|
|
||||||
.TP
|
|
||||||
.BI prefer " suffix1 suffix2"
|
|
||||||
Tells that the transformation rule from
|
|
||||||
.I suffix1
|
|
||||||
to
|
|
||||||
.I suffix2
|
|
||||||
is to be preferred when looking for a transformation path to the stop suffix.
|
|
||||||
Normally the shortest route to the stop suffix is used.
|
|
||||||
.B Prefer
|
|
||||||
is ignored on a
|
|
||||||
.BR combine ,
|
|
||||||
because the special nature of combines does not allow ambiguity.
|
|
||||||
.SP
|
|
||||||
The two suffixes on a
|
|
||||||
.B transform
|
|
||||||
or
|
|
||||||
.B prefer
|
|
||||||
may be the same, giving a rule that is only executed when preferred.
|
|
||||||
.TP
|
|
||||||
.BI combine " suffix-list suffix"
|
|
||||||
.B Combine
|
|
||||||
is like
|
|
||||||
.B transform
|
|
||||||
except that it allows a list of input suffixes to match several types of
|
|
||||||
input files that must be combined into one.
|
|
||||||
.TP
|
|
||||||
.B scan
|
|
||||||
The scanning phase may be run early from the initialization phase with the
|
|
||||||
.B scan
|
|
||||||
command. Use it if you need to make choices based on the arguments before
|
|
||||||
posting the transformation rules. After running this,
|
|
||||||
.B scan
|
|
||||||
and
|
|
||||||
.B arg
|
|
||||||
become no-ops.
|
|
||||||
.TP
|
|
||||||
.B compile
|
|
||||||
Move on to the compilation phase early, so that you have a chance to run
|
|
||||||
a few extra commands before exiting. This command implies a
|
|
||||||
.BR scan .
|
|
||||||
.PP
|
|
||||||
Any other command is seen as a \s-2UNIX\s+2 command. This is where the
|
|
||||||
.B <
|
|
||||||
and
|
|
||||||
.B >
|
|
||||||
operators come into play. They redirect standard input and standard output
|
|
||||||
to the file mentioned after them, just like the shell.
|
|
||||||
.B Acd
|
|
||||||
will stop with an error if the command is not successful.
|
|
||||||
.SS The Initialization Phase
|
|
||||||
The driver starts by executing the program once from top to bottom to
|
|
||||||
initialize variables and post argument scanning and transformation rules.
|
|
||||||
.SS The Scanning Phase
|
|
||||||
In this phase the driver makes a pass over the command line arguments to
|
|
||||||
process options. Each
|
|
||||||
.B arg
|
|
||||||
rule is tried one by one in the order they were posted against the front of
|
|
||||||
the argument list. If a match is made then the matched arguments are removed
|
|
||||||
from the argument list and the arg-body is executed. If no match can be made
|
|
||||||
then the first argument is moved to the list of files waiting to be
|
|
||||||
transformed and the scan is restarted.
|
|
||||||
.PP
|
|
||||||
The match is done as follows: Each of the strings after
|
|
||||||
.B arg
|
|
||||||
must match one argument at the front of the argument list. A character
|
|
||||||
in a string must match a character in an argument word, a subst in a string
|
|
||||||
may match 1 to all remaining characters in the argument, preferring the
|
|
||||||
shortest possible match. The hyphen in a argument starting with a hyphen
|
|
||||||
cannot be matched by a subst. Therefore:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.B arg \-i
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
matches only the argument
|
|
||||||
.BR \-i .
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.B arg \-O$n
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
matches any argument that starts with
|
|
||||||
.B \-O
|
|
||||||
and is at least three characters long. Lastly,
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.B arg \-o $out
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
matches
|
|
||||||
.B \-o
|
|
||||||
and the argument following it, unless that argument starts with a hyphen.
|
|
||||||
.PP
|
|
||||||
The variable
|
|
||||||
.B $\(**
|
|
||||||
is set to all the matched arguments before the arg-body is executed. All
|
|
||||||
the substs in the arg strings are set to the characters they match. The
|
|
||||||
variable
|
|
||||||
.B $>
|
|
||||||
is set to null. All the values of the variables are saved and the variables
|
|
||||||
marked local. All variables except
|
|
||||||
.B $>
|
|
||||||
are marked read-only. After the arg-body is executed is the value of
|
|
||||||
.B $>
|
|
||||||
concatenated to the file list. This allows one to stuff new files into the
|
|
||||||
transformation phase. These added names are not evaluated until the start
|
|
||||||
of the next phase.
|
|
||||||
.SS The Compilation Phase
|
|
||||||
The files gathered in the file list in the scanning phase are now transformed
|
|
||||||
one by one using the transformation rules. The shortest, or preferred route
|
|
||||||
is computed for each file all the way to the stop suffix. Each file is
|
|
||||||
transformed until it lands at the stop suffix, or at a combine rule. After
|
|
||||||
a while all files are either fully transformed or at a combine rule.
|
|
||||||
.PP
|
|
||||||
The driver chooses a combine rule that is not on a path from another combine
|
|
||||||
rule and executes it. The file that results is then transformed until it
|
|
||||||
again lands at a combine rule or the stop suffix. This continues until all
|
|
||||||
files are at the stop suffix and the program exits.
|
|
||||||
.PP
|
|
||||||
The paths through transform rules may be ambiguous and have cycles, they will
|
|
||||||
be resolved. But paths through combines must be unambiguous, because of
|
|
||||||
the many paths from the different files that meet there. A description file
|
|
||||||
will usually have only one combine rule for the loader. However if you do
|
|
||||||
have a combine conflict then put a no-op transform rule in front of one to
|
|
||||||
resolve the problem.
|
|
||||||
.PP
|
|
||||||
If a file matches a long and a short suffix then the long suffix is preferred.
|
|
||||||
By putting a null input suffix (\fB""\fP) in a rule one can match any file
|
|
||||||
that no other rule matches. You can send unknown files to the loader this
|
|
||||||
way.
|
|
||||||
.PP
|
|
||||||
The variable
|
|
||||||
.B $\(**
|
|
||||||
is set to the file to be transformed or the files to be combined before the
|
|
||||||
transform or combine-body is executed.
|
|
||||||
.B $>
|
|
||||||
is set to the output file name, it may again be modified.
|
|
||||||
.B $<
|
|
||||||
is set to the original name of the first file of
|
|
||||||
.B $\(**
|
|
||||||
with the leading directories and the suffix removed.
|
|
||||||
.B $\(**
|
|
||||||
will be made up of temporary files after the first rule.
|
|
||||||
.B $>
|
|
||||||
will be another temporary file or the name of the target file
|
|
||||||
.RB ( $<
|
|
||||||
plus the stop suffix), if the stop suffix is reached.
|
|
||||||
.PP
|
|
||||||
.B $>
|
|
||||||
is passed to the next rule; it is imploded and checked to be a single word.
|
|
||||||
This driver does not store intermediate object files in the current directory
|
|
||||||
like most other compilers, but keeps them in
|
|
||||||
.B /tmp
|
|
||||||
too. (Who knows if the current directory can have files created in?) As an
|
|
||||||
example, here is how you can express the "normal" method:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
.ft B
|
|
||||||
transform .s .o
|
|
||||||
if $> = $<.o
|
|
||||||
# Stop suffix is .o
|
|
||||||
else
|
|
||||||
$> = $<.o
|
|
||||||
temporary $>
|
|
||||||
$AS \-o $> $\(**
|
|
||||||
.ft P
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
Note that
|
|
||||||
.B temporary
|
|
||||||
is not called if the target is already the object file, or you would lose
|
|
||||||
the intended result!
|
|
||||||
.B $>
|
|
||||||
is known to be a word, because
|
|
||||||
.B $<
|
|
||||||
is local. (Any string whose substs are all expanded changes to a word.)
|
|
||||||
.SS "Predefined Variables"
|
|
||||||
The driver has three variables predefined:
|
|
||||||
.BR PROGRAM ,
|
|
||||||
set to the call name of the driver,
|
|
||||||
.BR VERSION ,
|
|
||||||
the driver's version number, and
|
|
||||||
.BR ARCH ,
|
|
||||||
set to the name of the default output architecture. The latter is optional,
|
|
||||||
and only defined if
|
|
||||||
.B acd
|
|
||||||
was compiled with \fB\-DARCH=\e"\fP\fIarch-name\fP\fB\e"\fP.
|
|
||||||
.SH EXAMPLE
|
|
||||||
As an example a description file for a C compiler is given. It has a
|
|
||||||
front end (ccom), an intermediate code optimizer (opt), a code generator (cg),
|
|
||||||
an assembler (as), and a loader (ld). The compiler can pre-process, but
|
|
||||||
there is also a separate cpp. If the
|
|
||||||
.B \-D
|
|
||||||
and options like it are changed to look like
|
|
||||||
.B \-o
|
|
||||||
then this example is even as required by \s-2POSIX\s+2.
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
|
|
||||||
# The compiler support search path.
|
|
||||||
C = /lib /usr/lib /usr/local/lib
|
|
||||||
|
|
||||||
# Compiler passes.
|
|
||||||
CPP = $C/cpp $CPP_F
|
|
||||||
CCOM = $C/ccom $CPP_F
|
|
||||||
OPT = $C/opt
|
|
||||||
CG = $C/cg
|
|
||||||
AS = $C/as
|
|
||||||
LD = $C/ld
|
|
||||||
|
|
||||||
# Predefined symbols.
|
|
||||||
CPP_F = \-D__EXAMPLE_CC__
|
|
||||||
|
|
||||||
# Library path.
|
|
||||||
LIBPATH = $USERLIBPATH $C
|
|
||||||
|
|
||||||
# Default transformation target.
|
|
||||||
stop .out
|
|
||||||
|
|
||||||
# Preprocessor directives.
|
|
||||||
arg \-D$name
|
|
||||||
arg \-U$name
|
|
||||||
arg \-I$dir
|
|
||||||
CPP_F = $CPP_F $\(**
|
|
||||||
|
|
||||||
# Stop suffix.
|
|
||||||
arg \-c
|
|
||||||
stop .o
|
|
||||||
|
|
||||||
arg \-E
|
|
||||||
stop .E
|
|
||||||
|
|
||||||
# Optimization.
|
|
||||||
arg \-O
|
|
||||||
prefer .m .m
|
|
||||||
OPT = $OPT -O1
|
|
||||||
|
|
||||||
arg \-O$n
|
|
||||||
numeric $n
|
|
||||||
prefer .m .m
|
|
||||||
OPT = $OPT $\(**
|
|
||||||
|
|
||||||
# Add debug info to the executable.
|
|
||||||
arg \-g
|
|
||||||
CCOM = $CCOM -g
|
|
||||||
|
|
||||||
# Add directories to the library path.
|
|
||||||
arg \-L$dir
|
|
||||||
USERLIBPATH = $USERLIBPATH $dir
|
|
||||||
|
|
||||||
# \-llib must be searched in $LIBPATH later.
|
|
||||||
arg \-l$lib
|
|
||||||
$> = $LIBPATH/lib$lib.a
|
|
||||||
|
|
||||||
# Change output file.
|
|
||||||
arg \-o$out
|
|
||||||
arg \-o $out
|
|
||||||
OUT = $out
|
|
||||||
|
|
||||||
# Complain about a missing argument.
|
|
||||||
arg \-o
|
|
||||||
error "argument expected after '$\(**'"
|
|
||||||
|
|
||||||
# Any other option (like \-s) are for the loader.
|
|
||||||
arg \-$any
|
|
||||||
LD = $LD $\(**
|
|
||||||
|
|
||||||
# Preprocess C-source.
|
|
||||||
transform .c .i
|
|
||||||
$CPP $\(** > $>
|
|
||||||
|
|
||||||
# Preprocess C-source and send it to standard output or $OUT.
|
|
||||||
transform .c .E
|
|
||||||
ifndef OUT
|
|
||||||
$CPP $\(**
|
|
||||||
else
|
|
||||||
$CPP $\(** > $OUT
|
|
||||||
|
|
||||||
# Compile C-source to intermediate code.
|
|
||||||
transform .c .m
|
|
||||||
transform .i .m
|
|
||||||
$CCOM $\(** $>
|
|
||||||
|
|
||||||
# Intermediate code optimizer.
|
|
||||||
transform .m .m
|
|
||||||
$OPT $\(** > $>
|
|
||||||
|
|
||||||
# Intermediate to assembly.
|
|
||||||
transform .m .s
|
|
||||||
$CG $\(** > $>
|
|
||||||
|
|
||||||
# Assembler to object code.
|
|
||||||
transform .s .o
|
|
||||||
if $> = $<.o
|
|
||||||
ifdef OUT
|
|
||||||
$> = $OUT
|
|
||||||
$AS \-o $> $\(**
|
|
||||||
|
|
||||||
# Combine object files and libraries to an executable.
|
|
||||||
combine (.o .a) .out
|
|
||||||
ifndef OUT
|
|
||||||
OUT = a.out
|
|
||||||
$LD \-o $OUT $C/crtso.o $\(** $C/libc.a
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.SH FILES
|
|
||||||
.TP 25n
|
|
||||||
.RI /usr/lib/ descr /descr
|
|
||||||
\- compiler driver description file.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR cc (1).
|
|
||||||
.SH ACKNOWLEDGEMENTS
|
|
||||||
Even though the end result doesn't look much like it, many ideas were
|
|
||||||
nevertheless derived from the ACK compiler driver by Ed Keizer.
|
|
||||||
.SH BUGS
|
|
||||||
\s-2POSIX\s+2 requires that if compiling one source file to an object file
|
|
||||||
fails then the compiler should continue with the next source file. There is
|
|
||||||
no way
|
|
||||||
.B acd
|
|
||||||
can do this, it always stops after error. It doesn't even know what an
|
|
||||||
object file is! (The requirement is stupid anyhow.)
|
|
||||||
.PP
|
|
||||||
If you don't think that tabs are 8 spaces wide, then don't mix them with
|
|
||||||
spaces for indentation.
|
|
||||||
.SH AUTHOR
|
|
||||||
Kees J. Bot (kjb@cs.vu.nl)
|
|
|
@ -1,82 +0,0 @@
|
||||||
.TH MKDEP 1 "February 1st, 2010"
|
|
||||||
.SH NAME
|
|
||||||
mkdep \- print dependencies in the Right Way for make(1)
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B mkdep
|
|
||||||
.I path
|
|
||||||
.br
|
|
||||||
.B mkdep
|
|
||||||
.I pp_command
|
|
||||||
.IR sourcefile " ... "
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.B Mkdep
|
|
||||||
does what
|
|
||||||
.B cpp -M
|
|
||||||
should do, but no compiler gets it right, they all
|
|
||||||
strip the leading path of the \fI*.o\fP files.
|
|
||||||
.PP
|
|
||||||
The first synopsis form just creates the needed
|
|
||||||
.I .depend
|
|
||||||
files in all the subdirectories of
|
|
||||||
.IR path .
|
|
||||||
.PP
|
|
||||||
The second synopsis form does the hard work of emitting the
|
|
||||||
dependencies instructions for
|
|
||||||
.IR sourcefile
|
|
||||||
in the right format expected by
|
|
||||||
.IR make (1),
|
|
||||||
including the path information.
|
|
||||||
.PP
|
|
||||||
.B Mkdep
|
|
||||||
expects
|
|
||||||
.I pp_command
|
|
||||||
to be the correct invocation for the preprocessor
|
|
||||||
.\" FIXME: there are no cpp(1x) manpage presently...
|
|
||||||
.\" .IR cpp (1x)
|
|
||||||
command adequate for
|
|
||||||
.IR sourcefile ,
|
|
||||||
and also expects this command to emit lines of the form
|
|
||||||
.nf
|
|
||||||
.ta +1i +\w'# lineno "filename"'u+2m
|
|
||||||
# \fIlineno\fP "\fIfilename\fP"
|
|
||||||
.fi
|
|
||||||
for each files which is included by the named
|
|
||||||
.IR sourcefile .
|
|
||||||
.PP
|
|
||||||
For C, the typical idiom is to add in all your
|
|
||||||
.IR Makefile s:
|
|
||||||
.PP
|
|
||||||
.nf
|
|
||||||
.ta +0.2i +\w'depend:'u+1m +\w'mkdep "$(CC) -E $(CPPFLAGS)" *.c > .depend'u+2m
|
|
||||||
depend:
|
|
||||||
cd sub1 && $(MAKE) -$(MAKEFLAGS) $@
|
|
||||||
cd sub2 && $(MAKE) -$(MAKEFLAGS) $@
|
|
||||||
# repeat for each subdirectory
|
|
||||||
mkdep "$(CC) -E $(CPPFLAGS)" *.c > .depend
|
|
||||||
.PP
|
|
||||||
.fi
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR cc (1),
|
|
||||||
.BR make (1).
|
|
||||||
.SH BUGS
|
|
||||||
Since
|
|
||||||
.I Makefile
|
|
||||||
is read in full before any command is executed,
|
|
||||||
there is no way to prevent
|
|
||||||
.IR make (1)
|
|
||||||
to report an error if the
|
|
||||||
.I .depend
|
|
||||||
file was not created beforehand; hence the first form of
|
|
||||||
.IR mkdep
|
|
||||||
should be used \fBbefore\fP any attempt is done to use this feature in any
|
|
||||||
.IR Makefile .
|
|
||||||
.PP
|
|
||||||
The current version hardcodes the \fI.o\fP suffix, so it cannot be used for e.g.
|
|
||||||
.IR flex (1)
|
|
||||||
or
|
|
||||||
.IR yacc (1)
|
|
||||||
source files.
|
|
||||||
.SH AUTHOR
|
|
||||||
.I Mkdep.c
|
|
||||||
was written by Kees J. Bot and Jorrit N. Herder.
|
|
||||||
.\" This manual page by A. Leca.
|
|
|
@ -1,63 +0,0 @@
|
||||||
.TH ANM 1
|
|
||||||
.SH NAME
|
|
||||||
anm \- print name list
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBanm \fR[\fB\-gnoprus\fR] \fIfile\fR ...\fR
|
|
||||||
.br
|
|
||||||
.de FL
|
|
||||||
.TP
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
\\$2
|
|
||||||
..
|
|
||||||
.de EX
|
|
||||||
.TP 20
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
# \\$2
|
|
||||||
..
|
|
||||||
.SH OPTIONS
|
|
||||||
.FL "\-g" "Global symbols only"
|
|
||||||
.FL "\-n" "Sort numerically"
|
|
||||||
.FL "\-o" "Prepend the filename to each line"
|
|
||||||
.FL "\-p" "No sorting\(emuse symbol table order"
|
|
||||||
.FL "\-r" "Sort in reverse order"
|
|
||||||
.FL "\-u" "List undefined symbols only"
|
|
||||||
.FL "\-s" "Sort in section order"
|
|
||||||
.SH EXAMPLES
|
|
||||||
.EX "anm \-gn test.o" "Print global symbols in numerical order"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
.I Anm
|
|
||||||
prints the name list (symbol table) of each ACK format object
|
|
||||||
.I file
|
|
||||||
in the argument list.
|
|
||||||
If no file name is given, \fIa.out\fR is used.
|
|
||||||
Each symbol name is preceded by its value, a section indicator
|
|
||||||
and a type indicator.
|
|
||||||
The section indicators are:
|
|
||||||
.PP
|
|
||||||
.ta 0.25i 0.50i
|
|
||||||
.nf
|
|
||||||
\fBU\fR Undefined symbol
|
|
||||||
\fBA\fR Absolute symbol
|
|
||||||
\fB\-\fR Other symbol
|
|
||||||
.sp
|
|
||||||
The type indicators are:
|
|
||||||
.PP
|
|
||||||
\fBF\fR Filename
|
|
||||||
\fBM\fR Module name
|
|
||||||
\fBS\fR Section name
|
|
||||||
\fBE\fR External (global) symbol
|
|
||||||
\fB\-\fR Local symbol
|
|
||||||
.fi
|
|
||||||
.PP
|
|
||||||
The output is sorted alphabetically, unless otherwise specified.
|
|
||||||
Notice that \fIanm\fR can only be used on ACK format object files
|
|
||||||
(that is: \fI.o\fR and \fI.out\fR files).
|
|
||||||
If you want to get the name list of an executable program use
|
|
||||||
.I nm
|
|
||||||
instead.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR asize (1),
|
|
||||||
.BR nm (1),
|
|
||||||
.BR ar (1),
|
|
||||||
.BR size (1).
|
|
|
@ -1,56 +0,0 @@
|
||||||
.TH AR 1
|
|
||||||
.SH NAME
|
|
||||||
ar, aal \- archivers
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBar\fR [\fBdmpqrtx\fR][\fBabciluv\fR]\fR [\fIposname\fR] \fIarchive\fR [\fIfile \fR...]\fR
|
|
||||||
.br
|
|
||||||
\fBaal\fR [\fBdpqrtx\fR][\fBclv\fR]\fR \fIarchive\fR [\fIfile \fR...]\fR
|
|
||||||
.br
|
|
||||||
.de FL
|
|
||||||
.TP
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
\\$2
|
|
||||||
..
|
|
||||||
.de EX
|
|
||||||
.TP 20
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
# \\$2
|
|
||||||
..
|
|
||||||
.SH EXAMPLES
|
|
||||||
.EX "ar r libc.a sort.s" "Replace \fIsort\fR.s in \fIlibc.a\fR"
|
|
||||||
.EX "ar rb a.s libc.a b.s" "Insert \fIb.s\fR before \fIa.s\fR in \fIlibc.a\fR"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
\fIAr\fR allows groups of files to be put together into a single archive.
|
|
||||||
It is normally used for libraries of compiled procedures. \fIAal\fR is like
|
|
||||||
\fIar\fP, but is to be used with the ACK compiler. The following keys
|
|
||||||
are allowed:
|
|
||||||
.PP
|
|
||||||
.ta 0.25i 0.50i
|
|
||||||
.nf
|
|
||||||
\fBd\fR: Delete. \fIAr\fR will delete the named members.
|
|
||||||
\fBm\fR: Move named files. \fIAr\fR expects \fIa\fR, \fIb\fR, or \fIi\fR to be specified.
|
|
||||||
\fBp\fR: Print the named files (list them on \fIstdout\fR)
|
|
||||||
\fBq\fR: Quickly append to the end of the archive file.
|
|
||||||
\fBr\fR: Replace (append when not in archive).
|
|
||||||
\fBt\fR: Print the archive's table of contents.
|
|
||||||
\fBx\fR: Extract
|
|
||||||
.fi
|
|
||||||
.PP
|
|
||||||
\fBThe keys may optionally concatencated with one or more of the following\fR:
|
|
||||||
.nf
|
|
||||||
.PP
|
|
||||||
\fBa\fR: After \fIposname\fR
|
|
||||||
\fBb\fR: Before \fIposname\fR
|
|
||||||
\fBc\fR: Create (suppresses creation message)
|
|
||||||
\fBi\fR: Before \fIposname\fR
|
|
||||||
\fBl\fR: Local temporary file for work instead of \fI/tmp/ar.$$$$$\fR
|
|
||||||
\fBu\fR: Replace only if dated later than member in archive
|
|
||||||
\fBv\fR: Verbose
|
|
||||||
.PP
|
|
||||||
.fi
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR anm (1),
|
|
||||||
.BR asize (1),
|
|
||||||
.BR nm (1),
|
|
||||||
.BR size (1).
|
|
|
@ -1,37 +0,0 @@
|
||||||
.TH ASIZE 1
|
|
||||||
.SH NAME
|
|
||||||
asize \- report the size of an object file
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBasize \fIfile\fR ...\fR
|
|
||||||
.br
|
|
||||||
.de FL
|
|
||||||
.TP
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
\\$2
|
|
||||||
..
|
|
||||||
.de EX
|
|
||||||
.TP 20
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
# \\$2
|
|
||||||
..
|
|
||||||
.SH EXAMPLES
|
|
||||||
.EX "asize test.o" "Give the size of \fItest.o\fR"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
.I Asize
|
|
||||||
prints for each argument
|
|
||||||
the (decimal) number of bytes used by the different sections,
|
|
||||||
as well as their sum in decimal and hexadecimal.
|
|
||||||
If no
|
|
||||||
.I file
|
|
||||||
is given \fIa.out\fR is used.
|
|
||||||
.I Asize
|
|
||||||
can only be used to obtain the size of a \fI.o\fR or \fI.out\fR file.
|
|
||||||
To obtain the size of an executable, use
|
|
||||||
.I size
|
|
||||||
instead.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR anm (1),
|
|
||||||
.BR nm (1),
|
|
||||||
.BR ar (1),
|
|
||||||
.BR size (1).
|
|
|
@ -1,65 +0,0 @@
|
||||||
.TH CHMEM 1
|
|
||||||
.SH NAME
|
|
||||||
chmem \- change memory allocation
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBchmem\fR [\fB+\fR]\fR [\fB\-\fR] [\fB=\fR] \fIamount file\fR
|
|
||||||
.br
|
|
||||||
.de FL
|
|
||||||
.TP
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
\\$2
|
|
||||||
..
|
|
||||||
.de EX
|
|
||||||
.TP 20
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
# \\$2
|
|
||||||
..
|
|
||||||
.SH EXAMPLES
|
|
||||||
.EX "chmem =50000 a.out" "Give \fIa.out\fP 50K of stack space"
|
|
||||||
.EX "chmem \-4000 a.out" "Reduce the stack space by 4000 bytes"
|
|
||||||
.EX "chmem +1000 file1" "Increase each stack by 1000 bytes"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
When a program is loaded into memory, it is allocated enough memory
|
|
||||||
for the text and data+bss segments, plus
|
|
||||||
an area for the stack.
|
|
||||||
Data segment growth using
|
|
||||||
.I malloc ,
|
|
||||||
.I brk ,
|
|
||||||
or
|
|
||||||
.I sbrk
|
|
||||||
eats up stack space from the low end.
|
|
||||||
The amount of stack space to allocate is derived
|
|
||||||
from a field in the executable program's file header.
|
|
||||||
If the combined stack and data segment growth exceeds the stack space
|
|
||||||
allocated, the program will be terminated.
|
|
||||||
.PP
|
|
||||||
It is therefore important to set the amount of stack space carefully.
|
|
||||||
If too little is provided, the program may crash.
|
|
||||||
If too much is provided, memory will be wasted, and fewer programs will be able
|
|
||||||
to fit in memory and run simultaneously.
|
|
||||||
\s-1MINIX 3\s-1
|
|
||||||
does not swap, so that when memory is full, subsequent attempts to fork will
|
|
||||||
fail.
|
|
||||||
The compiler sets the stack space
|
|
||||||
to the largest possible value (for the Intel CPUs, 64K \- text \- data).
|
|
||||||
For many programs, this value is far too large.
|
|
||||||
Nonrecursive programs that do not call
|
|
||||||
.I brk ,
|
|
||||||
.I sbrk ,
|
|
||||||
or
|
|
||||||
.I malloc ,
|
|
||||||
and do not have any local arrays usually do not need more than 8K of stack
|
|
||||||
space.
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.I chmem
|
|
||||||
command changes the value of the header field that determines the stack allocation, and
|
|
||||||
thus indirectly the total memory required to run the program.
|
|
||||||
The = option sets the stack size
|
|
||||||
to a specific value; the + and \- options increment and decrement the
|
|
||||||
current value by the indicated amount.
|
|
||||||
The old and new stack sizes are printed.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR install (1),
|
|
||||||
.BR brk (2).
|
|
|
@ -1,37 +0,0 @@
|
||||||
.TH POSTMORT 1
|
|
||||||
.SH NAME
|
|
||||||
postmort \- perform post-mortem on PC MINIX 3 core files
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBpostmort\fR [\fB\-dpt\fR] \fB\-c \fIcorefile \fB\-s \fIsymbfile\fR
|
|
||||||
.br
|
|
||||||
.de FL
|
|
||||||
.TP
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
\\$2
|
|
||||||
..
|
|
||||||
.de EX
|
|
||||||
.TP 20
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
# \\$2
|
|
||||||
..
|
|
||||||
.SH OPTIONS
|
|
||||||
.FL "\-c" "Use the named corefile"
|
|
||||||
.FL "\-d" "Dump all text symbols and segment data"
|
|
||||||
.FL "\-p" "Display the kernel process table"
|
|
||||||
.FL "\-s" "Use the named symbol file"
|
|
||||||
.FL "\-t" "Display a stack backtrace"
|
|
||||||
.SH EXAMPLES
|
|
||||||
.EX "postmort" "display the data from the file 'core'"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
.I Postmort
|
|
||||||
does a simple static analysis of a PC MINIX 3 core file;
|
|
||||||
By default, it looks for the
|
|
||||||
file 'core' in the local directory and loads that for analysis; it
|
|
||||||
also searches for the file 'symbol.out', and if that fails 'a.out',
|
|
||||||
expecting them to contain symbol information for the core file.
|
|
||||||
It is not a fatal error if the symbol files don't exist.
|
|
||||||
.PP
|
|
||||||
The stack backtrace is slightly tricky, and may go on longer
|
|
||||||
than is really justified, since there's no easy way for it to
|
|
||||||
know when to stop. Treat its results with caution.
|
|
|
@ -1,24 +0,0 @@
|
||||||
.TH STRIP 1
|
|
||||||
.SH NAME
|
|
||||||
strip \- remove symbol table from executable file
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBstrip\fR [\fIfile\fR] ...\fR
|
|
||||||
.br
|
|
||||||
.de FL
|
|
||||||
.TP
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
\\$2
|
|
||||||
..
|
|
||||||
.de EX
|
|
||||||
.TP 20
|
|
||||||
\\fB\\$1\\fR
|
|
||||||
# \\$2
|
|
||||||
..
|
|
||||||
.SH EXAMPLES
|
|
||||||
.EX "strip a.out" "Remove symbols from \fIa.out\fR"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
For each file argument, \fIstrip\fR removes the symbol table.
|
|
||||||
Strip makes a copy of the file being stripped, so links are lost.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR install (1).
|
|
|
@ -1,4 +1,4 @@
|
||||||
MAN= awk.1x dis88.1x elvis.1x kermit.1x \
|
MAN= awk.1x elvis.1x kermit.1x \
|
||||||
macros.1x mined.1x
|
macros.1x mined.1x
|
||||||
|
|
||||||
.include <bsd.man.mk>
|
.include <bsd.man.mk>
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
.so mnx.mac
|
|
||||||
.TH DIS88 1x
|
|
||||||
.CD "dis88 \(en disassembler [IBM]"
|
|
||||||
.SX "dis88\fR [\fB\(eno\fR] \fIinfile\fR [\fIoutfile\fR]"
|
|
||||||
.FL "\(eno" "List the object code along with the assembly code"
|
|
||||||
.EX "dis88 a.out >listing" "Disassemble \fIa.out\fR"
|
|
||||||
.EX "dis88 \(eno a.out listing" "Ditto, but with object code"
|
|
||||||
.PP
|
|
||||||
\fIDis88\fR disassembles 8088 object code to the assembly language format
|
|
||||||
used by
|
|
||||||
.MX .
|
|
||||||
It makes full use of
|
|
||||||
symbol table information, supports separate
|
|
||||||
instruction and data space, and generates synthetic labels when needed.
|
|
||||||
It does not support 8087 mnemonics, symbolic data segment references, or
|
|
||||||
the ESC mnemonic.
|
|
||||||
.PP
|
|
||||||
The program is invoked by:
|
|
||||||
.HS
|
|
||||||
.Cx "dis88 [\(eno] infile [outfile]"
|
|
||||||
.HS
|
|
||||||
The \(eno flag causes object code to be listed.
|
|
||||||
If no outfile is given, \fIstdout\fR is used.
|
|
||||||
.PP
|
|
||||||
The text segment of an object file is always padded to an even address.
|
|
||||||
In addition, if the file has split I/D space, the text segment will be padded
|
|
||||||
to a paragraph boundary (i.e., an address divisible by 16). Due to padding, the
|
|
||||||
disassembler may produce a few spurious, but harmless, instructions at the end
|
|
||||||
of the text segment.
|
|
||||||
.PP
|
|
||||||
Because the information to which initialized data refers cannot generally
|
|
||||||
be inferred from context, the data segment is treated literally. Byte values
|
|
||||||
(in hexadecimal) are output, and long stretches of null data are represented by
|
|
||||||
appropriate \fI.zerow\fR pseudo-ops.
|
|
||||||
Disassembly of the bss segment, on the other
|
|
||||||
hand, is quite straightforward, because uninitialized data is all zero by
|
|
||||||
definition.
|
|
||||||
No data is output in the bss segment, but symbolic labels are output
|
|
||||||
as appropriate.
|
|
||||||
.PP
|
|
||||||
The output of operands in symbolic form is complicated somewhat by the
|
|
||||||
existence of assembler symbolic constants and segment override opcodes. Thus,
|
|
||||||
the program's symbol lookup routine attempts to apply a certain amount of
|
|
||||||
intelligence when it is asked to find a symbol. If it cannot match on a symbol
|
|
||||||
of the preferred type, it may output a symbol of some other type, depending on
|
|
||||||
preassigned (and somewhat arbitrary) rankings within each type. Finally, if
|
|
||||||
all else fails, it will output a string containing the address sought as a hex
|
|
||||||
constant. For user convenience, the targets of branches are also output, in
|
|
||||||
comments, as hexadecimal constants.
|
|
||||||
.SS "Error Messages"
|
|
||||||
.PP
|
|
||||||
Various error messages may be generated as a result of problems encountered
|
|
||||||
during the disassembly.
|
|
||||||
They are listed below
|
|
||||||
.HS.
|
|
||||||
.in +3.20i
|
|
||||||
.ta +2.75i +0.2i
|
|
||||||
.ti -2.95i
|
|
||||||
Cannot access input file \(en Input file cannot be opened or read
|
|
||||||
.ti -2.95i
|
|
||||||
Cannot open output file \(en Output file cannot be created
|
|
||||||
.ti -2.95i
|
|
||||||
Input file not in object format \(en Bad magic number
|
|
||||||
.ti -2.95i
|
|
||||||
Not an 8086/8088 object file \(en CPU ID of the file header is incorrect
|
|
||||||
.ti -2.95i
|
|
||||||
Reloc table overflow \(en Relocation table exceeds 1500 entries
|
|
||||||
.ti -2.95i
|
|
||||||
Symbol table overflow \(en Symbol table exceeds 1500 entries
|
|
||||||
.ti -2.95i
|
|
||||||
Lseek error \(en Input file corrupted (should never happen)
|
|
||||||
.ti -2.95i
|
|
||||||
Warning: no symbols \(en Symbol table is missing (use ast)
|
|
||||||
.ti -2.95i
|
|
||||||
Cannot reopen input file \(en Input file was removed during execution
|
|
||||||
.in -3.20i
|
|
||||||
.SS "Author"
|
|
||||||
.PP
|
|
||||||
\fIDis88\fR was written and
|
|
||||||
copyrighted by G. M. Harding and is included here by permission. It may be
|
|
||||||
freely redistributed provided that complete source code, with all copyright
|
|
||||||
notices, accompanies any redistribution. This provision also applies to any
|
|
||||||
modifications you may make. You are urged to comment such changes, giving,
|
|
||||||
as a minimum, your name and complete address.
|
|
0
man/man3/dirname.3
Executable file → Normal file
0
man/man3/dirname.3
Executable file → Normal file
0
man/man3/feholdexcept.3
Executable file → Normal file
0
man/man3/feholdexcept.3
Executable file → Normal file
0
man/man3/getaddrinfo.3
Executable file → Normal file
0
man/man3/getaddrinfo.3
Executable file → Normal file
|
@ -19,9 +19,6 @@ Contains the utility programs; see also \fB/sbin/\fP, \fB/usr/bin/\fP, \fB/usr/s
|
||||||
...
|
...
|
||||||
.fi
|
.fi
|
||||||
.TP
|
.TP
|
||||||
.I /boot/
|
|
||||||
Contains images and files which are needed during the boot process. See \fBmonitor\fP(8).
|
|
||||||
.TP
|
|
||||||
.I /dev/
|
.I /dev/
|
||||||
Contains device, block, or other special files. See
|
Contains device, block, or other special files. See
|
||||||
.BR mknod(2).
|
.BR mknod(2).
|
||||||
|
@ -29,7 +26,7 @@ Contains device, block, or other special files. See
|
||||||
.nf
|
.nf
|
||||||
\fBconsole\fP computer's console device, \fBtty\fP(4)
|
\fBconsole\fP computer's console device, \fBtty\fP(4)
|
||||||
\fBfd*\fP floppy disk, \fBfd\fP(4)
|
\fBfd*\fP floppy disk, \fBfd\fP(4)
|
||||||
\fBhd*\fP hard disk, \fBhd\fP(4)
|
\fBc?d*\fP hard disk, \fBhd\fP(4)
|
||||||
\fBnull\fP accetps and discards all input; produces no output
|
\fBnull\fP accetps and discards all input; produces no output
|
||||||
\fBtty*\fP terminal device, \fBtty\fP(4)
|
\fBtty*\fP terminal device, \fBtty\fP(4)
|
||||||
\fBzero\fP the zero device; produces null bytes
|
\fBzero\fP the zero device; produces null bytes
|
||||||
|
@ -121,7 +118,6 @@ Contains source and majority of system utilities and files
|
||||||
|
|
||||||
\fIbin/\fP Common user programs and utilities.
|
\fIbin/\fP Common user programs and utilities.
|
||||||
|
|
||||||
\fBcc\fP MINIX 3 c compiler, \fBcc\fP(1)
|
|
||||||
\fBman\fP show manual pages, \fBman\fP(1)
|
\fBman\fP show manual pages, \fBman\fP(1)
|
||||||
...
|
...
|
||||||
|
|
||||||
|
@ -146,19 +142,7 @@ Contains source and majority of system utilities and files
|
||||||
\fBcawf/\fP text formatter support files, \fBcawf\fP(1)
|
\fBcawf/\fP text formatter support files, \fBcawf\fP(1)
|
||||||
\fBcrontab\fP cron jobs, \fBcron\fP(8)
|
\fBcrontab\fP cron jobs, \fBcron\fP(8)
|
||||||
\fBdict/\fP word lists
|
\fBdict/\fP word lists
|
||||||
\fBlibc.a\fP C library (Minix-8086 only), \fBcc\fP(1)
|
\fBlibc.a\fP C library
|
||||||
\fBarch\fP per architecture compiler binaries and
|
|
||||||
libaries, \fBcc\fP(1)
|
|
||||||
...
|
|
||||||
|
|
||||||
\fIlocal/\fP
|
|
||||||
Contains programs which are related to local softwares.
|
|
||||||
|
|
||||||
\fBbin/\fP utilities for locally installed programs
|
|
||||||
\fBetc/\fP local configuration and data files
|
|
||||||
\fBrc\fP local system startup
|
|
||||||
\fBman/\fP manual pages associated with local programs
|
|
||||||
\fBsrc/\fP local sources
|
|
||||||
...
|
...
|
||||||
|
|
||||||
\fIman/\fP Contains manual pages in subdirectories according to
|
\fIman/\fP Contains manual pages in subdirectories according to
|
||||||
|
@ -183,6 +167,14 @@ Contains source and majority of system utilities and files
|
||||||
\fBboot\fP bootstrap code, \fBinstallboot\fP(8)
|
\fBboot\fP bootstrap code, \fBinstallboot\fP(8)
|
||||||
...
|
...
|
||||||
|
|
||||||
|
\fIpkg/\fP
|
||||||
|
Contains programs which are related to local softwares.
|
||||||
|
|
||||||
|
\fBbin/\fP utilities for locally installed programs
|
||||||
|
\fBetc/\fP local configuration and data files
|
||||||
|
\fBman/\fP manual pages associated with local programs
|
||||||
|
...
|
||||||
|
|
||||||
\fIpreserve/\fP
|
\fIpreserve/\fP
|
||||||
Contains saved elvis editor buffers.
|
Contains saved elvis editor buffers.
|
||||||
See \fBelvprsv\fP(8), \fBelvrec\fP(1).
|
See \fBelvprsv\fP(8), \fBelvrec\fP(1).
|
||||||
|
@ -206,12 +198,10 @@ Contains source and majority of system utilities and files
|
||||||
utilities and boot files
|
utilities and boot files
|
||||||
\fBbenchmarks/\fP
|
\fBbenchmarks/\fP
|
||||||
test programs for system and graphic tests
|
test programs for system and graphic tests
|
||||||
\fBboot/\fP source files for boot monitor package
|
|
||||||
\fBcommands/\fP source file for command utilities
|
\fBcommands/\fP source file for command utilities
|
||||||
\fBcommon/\fP
|
\fBcommon/\fP
|
||||||
\fBinclude/\fP includes common to NetBSD and Minix
|
\fBinclude/\fP includes common to NetBSD and Minix
|
||||||
\fBlib/\fP lib files common to NetBSD kernel and libc
|
\fBlib/\fP lib files common to NetBSD kernel and libc
|
||||||
\fBcrclist\fP CRC checksums of the source tree, \fBsrccrc\fP(8)
|
|
||||||
\fBdocs/\fP documents related to recent source changes
|
\fBdocs/\fP documents related to recent source changes
|
||||||
\fBdrivers/\fP source files for various device drivers
|
\fBdrivers/\fP source files for various device drivers
|
||||||
\fBetc/\fP source for files in /etc/
|
\fBetc/\fP source for files in /etc/
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
MAN= add_route.8 backup.8 badblocks.8 boot.8 btrace.8 \
|
MAN= add_route.8 backup.8 badblocks.8 boot.8 btrace.8 \
|
||||||
cdprobe.8 checkhier.8 chown.8 cleantmp.8 config.8 cron.8 \
|
cdprobe.8 checkhier.8 chown.8 cleantmp.8 config.8 cron.8 \
|
||||||
dhcpd.8 diskctl.8 dosminix.8 elvprsv.8 fbdctl.8 fdisk.8 fingerd.8 \
|
dhcpd.8 diskctl.8 elvprsv.8 fbdctl.8 fdisk.8 fingerd.8 \
|
||||||
ftpd.8 getty.8 halt.8 hgfs.8 httpd.8 ifconfig.8 inet.8 init.8 \
|
getty.8 halt.8 hgfs.8 httpd.8 ifconfig.8 inet.8 init.8 \
|
||||||
installboot.8 intr.8 irdpd.8 loadramdisk.8 MAKEDEV.8 \
|
intr.8 irdpd.8 loadramdisk.8 MAKEDEV.8 \
|
||||||
mknod.8 monitor.8 netconf.8 newroot.8 nonamed.8 \
|
mknod.8 netconf.8 newroot.8 nonamed.8 \
|
||||||
ossdevlinks.8 part.8 partition.8 \
|
ossdevlinks.8 part.8 partition.8 \
|
||||||
poweroff.8 printroot.8 pr_routes.8 pwdauth.8 rarpd.8 \
|
poweroff.8 printroot.8 pr_routes.8 pwdauth.8 rarpd.8 \
|
||||||
rdate.8 readclock.8 reboot.8 repartition.8 rlogind.8 \
|
rdate.8 readclock.8 reboot.8 repartition.8 rlogind.8 \
|
||||||
|
|
0
man/man8/cdprobe.8
Executable file → Normal file
0
man/man8/cdprobe.8
Executable file → Normal file
|
@ -1,287 +0,0 @@
|
||||||
.TH DOSMINIX 8
|
|
||||||
.SH NAME
|
|
||||||
dosminix, mkfile \- Running MINIX 3 under DOS
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.RB "C:\eMINIX> " "boot disk0.mnx" "\0\0\0\0\0(Typical example)"
|
|
||||||
.br
|
|
||||||
.RB "C:\eMINIX> " "mkfile \fIsize disk"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.de SP
|
|
||||||
.if t .sp 0.4
|
|
||||||
.if n .sp
|
|
||||||
..
|
|
||||||
This text describes running MINIX 3
|
|
||||||
.\" or Minix-vmd
|
|
||||||
under DOS. The DOS version
|
|
||||||
of the Boot Monitor, described in
|
|
||||||
.BR monitor (8),
|
|
||||||
grabs as much memory as DOS is willing to give, loads MINIX 3 into that memory
|
|
||||||
from the active partition of a "file as disk", and jumps to the MINIX 3 kernel
|
|
||||||
to let MINIX 3 take control. As far as DOS is concerned MINIX 3 is just a part
|
|
||||||
of the
|
|
||||||
.B boot.com
|
|
||||||
program.
|
|
||||||
.PP
|
|
||||||
In the example above
|
|
||||||
.B disk0.mnx
|
|
||||||
is the "file as disk". It is a file of many megabytes that is used by MINIX 3
|
|
||||||
as a disk of four partitions. These partitions will normally be
|
|
||||||
.B /dev/dosd1
|
|
||||||
through
|
|
||||||
.BR /dev/dosd4 ,
|
|
||||||
with
|
|
||||||
.BR /dev/dosd0
|
|
||||||
for the whole "disk". The Boot Monitor will set the
|
|
||||||
.B dosd0
|
|
||||||
boot variable to the name of the disk (its first argument), the root file
|
|
||||||
system will be the active partition, usually
|
|
||||||
.BR dosd1 .
|
|
||||||
It is better to use the special name
|
|
||||||
.B bootdev
|
|
||||||
to indicate this device, usually in the setting
|
|
||||||
.BR rootdev = bootdev .
|
|
||||||
.PP
|
|
||||||
Once MINIX 3 is running it will operate the same as if started from a regular
|
|
||||||
disk partition until it is shut down. On shutdown from protected mode it
|
|
||||||
will return to the Boot Monitor prompt, and with the
|
|
||||||
.B exit
|
|
||||||
command you leave the Boot Monitor and return to DOS. Shutting down from
|
|
||||||
real mode will reboot the machine, just like when run from a disk partition.
|
|
||||||
(This more or less crashes DOS, but DOS is used to such abuse.)
|
|
||||||
.SS EMM386
|
|
||||||
MINIX 3 can't run in protected mode (286 or 386 mode) if DOS is using a memory
|
|
||||||
manager like
|
|
||||||
.BR EMM386 .
|
|
||||||
You can either temporarily comment out EMM386 from
|
|
||||||
.BR CONFIG.SYS ,
|
|
||||||
or you can press
|
|
||||||
.B F8
|
|
||||||
on startup to bypass CONFIG.SYS. This is only possible with the later DOS
|
|
||||||
versions.
|
|
||||||
.SS "Windows 95"
|
|
||||||
Press F8 at startup to make the boot menu visible. Choose
|
|
||||||
"\fBCommand prompt\fP", or "\fBSafe mode command prompt\fP" to run DOS.
|
|
||||||
Use the "safe mode" if EMM386 is started in CONFIG.SYS.
|
|
||||||
.PP
|
|
||||||
Typing F8 at the right moment isn't easy, so you may want to change the way
|
|
||||||
Windows boots by editing the
|
|
||||||
.B MSDOS.SYS
|
|
||||||
file found in the root directory of your Windows system. This is alas not
|
|
||||||
trivial.
|
|
||||||
Open a window on your main drive, click on "\fBView\fP" and choose
|
|
||||||
"\fBOptions\fP." In the Options window choose "\fBView\fP" and enable
|
|
||||||
"\fBShow all files\fP". The MSDOS.SYS file should now be visible, among
|
|
||||||
several other hidden files. Right-click on the MSDOS.SYS icon, choose
|
|
||||||
"\fBProperties\fP" and disable "\fBRead-only\fP". Bring MSDOS.SYS into a
|
|
||||||
simple text editor such as Notepad. In the
|
|
||||||
.B "[Options]"
|
|
||||||
segment add the following lines (or change existing lines into):
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
BootMenu=2
|
|
||||||
BootMenuDelay=5
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
The first setting makes the Windows boot menu always visible, and the second
|
|
||||||
line changes the delay before booting to 5 seconds. Take care not to change
|
|
||||||
anything else, or things will go horribly wrong. Save MSDOS.SYS and exit.
|
|
||||||
Don't forget to make MSDOS.SYS read-only again, and also hide all the hidden
|
|
||||||
files again, unless you like it this way.
|
|
||||||
.SS "DOS compatibility box"
|
|
||||||
The 16-bit version of standard MINIX 3 can be run in real mode in a DOS box.
|
|
||||||
This is somewhat surprising, because it means Windows 95 simulates devices
|
|
||||||
like the keyboard, timer, and interrupt controller well enough to fool MINIX 3
|
|
||||||
into thinking that all is well. Alas it doesn't work as well under Windows
|
|
||||||
NT. Keypresses get lost if you type to fast, and using the floppy
|
|
||||||
occasionally locks MINIX 3 up. This is a bit disappointing, because it is the
|
|
||||||
only way to run MINIX 3 under NT. Under Windows 95 one is better off
|
|
||||||
putting the system in DOS at boot and then to run MINIX 3 in protected mode.
|
|
||||||
.PP
|
|
||||||
One thing that is better under NT is that the Boot Monitor is able to get a
|
|
||||||
so-called "Upper Memory Block", thereby raising useful memory to about 750K.
|
|
||||||
Windows 95 however hogs leftover UMB memory in a process named
|
|
||||||
.BR vmm32 ,
|
|
||||||
whatever that may be. To get
|
|
||||||
some of this memory you can put
|
|
||||||
.B "BOOT /U"
|
|
||||||
at the start of
|
|
||||||
.BR autoexec.bat .
|
|
||||||
The monitor will grab a 64K UMB if it can get it, and keep that memory safe
|
|
||||||
for use by MINIX 3 when it is later started from Windows.
|
|
||||||
.PP
|
|
||||||
The easiest way to start MINIX 3 is to give all MINIX 3 disk files the suffix
|
|
||||||
.BR MNX .
|
|
||||||
Doubleclick on the disk you want to run to make the "\fBOpen With\fP" window
|
|
||||||
appear. Click on "\fBOther\fP" and browse to the
|
|
||||||
.B BOOT.COM
|
|
||||||
program. Set the name of the .mnx files to "\fBMINIX 3 "disk" file\fP" in the
|
|
||||||
description box if you want everything right. In the future you can
|
|
||||||
just click on a MINIX 3 disk file to run it, you don't have to start a DOS
|
|
||||||
box first. (To make it perfect use "View", "Options", "File Types", choose
|
|
||||||
"MINIX 3 "disk" file", "Edit", "Change Icon", "Browse", select MINIX.ICO.)
|
|
||||||
.PP
|
|
||||||
When MINIX 3 shuts down it will try to reboot what it thinks is a PC. Windows
|
|
||||||
seems to assume that the DOS session has exited. Right-click on the
|
|
||||||
BOOT.COM program, "Properties", "Program", and enable "Close on exit" to make
|
|
||||||
the DOS box disappear automatically when MINIX 3 thinks it reboots. You may
|
|
||||||
also want to lock the font to
|
|
||||||
.BR 7x12 ,
|
|
||||||
or any other font that isn't ugly.
|
|
||||||
.PP
|
|
||||||
MINIX 3 disk files are opened in a write-exclusive mode. A second MINIX 3
|
|
||||||
session can only open it read-only, which may lead to a "can't open
|
|
||||||
root device" error.
|
|
||||||
.SS "Mkfile"
|
|
||||||
MINIX 3 disk files can be created or resized with the
|
|
||||||
.B mkfile
|
|
||||||
utility. Its two arguments are the size and name of the disk file. The
|
|
||||||
size is a number optionally followed by the letter
|
|
||||||
.BR k ,
|
|
||||||
.BR m
|
|
||||||
or
|
|
||||||
.BR g
|
|
||||||
to specify kilobytes, megabytes, or even gigabytes. So the call
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.B "mkfile 50m disk5.mnx"
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
will create a 50 megabyte file named
|
|
||||||
.BR disk5.mnx .
|
|
||||||
If the file already exist then it is shrunk or grown to 50 megabytes. No
|
|
||||||
data is lost if the file is grown. If the file is shrunk then only the data
|
|
||||||
that is cut off is lost. These features allow one to inrease the size of a
|
|
||||||
MINIX 3 /usr partition with the following recipe:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.ta +24n+2m
|
|
||||||
.nf
|
|
||||||
copy disk0.mnx disk0.new Copy the disk to disk0.new
|
|
||||||
mkfile 100M disk0.new Enlarge to 100 megabytes
|
|
||||||
boot disk0.mnx Boot the old "disk"
|
|
||||||
[ESC] Get the attention of the monitor
|
|
||||||
dosd5=disk0.new /dev/dosd5 becomes disk0.new
|
|
||||||
boot
|
|
||||||
\&...
|
|
||||||
login: root
|
|
||||||
.fi
|
|
||||||
.in +(24n+2m)
|
|
||||||
.ti -(24n+2m)
|
|
||||||
part Choose dosd5, move to the Size field of dosd7
|
|
||||||
partition, hit 'm' to fill it out to the end of the "disk". Write and quit.
|
|
||||||
.in -(24n+2m)
|
|
||||||
.nf
|
|
||||||
mkfs /dev/dosd7 Recreate the file system, but larger
|
|
||||||
mount /dev/dosd7 /mnt
|
|
||||||
cpdir -v /usr /mnt Copy /usr to the new disk's /usr to be
|
|
||||||
shutdown Back to the monitor
|
|
||||||
exit Back to DOS
|
|
||||||
ren disk0.mnx disk0.old
|
|
||||||
ren disk0.new disk0.mnx Replace old by new
|
|
||||||
boot disk0.mnx Run the larger system
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
Now MINIX 3 runs from a larger "disk". Don't worry if it claims to have
|
|
||||||
crashed, there wasn't a "shutdown" entry in /usr/adm/wtmp at the time it was
|
|
||||||
copied.
|
|
||||||
.PP
|
|
||||||
The above recipe is for a ordinary standard MINIX 3 installation with /usr on
|
|
||||||
the second and last partition.
|
|
||||||
.\" Minix-vmd usually has /usr on the third and
|
|
||||||
.\" last partition (dosd3 / dosd8), its
|
|
||||||
.\" .B mkfs
|
|
||||||
.\" command requires a
|
|
||||||
.\" .B "-t\ 2f"
|
|
||||||
.\" option to specify the file system type as "V2 flex", and it knows if
|
|
||||||
.\" it has crashed or not.
|
|
||||||
.SS Backups
|
|
||||||
In the recipe above you saw how simple it is to create a new system, just
|
|
||||||
copy a disk file. It is equally simple to make a backup, you just copy the
|
|
||||||
disk file. To make a test system: copy the disk file. To make another test
|
|
||||||
system: copy the disk file. Let friends have their own MINIX 3: copy the disk
|
|
||||||
file again. (Exciting, eh?)
|
|
||||||
.PP
|
|
||||||
You may want to save a MINIX 3 disk file in a ZIP file to save space. It may
|
|
||||||
look as a good idea to first run
|
|
||||||
.B "make clean"
|
|
||||||
in
|
|
||||||
.B /usr/src
|
|
||||||
to remove all the binary junk, but alas that has no effect at all.
|
|
||||||
The disk file is compressed under DOS, and there it is unknown which blocks
|
|
||||||
are in use and which are free. With the following trick you can make those
|
|
||||||
deleted blocks compress really well:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
cd /usr/tmp
|
|
||||||
echo >junk
|
|
||||||
while cat junk >>junk; do :; done
|
|
||||||
sync
|
|
||||||
rm junk
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
After these commands all free blocks contain newlines. Long runs of the
|
|
||||||
same byte happen to compress by a factor 1000, so the unused disk blocks
|
|
||||||
will almost disappear in the ZIP file.
|
|
||||||
.\" Under Minix-vmd you can use
|
|
||||||
.\" .PP
|
|
||||||
.\" .RS
|
|
||||||
.\" cp /dev/zero junk
|
|
||||||
.\" .RE
|
|
||||||
.\" .PP
|
|
||||||
.\" instead of the echo/while pair of lines above. Standard MINIX 3 doesn't have
|
|
||||||
.\" /dev/zero.
|
|
||||||
.SS "FAT driver"
|
|
||||||
The dos disk driver, described in
|
|
||||||
.BR dosd (4),
|
|
||||||
has two identities. By default you get the "\fBfile\fP" driver, that uses
|
|
||||||
DOS file I/O calls to access a large DOS file as a disk. The other
|
|
||||||
alternative is the "\fBFAT\fP" driver. The FAT driver sits on top of an
|
|
||||||
ordinary MINIX 3 disk driver, and interprets a partition as a FAT (File Access
|
|
||||||
Table) file system to find a file to use as a MINIX 3 disk. The result
|
|
||||||
has the same effect as the file driver, except that no costly calls to DOS
|
|
||||||
are made. To enable this feature you have to use the following Boot
|
|
||||||
environment settings:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
dosd = fat
|
|
||||||
dosd0 = hd1:\eminix\edisk0.mnx
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B dosd
|
|
||||||
setting tells MINIX 3 to use the FAT driver, and the
|
|
||||||
.B dosd0
|
|
||||||
setting tells the MINIX 3 device and DOS file name to use. Disk I/O should
|
|
||||||
be sped up nicely by this change, although typical use of MINIX 3 doesn't
|
|
||||||
require fast disk I/O, so the difference won't be too noticable.
|
|
||||||
.PP
|
|
||||||
Support for FAT-32 (big file system support added in the later Windows 95
|
|
||||||
releases) has not been tested very well. The FAT-12 and FAT-16 code has
|
|
||||||
been used a lot, and seems safe. Note the risks inherent in these
|
|
||||||
drivers: The file driver uses simple DOS file I/O calls, leaving it to
|
|
||||||
DOS to know its own file system. The FAT driver interprets FAT file system
|
|
||||||
structures by itself. MINIX 3 booted from a real hard disk partition can
|
|
||||||
only use DOS disk files through the FAT driver.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR dosd (4),
|
|
||||||
.BR monitor (8),
|
|
||||||
.BR usage (8).
|
|
||||||
.SH NOTES
|
|
||||||
Use at your own risk.
|
|
||||||
.SH BUGS
|
|
||||||
Hasn't been tried under Windows 98 yet.
|
|
||||||
.PP
|
|
||||||
Pray the deity of your choice will forgive you for running a UNIX-like
|
|
||||||
system as an ordinary DOS program. The author of this code is already
|
|
||||||
doomed. When his time comes the daemons wi*(&%*$%*&
|
|
||||||
.br
|
|
||||||
Memory fault \- core dumped
|
|
||||||
.SH AUTHOR
|
|
||||||
Kees J. Bot (kjb@cs.vu.nl)
|
|
145
man/man8/ftpd.8
145
man/man8/ftpd.8
|
@ -1,145 +0,0 @@
|
||||||
.\" Copyright (c) 1985 Regents of the University of California.
|
|
||||||
.\" All rights reserved. The Berkeley software License Agreement
|
|
||||||
.\" specifies the terms and conditions for redistribution.
|
|
||||||
.\"
|
|
||||||
.\" @(#)ftpd.8c 6.4 (Berkeley) 5/28/86
|
|
||||||
.\"
|
|
||||||
.TH FTPD 8
|
|
||||||
.SH NAME
|
|
||||||
ftpd, in.ftpd, setup.anonftp \- DARPA Internet File Transfer Protocol server
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B "ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd"
|
|
||||||
.br
|
|
||||||
.B "tcpd ftp /usr/sbin/in.ftpd"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.B Ftpd
|
|
||||||
is the DARPA Internet File Transfer Prototocol
|
|
||||||
server process. The server uses the TCP protocol
|
|
||||||
and listens at the port specified in the ``ftp''
|
|
||||||
service specification; see
|
|
||||||
.BR services (5).
|
|
||||||
.PP
|
|
||||||
The ftp server currently supports the following ftp
|
|
||||||
requests; case is not distinguished.
|
|
||||||
.PP
|
|
||||||
.nf
|
|
||||||
.ta \w'Request 'u
|
|
||||||
\fBRequest Description\fP
|
|
||||||
ABOR abort previous command
|
|
||||||
ACCT specify account (ignored)
|
|
||||||
ALLO allocate storage (vacuously)
|
|
||||||
APPE append to a file
|
|
||||||
CDUP change to parent of current working directory
|
|
||||||
CWD change working directory
|
|
||||||
DELE delete a file
|
|
||||||
HELP give help information
|
|
||||||
LIST give list files in a directory (``ls -lA'')
|
|
||||||
MKD make a directory
|
|
||||||
MODE specify data transfer \fImode\fP
|
|
||||||
NLST give name list of files in directory (``ls'')
|
|
||||||
NOOP do nothing
|
|
||||||
PASS specify password
|
|
||||||
PASV prepare for server-to-server transfer
|
|
||||||
PORT specify data connection port
|
|
||||||
PWD print the current working directory
|
|
||||||
QUIT terminate session
|
|
||||||
RETR retrieve a file
|
|
||||||
RMD remove a directory
|
|
||||||
RNFR specify rename-from file name
|
|
||||||
RNTO specify rename-to file name
|
|
||||||
STOR store a file
|
|
||||||
STOU store a file with a unique name
|
|
||||||
STRU specify data transfer \fIstructure\fP
|
|
||||||
TYPE specify data transfer \fItype\fP
|
|
||||||
USER specify user name
|
|
||||||
XCUP change to parent of current working directory
|
|
||||||
XCWD change working directory
|
|
||||||
XMKD make a directory
|
|
||||||
XPWD print the current working directory
|
|
||||||
XRMD remove a directory
|
|
||||||
.fi
|
|
||||||
.PP
|
|
||||||
The remaining ftp requests specified in Internet RFC 959 are
|
|
||||||
recognized, but not implemented.
|
|
||||||
.PP
|
|
||||||
The ftp server will abort an active file transfer only when the
|
|
||||||
ABOR command is preceded by a Telnet "Interrupt Process" (IP)
|
|
||||||
signal and a Telnet "Synch" signal in the command Telnet stream,
|
|
||||||
as described in Internet RFC 959.
|
|
||||||
.PP
|
|
||||||
.B Ftpd
|
|
||||||
interprets file names according to the ``globbing''
|
|
||||||
conventions used by
|
|
||||||
.BR csh (1).
|
|
||||||
This allows users to utilize the metacharacters ``*?[]{}~''.
|
|
||||||
.PP
|
|
||||||
.B Ftpd
|
|
||||||
authenticates users according to three rules.
|
|
||||||
.IP 1)
|
|
||||||
The user name must be in the password data base,
|
|
||||||
.BR /etc/passwd ,
|
|
||||||
and not have a null password. In this case a password
|
|
||||||
must be provided by the client before any file operations
|
|
||||||
may be performed.
|
|
||||||
.IP 2)
|
|
||||||
The user name must not appear in the file
|
|
||||||
.BR /etc/ftpusers .
|
|
||||||
.IP 3)
|
|
||||||
If the user name is ``anonymous'' or ``ftp'', an
|
|
||||||
anonymous ftp account must be present in the password
|
|
||||||
file (user ``ftp''). In this case the user is allowed
|
|
||||||
to log in by specifying any password (by convention this
|
|
||||||
is given as the client host's name).
|
|
||||||
.PP
|
|
||||||
In the last case,
|
|
||||||
.B ftpd
|
|
||||||
takes special measures to restrict the client's access privileges.
|
|
||||||
The server performs a
|
|
||||||
.BR chroot (2)
|
|
||||||
command to the home directory of the ``ftp'' user.
|
|
||||||
In order that system security is not breached, it is recommended
|
|
||||||
that the ``ftp'' subtree be constructed with care; the following
|
|
||||||
rules are recommended.
|
|
||||||
.IP ~ftp)
|
|
||||||
Make the home directory owned by ``ftp'' and unwritable by anyone.
|
|
||||||
.IP ~ftp/bin)
|
|
||||||
Make this directory owned by the super-user and unwritable by
|
|
||||||
anyone. The program
|
|
||||||
.BR ls (1)
|
|
||||||
must be present to support the list commands. This
|
|
||||||
program should have mode 111.
|
|
||||||
.IP ~ftp/etc)
|
|
||||||
This directory could be created, and could have
|
|
||||||
.BR passwd (5)
|
|
||||||
and
|
|
||||||
.BR group (5)
|
|
||||||
databases in it so that
|
|
||||||
.B ls
|
|
||||||
can show file ownership, but outsiders will grab your password file and
|
|
||||||
misuse it to spam you. So don't bother.
|
|
||||||
.IP ~ftp/pub)
|
|
||||||
Make this directory mode 755 and owned by the super-user. Create
|
|
||||||
directories in it owned by users if those users want to manage an
|
|
||||||
anonymous ftp directory.
|
|
||||||
.IP ~ftp/pub/incoming)
|
|
||||||
Optionally create this directory for anonymous uploads. Make it mode
|
|
||||||
777. The FTP daemon will create files with mode 266, so remote users
|
|
||||||
can write a file, but only local users can do something with it.
|
|
||||||
.PP
|
|
||||||
The script
|
|
||||||
.B setup.anonftp
|
|
||||||
can be used to create or check an anonymous FTP tree.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR ftp (1).
|
|
||||||
.SH BUGS
|
|
||||||
The anonymous account is inherently dangerous and should
|
|
||||||
avoided when possible.
|
|
||||||
.ig \" MINIX 3 doesn't have privileged port numbers (yet?)
|
|
||||||
.PP
|
|
||||||
The server must run as the super-user
|
|
||||||
to create sockets with privileged port numbers. It maintains
|
|
||||||
an effective user id of the logged in user, reverting to
|
|
||||||
the super-user only when binding addresses to sockets. The
|
|
||||||
possible security holes have been extensively
|
|
||||||
scrutinized, but are possibly incomplete.
|
|
||||||
..
|
|
|
@ -1,395 +0,0 @@
|
||||||
.TH INSTALLBOOT 8
|
|
||||||
.SH NAME
|
|
||||||
installboot \- make a device bootable
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B installboot \-i(mage)
|
|
||||||
.I image
|
|
||||||
.RI [ label :] kernel
|
|
||||||
.IR "mm fs" " ... " init
|
|
||||||
.br
|
|
||||||
.B installboot \-(e)x(tract)
|
|
||||||
.I image
|
|
||||||
.br
|
|
||||||
.B installboot \-d(evice)
|
|
||||||
.I device bootblock boot
|
|
||||||
.RI [[ label :] image
|
|
||||||
\&...]
|
|
||||||
.br
|
|
||||||
.B installboot \-b(oot)
|
|
||||||
.I device bootblock boot
|
|
||||||
.RI [ label :] image
|
|
||||||
\&...
|
|
||||||
.br
|
|
||||||
.B installboot \-m(aster)
|
|
||||||
.I device masterboot
|
|
||||||
.RI [ keys " [" logical ]]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.de SP
|
|
||||||
.if t .sp 0.4
|
|
||||||
.if n .sp
|
|
||||||
..
|
|
||||||
.B Installboot
|
|
||||||
may be used to make a device bootable by constructing a kernel image and
|
|
||||||
installing bootstrap code into the boot block of a MINIX 3 file system. To
|
|
||||||
understand how this can be done one first has to know what happens when a
|
|
||||||
PC is booted.
|
|
||||||
.PP
|
|
||||||
When the power is turned on the typical PC will try to read the first sector
|
|
||||||
from the first floppy disk or from the first hard disk into memory and execute
|
|
||||||
it. The code obtained from the hard disk (from the so-called master boot
|
|
||||||
sector) will immediately replace itself by the code found in the first sector
|
|
||||||
of the active partition. Thus the PC is now executing the bootstrap code found
|
|
||||||
in the first sector of /dev/fd0, /dev/c0d0p0, /dev/c0d0p1, /dev/c0d0p2, or
|
|
||||||
/dev/c0d0p3 (assuming the boot disk is attached to controller 0.)
|
|
||||||
The bootstrap will locate the operating system on the device it itself was
|
|
||||||
loaded from, load it, and execute it.
|
|
||||||
.PP
|
|
||||||
To make a MINIX 3 file system
|
|
||||||
.B /dev/fd0
|
|
||||||
mounted on
|
|
||||||
.B /mnt
|
|
||||||
bootable, enter the following:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
.ft B
|
|
||||||
cp /usr/mdec/boot /mnt/boot
|
|
||||||
.SP
|
|
||||||
installboot \-i /mnt/minix kernel mm fs init
|
|
||||||
.SP
|
|
||||||
installboot \-d /dev/fd0 /usr/mdec/bootblock boot
|
|
||||||
.ft P
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
The "boot" program in the example is named the "Boot Monitor". It is loaded
|
|
||||||
by the bootblock code placed in the boot sector of /dev/fd0 and it will take
|
|
||||||
care of loading the kernel image "minix" from the root directory of the
|
|
||||||
file system. See
|
|
||||||
.BR monitor (8)
|
|
||||||
for a description of the Boot Monitor. Note that
|
|
||||||
.B boot
|
|
||||||
is a name in the file system on
|
|
||||||
.B /dev/fd0
|
|
||||||
in this example, the same file as
|
|
||||||
.BR /mnt/boot .
|
|
||||||
Making
|
|
||||||
.B /mnt/minix
|
|
||||||
is normally not necessary, there is usually a kernel image in the
|
|
||||||
.B tools
|
|
||||||
directory.
|
|
||||||
.SH OPTIONS
|
|
||||||
.B \-i(mage)
|
|
||||||
.I image
|
|
||||||
.RI [ label :] kernel
|
|
||||||
.IR "mm fs" " ... " init
|
|
||||||
.RS
|
|
||||||
The
|
|
||||||
.B \-image
|
|
||||||
option (or the
|
|
||||||
.B \-i
|
|
||||||
shorthand) combines the executable files needed to run MINIX 3 in one file.
|
|
||||||
Only the names and a few zero bytes are inserted into the image. The name
|
|
||||||
is for identification and the zeros are used to pad separate pieces to
|
|
||||||
sector boundaries for fast loading.
|
|
||||||
.SP
|
|
||||||
An executable may be prefixed by a label. The Monitor may be instructed to
|
|
||||||
load processes by label. So more than one kernel process may be included in
|
|
||||||
the image, each with a different winchester driver for instance. So if you
|
|
||||||
have compiled two different kernels with an AT or XT driver then
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
.BI "installboot \-i" " image AT:at_kernel XT:xt_kernel mm fs init"
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
will make an image with two different labeled kernels and one
|
|
||||||
unlabeled set of the other binaries.
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
.B \-(e)x(tract)
|
|
||||||
.I image
|
|
||||||
.RS
|
|
||||||
Extract the binaries from
|
|
||||||
.I image
|
|
||||||
under the names stored in the image. (The name includes the optional label.)
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
.B \-d(evice)
|
|
||||||
.I device bootblock boot
|
|
||||||
.RI [[ label :] image
|
|
||||||
\&...]
|
|
||||||
.RS
|
|
||||||
Installs
|
|
||||||
.I bootblock
|
|
||||||
in the boot sector of
|
|
||||||
.I device
|
|
||||||
together with the disk addresses to
|
|
||||||
.IR boot .
|
|
||||||
These disk addresses are needed to load
|
|
||||||
.I boot
|
|
||||||
from the file system at boot time. The argument
|
|
||||||
.I boot
|
|
||||||
is first searched in the file system on
|
|
||||||
.IR device .
|
|
||||||
If it is not found then it is read as a normal file and added at the end of
|
|
||||||
the file system. The file system should be smaller than the device it is on
|
|
||||||
to allow this. Any extra images are also added to the end as described
|
|
||||||
under
|
|
||||||
.BR \-boot .
|
|
||||||
(Make sure you understand all this.)
|
|
||||||
.SP
|
|
||||||
The device need not be mounted when
|
|
||||||
.B installboot
|
|
||||||
is run, nor does it matter if it is.
|
|
||||||
.SP
|
|
||||||
.B Installboot
|
|
||||||
needs to be run again if
|
|
||||||
.I boot
|
|
||||||
is rewritten, because it will then occupy a new place on the disk.
|
|
||||||
.SP
|
|
||||||
Old boot parameters are kept if there are no images added.
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
.B \-b(oot)
|
|
||||||
.I device bootblock boot
|
|
||||||
.RI [ label :] image
|
|
||||||
\&...
|
|
||||||
.RS
|
|
||||||
This option fills a blank floppy in
|
|
||||||
.I device
|
|
||||||
with boot code and kernel images. This "boot disk" does not have a root
|
|
||||||
file system, only the Boot Monitor and MINIX 3 kernels. The boot parameters
|
|
||||||
sector is filled with code that enables menu options for selecting an
|
|
||||||
image. After loading an image, the Monitor will ask you to insert a root
|
|
||||||
file system diskette before starting MINIX 3.
|
|
||||||
.SP
|
|
||||||
The labels used on the images should match those on the executables used
|
|
||||||
inside the image. You can put a comma separated list of labels on an image
|
|
||||||
for each label used within the image. For the image created earlier one
|
|
||||||
would create a boot floppy like this:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
.nf
|
|
||||||
.BI "installboot \-b /dev/fd0 bootblock boot" " AT,XT:image"
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
If a label-list is omitted on an image, then that image will be selected by
|
|
||||||
default. (Like in the normal one image, no labels case.)
|
|
||||||
.SP
|
|
||||||
Note that
|
|
||||||
.B \-device
|
|
||||||
and
|
|
||||||
.B \-boot
|
|
||||||
together allow you to make a boot floppy with or without a root file system.
|
|
||||||
With the boot code in the file system, attached to the end of it, or after
|
|
||||||
the boot block. And with one or more kernel images in the file system or
|
|
||||||
at the end of the device. Somewhat confusing.
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
.B \-m(aster)
|
|
||||||
.I device masterboot
|
|
||||||
.RI [ keys " [" logical ]]
|
|
||||||
.RS
|
|
||||||
This option installs the
|
|
||||||
.I masterboot
|
|
||||||
program into the boot sector of the given device. If another device is
|
|
||||||
given instead of
|
|
||||||
.I masterboot
|
|
||||||
then its bootstrap code is copied to
|
|
||||||
.IR device .
|
|
||||||
The master bootstrap on a hard disk boots the active partition on that disk
|
|
||||||
at boot time. The MS-DOS fdisk command normally puts a master bootstrap on
|
|
||||||
the hard disk. MINIX 3 has two bootstraps that can be used as a master
|
|
||||||
bootstrap,
|
|
||||||
.B masterboot
|
|
||||||
and
|
|
||||||
.BR jumpboot.
|
|
||||||
.SP
|
|
||||||
.B Masterboot
|
|
||||||
is a fairly normal master bootstrap that works as follows:
|
|
||||||
.RS
|
|
||||||
.SP
|
|
||||||
If installed on a hard disk then it will load the bootstrap of the active
|
|
||||||
partition and run it.
|
|
||||||
.B Masterboot
|
|
||||||
can be put in the first sector of a hard disk to boot the active partition,
|
|
||||||
or in the first sector of a MINIX 3 partition to boot the active subpartition.
|
|
||||||
.SP
|
|
||||||
If installed on a MINIX 3 floppy then it will try to boot the next floppy or
|
|
||||||
the first hard disk. Ideal for floppies with just data on it, they will no
|
|
||||||
longer obstruct the boot process if left in the drive. Also a very useful
|
|
||||||
trick to boot from floppy drive 1.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
The other bootstrap named
|
|
||||||
.B jumpboot
|
|
||||||
is used for the weird cases:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
If your default operating system is installed on another disk then
|
|
||||||
.B jumpboot
|
|
||||||
can be installed on the first disk and instructed to boot the disk,
|
|
||||||
partition or subpartition that must be booted by default.
|
|
||||||
.SP
|
|
||||||
If one of your operating systems insists on being active when booted then use
|
|
||||||
.B jumpboot
|
|
||||||
to ignore the active flag and boot your preferred O.S. instead. The Boot
|
|
||||||
Monitor's "\fBboot\ \(**\fP" trick to activate the partition to boot is
|
|
||||||
useful here.
|
|
||||||
.SP
|
|
||||||
To boot a logical partition within an extended partition. Note that you can
|
|
||||||
put
|
|
||||||
.B jumpboot
|
|
||||||
in the first sector of the extended partition in this case, with the
|
|
||||||
extended partition marked active.
|
|
||||||
.SP
|
|
||||||
If you hold down the ALT key while
|
|
||||||
.B jumpboot
|
|
||||||
is being executed, then you can type the disk, partition or subpartition
|
|
||||||
you want to boot as one to three digits followed by typing ENTER.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B Jumpboot
|
|
||||||
can be programmed to boot a certain partition with the
|
|
||||||
.I keys
|
|
||||||
argument and optionally also the
|
|
||||||
.I logical
|
|
||||||
argument.
|
|
||||||
.I Keys
|
|
||||||
are one to three digits naming the disk, partition or subpartition. If the
|
|
||||||
device to boot is
|
|
||||||
.BR /dev/c0d1p3s0 ,
|
|
||||||
then
|
|
||||||
.I keys
|
|
||||||
is
|
|
||||||
.BR 130 .
|
|
||||||
These are the same three digits you can type manually if you hold down ALT
|
|
||||||
at boot. To program
|
|
||||||
.B jumpboot
|
|
||||||
to boot a logical partition within an extended partition, let
|
|
||||||
.I keys
|
|
||||||
be just a disk number, and specify
|
|
||||||
.I logical
|
|
||||||
as the name of the logical partition on that disk that is to be booted.
|
|
||||||
(Actually
|
|
||||||
.I logical
|
|
||||||
can be any device name, but this form should be avoided because it offers
|
|
||||||
less checking to see if the device is still there after a disk
|
|
||||||
rearrangement.)
|
|
||||||
.SP
|
|
||||||
A backup copy of the current master bootstrap (including the partition
|
|
||||||
table) can be made with:
|
|
||||||
.RS
|
|
||||||
.SP
|
|
||||||
dd if=\fIdevice\fP of=\fIbackup-file\fP count=1
|
|
||||||
.SP
|
|
||||||
.RE
|
|
||||||
A simple 'cp \fIbackup-file\fP \fIdevice\fP' will put it back. You can
|
|
||||||
also use
|
|
||||||
.B fdisk /mbr
|
|
||||||
under MS-DOS 5.0 (or newer) to restore the master bootstrap.
|
|
||||||
.RE
|
|
||||||
.RE
|
|
||||||
.SH FILES
|
|
||||||
.TP 25
|
|
||||||
.B /usr/mdec/bootblock
|
|
||||||
MINIX 3 bootstrap for the Minix root device. To be placed in the boot sector.
|
|
||||||
.TP
|
|
||||||
.B /usr/mdec/boot
|
|
||||||
MINIX 3 Boot Monitor. Can usually be found in the root directory of a bootable
|
|
||||||
device.
|
|
||||||
.TP
|
|
||||||
.B /usr/mdec/masterboot
|
|
||||||
Master bootstrap. Can be placed in the first sector of a disk to select the
|
|
||||||
active partition. In a MINIX 3 primary partition it selects the active
|
|
||||||
subpartition.
|
|
||||||
.TP
|
|
||||||
.B /usr/mdec/jumpboot
|
|
||||||
Special "boot this" bootstrap.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR part (8),
|
|
||||||
.BR monitor (8).
|
|
||||||
.SH DIAGNOSTICS
|
|
||||||
.I File
|
|
||||||
is not an executable
|
|
||||||
.RS
|
|
||||||
What you think is boot code or part of the kernel isn't.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.I Program
|
|
||||||
will crash, text/data segment larger then 64K
|
|
||||||
.RS
|
|
||||||
One of the 16-bit programs added to an image has a text or data segment
|
|
||||||
that is larger than 64K. You probably enabled too many drivers, or
|
|
||||||
configured too many buffers.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.I File
|
|
||||||
can't be attached to
|
|
||||||
.I device
|
|
||||||
.RS
|
|
||||||
You are trying to put the boot monitor or an image after a file system, but
|
|
||||||
there is no or not enough space. Did you specify the full path of the
|
|
||||||
monitor instead of just "boot"?
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.I Device
|
|
||||||
is not a MINIX 3 file system
|
|
||||||
.RS
|
|
||||||
You are using
|
|
||||||
.B \-device
|
|
||||||
on a device that doesn't contain a file system. Maybe you specified the
|
|
||||||
wrong device, maybe you should make a file system, or maybe you should use
|
|
||||||
.BR \-boot .
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.I Device
|
|
||||||
contains a file system
|
|
||||||
.RS
|
|
||||||
You are about to destroy a file system with
|
|
||||||
.BR \-boot .
|
|
||||||
Maybe you meant to use
|
|
||||||
.BR \-device ?
|
|
||||||
You have 10 seconds to make up your mind...
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.I File
|
|
||||||
is too big
|
|
||||||
.RS
|
|
||||||
Several types of messages like these will tell you that
|
|
||||||
.I file
|
|
||||||
can't be installed in a boot sector, or that there is no room to add some
|
|
||||||
parameters, etc. Is
|
|
||||||
.I file
|
|
||||||
really a bootstrap?
|
|
||||||
.RE
|
|
||||||
.SS "Bootstrap errors"
|
|
||||||
Read error
|
|
||||||
.RS
|
|
||||||
A read error trying to get the next bit of boot code. You may even get the
|
|
||||||
BIOS error code in hex. Either the device has a bad block, or jumpboot is
|
|
||||||
told to read a nonexistent disk.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
No active partition
|
|
||||||
.RS
|
|
||||||
None of the partitions in a partition table is marked active.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
Not bootable
|
|
||||||
.RS
|
|
||||||
Partition does not exist (jumpboot), or it's bootstrap isn't executable.
|
|
||||||
.RE
|
|
||||||
.SH NOTES
|
|
||||||
The MINIX 3 bootstraps can boot beyond the 8G disk size limit if the BIOS
|
|
||||||
supports the IBM/MS INT 13 Extensions. Alas only Minix-vmd can make use of
|
|
||||||
this, standard MINIX 3 has a 4G disk size limit.
|
|
||||||
.SH BUGS
|
|
||||||
It has four more options than the SunOS installboot program it is modeled
|
|
||||||
after.
|
|
||||||
.PP
|
|
||||||
The bootblock code has been crunched to such ugliness that you can use it
|
|
||||||
to scare little kids out of your garden.
|
|
||||||
.SH AUTHOR
|
|
||||||
Kees J. Bot (kjb@cs.vu.nl)
|
|
||||||
.\"
|
|
||||||
.\" $PchId: installboot.8,v 1.7 2000/08/13 22:09:31 philip Exp $
|
|
0
man/man8/loadramdisk.8
Executable file → Normal file
0
man/man8/loadramdisk.8
Executable file → Normal file
|
@ -1,606 +0,0 @@
|
||||||
.TH MONITOR 8
|
|
||||||
.SH NAME
|
|
||||||
monitor, edparams \- load and start MINIX 3, modify boot parameters
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B /boot
|
|
||||||
.br
|
|
||||||
.B edparams
|
|
||||||
.I device
|
|
||||||
.RI [ command " ...]"
|
|
||||||
.br
|
|
||||||
.B boot.com
|
|
||||||
.I virdisk
|
|
||||||
.RI [ command " ...]"
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.de SP
|
|
||||||
.if t .sp 0.4
|
|
||||||
.if n .sp
|
|
||||||
..
|
|
||||||
This text describes the Boot Monitor, a boot time interactive program designed
|
|
||||||
not only to load and start MINIX 3, its most important task, but to also
|
|
||||||
provide an interface to configure MINIX 3 and to boot other operating systems.
|
|
||||||
.PP
|
|
||||||
The monitor is controlled with an environment that is modeled after the
|
|
||||||
Bourne shell. This environment is filled at startup with default values
|
|
||||||
that depend on the machine the monitor is running on and the environment
|
|
||||||
settings saved into the boot parameters sector (the second sector on a
|
|
||||||
device). When the environment is loaded, the monitor executes the function
|
|
||||||
named
|
|
||||||
.BR main ,
|
|
||||||
which by default starts a simple menu.
|
|
||||||
.PP
|
|
||||||
The environment can be manipulated at boot time from the monitor prompt,
|
|
||||||
but may also be edited using
|
|
||||||
.B edparams
|
|
||||||
on a given device.
|
|
||||||
.B Edparams
|
|
||||||
simulates the monitor as much as it can, echoing commands it can't execute
|
|
||||||
between brackets. It can also be used in Makefiles and scripts by giving
|
|
||||||
it commands as arguments.
|
|
||||||
.PP
|
|
||||||
The DOS version of the monitor, usually named
|
|
||||||
.B boot.com
|
|
||||||
under DOS, boots MINIX 3 from a "DOS virtual disk".
|
|
||||||
.B Boot.com
|
|
||||||
is a simple COM program that interprets a DOS
|
|
||||||
file as a disk, loads a MINIX 3 kernel from the active partition in the same
|
|
||||||
way as the BIOS based monitor, and executes it to start MINIX 3. All the
|
|
||||||
monitor commands function in the same way, except for the
|
|
||||||
.B boot
|
|
||||||
command, it can only load MINIX 3. The monitor grabs as much free memory as
|
|
||||||
it can for MINIX 3 to work in, as the
|
|
||||||
.B memory
|
|
||||||
variable shows. Further details on how to run MINIX 3 under DOS, Windows 95,
|
|
||||||
or even Windows NT are written down in
|
|
||||||
.BR dosminix (8).
|
|
||||||
.SH COMMANDS
|
|
||||||
The monitor is best described by the commands you can type to the '>'
|
|
||||||
prompt. This is known as the "monitor mode". You can enter this mode by
|
|
||||||
hitting the Escape key. These are the monitor commands:
|
|
||||||
.PP
|
|
||||||
\fIname\fP = [\fBdevice\fP] \fIvalue\fP
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
Set environment variable.
|
|
||||||
.br
|
|
||||||
Changes the value of
|
|
||||||
.I name
|
|
||||||
to
|
|
||||||
.IR value .
|
|
||||||
The optional word
|
|
||||||
.B device
|
|
||||||
marks
|
|
||||||
.I name
|
|
||||||
as being subject to device translation. (See the section on devices.) These
|
|
||||||
(name, value) pairs are passed to the kernel who uses them to configure
|
|
||||||
itself. These variables are passed by default:
|
|
||||||
.SP
|
|
||||||
.B rootdev
|
|
||||||
.RS
|
|
||||||
This is the device used as your root device. It is by default set to
|
|
||||||
.BR ram,
|
|
||||||
which means that the device specified by
|
|
||||||
.B ramimagedev
|
|
||||||
will be loaded into the RAM disk and used as root. If you change this
|
|
||||||
variable then a physical device will be used as root, and the RAM disk will
|
|
||||||
be uninitialized and have the size specified by
|
|
||||||
.BR ramsize .
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B ramimagedev
|
|
||||||
.RS
|
|
||||||
Describes the device to use to initialize the RAM disk if
|
|
||||||
.B rootdev
|
|
||||||
is set to
|
|
||||||
.BR ram .
|
|
||||||
It's by default set to
|
|
||||||
.BR bootdev ,
|
|
||||||
a special name for the device the monitor booted from.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B ramsize
|
|
||||||
.RS
|
|
||||||
The size of the RAM disk. If the RAM disk is used for the root file system
|
|
||||||
then the root file system is stretched out to
|
|
||||||
.B ramsize
|
|
||||||
if possible.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B processor
|
|
||||||
.RS
|
|
||||||
Set by default to
|
|
||||||
.BR 86 ,
|
|
||||||
.BR 186 ,
|
|
||||||
.BR 286 ,
|
|
||||||
.BR 386 ,
|
|
||||||
.BR 486 ", ..."
|
|
||||||
depending on the hardware you have. You can set it to a smaller value to
|
|
||||||
test your kernel in a more limited environment.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B bus
|
|
||||||
.RS
|
|
||||||
The type of system bus, either
|
|
||||||
.BR xt ,
|
|
||||||
.BR at
|
|
||||||
or
|
|
||||||
.BR mca .
|
|
||||||
This answers basic questions like: "How many interrupt controllers and how
|
|
||||||
to initialize?" Or: "Does the keyboard have LEDs?"
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B memory
|
|
||||||
.RS
|
|
||||||
List of memory free for use by MINIX 3. It is a comma separated list of
|
|
||||||
.IR base:size
|
|
||||||
pairs denoting the byte offsets and sizes of free memory in hexadecimal.
|
|
||||||
.B "800:925E0,100000:F00000"
|
|
||||||
is a typical example of about 585K starting at 2K, and 15M starting at 1M.
|
|
||||||
(The first 2K are BIOS parameters and the 53K under the 640K boundary is
|
|
||||||
the monitor itself.) The very last number you can play with if you know
|
|
||||||
what you are doing. Either increase it if the monitor has it wrong, or
|
|
||||||
decrease it to test if MINIX 3 still runs with less memory then normal.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B video
|
|
||||||
.RS
|
|
||||||
Describes capabilities of the VDU:
|
|
||||||
.BR mda ,
|
|
||||||
.BR cga ,
|
|
||||||
.B ega
|
|
||||||
or
|
|
||||||
.BR vga .
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B chrome
|
|
||||||
.RS
|
|
||||||
Either
|
|
||||||
.B color
|
|
||||||
or
|
|
||||||
.BR mono .
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B c0
|
|
||||||
.RS
|
|
||||||
By default
|
|
||||||
.B at
|
|
||||||
(AT compatibles),
|
|
||||||
.B bios
|
|
||||||
(XT or PS/2), or
|
|
||||||
.B dosfile
|
|
||||||
(running under DOS).
|
|
||||||
The
|
|
||||||
.B c0
|
|
||||||
variable binds a driver to the first controller, i.e. the
|
|
||||||
.B /dev/c0*
|
|
||||||
devices. The monitor sets
|
|
||||||
.B c0
|
|
||||||
to a suitable default, so that most machines can find their disk.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B console
|
|
||||||
.RS
|
|
||||||
If set to a hexadecimal value it makes the monitor set the BIOS video mode to
|
|
||||||
this value when MINIX 3 is started.
|
|
||||||
This allows the use of video modes with more rows or colums than the
|
|
||||||
standard 80x25 mode. You can use any text mode in the 00-FF range, and VESA
|
|
||||||
extended modes in the 100-FFF range. Most text modes use a 9x16 font with
|
|
||||||
400 scanlines on screen, so you see 400/16 = 25 lines. The text mode can be
|
|
||||||
modified by adding special flags to the console setting. Add
|
|
||||||
2000 to switch to 480 scan lines, adding 20% more lines to the screen. Add
|
|
||||||
4000 to select a 9x14 font, so 28 or 34 lines are shown. Add 8000 instead
|
|
||||||
to select an 8x8 font showing 50 or 60 lines. Each setting has drawbacks.
|
|
||||||
Using 480 scanlines implies a 60 Hz refresh, so the screen may flicker. The
|
|
||||||
8x8 font looks squashed. More letters on screen require more memory, so there
|
|
||||||
is less for virtual consoles. Interesting modes to try are 4003 (80x28),
|
|
||||||
2003 (80x30), 6003 (80x34), 8003 (80x50), A003 (80x60), 109 (132x25),
|
|
||||||
10A (132x43), 10B (132x50), 10C (132x60). The 109 VESA mode is often
|
|
||||||
available, and can be modified like mode 3. Use mode 7 instead of 3 for
|
|
||||||
monochrome. Which modes and flags work can only be found out by experiment.
|
|
||||||
More parameters may follow the mode number that are of interest
|
|
||||||
to the console driver, see
|
|
||||||
.BR boot (8).
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B dosfile-d0
|
|
||||||
.RS
|
|
||||||
Set by the DOS version of the monitor to the name of the virtual disk, i.e.
|
|
||||||
the
|
|
||||||
.I virdisk
|
|
||||||
argument as shown above. The "dosfile" driver
|
|
||||||
will use this as the name of the file to use as a disk.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
Two variables are only used by the monitor, even though they are passed to the
|
|
||||||
kernel too:
|
|
||||||
.SP
|
|
||||||
.B image
|
|
||||||
.RS
|
|
||||||
The name of the file containing the kernel image, by default
|
|
||||||
.BR minix .
|
|
||||||
If it refers to a directory however then the newest file inside the
|
|
||||||
directory is chosen to be the kernel image. The names inside
|
|
||||||
.B /minix/
|
|
||||||
are best set to the MINIX 3 version you are using, which looks good when the
|
|
||||||
monitor prints its name. Rules for pretty printing image names:
|
|
||||||
.RS
|
|
||||||
.SP
|
|
||||||
A '/' or '_' is changed to a space.
|
|
||||||
.SP
|
|
||||||
The first letter is changed from lowercase to uppercase.
|
|
||||||
.SP
|
|
||||||
An 'r' if followed by a digit changes to " revision ".
|
|
||||||
.RE
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B label
|
|
||||||
.RS
|
|
||||||
If set then only processes marked with this label or without a label are
|
|
||||||
loaded from the image.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B Installboot \-boot
|
|
||||||
will create functions to select images and labels. These functions will set
|
|
||||||
.B label
|
|
||||||
and
|
|
||||||
.B image
|
|
||||||
and echo what you selected. The two numbers separated by a colon used as an
|
|
||||||
image name tell the starting sector and sector count of the image on disk.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fIname\fP() \fIcommand\fP
|
|
||||||
.RS
|
|
||||||
Define function.
|
|
||||||
.br
|
|
||||||
Functions may be used to bundle a set of commands, so that you can easily
|
|
||||||
boot MINIX 3 with a different set of parameters then normal. E.g.
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
ram() { rootdev=ram; boot }
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
will allow you to run MINIX 3 with the root device on RAM for a change, if you
|
|
||||||
normally use a real device as root. There are three predefined functions,
|
|
||||||
.BR leader ,
|
|
||||||
with default value an
|
|
||||||
.B echo
|
|
||||||
command that shows the monitor's startup banner,
|
|
||||||
.BR main ,
|
|
||||||
with default value
|
|
||||||
.BR menu ,
|
|
||||||
and
|
|
||||||
.BR trailer ,
|
|
||||||
with default value a command that clears the screen.
|
|
||||||
The monitor executes
|
|
||||||
.B leader;main
|
|
||||||
at startup to show the banner message and a menu. The
|
|
||||||
.B trailer
|
|
||||||
function is executed just before MINIX 3 is started. These three functions can
|
|
||||||
be redefined as you please.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fIname\fP(\fIkey\fP) \fIcommand\fP
|
|
||||||
.RS
|
|
||||||
Define kernel selecting function.
|
|
||||||
.br
|
|
||||||
The menu command uses functions like these to add menu entries to select
|
|
||||||
a different kernel from a boot disk.
|
|
||||||
.B Installboot \-boot
|
|
||||||
produces these functions when the images are labeled. The label
|
|
||||||
.B AT
|
|
||||||
would give:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
AT(a) {label=AT;image=42:626;echo AT kernel selected;menu}
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
With the menu option:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
a Select AT kernel
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
Typing
|
|
||||||
.B a
|
|
||||||
will then execute the
|
|
||||||
.B AT
|
|
||||||
function above.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fIname\fP(\fIkey\fP,\fItext\fP) \fIcommand\fP
|
|
||||||
.RS
|
|
||||||
User defined menu option.
|
|
||||||
.br
|
|
||||||
This variant may be used to make any menu entry you like:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
dos(d,Boot MS-DOS) boot d0p0
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.I Text
|
|
||||||
may be anything, even parentheses if they match.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.I name
|
|
||||||
.RS
|
|
||||||
Call function.
|
|
||||||
.br
|
|
||||||
If
|
|
||||||
.I name
|
|
||||||
is a user defined function then its value is expanded and executed in place of
|
|
||||||
.IR name .
|
|
||||||
Try a recursive one like 'rec() {rec;xx}' one day. You can see the monitor
|
|
||||||
run out of space with nice messages about using
|
|
||||||
.BR chmem (1)
|
|
||||||
to increase it's heap.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBboot\fP [\fB\-\fP\fIopts\fP]
|
|
||||||
.br
|
|
||||||
\fBboot\fP \fIdevice\fP
|
|
||||||
.RS
|
|
||||||
Boot MINIX 3 or another O.S.
|
|
||||||
.br
|
|
||||||
Without an argument,
|
|
||||||
.B boot
|
|
||||||
will load and execute the MINIX 3 image named by the
|
|
||||||
.B image
|
|
||||||
variable. With options the variable
|
|
||||||
.B bootopts
|
|
||||||
is first set to
|
|
||||||
.BI \- opts
|
|
||||||
before MINIX 3 is started, and unset when Minix returns. With a
|
|
||||||
.I device
|
|
||||||
argument,
|
|
||||||
.B boot
|
|
||||||
loads the boot sector of
|
|
||||||
.I device
|
|
||||||
into memory and jumps to it, starting another operating system. You would
|
|
||||||
normally use partitions on the first hard disk for this command (d0p[0\-3]),
|
|
||||||
using d0 will also work (choosing the active partition). One can also boot
|
|
||||||
devices on the second hard disk (d1, d1p[0\-3]) if the bootstrap writer did
|
|
||||||
not hardwire the disk number to disk 0.
|
|
||||||
.br
|
|
||||||
Some Operating Systems can only be booted from the active partition, if
|
|
||||||
you use a '*', e.g.
|
|
||||||
.BR "boot *d0p2" ,
|
|
||||||
then partition 2 is first made active. You'll then need to use
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
.BI "installboot \-m /dev/c0d0 /usr/mdec/jumpboot" " keys"
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
with
|
|
||||||
.I keys
|
|
||||||
chosen so that MINIX 3 is booted at startup. (See
|
|
||||||
.BR installboot (8).)
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBctty\fP \fIn\fP
|
|
||||||
.RS
|
|
||||||
Copies output to and takes input from serial line
|
|
||||||
.I n
|
|
||||||
(0-3) at 9600 baud, 8 bits, no parity.
|
|
||||||
This allows you to control a MINIX 3 system remotely through an RS-232
|
|
||||||
connection.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBdelay\fP [\fImsec\fP]
|
|
||||||
.RS
|
|
||||||
Delay (500 msec default).
|
|
||||||
.br
|
|
||||||
Fast booting speed was one of the objectives when this program was created,
|
|
||||||
so a hard disk boot usually takes only a fraction of a second. If you need
|
|
||||||
some time (to hit Escape, or stare at the numbers) you can use
|
|
||||||
.B delay
|
|
||||||
to make the monitor pause for a specified number of milliseconds.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBecho\fP \fIword\fP ...
|
|
||||||
.RS
|
|
||||||
Print these words.
|
|
||||||
.br
|
|
||||||
Used to display messages, like the startup banner. Echo normally prints
|
|
||||||
the words with spaces in between and a newline at the end. Echo understands
|
|
||||||
special '\e' escape sequences as follows:
|
|
||||||
.RS
|
|
||||||
.SP
|
|
||||||
\e (At the end) Don't print a newline.
|
|
||||||
.br
|
|
||||||
\en Print a newline.
|
|
||||||
.br
|
|
||||||
\ev Print the monitor's version numbers.
|
|
||||||
.br
|
|
||||||
\ec Clear the screen.
|
|
||||||
.br
|
|
||||||
\ew Wait until a RETURN is typed
|
|
||||||
.br
|
|
||||||
\e\e Print a backslash.
|
|
||||||
.RE
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBls\fP [\fIdirectory\fP]
|
|
||||||
.RS
|
|
||||||
List contents of a directory.
|
|
||||||
.br
|
|
||||||
Useful when looking for kernel images.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B menu
|
|
||||||
.RS
|
|
||||||
Menu driven startup.
|
|
||||||
.br
|
|
||||||
This command allows you to execute functions defined with a
|
|
||||||
.IR key .
|
|
||||||
If no menu functions have been defined then
|
|
||||||
.B menu
|
|
||||||
will use this one hidden built-in function:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
*(=,Start Minix) boot
|
|
||||||
.SP
|
|
||||||
.RE
|
|
||||||
Kernel selecting functions only add new options to this set, but if you
|
|
||||||
define a two argument function yourself then the above one is no longer
|
|
||||||
shown, allowing you to customize the menu completely. Your first
|
|
||||||
function definition should therefore be one that starts MINIX 3.
|
|
||||||
.SP
|
|
||||||
Menu entries are shown in the same order as
|
|
||||||
.B set
|
|
||||||
shows them. If you don't like the order then you have to unset the
|
|
||||||
functions and retype them in the proper order.
|
|
||||||
.SP
|
|
||||||
If you type a key then a scheduled trap is killed and the appropriate menu
|
|
||||||
function is executed. If you need more time to choose then hit the
|
|
||||||
spacebar. A key not on the menu also kills a trap, but does nothing more.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B save
|
|
||||||
.RS
|
|
||||||
Save environment.
|
|
||||||
.br
|
|
||||||
This will save all the environment variables and functions with nondefault
|
|
||||||
values to the parameter sector (the second sector on the boot device), so
|
|
||||||
they are automatically set the next time you boot the monitor.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
.B set
|
|
||||||
.RS
|
|
||||||
Show environment.
|
|
||||||
.br
|
|
||||||
Show the current values of the environment variables and functions. Default
|
|
||||||
values are shown between parentheses to distinguish them from values that
|
|
||||||
were explicitly set.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBtrap\fP \fImsec\fP \fIfunction\fP
|
|
||||||
.RS
|
|
||||||
Schedule function.
|
|
||||||
.br
|
|
||||||
Schedules a function to be executed after
|
|
||||||
.I msec
|
|
||||||
milliseconds. Only the monitor mode cannot be interrupted, a scheduled trap
|
|
||||||
is killed when the prompt is printed. Example:
|
|
||||||
.SP
|
|
||||||
.RS
|
|
||||||
main() {trap 10000 boot; menu}
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
This gives you 10 seconds to choose a menu option before MINIX 3 is booted.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBunset\fP \fIname\fP ...
|
|
||||||
.RS
|
|
||||||
Unset environment variables.
|
|
||||||
.br
|
|
||||||
Removes the named variables and functions from the environment, and sets
|
|
||||||
special variables back to their default values. This is also the only way
|
|
||||||
to remove the "device name translation" property from a variable.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBexit\fP
|
|
||||||
.RS
|
|
||||||
Exit the monitor.
|
|
||||||
.br
|
|
||||||
Reboot the machine, exit to MINIX 3 or exit to DOS as appropriate.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fBoff\fP
|
|
||||||
.RS
|
|
||||||
Turn the PC off.
|
|
||||||
.br
|
|
||||||
If the PC supports power management then turn it off, otherwise
|
|
||||||
print some error messages and do nothing.
|
|
||||||
.RE
|
|
||||||
.SP
|
|
||||||
\fB{\fP \fIcommand\fP; ... \fB}\fP
|
|
||||||
.RS
|
|
||||||
Bundle commands.
|
|
||||||
.br
|
|
||||||
Treat a number of commands as a single command. Used for function
|
|
||||||
definitions when a function body must contain more than one command.
|
|
||||||
.RE
|
|
||||||
.SH DEVICES
|
|
||||||
The MINIX 3 kernel can't do anything with device names, so they have to be
|
|
||||||
translated to device numbers before they are passed to the kernel. This
|
|
||||||
number is found under the st_rdev field (see
|
|
||||||
.BR stat (2))
|
|
||||||
of the file on the boot file system. The monitor will look for the device
|
|
||||||
file with the working directory set to '/dev'. If it can't find the device
|
|
||||||
name then it will translate names like 'ram', 'fd1', 'c0d1p0', 'c1d0p2s0',
|
|
||||||
and even the obsolete 'hd2a' to what it itself thinks the numbers should be.
|
|
||||||
.PP
|
|
||||||
The special name
|
|
||||||
.B bootdev
|
|
||||||
is translated to the name of the device booted from, like 'fd0',
|
|
||||||
or 'c0d0p1s0', and then searched for in /dev.
|
|
||||||
.B Bootdev
|
|
||||||
can only be translated to a device for the first controller, and only if
|
|
||||||
the disks on that controller are numbered without "gaps". (The master
|
|
||||||
device on the second IDE channel is always d2 on MINIX 3. The BIOS will
|
|
||||||
call it disk 0, 1, or 2 depending on the number of disks on the first
|
|
||||||
IDE channel.)
|
|
||||||
.SP
|
|
||||||
Controller numbers are meaningless to the BIOS, so everything is assumed to
|
|
||||||
be attached to controller 0. You can omit
|
|
||||||
.B c0
|
|
||||||
for device names, and it is best to always omit
|
|
||||||
.B c0
|
|
||||||
for the
|
|
||||||
.B boot
|
|
||||||
command, and to always use the full name for variables passed to MINIX 3.
|
|
||||||
.SH EXTENSIONS
|
|
||||||
A few extensions have been made to this program for kernel hackers. They
|
|
||||||
may be triggered by setting bits in the flags word in the kernel startup
|
|
||||||
code (the mpx file.) The flag bits are:
|
|
||||||
.TP 10
|
|
||||||
0x0001
|
|
||||||
Call kernel in 386 mode.
|
|
||||||
.TP
|
|
||||||
0x0002
|
|
||||||
Do not make space for the bss areas of processes other than the kernel.
|
|
||||||
.TP
|
|
||||||
0x0004
|
|
||||||
Use the stack size set by
|
|
||||||
.BR chmem (1).
|
|
||||||
.TP
|
|
||||||
0x0008
|
|
||||||
Load PM, VFS, etc. into extended memory.
|
|
||||||
.TP
|
|
||||||
0x0010
|
|
||||||
No need to patch process sizes into the kernel.
|
|
||||||
.TP
|
|
||||||
0x0020
|
|
||||||
The kernel can return to the monitor on halt or reboot.
|
|
||||||
.TP
|
|
||||||
0x0040
|
|
||||||
Offer generic BIOS support instead of just INT 13 (disk I/O).
|
|
||||||
.TP
|
|
||||||
0x0080
|
|
||||||
Pass memory lists for free and used memory (processes).
|
|
||||||
.TP
|
|
||||||
0x0100
|
|
||||||
Kernel returns monitor code on shutdown in boot parameters array.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR controller (4),
|
|
||||||
.BR installboot (8),
|
|
||||||
.BR usage (8),
|
|
||||||
.BR boot (8),
|
|
||||||
.BR dosminix (8).
|
|
||||||
.SH BUGS
|
|
||||||
The
|
|
||||||
.B delay
|
|
||||||
command will hang forever on the original IBM PC (not the XT!). Not that it
|
|
||||||
matters, as everything takes forever on that box.
|
|
||||||
.PP
|
|
||||||
By redefining
|
|
||||||
.B leader
|
|
||||||
one can easily hide the identity of this program.
|
|
||||||
.SH ACKNOWLEDGMENTS
|
|
||||||
Earl Chew, for the inspiration his ShoeLace package provided, unless he wants
|
|
||||||
to file a "look and feel" suit against me, then I will say I modeled it after
|
|
||||||
the Sun ROM boot monitor, which is also true.
|
|
||||||
.SH AUTHOR
|
|
||||||
Kees J. Bot (kjb@cs.vu.nl)
|
|
||||||
.\"
|
|
||||||
.\" $PchId: monitor.8,v 1.11 2002/02/27 19:36:34 philip Exp $
|
|
0
man/man8/newroot.8
Executable file → Normal file
0
man/man8/newroot.8
Executable file → Normal file
|
@ -46,10 +46,6 @@ FORWARD _PROTOTYPE( void handle_vfs_reply, (void) );
|
||||||
#define click_to_round_k(n) \
|
#define click_to_round_k(n) \
|
||||||
((unsigned) ((((unsigned long) (n) << CLICK_SHIFT) + 512) / 1024))
|
((unsigned) ((((unsigned long) (n) << CLICK_SHIFT) + 512) / 1024))
|
||||||
|
|
||||||
#if !defined(__ELF__)
|
|
||||||
extern int unmap_ok;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* SEF functions and variables. */
|
/* SEF functions and variables. */
|
||||||
FORWARD _PROTOTYPE( void sef_local_startup, (void) );
|
FORWARD _PROTOTYPE( void sef_local_startup, (void) );
|
||||||
FORWARD _PROTOTYPE( int sef_cb_init_fresh, (int type, sef_init_info_t *info) );
|
FORWARD _PROTOTYPE( int sef_cb_init_fresh, (int type, sef_init_info_t *info) );
|
||||||
|
@ -302,19 +298,6 @@ PRIVATE int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info))
|
||||||
|
|
||||||
system_hz = sys_hz();
|
system_hz = sys_hz();
|
||||||
|
|
||||||
/* Map out our own text and data. This is normally done in crtso.o
|
|
||||||
* but PM is an exception - we don't get to talk to VM so early on.
|
|
||||||
* That's why we override munmap() and munmap_text() in utility.c.
|
|
||||||
*
|
|
||||||
* _minix_unmapzero() is the same code in crtso.o that normally does
|
|
||||||
* it on startup. It's best that it's there as crtso.o knows exactly
|
|
||||||
* what the ranges are of the filler data.
|
|
||||||
*/
|
|
||||||
#if !defined(__ELF__)
|
|
||||||
unmap_ok = 1;
|
|
||||||
_minix_unmapzero();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize user-space scheduling. */
|
/* Initialize user-space scheduling. */
|
||||||
sched_init();
|
sched_init();
|
||||||
|
|
||||||
|
|
|
@ -149,7 +149,3 @@ message *m_ptr;
|
||||||
|
|
||||||
rmp->mp_flags |= VFS_CALL;
|
rmp->mp_flags |= VFS_CALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(__ELF__)
|
|
||||||
int unmap_ok = 0;
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -10,8 +10,6 @@
|
||||||
*/
|
*/
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <a.out.h>
|
|
||||||
#include <minix/crtso.h>
|
|
||||||
#include "kernel/const.h"
|
#include "kernel/const.h"
|
||||||
#include "kernel/type.h"
|
#include "kernel/type.h"
|
||||||
#include "kernel/proc.h"
|
#include "kernel/proc.h"
|
||||||
|
@ -24,9 +22,6 @@ FORWARD _PROTOTYPE(void boot_image_info_lookup, ( endpoint_t endpoint,
|
||||||
FORWARD _PROTOTYPE(void catch_boot_init_ready, (endpoint_t endpoint) );
|
FORWARD _PROTOTYPE(void catch_boot_init_ready, (endpoint_t endpoint) );
|
||||||
FORWARD _PROTOTYPE(void get_work, (message *m_ptr, int *status_ptr) );
|
FORWARD _PROTOTYPE(void get_work, (message *m_ptr, int *status_ptr) );
|
||||||
|
|
||||||
/* Flag set when memory unmapping can be done. */
|
|
||||||
EXTERN int unmap_ok;
|
|
||||||
|
|
||||||
/* SEF functions and variables. */
|
/* SEF functions and variables. */
|
||||||
FORWARD _PROTOTYPE( void sef_local_startup, (void) );
|
FORWARD _PROTOTYPE( void sef_local_startup, (void) );
|
||||||
FORWARD _PROTOTYPE( int sef_cb_init_fresh, (int type, sef_init_info_t *info) );
|
FORWARD _PROTOTYPE( int sef_cb_init_fresh, (int type, sef_init_info_t *info) );
|
||||||
|
@ -459,12 +454,6 @@ PRIVATE int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info))
|
||||||
/* Clean up the old RS instance, the new instance will take over. */
|
/* Clean up the old RS instance, the new instance will take over. */
|
||||||
cleanup_service(rp);
|
cleanup_service(rp);
|
||||||
|
|
||||||
/* Map out our own text and data. */
|
|
||||||
unmap_ok = 1;
|
|
||||||
#if !defined(__ELF__)
|
|
||||||
_minix_unmapzero();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Ask VM to pin memory for the new RS instance. */
|
/* Ask VM to pin memory for the new RS instance. */
|
||||||
if((s = vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN)) != OK) {
|
if((s = vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN)) != OK) {
|
||||||
panic("unable to pin memory for the new RS instance: %d", s);
|
panic("unable to pin memory for the new RS instance: %d", s);
|
||||||
|
|
|
@ -61,8 +61,6 @@ struct {
|
||||||
FORWARD _PROTOTYPE(int map_service, (struct rprocpub *rpub));
|
FORWARD _PROTOTYPE(int map_service, (struct rprocpub *rpub));
|
||||||
FORWARD _PROTOTYPE(int vm_acl_ok, (endpoint_t caller, int call));
|
FORWARD _PROTOTYPE(int vm_acl_ok, (endpoint_t caller, int call));
|
||||||
|
|
||||||
extern int unmap_ok;
|
|
||||||
|
|
||||||
/* SEF functions and variables. */
|
/* SEF functions and variables. */
|
||||||
FORWARD _PROTOTYPE( void sef_local_startup, (void) );
|
FORWARD _PROTOTYPE( void sef_local_startup, (void) );
|
||||||
FORWARD _PROTOTYPE( int sef_cb_init_fresh, (int type, sef_init_info_t *info) );
|
FORWARD _PROTOTYPE( int sef_cb_init_fresh, (int type, sef_init_info_t *info) );
|
||||||
|
@ -379,12 +377,6 @@ PRIVATE int sef_cb_init_fresh(int type, sef_init_info_t *info)
|
||||||
/* Initialize the structures for queryexit */
|
/* Initialize the structures for queryexit */
|
||||||
init_query_exit();
|
init_query_exit();
|
||||||
|
|
||||||
/* Unmap our own low pages. */
|
|
||||||
unmap_ok = 1;
|
|
||||||
#if !defined(__ELF__)
|
|
||||||
_minix_unmapzero();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Map all the services in the boot image. */
|
/* Map all the services in the boot image. */
|
||||||
if((s = sys_safecopyfrom(RS_PROC_NR, info->rproctab_gid, 0,
|
if((s = sys_safecopyfrom(RS_PROC_NR, info->rproctab_gid, 0,
|
||||||
(vir_bytes) rprocpub, sizeof(rprocpub), S)) != OK) {
|
(vir_bytes) rprocpub, sizeof(rprocpub), S)) != OK) {
|
||||||
|
|
|
@ -94,7 +94,7 @@ hdboot: image
|
||||||
done
|
done
|
||||||
cp kernel /boot/minix/.temp/
|
cp kernel /boot/minix/.temp/
|
||||||
[ -d /boot/image ] && ln -f /boot/minix/.temp/kernel /boot/kernel || true
|
[ -d /boot/image ] && ln -f /boot/minix/.temp/kernel /boot/kernel || true
|
||||||
exec sh mkboot $@ minix
|
sh mkboot $@ minix
|
||||||
exec sh update_bootcfg.sh
|
exec sh update_bootcfg.sh
|
||||||
|
|
||||||
fdboot: image
|
fdboot: image
|
||||||
|
|
Loading…
Reference in a new issue