From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tommy McCabe Subject: Broken-up patch #11 Date: Fri, 28 May 2004 16:35:04 -0700 (PDT) Sender: linux-8086-owner@vger.kernel.org Message-ID: <20040528233504.68694.qmail@web51303.mail.yahoo.com> Mime-Version: 1.0 Return-path: List-Id: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-8086@vger.kernel.org Interconnected patch to: 1. Incorporate a few files from bootblocks into the source treeso linux-86 isn't necessary for compiling. 2. Move MAKEDEV and MAKESET out of rootfs_template to save 12KB of space. 3. Fix I-don't-know-how-many-bugs in MAKEDEV. 4. Change /mnt/elks to /mnt/test. diff -ruN ./elks-stuff/elkscmd/MAKEDEV ./elks/elkscmd/MAKEDEV --- ./elks-stuff/elkscmd/MAKEDEV 1969-12-31 19:00:00.000000000 -0500 +++ ./elks/elkscmd/MAKEDEV 2004-05-28 15:31:49.000000000 -0400 @@ -0,0 +1,266 @@ +#!/bin/sh + +# Devices are generated by this script in the same order that they are listed +# in the Documentation/devices.txt file in the Linux 2.4.18 and5.21 kernel +# sources. This includes devices that are not currently relevant to ELKS, to +# encourage the use of common node numbers when these devices are eventually +# implemented. +# +# Where different node numbers are currently used by ELKS, the current ELKS +# node numbers are generated by lines labelled "Currently" and the relevant +# Linux node numbers are generated by lines labelled "Ought to be". +# +# Refer to the MAKESET command, also in this directory, for usage details. + +LINK=ln +MKDEV=mknod +MKSET=./MAKESET +TARGET_MNT=/mnt/test +DEVDIR=./$TARGET_MNT/dev + +############################################################################## +# Ensure required auxilliary script is present. + +if ! test -f "$MKSET" +then + echo ERROR: \"$MKSET\" script missing, unable to continue. + exit 1 +fi + +############################################################################## +# Create memory devices. + + $MKDEV $DEVDIR/mem c 1 1 + $MKDEV $DEVDIR/kmem c 1 2 + $MKDEV $DEVDIR/null c 1 3 +# $MKDEV $DEVDIR/port c 1 4 + $MKDEV $DEVDIR/zero c 1 5 +# $MKDEV $DEVDIR/core c 1 6 + $MKDEV $DEVDIR/full c 1 7 +# $MKDEV $DEVDIR/random c 1 8 +# $MKDEV $DEVDIR/urandom c 1 9 +# $MKDEV $DEVDIR/aio c 1 10 + +############################################################################## +# RAM disks. + + $MKSET 0 7 $MKDEV $DEVDIR/ram b 1 + + $LINK $DEVDIR/ram1 $DEVDIR/ramdisk + +############################################################################## +# Pseudo-TTY master devices. These are not yet supported by the ELKS kernel. + +# $MKSET 0 15 $MKDEV $DEVDIR/ptyp x 2 +# $MKSET 16 15 $MKDEV $DEVDIR/ptyq x 2 +# $MKSET 32 15 $MKDEV $DEVDIR/ptyr x 2 +# $MKSET 48 15 $MKDEV $DEVDIR/ptys x 2 +# $MKSET 64 15 $MKDEV $DEVDIR/ptyt x 2 +# $MKSET 80 15 $MKDEV $DEVDIR/ptyu x 2 +# $MKSET 96 15 $MKDEV $DEVDIR/ptyv x 2 +# $MKSET 112 15 $MKDEV $DEVDIR/ptyw x 2 +# $MKSET 128 15 $MKDEV $DEVDIR/ptyx x 2 +# $MKSET 144 15 $MKDEV $DEVDIR/ptyy x 2 +# $MKSET 160 15 $MKDEV $DEVDIR/ptyz x 2 +# $MKSET 176 15 $MKDEV $DEVDIR/ptya x 2 +# $MKSET 192 15 $MKDEV $DEVDIR/ptyb x 2 +# $MKSET 208 15 $MKDEV $DEVDIR/ptyc x 2 +# $MKSET 224 15 $MKDEV $DEVDIR/ptyd x 2 +# $MKSET 240 15 $MKDEV $DEVDIR/ptye x 2 + +############################################################################## +# Floppy diskettes. Only the auto-detect nodes are listed. + + $MKDEV $DEVDIR/fd0 b 3 128 # Currently. + $MKDEV $DEVDIR/fd1 b 3 192 # Currently. + +# $MKSET 0 3 $MKDEV $DEVDIR/fd b 2 # Ought to be. + +############################################################################## +# Pseudo-TTY master devices. These are not yet supported by the ELKS kernel. + +# $MKSET 0 15 $MKDEV $DEVDIR/ttyp x 3 +# $MKSET 16 15 $MKDEV $DEVDIR/ttyq x 3 +# $MKSET 32 15 $MKDEV $DEVDIR/ttyr x 3 +# $MKSET 48 15 $MKDEV $DEVDIR/ttys x 3 +# $MKSET 64 15 $MKDEV $DEVDIR/ttyt x 3 +# $MKSET 80 15 $MKDEV $DEVDIR/ttyu x 3 +# $MKSET 96 15 $MKDEV $DEVDIR/ttyv x 3 +# $MKSET 112 15 $MKDEV $DEVDIR/ttyw x 3 +# $MKSET 128 15 $MKDEV $DEVDIR/ttyx x 3 +# $MKSET 144 15 $MKDEV $DEVDIR/ttyy x 3 +# $MKSET 160 15 $MKDEV $DEVDIR/ttyz x 3 +# $MKSET 176 15 $MKDEV $DEVDIR/ttya x 3 +# $MKSET 192 15 $MKDEV $DEVDIR/ttyb x 3 +# $MKSET 208 15 $MKDEV $DEVDIR/ttyc x 3 +# $MKSET 224 15 $MKDEV $DEVDIR/ttyd x 3 +# $MKSET 240 15 $MKDEV $DEVDIR/ttye x 3 + +############################################################################## +# Direct IDE disks, Primary channel. + + $MKSET 0 7 $MKDEV $DEVDIR/hda b 5 # Currently. + $MKSET 8 7 $MKDEV $DEVDIR/hdb b 5 # Currently. + +# $MKSET 0 7 $MKDEV $DEVDIR/hda b 3 # Ought to be. +# $MKSET 8 7 $MKDEV $DEVDIR/hdb b 3 # Ought to be. + +############################################################################## +# Virtual consoles. Note that tty4 through tty7 can't be enabled at this +# time because of the possible conflict with ttyS0 through ttyS3 which +# used to use the node numbers these now use. However, it is expected that +# this restriction can be removed in the near future. + + $MKSET 0 3 $MKDEV $DEVDIR/tty c 4 # Currently +# $MKSET 0 15 $MKDEV $DEVDIR/tty c 4 # Soon to be + +# Serial ports, as detected by the ROM BIOS. + + $MKSET 64 3 $MKDEV $DEVDIR/ttyS c 4 + +############################################################################## +# Alternate TTY devices. These are not yet supported. + +# $MKDEV $DEVDIR/tty c 5 0 +# $MKDEV $DEVDIR/console c 5 1 +# $MKDEV $DEVDIR/ptmx c 5 2 + +############################################################################## +# Parallel devices, as detected by the ROM BIOS. + + $MKSET 0 3 $MKDEV $DEVDIR/lp c 6 + +############################################################################## +# Loopback devices. These are not yet supported. + +# $MKSET 0 15 $MKDEV $DEVDIR/loop c 7 + +############################################################################## +# SCSI disks. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/sda b 8 +# $MKSET 8 7 $MKDEV $DEVDIR/sdb b 8 +# $MKSET 16 7 $MKDEV $DEVDIR/sdc b 8 +# $MKSET 24 7 $MKDEV $DEVDIR/sdd b 8 +# $MKSET 32 7 $MKDEV $DEVDIR/sde b 8 +# $MKSET 40 7 $MKDEV $DEVDIR/sdf b 8 +# $MKSET 48 7 $MKDEV $DEVDIR/sdg b 8 +# $MKSET 56 7 $MKDEV $DEVDIR/sdh b 8 +# $MKSET 64 7 $MKDEV $DEVDIR/sdi b 8 +# $MKSET 72 7 $MKDEV $DEVDIR/sdj b 8 +# $MKSET 80 7 $MKDEV $DEVDIR/sdk b 8 +# $MKSET 88 7 $MKDEV $DEVDIR/sdl b 8 +# $MKSET 96 7 $MKDEV $DEVDIR/sdm b 8 +# $MKSET 104 7 $MKDEV $DEVDIR/sdn b 8 +# $MKSET 112 7 $MKDEV $DEVDIR/sdo b 8 +# $MKSET 120 7 $MKDEV $DEVDIR/sdp b 8 + +############################################################################## +# SCSI tapes. These are not yet supported. + +# $MKSET 0 31 $MKDEV $DEVDIR/st c 9 +# $MKSET 32 31 $MKDEV $DEVDIR/st c 9 l +# $MKSET 64 31 $MKDEV $DEVDIR/st c 9 m +# $MKSET 96 31 $MKDEV $DEVDIR/st c 9 a +# $MKSET 128 31 $MKDEV $DEVDIR/nst c 9 +# $MKSET 160 31 $MKDEV $DEVDIR/nst c 9 l +# $MKSET 192 31 $MKDEV $DEVDIR/nst c 9 m +# $MKSET 224 31 $MKDEV $DEVDIR/nst c 9 a + +############################################################################## +# Metadisk (RAID) devices. These are not yet supported. + +# $MKSET 0 15 $MKDEV $DEVDIR/md b 9 + +############################################################################## +# SCSI CD-ROM devices. These are not yet supported. + +# $MKDEV $DEVDIR/scd b 11 + +############################################################################## +# MSCDEX CD-ROM devices. These are not yet supported. + +# $MKDEV $DEVDIR/doscd b 12 + +############################################################################## +# 8-bit MFM/RLL controllers. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/xda b 13 +# $MKSET 8 7 $MKDEV $DEVDIR/xdb b 13 + +############################################################################## +# BIOS hard disks. + + $MKSET 0 7 $MKDEV $DEVDIR/bda b 3 # Currently + $MKSET 8 7 $MKDEV $DEVDIR/bdb b 3 # Currently + $MKSET 16 7 $MKDEV $DEVDIR/bdc b 3 # Currently + $MKSET 24 7 $MKDEV $DEVDIR/bdd b 3 # Currently + +# $MKSET 0 7 $MKDEV $DEVDIR/bda b 14 # Ought to be +# $MKSET 8 7 $MKDEV $DEVDIR/bdb b 14 # Ought to be +# $MKSET 16 7 $MKDEV $DEVDIR/bdc b 14 # Ought to be +# $MKSET 24 7 $MKDEV $DEVDIR/bdd b 14 # Ought to be + +############################################################################## +# Joysticks. These are not yet supported. + +# $MKDEV $DEVDIR/js c 15 +# $MKDEV $DEVDIR/djs c 15 + +############################################################################## +# Generic SCSI devices. These are not yet supported. + +# $MKSET 0 15 $MKDEV $DEVDIR/sg c 21 + +############################################################################## +# Direct IDE disks, Secondary channel. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/hdc b 22 +# $MKSET 8 7 $MKDEV $DEVDIR/hdd b 22 + +############################################################################## +# Direct IDE disks, Tertiary channel. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/hde b 33 +# $MKSET 8 7 $MKDEV $DEVDIR/hdf b 33 + +############################################################################## +# Z80-SIO devices. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/scc c 34 + +############################################################################## +# Direct IDE disks, Quaternary channel. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/hde b 34 +# $MKSET 8 7 $MKDEV $DEVDIR/hdf b 34 + +############################################################################## +# Direct IDE disks, Quinternary channel. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/hdg b 56 +# $MKSET 8 7 $MKDEV $DEVDIR/hdh b 56 + +############################################################################## +# Direct IDE disks, Septernary channel. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/hdi b 57 +# $MKSET 8 7 $MKDEV $DEVDIR/hdj b 57 + +############################################################################## +# SCSI Media Changer. These are not yet supported. + +# $MKSET 0 15 $MKDEV $DEVDIR/sch c 86 + +############################################################################## +# I2C bus drivers. These are not yet supported. + +# $MKSET 0 7 $MKDEV $DEVDIR/i2c c 89 + +############################################################################## +# Conrad Electronic Parallel Port Radio Clocks. These are not yet supported. + +# $MKSET 0 1 $MKDEV $DEVDIR/pcfclock c 181 + +############################################################################## +# EOF. diff -ruN ./elks-stuff/elkscmd/MAKESET ./elks/elkscmd/MAKESET --- ./elks-stuff/elkscmd/MAKESET 1969-12-31 19:00:00.000000000 -0500 +++ ./elks/elkscmd/MAKESET 2004-04-18 14:54:13.000000000 -0400 @@ -0,0 +1,48 @@ +#!/bin/sh + +if [ $# -lt 6 -o $# -gt 7 ]; then + echo + echo "Usage: makeset min count cmd prefix type major [suffix]" + echo + echo "where min is the minor of the first node to make," + echo " count is the number of the last node to make," + echo " cmd is the command to make a node," + echo " prefix is the node name prefix," + echo " type is the type selector for the node," + echo " major is the major number for the node," + echo " and suffix is a suffix to append to the node names." + echo + echo "The following type selectors are supported:" + echo + echo " b Block device, all nodes have numeric suffix." + echo " d Block device, first node is raw device without numeric suffix." + echo + echo " c Character device with decimal numeric suffix." + echo " x Character device with hexadecimal numeric suffix." + echo +else + N=0 + while [ $N -le $2 ]; do + P=`expr $N + $1` + case ".$5" in + .b) eval $3 $4$N$7 $5 $6 $P + ;; + .c) eval $3 $4$N$7 $5 $6 $P + ;; + .d) if [ $N -gt 0 ]; then + eval $3 $4$N$7 $5 $6 $P + else + eval $3 $4$7 $5 $6 $P + fi + ;; + .x) if [ $N -gt 9 ]; then + R=`echo 123456789abcdef | cut -b $N` + eval $3 $4$R$7 c $6 $P + else + eval $3 $4$N$7 c $6 $P + fi + ;; + esac + N=`expr $N + 1` + done +fi diff -ruN ./elks-stuff/elkscmd/Make.defs ./elks/elkscmd/Make.defs --- ./elks-stuff/elkscmd/Make.defs 2004-05-28 16:02:01.000000000 -0400 +++ ./elks/elkscmd/Make.defs 2004-04-18 15:02:51.000000000 -0400 @@ -147,7 +147,7 @@ MKFS=/sbin/mkfs.minix MKFS_OPTS=-n14 -MINIX_BOOT=$(DEV86_DIR)/bootblocks +MINIX_BOOT=./bootblocks ############################################################################## # @@ -159,7 +159,7 @@ endif ifeq ($(TARGET_MODE),LOOP) -TARGET_MNT=/mnt/elks +TARGET_MNT=/mnt/test LOOP=-o loop endif diff -ruN ./elks-stuff/elkscmd/Makefile ./elks/elkscmd/Makefile --- ./elks-stuff/elkscmd/Makefile 2004-05-28 16:02:01.000000000 -0400 +++ ./elks/elkscmd/Makefile 2004-05-28 15:30:59.000000000 -0400 @@ -46,9 +46,10 @@ $(FULL3_TARGET_FS) $(FULL5_TARGET_FS) || true rm -f $(COMB_TARGET_FS) $(ROOT_TARGET_FS) $(ROOT_NET_TARGET_FS) \ $(FULL3_TARGET_FS) $(FULL5_TARGET_FS) boot images.zip core - rm -rf rootfs_template $(ROOTDIR) + rm -rf ./rootfs_template $(ROOTDIR) + rm -rf ./bootblocks/*s ./bootblocks/*bin ./bootblocks/*v @for i in $(DIRS); do make -C $$i clean ; done - tar xf rootfs_template.tar + tar xzf rootfs_template.tar.gz ############################################################################### # @@ -119,10 +120,13 @@ # Create relevant parts of other packages. $(FD_BSECT): - make -C $(MINIX_BOOT) bin + bcc -Mf -O -DTRY_FLOPPY -DDOTS -o ./bootblocks/minix.s -S ./bootblocks/minix.c + as86 -w- -0 -b ./bootblocks/minix.bin -s ./bootblocks/minix.sym ./bootblocks/minix.s $(KHELPER): - make -C $(MINIX_BOOT) + as86_encap ./bootblocks/minix.s ./bootblocks/minix.v minix_ -0 -w + bcc -Mf -O -DDOTS -o ./bootblocks/minix_elks.s -S ./bootblocks/minix_elks.c + as86 -w- -0 -b ./bootblocks/minix_elks.bin -s ./bootblocks/minix_elks.sym ./bootblocks/minix_elks.s ############################################################################### # @@ -146,8 +150,8 @@ $(SIBO_TARGET_FS): dd if=/dev/zero of=$(SIBO_TARGET_FS) bs=1024 count=$(SIBO_TARGET_BLKS) -$(ELKSCMD_DIR)/rootfs_template/etc/passwd: rootfs_template.tar - tar xpf rootfs_template.tar +$(ELKSCMD_DIR)/rootfs_template/etc/passwd: rootfs_template.tar.gz + tar xzpf rootfs_template.tar.gz $(ELKSCMD_DIR)/rootfs_template/etc/issue: $(ELKSCMD_DIR)/rootfs_template/etc/passwd $(ELKS_DIR)/Makefile $(ELKSCMD_DIR)/tools/ver.pl $(ELKS_DIR)/Makefile > $(ELKSCMD_DIR)/rootfs_template/etc/issue @@ -155,37 +159,37 @@ mount_combfs: $(COMB_TARGET_FS) $(ELKSCMD_DIR)/rootfs_template/etc/issue $(MKFS) $(MKFS_OPTS) $(COMB_TARGET_FS) $(COMB_TARGET_BLKS) mount $(COMB_TARGET_FS) $(TARGET_MNT) $(LOOP) - (cd $(ELKSCMD_DIR)/rootfs_template ; tar cf - --exclude CVS *) | \ - (cd $(TARGET_MNT) ; tar xpvf -) - (cd $(TARGET_MNT)/dev ; ./MAKEDEV) + cd $(ELKSCMD_DIR)/rootfs_template; tar cf test.tar ./; cp ./test.tar $(TARGET_MNT) + cd $(TARGET_MNT); tar -xpf ./test.tar; rm -rf test.tar; cd $(ELKSCMD_DIR) + rm -rf ./rootfs_template/test.tar; ./MAKEDEV mount_full3fs: $(FULL3_TARGET_FS) $(ELKSCMD_DIR)/rootfs_template/etc/issue $(MKFS) $(MKFS_OPTS) $(FULL3_TARGET_FS) $(FULL3_TARGET_BLKS) mount $(FULL3_TARGET_FS) $(TARGET_MNT) $(LOOP) - (cd $(ELKSCMD_DIR)/rootfs_template ; tar cf - --exclude CVS *) | \ - (cd $(TARGET_MNT) ; tar xpvf -) - (cd $(TARGET_MNT)/dev ; ./MAKEDEV) + cd $(ELKSCMD_DIR)/rootfs_template; tar cf test.tar ./; cp ./test.tar $(TARGET_MNT) + cd $(TARGET_MNT); tar -xpf ./test.tar; rm -rf test.tar; cd $(ELKSCMD_DIR) + rm -rf ./rootfs_template/test.tar; ./MAKEDEV mount_full5fs: $(FULL5_TARGET_FS) $(ELKSCMD_DIR)/rootfs_template/etc/issue $(MKFS) $(MKFS_OPTS) $(FULL5_TARGET_FS) $(FULL5_TARGET_BLKS) mount $(FULL5_TARGET_FS) $(TARGET_MNT) $(LOOP) - (cd $(ELKSCMD_DIR)/rootfs_template ; tar cf - --exclude CVS *) | \ - (cd $(TARGET_MNT) ; tar xpvf -) - (cd $(TARGET_MNT)/dev ; ./MAKEDEV) + cd $(ELKSCMD_DIR)/rootfs_template; tar cf test.tar ./; cp ./test.tar $(TARGET_MNT) + cd $(TARGET_MNT); tar -xpf ./test.tar; rm -rf test.tar; cd $(ELKSCMD_DIR) + rm -rf ./rootfs_template/test.tar; ./MAKEDEV mount_rootfs: $(ROOT_TARGET_FS) $(ELKSCMD_DIR)/rootfs_template/etc/issue - $(MKFS) $(MKFS_OPTS) $(ROOT_TARGET_FS) $(ROOT_TARGET_BLKS) + $(MKFS) -i 200 $(MKFS_OPTS) $(ROOT_TARGET_FS) $(ROOT_TARGET_BLKS) mount $(ROOT_TARGET_FS) $(TARGET_MNT) $(LOOP) - (cd $(ELKSCMD_DIR)/rootfs_template ; tar cf - --exclude CVS *) | \ - (cd $(TARGET_MNT) ; tar xpvf -) - (cd $(TARGET_MNT)/dev ; ./MAKEDEV) + cd $(ELKSCMD_DIR)/rootfs_template; tar cf test.tar ./; cp ./test.tar $(TARGET_MNT) + cd $(TARGET_MNT); tar -xpf ./test.tar; rm -rf test.tar; cd $(ELKSCMD_DIR) + rm -rf ./rootfs_template/test.tar; ./MAKEDEV mount_rootnetfs: $(ROOT_NET_TARGET_FS) $(ELKSCMD_DIR)/rootfs_template/etc/issue $(MKFS) $(MKFS_OPTS) $(ROOT_NET_TARGET_FS) $(ROOT_NET_TARGET_BLKS) mount $(ROOT_NET_TARGET_FS) $(TARGET_MNT) $(LOOP) - (cd $(ELKSCMD_DIR)/rootfs_template ; tar cf - --exclude CVS *) | \ - (cd $(TARGET_MNT) ; tar xpvf -) - (cd $(TARGET_MNT)/dev ; ./MAKEDEV) + cd $(ELKSCMD_DIR)/rootfs_template; tar cf test.tar ./; cp ./test.tar $(TARGET_MNT) + cd $(TARGET_MNT); tar -xpf ./test.tar; rm -rf test.tar; cd $(ELKSCMD_DIR) + rm -rf ./rootfs_template/test.tar; ./MAKEDEV mount_sibofs: $(SIBO_TARGET_FS) $(ELKSCMD_DIR)/rootfs_template/etc/issue $(MKFS) $(MKFS_OPTS) $(SIBO_TARGET_FS) $(SIBO_TARGET_BLKS) @@ -210,35 +214,42 @@ comb: mount_combfs $(ELKS_DIR)/arch/i86/boot/Image $(FD_BSECT) $(KHELPER) + dd if=/dev/zero of=./flagfile bs=1k count=0 @for i in $(DIRS); do make -C $$i min_rfs ; done + mkdir $(TARGET_MNT)/boot cp $(ELKS_DIR)/arch/i86/boot/Image $(TARGET_MNT)/boot/linux cp $(KHELPER) $(TARGET_MNT)/boot/boot umount $(COMB_TARGET_FS) dd if=$(FD_BSECT) of=$(COMB_TARGET_FS) bs=512 count=2 conv=notrunc full3: mount_full3fs $(ELKS_DIR)/arch/i86/boot/Image $(FD_BSECT) $(KHELPER) + mkdir $(TARGET_MNT)/bin; cp -p -f $(ELKSNET_DIR)/ktcp/ktcp $(TARGET_MNT)/bin @for i in $(DIRS); do make -C $$i rfs ; done + mkdir $(TARGET_MNT)/boot cp $(ELKS_DIR)/arch/i86/boot/Image $(TARGET_MNT)/boot/linux cp $(KHELPER) $(TARGET_MNT)/boot/boot umount $(FULL3_TARGET_FS) dd if=$(FD_BSECT) of=$(FULL3_TARGET_FS) bs=512 count=2 conv=notrunc -full5: mount_full3fs $(ELKS_DIR)/arch/i86/boot/Image $(FD_BSECT) $(KHELPER) +full5: mount_full5fs $(ELKS_DIR)/arch/i86/boot/Image $(FD_BSECT) $(KHELPER) @for i in $(DIRS); do make -C $$i rfs ; done + mkdir $(TARGET_MNT)/boot cp $(ELKS_DIR)/arch/i86/boot/Image $(TARGET_MNT)/boot/linux cp $(KHELPER) $(TARGET_MNT)/boot/boot - umount $(FULL3_TARGET_FS) - dd if=$(FD_BSECT) of=$(FULL3_TARGET_FS) bs=512 count=2 conv=notrunc + umount $(FULL5_TARGET_FS) + dd if=$(FD_BSECT) of=$(FULL5_TARGET_FS) bs=512 count=2 conv=notrunc root: mount_rootfs + rm -rf ./flagfile @for i in $(DIRS); do make -C $$i min_rfs ; done umount $(ROOT_TARGET_FS) comb_net: mount_rootnetfs $(ELKS_DIR)/arch/i86/boot/Image $(FD_BSECT) $(KHELPER) cd $(ELKSNET_DIR)/ktcp ; \ make ; \ - cp -p -f ktcp $(TARGET_MNT)/bin + mkdir $(TARGET_MNT)/bin; cp -p -f ktcp $(TARGET_MNT)/bin @for i in $(DIRS); do make -C $$i net_rfs ; done + mkdir $(TARGET_MNT)/boot cp $(ELKS_DIR)/arch/i86/boot/Image $(TARGET_MNT)/boot/linux cp $(KHELPER) $(TARGET_MNT)/boot/boot umount $(ROOT_NET_TARGET_FS) diff -ruN ./elks-stuff/elkscmd/bootblocks/minix.c ./elks/elkscmd/bootblocks/minix.c --- ./elks-stuff/elkscmd/bootblocks/minix.c 1969-12-31 19:00:00.000000000 -0500 +++ ./elks/elkscmd/bootblocks/minix.c 2004-04-18 15:00:49.000000000 -0400 @@ -0,0 +1,943 @@ +/* + * This bootblock loads the linux-8086 executable in the file 'boot' + * from the root directory of a minix filesystem. + * + * Copyright (C) 1990-1998 Robert de Bath, distributed under the GPL Version 2 + * Based on minix filesystem definitions. + * + * TODO: + * Alter nogood() to do a mov sp,... so the helper program can override + * the panic message. + */ + +#include +#include "minix.h" + +/* #define DOTS /* define to have dots printed */ +/* #define HARDDISK /* Define for hard disk version */ +/* #define TRY_FLOPPY /* To do trial reads to find floppy size */ + +/* #define MIN_SPACE */ + +#define zone_shift 0 /* for any < 32M (!= 0 not supported yet, if ever) */ +#define seg_at(k) ((k)*64) +#define seg_of(p) ((unsigned int)p >>4) +#define BOOTSEG (0x07c0) +#define LOADSEG (0x1000) +#define ORGADDR (0x0500) + +#ifdef HARDDISK +#define get_now() +#endif + +#ifdef zone_shift +#if zone_shift == 0 +#define load_zone load_block +#endif +#else +static short zone_shift; +#endif + +#asm +BOOTADDR = 0x7c00 + +.text +! Apparently on startup the only things we can assume are that we start at +! `start` (ABS addr $07C00) and the boot sector is in the segment. + +! So first set CS=DS=ES=SS=0 +! The we move this to $0500 and put the stack at the top of the first 64k. +! The directory 'file' is loaded $1500 and scanned there. +! The final executable will be loaded in the 2nd 64k chunk. +! +org ORGADDR ! The lowest available address. +start: +#ifndef MIN_SPACE + include sysboot.s + +org start ! The lowest available address, again. + j skip_vars + +org dos_sysid + .ascii "MINIXFS BOOT (C) 1990-1999, Robert de Bath" + + org codestart +#endif + +! A few variables we need to know the positions of for patching, so export +! them and as86_encaps will make some variables. Put them here at the start +! so they're in the same place for both Floppy and harddisk versions as they +! will be used by helper programs. + +export inode ! Inode to search +inode: +_inode: .word 1 ! ROOT_INODE + +#ifndef MIN_SPACE +export dinode ! Inode of directory file was found in. +dinode: +_dinode: .word 1 ! ROOT_INODE +#endif + +export bootfile ! File to boot, make this whatever you like, +bootfile: ! 'boot' is good, 'linux' too. +_bootfile: + .ascii "boot" + .byte 0,0,0,0,0,0,0,0,0,0 + +skip_vars: +#ifdef HARDDISK + mov bx,[si+8] ! Fetch the linear address of part from DS:SI + mov dh,[si+10] ! DL is drive number +#endif + + xor ax,ax ! All segments are zero, first 64k of mem. + mov ds,ax + mov es,ax + mov ss,ax + mov sp,ax + +#ifndef HARDDISK +loopy: + mov ax,#$0203 ! Read 3 sectors, code + superblock. + mov bx,#start ! Where this _should_ be + mov cx,#$0001 ! From sector 1 + xor dx,dx ! Of the floppy drive head zero + int $13 + jc loopy +#else + + mov cx,#$100 ! Move 256 words + mov si,#BOOTADDR ! From default BB + mov di,#ORGADDR ! To the correct address. + rep + movsw + + xchg dl,dh + mov [bootpart],bx ! Save the partition sector offset (and drive) + mov [bootpart+2],dx + + ! Read next 2 sectors of hd. + xor dx,dx + mov cx,#1 + mov bx,#ORGADDR+$200 + mov al,#2 + + call load_sect +#endif + + jmpi code,#0 + +#endasm + +/* /* */ +/****************************************************************************/ +/* Section cdef */ +/****************************************************************************/ + +/* The name of the file and inode to start */ +extern char bootfile[]; +extern inode_nr inode; +extern inode_nr dinode; + +/* For multi-sector reads */ +extern sect_nr lastsect; +extern sect_nr firstsect; +extern unsigned loadaddr; +extern unsigned loadcount; + +/* Keep track of zones to load */ +extern zone_nr * next_zone; +extern zone_nr * end_zone; +extern zone_nr indirect; + +/* Where to load zones */ +extern unsigned ldaddr; + +/* Directory reading */ +extern dir_struct * dirptr; +extern unsigned flength; +extern unsigned dir_32; + +#ifndef HARDDISK +/* The 'shape' of the floppy - intuit from superblock or try to read max */ +extern unsigned n_sectors; +#endif + +extern struct super_block b_super; +extern d_inode b_inode[INODES_PER_BLOCK]; +extern zone_nr b_zone[NR_INDIRECTS]; +extern dir_struct directory[]; + +/* /* */ +/****************************************************************************/ +/* Section adef */ +/****************************************************************************/ + +#asm +.text + +#ifdef HARDDISK +bootpart: .long 0 +#else +_loadcount: .word 0 +_firstsect: .word 0 +_loadaddr: .word 0 +_lastsect: .word 0 +#endif + + block start+0x400 +_b_super: .blkb 512 + +#ifndef MIN_SPACE +export helper +helper: .blkb 1024 +export helper_end +helper_end: +#endif + +_b_inode: .blkb 1024 +_b_zone: .blkb 1024 + +#ifdef MIN_SPACE +temp_space: .blkb 512 +#endif +probe_buf: +_directory: .blkb 32768 + endb + +#endasm + +/* /* */ +/****************************************************************************/ +/* Section nogood */ +/****************************************************************************/ +/* #if defined(HARDDISK) && !defined(SKIPBOOT) */ +#ifndef SKIPBOOT +static +nogood() +{ +#asm + mov si,#fail_fs +min_nextc: + lodsb + cmp al,#0 + jz min_eos + mov bx,#7 + mov ah,#$E ! Can't use $13 cause that's AT+ only! + int $10 + jmp min_nextc +min_eos: ! Wait for a key then reboot + xor ax,ax + int $16 + jmpi $0,$FFFF ! Reboot. + +fail_fs: + .byte 13,10 +#if defined(HARDDISK) + .asciz "Initial boot failed, press return to reboot\r\n" +#else + .asciz "Boot failed:" +#endif +#endasm +} + +#else + +static +nogood() +{ +/* This didn't work, chain the boot sector of the HD */ +#asm + push cs + pop es +hcode: + mov ax,#$0201 ! Read 1 sector + mov bx,#BOOTADDR ! In the boot area + mov cx,#$0001 ! From sector 1 + mov dx,#$0080 ! Of the hard drive head zero + int $13 + jc hcode ! Keep trying forever! + jmpi BOOTADDR,0 +#endasm +} +#endif + +/* /* */ +/****************************************************************************/ +/* Section hd_sect */ +/****************************************************************************/ +#ifdef HARDDISK +#asm +! +! Load AL sectors from linear sector DX:CX into location ES:BX +! Linear sector zero is at [bootpart] +! This loads one sector at a time, but that's OK cause even in the _very_ +! worst case it'll take no more that 5 seconds to load a 16 bit executable. +! +load_sect: + add cx,[bootpart] + adc dx,[bootpart+2] +moresect: + cmp al,#0 + jnz onesect + clc + ret + +! Load one sector... +onesect: + push ax ! Save lots + push di + push si + push cx ! Drive and sector. + push dx + + push es ! Load location + push bx + + push cx ! Drive and sector again. + push dx + + ! Fetch drive 'shape' + mov ah,#8 + mov dl,dh + int $13 ! DX:CX = drive specification + jc _nogood + + and cx,#$3F ! Get sector count => DI + mov di,cx + + xor dl,dl ! Get head count => SI + xchg dl,dh + inc dx + mov si,dx + + pop dx ! Get back drive and sector + pop ax + + mov bl,dh ! Save drive + xor dh,dh + + div di ! DX=sector, AX=track number + mov cx,dx + inc cl ! CL=sector number + + xor dx,dx + div si ! DX=head, AX=cylinder + + mov dh,dl + mov dl,bl ! DX for int 1302 + + xchg al,ah + ror al,#1 + ror al,#1 + or cx,ax ! CX for int 1302 + + pop bx ! ES:BX for int 1302 + pop es + + mov di,#5 ! Lots of retries for a hd +retry: + mov ax,#$0201 + int $13 + jnc got_hd_sect + + xor ax,ax ! Reset between each try. + int $13 + + dec di + jnz retry + br _nogood + +got_hd_sect: + pop dx + pop cx + pop si + pop di + pop ax + + dec al + add cx,#1 + adc dh,#0 + add bh,#2 + jmp moresect +#endasm +#endif + +/****************************************************************************/ +/* This is the end of the parts that MUST be in the first sector */ +/* From here down the functions can safely be in any order. */ +/****************************************************************************/ + +/* /* */ +/****************************************************************************/ +/* Section fd_block */ +/****************************************************************************/ +#ifndef HARDDISK +static +load_block(address, blkno) +unsigned address, blkno; +{ + register sect_nr sectno; + if(blkno == 0) { zero_block(address); return; } +#ifdef DOTS + prt_dot(); +#endif + + sectno = (sect_nr)blkno * 2; + load_sect(address, sectno); + load_sect(address+32, sectno+1); +} +#endif + +/****************************************************************************/ +/* Section fd_bpb */ +/****************************************************************************/ +#ifndef HARDDISK +#asm +_set_bpb: +#ifdef MIN_SPACE +bios_tabl=temp_space ! Temp space. +bios_disk=temp_space+4 ! +#else +bios_tabl=dosfs_stat ! Temp space. +bios_disk=dosfs_stat+4 ! +#endif + +#ifndef __CALLER_SAVES__ + push si + push di +#endif + + mov di,#bios_disk + mov bx,#0x78 +! 0:bx is parameter table address + + push ds + push di + + mov si,[bx] + mov ax,[bx+2] + mov [bios_tabl],si + mov [bios_tabl+2],ax + push ax + + pop ds +! ds:si is source + +! copy 12 bytes + mov cl,#6 + cld + rep + movsw + + pop di + pop ds + mov ax,[_n_sectors] + movb 4[di],al ! patch sector count + + mov [bx],di + mov 2[bx],es + +#ifndef __CALLER_SAVES__ + pop si + pop di +#endif + ret + +_unset_bpb: +! 0:0x78 is parameter table address + + mov ax,[bios_tabl] + mov [0x78],ax + mov ax,[bios_tabl+2] + mov [0x78+2],ax + ret + +#endasm +#endif + +/****************************************************************************/ +/* Section fd_get_now */ +/****************************************************************************/ +#ifndef HARDDISK +static +get_now() +{ +#asm + mov si,#5 +retry_get: + xor dx,dx + mov cx,[_firstsect] + shr ch,#1 + adc dh,#0 + mov es,[_loadaddr] + xor bx,bx + mov ax,[_loadcount] + test ax,ax + jz no_load + mov ah,#2 + int $13 ! Try fetch + jnc no_load + xor ax,ax ! Bad, retry. + int $13 + dec si + jnz retry_get + br _nogood +no_load: + xor ax,ax + mov [_loadcount],ax +#endasm +} +#endif + +/****************************************************************************/ +/* Section fd_probe */ +/****************************************************************************/ +#ifndef HARDDISK +#ifdef TRY_FLOPPY +#asm +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +! +! These are the number of sectors per track that will be scanned for. +! For 3.5 inch floppies 36 is 2.88 Mb, 18 is 1.44Mb, 21 is 1.68Mb on +! a 1.44Mb floppy drive. 15 and 9 are for 5.25 inch floppies. + +disksizes: .byte 36,21,18,15,9 + +! It seems that there is no BIOS call to get the number of sectors. Guess +! 36 sectors if sector 36 can be read, 18 sectors if sector 18 can be read, +! 15 if sector 15 can be read. Otherwise guess 9. + +_probe_sectors: + mov si,#disksizes ! table of sizes to try + +probe_loop: + lodsb + cbw ! extend to word + mov _n_sectors, ax + cmp al,#9 + je got_sectors ! if all else fails, try 9 + xchg ax, cx ! cx = track and sector + xor dx, dx ! drive 0, head 0 + mov bx,#probe_buf ! address after setup (es = cs) + mov ax,#0x0201 ! service 2, 1 sector + int 0x13 + jc probe_loop ! try next value +got_sectors: + + ret +#endasm +#else +probe_sectors() +{ + /* Guess the number of sectors based on the size of the file system */ + if( (n_sectors = b_super.s_nzones / 40) > 11 ) n_sectors /= 2; +} +#endif +#endif + +/****************************************************************************/ +/* Section fd_sect */ +/****************************************************************************/ +#ifndef HARDDISK +static +load_sect(address, sectno) +unsigned address; +sect_nr sectno; +{ + register sect_nr nsect; + + nsect = sectno%n_sectors +1; + sectno /= n_sectors; + nsect |= (sectno<<8); + + if( loadcount ) + { + lastsect++; + if( ( address & 4095 ) && nsect == lastsect ) + { + loadcount++; + return; + } + get_now(); + } + + lastsect = firstsect = nsect; + loadaddr = address; + loadcount = 1; +} +#endif + +/****************************************************************************/ +/* Section fd_zeroblk */ +/****************************************************************************/ +#ifndef HARDDISK +static +zero_block(address) +{ +#asm +#if __FIRST_ARG_IN_AX__ + mov es,ax +#else + mov bx,sp + mov es,[bx+2] +#endif + push di + mov cx,#512 + xor ax,ax + mov di,ax + rep + stosw + pop di +#endasm +} +#endif + +/****************************************************************************/ +/* Section hd_block */ +/****************************************************************************/ +#ifdef HARDDISK +/*----------------------------------*/ +/* Hard disk block driver */ +/*----------------------------------*/ + +#asm +_load_block: + push bp + mov bp,sp +#if __FIRST_ARG_IN_AX__ + ! Fetch load location + mov es,ax + + ! Test for block zero + mov ax,4[bp] +#else + ! Fetch load location + mov ax,[bp+4] + mov es,ax + + ! Test for block zero + mov ax,6[bp] +#endif + test ax,ax + jne real_block + + ! Iff block zero, zap memory + push di + mov cx,#512 + xor ax,ax + mov di,ax + rep + stosw + pop di + +func_exit: + mov sp,bp + pop bp + ret + +real_block: +#ifdef DOTS + push ax + call _prt_dot + pop ax +#endif + +! Load a real block. + mov cx,ax + xor dx,dx + shl cx,#1 + rcl dx,#1 + + xor bx,bx + mov al,#2 + call load_sect + + j func_exit +#endasm +#endif + +/****************************************************************************/ +/* Section main */ +/****************************************************************************/ +#asm +code: + call _loadprog + call _runprog + br _nogood + +#endasm + +/****************************************************************************/ +/* Section prt_dots */ +/****************************************************************************/ +#ifdef DOTS +#asm +_prt_crlf: + mov al,#13 + call outch + mov al,#10 + j outch +_prt_dot: + mov al,#'. +outch: + mov ah,#$0E + mov bx,#7 + int $10 + ret +#endasm +#endif + +/****************************************************************************/ +/* Section end_1 */ +/****************************************************************************/ +#if defined(HARDDISK) || !defined(MIN_SPACE) +#asm +end_of_part1: +#ifdef HARDDISK + if *>start+0x1FE ! Leave space for magic +#else + if *>start+0x200 +#endif + fail! Part 1 too large! + endif + .blkb 0x200+start-* +#endasm +#endif + +/****************************************************************************/ +/* Section prog_load */ +/****************************************************************************/ + +loadprog() +{ +#ifdef DOTS + prt_dot(); +#endif + if( b_super.s_magic == SUPER_MAGIC2 ) + dir_32 = 1; + else if( b_super.s_magic == SUPER_MAGIC ) + dir_32 = 0; + else + nogood(); + +#ifdef zone_shift + if( zone_shift != b_super.s_log_zone_size) nogood(); +#else + zone_shift = b_super.s_log_zone_size; +#endif + +#ifndef HARDDISK + probe_sectors(); + + /* if( (n_sectors = b_super.s_nzones / 40) > 11 ) n_sectors /= 2; */ + + set_bpb(); +#endif + +try_again:; + inode--; + load_block(seg_of(b_inode), inode/INODES_PER_BLOCK + + b_super.s_imap_blocks + + b_super.s_zmap_blocks + + 2); + get_now(); + + ldaddr = LOADSEG; /* Load at 64k mark */ + + { + register d_inode * i_ptr; + i_ptr = b_inode + inode%INODES_PER_BLOCK; + next_zone = i_ptr->i_zone; + flength = i_ptr->i_size; + if( (i_ptr->i_mode & I_TYPE) == I_DIRECTORY ) + { + ldaddr = seg_of(directory); +#ifndef MIN_SPACE + dinode = inode+1; /* Remember current directory */ +#endif + inode = 0; /* Mark - we've no _file_ inode yet */ + } + } + + end_zone = next_zone+NR_DZONE_NUM; + load_zone(seg_of(b_zone), (indirect = next_zone[NR_DZONE_NUM])); + get_now(); + + for(;;) + { + if( next_zone >= end_zone ) + { + if( indirect != 0 ) + { + next_zone = b_zone; + end_zone = next_zone + NR_INDIRECTS; + indirect = 0; + continue; + } + break; + } + load_zone(ldaddr, *next_zone); + next_zone++; + ldaddr += (seg_at(1) << zone_shift); + } + get_now(); + +#ifdef DOTS + prt_crlf(); +#endif + if(!inode) + { + dirptr = directory; + while(flength > 0) + { +register char * s = bootfile; +register char * p = dirptr->d_name; + + if( dirptr->d_inum ) + { + for(;;) + { + if( *s == '\0') + { + if(*p == '\0') + { + inode = dirptr->d_inum; + goto try_again; + } + break; + } + if( *s++ != *p++ ) break; + } + } + flength -= 16; + dirptr++; + if( dir_32 ) + { + flength -= 16; + dirptr++; + } + } + nogood(); + } +#ifndef HARDDISK + unset_bpb(); +#endif +} + +/****************************************************************************/ +/* Section prog_run */ +/****************************************************************************/ +static +runprog() +{ +/* It all worked, run the loaded executable */ +#asm +#ifdef HARDDISK + mov dx,[bootpart+2] + xchg dh,dl ! DX => hard drive + push [bootpart] ! CX => partition offset + xor si,si +#else + xor dx,dx ! DX=0 => floppy drive + push dx ! CX=0 => partition offset = 0 + mov si,[_n_sectors] ! Save for monitor.out +#endif + + mov bx,#LOADSEG + mov ds,bx ! DS = loadaddress + xor di,di ! Zero + mov ax,[di] + cmp ax,#0x0301 ! Right magic ? + jnz binfile ! Yuk ... assume .SYS + inc bx + inc bx ! bx = initial CS + mov ax,[di+2] + and ax,#$20 ! Is it split I/D ? + jz impure ! No ... + mov cl,#4 + mov ax,[di+8] + shr ax,cl +impure: + pop cx + add ax,bx + mov ss,ax + mov sp,[di+24] ! Chmem value + mov ds,ax +binfile: + + push bx + push di ! jmpi 0,#LOADSEG+2 + retf +#endasm +} + +/****************************************************************************/ +/* Section sys_libs */ +/****************************************************************************/ +#asm +! These functions are pulled from the C library. +libstuff: +imodu: + xor dx,dx + div bx + mov ax,dx ! instruction queue full so xchg slower + ret +idiv_u: + xor dx,dx + div bx + ret +#ifndef zone_shift +isl: +islu: + mov cl,bl + shl ax,cl + ret +#endif +libend: +#endasm + +/****************************************************************************/ +/* Section sys_vars */ +/****************************************************************************/ +#asm +#ifdef MIN_SPACE + block temp_space+64 +#endif +vars: +#ifndef HARDDISK +_n_sectors: .blkw 1 +#endif +_next_zone: .blkw 1 +_end_zone: .blkw 1 +_indirect: .blkw 1 +_ldaddr: .blkw 1 +_dirptr: .blkw 1 +_flength: .blkw 1 +_dir_32: .blkw 1 +varend: +#ifdef MIN_SPACE + endb +#endif +#endasm + +/****************************************************************************/ +/* Section end_2 */ +/****************************************************************************/ +#asm +end_of_prog: + if *>start+0x400 + fail! Part 2 too large! + endif + + if end_of_prog