From f5a2fbe4184a948e76650e02ae098f4f8fcab5a2 Mon Sep 17 00:00:00 2001 From: rnordier Date: Mon, 19 Jul 1999 18:07:44 +0000 Subject: [PATCH] kgzldr is a kzipboot replacement for use with kgzip(8). Development sponsored by Global Technology Associates, Inc. Reviewed/tested by: abial --- sys/boot/i386/kgzldr/Makefile | 29 ++++++++ sys/boot/i386/kgzldr/boot.c | 128 ++++++++++++++++++++++++++++++++++ sys/boot/i386/kgzldr/crt.s | 83 ++++++++++++++++++++++ sys/boot/i386/kgzldr/kgzldr.h | 41 +++++++++++ sys/boot/i386/kgzldr/lib.c | 87 +++++++++++++++++++++++ sys/boot/i386/kgzldr/sio.s | 46 ++++++++++++ sys/boot/i386/kgzldr/start.s | 45 ++++++++++++ 7 files changed, 459 insertions(+) create mode 100644 sys/boot/i386/kgzldr/Makefile create mode 100644 sys/boot/i386/kgzldr/boot.c create mode 100644 sys/boot/i386/kgzldr/crt.s create mode 100644 sys/boot/i386/kgzldr/kgzldr.h create mode 100644 sys/boot/i386/kgzldr/lib.c create mode 100644 sys/boot/i386/kgzldr/sio.s create mode 100644 sys/boot/i386/kgzldr/start.s diff --git a/sys/boot/i386/kgzldr/Makefile b/sys/boot/i386/kgzldr/Makefile new file mode 100644 index 000000000000..799bd29d3708 --- /dev/null +++ b/sys/boot/i386/kgzldr/Makefile @@ -0,0 +1,29 @@ +# $Id: $ + +PROG= kgzldr.o +SRCS= start.s boot.c inflate.c lib.c crt.s sio.s +CFLAGS= -fno-builtin -Os +CFLAGS+=-DKZIP +LDFLAGS=-nostdlib -static -r +NOMAN= +BINDIR= /usr/lib +BINMODE=444 +STRIP= +.PATH: ${.CURDIR}/../../../kern + +M4?= m4 +MFLAGS= + +BOOT_COMCONSOLE_PORT?= 0x3f8 +MFLAGS+=-DSIOPRT=${BOOT_COMCONSOLE_PORT} + +all: kgzldr.o + +kgzldr.o: ${OBJS} + ${CC} ${LDFLAGS} -o ${.TARGET} ${OBJS} + +.s.o: + (cd ${.CURDIR}; ${M4} ${MFLAGS} ${.IMPSRC}) |\ + ${AS} ${AFLAGS} -o ${.TARGET} + +.include diff --git a/sys/boot/i386/kgzldr/boot.c b/sys/boot/i386/kgzldr/boot.c new file mode 100644 index 000000000000..0313be7b34c1 --- /dev/null +++ b/sys/boot/i386/kgzldr/boot.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 1999 Global Technology Associates, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id:$ + */ + +#include +#include +#include + +#include "kgzldr.h" + +#define KGZ_HEAD 0xa /* leading bytes to ignore */ +#define KGZ_TAIL 0x8 /* trailing bytes to ignore */ + +#define E_FMT 1 /* Error: Invalid format */ +#define E_MEM 2 /* Error: Out of memory */ + +struct kgz_hdr { + char ident[4]; /* identification */ + uint32_t dload; /* decoded image load address */ + uint32_t dsize; /* decoded image size */ + uint32_t isize; /* image size in memory */ + uint32_t entry; /* program entry point */ + uint32_t nsize; /* encoded image size */ +}; +extern struct kgz_hdr kgz; /* header */ +extern uint8_t kgz_ndata[]; /* encoded image */ + +static const char *const msg[] = { + "done", + "invalid format", + "out of memory" +}; + +static const u_char *ip; /* input pointer */ +static u_char *op; /* output pointer */ + +static struct inflate infl; /* inflate() parameters */ + +static int decode(void); +static int input(void *); +static int output(void *, u_char *, u_long); + +/* + * Uncompress and boot a kernel. + */ +int +boot(int howto) +{ + int err; + + kgz_con = howto & RB_SERIAL ? KGZ_SIO : KGZ_CRT; + putstr("Uncompressing ... "); + err = decode(); + putstr(msg[err]); + putstr("\n"); + if (err) { + putstr("System halted"); + for (;;) + ; + } + return err; +} + +/* + * Interface with inflate() to uncompress the data. + */ +static int +decode(void) +{ + static u_char slide[GZ_WSIZE]; + int err; + + ip = kgz_ndata + KGZ_HEAD; + op = (u_char *)kgz.dload; + infl.gz_input = input; + infl.gz_output = output; + infl.gz_slide = slide; + err = inflate(&infl); + return err ? err == 3 ? E_MEM : E_FMT : 0; +} + +/* + * Read a byte. + */ +static int +input(void *dummy) +{ + if ((size_t)(ip - kgz_ndata) + KGZ_TAIL > kgz.nsize) + return GZ_EOF; + return *ip++; +} + +/* + * Write some bytes. + */ +static int +output(void *dummy, u_char * ptr, u_long len) +{ + if (op - (u_char *)kgz.dload + len > kgz.dsize) + return -1; + while (len--) + *op++ = *ptr++; + return 0; +} diff --git a/sys/boot/i386/kgzldr/crt.s b/sys/boot/i386/kgzldr/crt.s new file mode 100644 index 000000000000..4c0474755d47 --- /dev/null +++ b/sys/boot/i386/kgzldr/crt.s @@ -0,0 +1,83 @@ +# +# Copyright (c) 1999 Global Technology Associates, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# From: btx.s 1.10 1999/02/25 16:27:41 rnordier +# $Id:$ +# + +# Screen defaults and assumptions. + + .set SCR_MAT,0x7 # Mode/attribute + .set SCR_COL,0x50 # Columns per row + .set SCR_ROW,0x19 # Rows per screen + +# BIOS Data Area locations. + + .set BDA_SCR,0x449 # Video mode + .set BDA_POS,0x450 # Cursor position + + .globl crt_putchr + +# void crt_putchr(int c) + +crt_putchr: movb 0x4(%esp,1),%al # Get character + pusha # Save + xorl %ecx,%ecx # Zero for loops + movb $SCR_MAT,%ah # Mode/attribute + movl $BDA_POS,%ebx # BDA pointer + movw (%ebx),%dx # Cursor position + movl $0xb8000,%edi # Regen buffer (color) + cmpb %ah,BDA_SCR-BDA_POS(%ebx) # Mono mode? + jne crt_putchr.1 # No + xorw %di,%di # Regen buffer (mono) +crt_putchr.1: cmpb $0xa,%al # New line? + je crt_putchr.2 # Yes + xchgl %eax,%ecx # Save char + movb $SCR_COL,%al # Columns per row + mulb %dh # * row position + addb %dl,%al # + column + adcb $0x0,%ah # position + shll %eax # * 2 + xchgl %eax,%ecx # Swap char, offset + movw %ax,(%edi,%ecx,1) # Write attr:char + incl %edx # Bump cursor + cmpb $SCR_COL,%dl # Beyond row? + jb crt_putchr.3 # No +crt_putchr.2: xorb %dl,%dl # Zero column + incb %dh # Bump row +crt_putchr.3: cmpb $SCR_ROW,%dh # Beyond screen? + jb crt_putchr.4 # No + leal 2*SCR_COL(%edi),%esi # New top line + movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move + rep # Scroll + movsl # screen + movb $' ',%al # Space + movb $SCR_COL,%cl # Columns to clear + rep # Clear + stosw # line + movb $SCR_ROW-1,%dh # Bottom line +crt_putchr.4: movw %dx,(%ebx) # Update position + popa # Restore + ret # To caller diff --git a/sys/boot/i386/kgzldr/kgzldr.h b/sys/boot/i386/kgzldr/kgzldr.h new file mode 100644 index 000000000000..7f18c7e0b5d3 --- /dev/null +++ b/sys/boot/i386/kgzldr/kgzldr.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 1999 Global Technology Associates, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id:$ + */ + +#define KGZ_CRT 0x1 /* Video console */ +#define KGZ_SIO 0x2 /* Serial console */ + +extern int kgz_con; + +int boot(int); + +unsigned char *kzipmalloc(int); +void kzipfree(void *); +void putstr(const char *); + +void crt_putchr(int); +void sio_putchr(int); diff --git a/sys/boot/i386/kgzldr/lib.c b/sys/boot/i386/kgzldr/lib.c new file mode 100644 index 000000000000..f763f3119274 --- /dev/null +++ b/sys/boot/i386/kgzldr/lib.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 1999 Global Technology Associates, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id:$ + */ + +#include +#include + +#include "kgzldr.h" + +#define MEMSIZ 0x8000 /* Memory pool size */ + +int kgz_con; /* Console control */ + +static size_t memtot; /* Memory allocated: bytes */ +static u_int memcnt; /* Memory allocated: blocks */ + +/* + * Library functions required by inflate(). + */ + +/* + * Allocate memory block. + */ +unsigned char * +kzipmalloc(int size) +{ + static u_char mem[MEMSIZ]; + void *ptr; + + if (memtot + size > MEMSIZ) + return NULL; + ptr = mem + memtot; + memtot += size; + memcnt++; + return ptr; +} + +/* + * Free allocated memory block. + */ +void +kzipfree(void *ptr) +{ + memcnt--; + if (!memcnt) + memtot = 0; +} + +/* + * Write a string to the console. + */ +void +putstr(const char *str) +{ + int c; + + while ((c = *str++)) { + if (kgz_con & KGZ_CRT) + crt_putchr(c); + if (kgz_con & KGZ_SIO) + sio_putchr(c); + } +} diff --git a/sys/boot/i386/kgzldr/sio.s b/sys/boot/i386/kgzldr/sio.s new file mode 100644 index 000000000000..78fd6ca31373 --- /dev/null +++ b/sys/boot/i386/kgzldr/sio.s @@ -0,0 +1,46 @@ +# +# Copyright (c) 1999 Global Technology Associates, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# From: sio.s 1.3 1999/01/10 14:48:03 rnordier +# $Id:$ +# + + .set SIO_PRT,SIOPRT # Base port + + .globl sio_putchr + +# void sio_putchr(int c) + +sio_putchr: movw $SIO_PRT+0x5,%dx # Line status reg + xor %ecx,%ecx # Timeout + movb $0x40,%ch # counter +sio_putchr.1: inb (%dx),%al # Transmitter + testb $0x20,%al # buffer empty? + loopz sio_putchr.1 # No + jz sio_putchr.2 # If timeout + movb 0x4(%esp,1),%al # Get character + subb $0x5,%dl # Transmitter hold reg + outb %al,(%dx) # Write character +sio_putchr.2: ret # To caller diff --git a/sys/boot/i386/kgzldr/start.s b/sys/boot/i386/kgzldr/start.s new file mode 100644 index 000000000000..d565cecfbf51 --- /dev/null +++ b/sys/boot/i386/kgzldr/start.s @@ -0,0 +1,45 @@ +# +# Copyright (c) 1999 Global Technology Associates, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# $Id:$ +# + + .set entry,0x10 # kgz.entry + + .globl _start + +# C startup code for kgzldr. + +_start: cld # String ops inc + movl $_edata,%edi # Start of bss + movl $_end,%ecx # Compute + subl %edi,%ecx # size + xorl %eax,%eax # Zero + rep # Clear + stosb # bss + pushl 0x4(%esp) # Pass howto flags + call boot # Call C code + popl %ecx # Clear stack + jmp *kgz+entry # To loaded code