Remove kgzip and kgzldr.

PR:		183666, 229763
Submitted by:	Yoshihiro Ota <ota at j.email.ne.jp>
Differential Revision:	https://reviews.freebsd.org/D20248
This commit is contained in:
Xin LI 2019-05-24 05:34:21 +00:00
parent a49818787d
commit 5e86bd6073
27 changed files with 6 additions and 1799 deletions

View File

@ -38,6 +38,11 @@
# xargs -n1 | sort | uniq -d;
# done
# 20190523: Remove obsolete kgzip and support files
OLD_FILES+=usr/sbin/kgzip
OLD_FILES+=usr/lib/kgzldr.o
OLD_FILES+=usr/share/man/man8/kgzip.8.gz
# 20190517: Remove obsolete 10 and 10/100 ethernet drivers.
OLD_FILES+=usr/share/man/man4/bm.4.gz
OLD_FILES+=usr/share/man/man4/cs.4.gz

View File

@ -16,10 +16,6 @@ SUBDIR.yes+= loader_simp
# special boot programs, 'self-extracting boot2+loader'
SUBDIR.yes+= pxeldr
.if ${MACHINE_CPUARCH} == "i386"
SUBDIR.yes+= kgzldr
.endif
SUBDIR.${MK_LOADER_ZFS}+= zfsboot gptzfsboot
.include <bsd.subdir.mk>

View File

@ -1,20 +0,0 @@
# $FreeBSD$
.include <bsd.init.mk>
PROG= kgzldr.o
STRIP=
BINMODE=${LIBMODE}
BINDIR= ${LIBDIR}
SRCS= start.S boot.c subr_inflate.c lib.c crt.S sio.S
CFLAGS= -Os
CFLAGS+=-DKZIP
NO_SHARED=
LDFLAGS+=-Wl,-r
.PATH: ${SYSDIR}/kern
BOOT_COMCONSOLE_PORT?= 0x3f8
ACFLAGS+=-Wa,-defsym,SIO_PRT=${BOOT_COMCONSOLE_PORT}
.include <bsd.prog.mk>

View File

@ -1,12 +0,0 @@
# $FreeBSD$
# Autogenerated - do NOT edit!
DIRDEPS = \
include \
.include <dirdeps.mk>
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
# local dependencies - needed for -jN in clean tree
.endif

View File

@ -1,129 +0,0 @@
/*-
* 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.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/reboot.h>
#include <sys/inflate.h>
#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;
}

View File

@ -1,83 +0,0 @@
#
# 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
# $FreeBSD$
#
# 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

View File

@ -1,41 +0,0 @@
/*
* 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.
*
* $FreeBSD$
*/
#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);

View File

@ -1,88 +0,0 @@
/*-
* 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.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <stddef.h>
#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);
}
}

View File

@ -1,44 +0,0 @@
#
# 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
# $FreeBSD$
#
.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

View File

@ -1,45 +0,0 @@
#
# 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.
#
# $FreeBSD$
#
.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

View File

@ -827,7 +827,6 @@ DIRDEPS.i386= \
usr.sbin/hyperv/tools/kvp \
usr.sbin/hyperv/tools/vss \
usr.sbin/kgmon \
usr.sbin/kgzip \
usr.sbin/lptcontrol \
usr.sbin/mptable \
usr.sbin/ndiscvt \

View File

@ -83,7 +83,7 @@ DIRDEPS+= \
DIRDEPS.arm= ${_sys_boot_fdt} ${_sys_boot_efi}
DIRDEPS.arm64= ${_sys_boot_fdt} ${_sys_boot_efi}
DIRDEPS.i386= ${DIRDEPS.x86sys} ${_sys_boot_efi} stand/i386/kgzldr
DIRDEPS.i386= ${DIRDEPS.x86sys} ${_sys_boot_efi}
DIRDEPS.powerpc= ${_sys_boot_fdt} stand/libsa32 stand/ofw stand/uboot
DIRDEPS.sparc64= stand/ofw ${_sys_boot_zfs}
.endif

View File

@ -1,6 +1,5 @@
# $FreeBSD$
# kgzip: builds, but missing support files
# mptable: broken (not 64 bit clean)
# pnpinfo: crashes (not really useful anyway)
.if ${MK_ACPI} != "no"

View File

@ -16,7 +16,6 @@ SUBDIR+= cpucontrol
SUBDIR+= hyperv
.endif
SUBDIR+= kgmon
SUBDIR+= kgzip
SUBDIR+= lptcontrol
SUBDIR+= mptable
.if ${MK_NDIS} != "no"

View File

@ -1,9 +0,0 @@
# $FreeBSD$
PROG= kgzip
MAN= kgzip.8
SRCS= kgzip.c aouthdr.c elfhdr.c kgzcmp.c kgzld.c xio.c
WARNS?= 3
.include <bsd.prog.mk>

View File

@ -1,15 +0,0 @@
# $FreeBSD$
# Autogenerated - do NOT edit!
DIRDEPS = \
include \
include/xlocale \
lib/${CSU_DIR} \
lib/libc \
.include <dirdeps.mk>
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
# local dependencies - needed for -jN in clean tree
.endif

View File

@ -1,81 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2000 Robert Nordier
* 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(S) ``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(S) 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.
*
* $FreeBSD$
*/
#include <stddef.h>
#include "aouthdr.h"
#define KGZ_FIX_NSIZE 0 /* Run-time fixup */
const struct kgz_aouthdr0 aouthdr0 = {
/* a.out header */
{
MID_I386 << 020 | OMAGIC, /* a_midmag */
0, /* a_text */
sizeof(struct kgz_hdr) + KGZ_FIX_NSIZE, /* a_data */
0, /* a_bss */
sizeof(struct nlist) * KGZ__STNUM, /* a_syms */
0, /* a_entry */
0, /* a_trsize */
0 /* a_drsize */
}
};
const struct kgz_aouthdr1 aouthdr1 = {
/* Symbol table */
{
{
{
(char *)offsetof(struct kgz__strtab,
kgz) /* n_un */
},
N_DATA | N_EXT, /* n_type */
AUX_OBJECT, /* n_other */
0, /* n_desc */
0 /* n_value */
},
{
{
(char *)offsetof(struct kgz__strtab,
kgz_ndata) /* n_un */
},
N_DATA | N_EXT, /* n_type */
AUX_OBJECT, /* n_other */
0, /* n_desc */
sizeof(struct kgz_hdr) /* n_value */
}
},
/* String table */
{
sizeof(struct kgz__strtab), /* length */
KGZ__STR_KGZ, /* kgz */
KGZ__STR_KGZ_NDATA /* kgz_ndata */
}
};

View File

@ -1,61 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2000 Robert Nordier
* 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(S) ``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(S) 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.
*
* $FreeBSD$
*/
#include <a.out.h>
#include "kgz.h"
/* Relocatable header: part 0 */
struct kgz_aouthdr0 {
struct exec a;
};
/* Symbol table entries */
#define KGZ__STNUM 2
/* Symbol table strings */
#define KGZ__STR_KGZ "_kgz"
#define KGZ__STR_KGZ_NDATA "_kgz_ndata"
/* String table */
struct kgz__strtab {
unsigned long length;
char kgz[sizeof(KGZ__STR_KGZ)];
char kgz_ndata[sizeof(KGZ__STR_KGZ_NDATA)];
};
/* Relocatable header: part 1 */
struct kgz_aouthdr1 {
struct nlist st[KGZ__STNUM];
struct kgz__strtab strtab;
};
extern const struct kgz_aouthdr0 aouthdr0;
extern const struct kgz_aouthdr1 aouthdr1;

View File

@ -1,166 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* 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.
*
* $FreeBSD$
*/
#include <sys/endian.h>
#include <stddef.h>
#include "elfhdr.h"
#define KGZ_FIX_NSIZE 0 /* Run-time fixup */
/*
* Relocatable header template.
*/
const struct kgz_elfhdr elfhdr = {
/* ELF header */
{
{
ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, /* e_ident */
ELFCLASS32, ELFDATA2LSB, EV_CURRENT, 0,
'F', 'r', 'e', 'e', 'B', 'S', 'D', 0
},
htole16(ET_EXEC), /* e_type */
htole16(EM_386), /* e_machine */
htole32(EV_CURRENT), /* e_version */
0, /* e_entry */
0, /* e_phoff */
htole32(offsetof(struct kgz_elfhdr, sh)), /* e_shoff */
0, /* e_flags */
htole16(sizeof(Elf32_Ehdr)), /* e_ehsize */
0, /* e_phentsize */
0, /* e_phnum */
htole16(sizeof(Elf32_Shdr)), /* e_shentsize */
htole16(KGZ_SHNUM), /* e_shnum */
htole16(KGZ_SH_SHSTRTAB) /* e_shstrndx */
},
/* Section header */
{
{
0, /* sh_name */
htole32(SHT_NULL), /* sh_type */
0, /* sh_flags */
0, /* sh_addr */
0, /* sh_offset */
0, /* sh_size */
htole32(SHN_UNDEF), /* sh_link */
0, /* sh_info */
0, /* sh_addralign */
0 /* sh_entsize */
},
{
htole32(offsetof(struct kgz_shstrtab, symtab)), /* sh_name */
htole32(SHT_SYMTAB), /* sh_type */
0, /* sh_flags */
0, /* sh_addr */
htole32(offsetof(struct kgz_elfhdr, st)), /* sh_offset */
htole32(sizeof(Elf32_Sym) * KGZ_STNUM), /* sh_size */
htole32(KGZ_SH_STRTAB), /* sh_link */
htole32(1), /* sh_info */
htole32(4), /* sh_addralign */
htole32(sizeof(Elf32_Sym)) /* sh_entsize */
},
{
htole32(offsetof(struct kgz_shstrtab, shstrtab)), /* sh_name */
htole32(SHT_STRTAB), /* sh_type */
0, /* sh_flags */
0, /* sh_addr */
htole32(offsetof(struct kgz_elfhdr, shstrtab)), /* sh_offset */
htole32(sizeof(struct kgz_shstrtab)), /* sh_size */
htole32(SHN_UNDEF), /* sh_link */
0, /* sh_info */
htole32(1), /* sh_addralign */
0 /* sh_entsize */
},
{
htole32(offsetof(struct kgz_shstrtab, strtab)), /* sh_name */
htole32(SHT_STRTAB), /* sh_type */
0, /* sh_flags */
0, /* sh_addr */
htole32(offsetof(struct kgz_elfhdr, strtab)), /* sh_offset */
htole32(sizeof(struct kgz_strtab)), /* sh_size */
htole32(SHN_UNDEF), /* sh_link */
0, /* sh_info */
htole32(1), /* sh_addralign */
0 /* sh_entsize */
},
{
htole32(offsetof(struct kgz_shstrtab, data)), /* sh_name */
htole32(SHT_PROGBITS), /* sh_type */
htole32(SHF_ALLOC | SHF_WRITE), /* sh_flags */
0, /* sh_addr */
htole32(sizeof(struct kgz_elfhdr)), /* sh_offset */
htole32(sizeof(struct kgz_hdr) + KGZ_FIX_NSIZE), /* sh_size */
htole32(SHN_UNDEF), /* sh_link */
0, /* sh_info */
htole32(4), /* sh_addralign */
0 /* sh_entsize */
}
},
/* Symbol table */
{
{
0, /* st_name */
0, /* st_value */
0, /* st_size */
0, /* st_info */
0, /* st_other */
htole16(SHN_UNDEF) /* st_shndx */
},
{
htole32(offsetof(struct kgz_strtab, kgz)), /* st_name */
0, /* st_value */
htole32(sizeof(struct kgz_hdr)), /* st_size */
ELF32_ST_INFO(STB_GLOBAL, STT_OBJECT), /* st_info */
0, /* st_other */
htole16(KGZ_SH_DATA) /* st_shndx */
},
{
htole32(offsetof(struct kgz_strtab, kgz_ndata)), /* st_name */
htole32(sizeof(struct kgz_hdr)), /* st_value */
htole32(KGZ_FIX_NSIZE), /* st_size */
ELF32_ST_INFO(STB_GLOBAL, STT_OBJECT), /* st_info */
0, /* st_other */
htole16(KGZ_SH_DATA) /* st_shndx */
}
},
/* Section header string table */
{
KGZ_SHSTR_ZERO, /* zero */
KGZ_SHSTR_SYMTAB, /* symtab */
KGZ_SHSTR_SHSTRTAB, /* shstrtab */
KGZ_SHSTR_STRTAB, /* strtab */
KGZ_SHSTR_DATA /* data */
},
/* String table */
{
KGZ_STR_ZERO, /* zero */
KGZ_STR_KGZ, /* kgz */
KGZ_STR_KGZ_NDATA /* kgz_ndata */
}
};

View File

@ -1,86 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* 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.
*
* $FreeBSD$
*/
#include <sys/types.h>
#define __ELF_WORD_SIZE 32
#include <sys/elf32.h>
#include <sys/elf_generic.h>
#include "kgz.h"
/* Section header indices */
#define KGZ_SH_SYMTAB 1
#define KGZ_SH_SHSTRTAB 2
#define KGZ_SH_STRTAB 3
#define KGZ_SH_DATA 4
#define KGZ_SHNUM 5
/* Section header strings */
#define KGZ_SHSTR_ZERO ""
#define KGZ_SHSTR_SYMTAB ".symtab"
#define KGZ_SHSTR_SHSTRTAB ".shstrtab"
#define KGZ_SHSTR_STRTAB ".strtab"
#define KGZ_SHSTR_DATA ".data"
/* Section header string table */
struct kgz_shstrtab {
char zero[sizeof(KGZ_SHSTR_ZERO)];
char symtab[sizeof(KGZ_SHSTR_SYMTAB)];
char shstrtab[sizeof(KGZ_SHSTR_SHSTRTAB)];
char strtab[sizeof(KGZ_SHSTR_STRTAB)];
char data[sizeof(KGZ_SHSTR_DATA)];
};
/* Symbol table indices */
#define KGZ_ST_KGZ 1
#define KGZ_ST_KGZ_NDATA 2
#define KGZ_STNUM 3
/* Symbol table strings */
#define KGZ_STR_ZERO ""
#define KGZ_STR_KGZ "kgz"
#define KGZ_STR_KGZ_NDATA "kgz_ndata"
/* String table */
struct kgz_strtab {
char zero[sizeof(KGZ_STR_ZERO)];
char kgz[sizeof(KGZ_STR_KGZ)];
char kgz_ndata[sizeof(KGZ_STR_KGZ_NDATA)];
};
/* Relocatable header format */
struct kgz_elfhdr {
Elf32_Ehdr e;
Elf32_Shdr sh[KGZ_SHNUM];
Elf32_Sym st[KGZ_STNUM];
struct kgz_shstrtab shstrtab;
struct kgz_strtab strtab;
};
extern const struct kgz_elfhdr elfhdr;

View File

@ -1,59 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* 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.
*
* $FreeBSD$
*/
#ifndef _KGZ_H_
#define _KGZ_H_
#include <sys/types.h>
/*
* KGZ definitions: kgzip(8) output.
*/
/* Values for ident[]. */
#define KGZ_ID0 'K'
#define KGZ_ID1 'G'
#define KGZ_ID2 'Z'
#define KGZ_ID3 '\0'
/* KGZ header. */
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 */
#endif /* !_KGZ_H_ */

View File

@ -1,239 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* 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.
*
* $FreeBSD$
*/
#define _KERNEL
#include <sys/param.h>
#undef _KERNEL
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <a.out.h>
#include "aouthdr.h"
#include "elfhdr.h"
#include "kgzip.h"
static void mk_data(const struct iodesc *i, const struct iodesc *,
struct kgz_hdr *, size_t);
static int ld_elf(const struct iodesc *, const struct iodesc *,
struct kgz_hdr *, const Elf32_Ehdr *);
static int ld_aout(const struct iodesc *, const struct iodesc *,
struct kgz_hdr *, const struct exec *);
/*
* Compress executable and output it in relocatable object format.
*/
void
kgzcmp(struct kgz_hdr *kh, const char *f1, const char *f2)
{
struct iodesc idi, ido;
struct kgz_hdr khle;
if ((idi.fd = open(idi.fname = f1, O_RDONLY)) == -1)
err(1, "%s", idi.fname);
if ((ido.fd = open(ido.fname = f2, O_CREAT | O_TRUNC | O_WRONLY,
0666)) == -1)
err(1, "%s", ido.fname);
kh->ident[0] = KGZ_ID0;
kh->ident[1] = KGZ_ID1;
kh->ident[2] = KGZ_ID2;
kh->ident[3] = KGZ_ID3;
mk_data(&idi, &ido, kh,
(format == F_AOUT ? sizeof(struct kgz_aouthdr0) :
sizeof(struct kgz_elfhdr)) +
sizeof(struct kgz_hdr));
kh->dload &= 0xffffff;
kh->entry &= 0xffffff;
if (format == F_AOUT) {
struct kgz_aouthdr0 ahdr0 = aouthdr0;
struct kgz_aouthdr1 ahdr1 = aouthdr1;
unsigned x = (sizeof(struct kgz_hdr) + kh->nsize) & (16 - 1);
if (x) {
x = 16 - x;
xzero(&ido, x);
}
xwrite(&ido, &ahdr1, sizeof(ahdr1));
ahdr0.a.a_data += kh->nsize + x;
xseek(&ido, 0);
xwrite(&ido, &ahdr0, sizeof(ahdr0));
} else {
struct kgz_elfhdr ehdr = elfhdr;
ehdr.st[KGZ_ST_KGZ_NDATA].st_size = htole32(kh->nsize);
ehdr.sh[KGZ_SH_DATA].sh_size =
htole32(le32toh(ehdr.sh[KGZ_SH_DATA].sh_size) + kh->nsize);
xseek(&ido, 0);
xwrite(&ido, &ehdr, sizeof(ehdr));
}
khle = *kh;
khle.dload = htole32(khle.dload);
khle.dsize = htole32(khle.dsize);
khle.isize = htole32(khle.isize);
khle.entry = htole32(khle.entry);
khle.nsize = htole32(khle.nsize);
xwrite(&ido, &khle, sizeof(khle));
xclose(&ido);
xclose(&idi);
}
/*
* Make encoded (compressed) data.
*/
static void
mk_data(const struct iodesc * idi, const struct iodesc * ido,
struct kgz_hdr * kh, size_t off)
{
union {
struct exec ex;
Elf32_Ehdr ee;
} hdr;
struct stat sb;
struct iodesc idp;
int fd[2];
pid_t pid;
size_t n;
int fmt, status, e;
n = xread(idi, &hdr, sizeof(hdr), 0);
fmt = 0;
if (n >= sizeof(hdr.ee) && IS_ELF(hdr.ee))
fmt = F_ELF;
else if (n >= sizeof(hdr.ex) && N_GETMAGIC(hdr.ex) == ZMAGIC)
fmt = F_AOUT;
if (!fmt)
errx(1, "%s: Format not supported", idi->fname);
xseek(ido, off);
if (pipe(fd))
err(1, NULL);
switch (pid = fork()) {
case -1:
err(1, NULL);
case 0:
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(idi->fd);
dup2(ido->fd, STDOUT_FILENO);
close(ido->fd);
execlp("gzip", "gzip", "-9n", (char *)NULL);
warn(NULL);
_exit(1);
default:
close(fd[0]);
idp.fname = "(pipe)";
idp.fd = fd[1];
e = fmt == F_ELF ? ld_elf(idi, &idp, kh, &hdr.ee) :
fmt == F_AOUT ? ld_aout(idi, &idp, kh, &hdr.ex) : -1;
close(fd[1]);
if ((pid = waitpid(pid, &status, 0)) == -1)
err(1, NULL);
if (WIFSIGNALED(status) || WEXITSTATUS(status))
exit(1);
}
if (e)
errx(1, "%s: Invalid format", idi->fname);
if (fstat(ido->fd, &sb))
err(1, "%s", ido->fname);
kh->nsize = sb.st_size - off;
}
/*
* "Load" an ELF-format executable.
*/
static int
ld_elf(const struct iodesc * idi, const struct iodesc * ido,
struct kgz_hdr * kh, const Elf32_Ehdr * e)
{
Elf32_Phdr p;
size_t load, addr, n;
unsigned x, i;
load = addr = n = 0;
for (x = i = 0; i < e->e_phnum; i++) {
if (xread(idi, &p, sizeof(p),
e->e_phoff + i * e->e_phentsize) != e->e_phentsize)
return -1;
if (p.p_type != PT_LOAD)
continue;
if (!x)
load = addr = p.p_vaddr;
else {
if (p.p_vaddr < addr)
return -1;
n = p.p_vaddr - addr;
if (n) {
xzero(ido, n);
addr += n;
}
}
if (p.p_memsz < p.p_filesz)
return -1;
n = p.p_memsz - p.p_filesz;
xcopy(idi, ido, p.p_filesz, p.p_offset);
addr += p.p_filesz;
x++;
}
if (!x)
return -1;
kh->dload = load;
kh->dsize = addr - load;
kh->isize = kh->dsize + n;
kh->entry = e->e_entry;
return 0;
}
/*
* "Load" an a.out-format executable.
*/
static int
ld_aout(const struct iodesc * idi, const struct iodesc * ido,
struct kgz_hdr * kh, const struct exec * a)
{
size_t load, addr;
load = addr = N_TXTADDR(*a);
xcopy(idi, ido, le32toh(a->a_text), N_TXTOFF(*a));
addr += le32toh(a->a_text);
if (N_DATADDR(*a) != addr)
return -1;
xcopy(idi, ido, le32toh(a->a_data), N_DATOFF(*a));
addr += le32toh(a->a_data);
kh->dload = load;
kh->dsize = addr - load;
kh->isize = kh->dsize + le32toh(a->a_bss);
kh->entry = le32toh(a->a_entry);
return 0;
}

View File

@ -1,156 +0,0 @@
.\" 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.
.\"
.\" $FreeBSD$
.\"
.Dd August 2, 2016
.Dt KGZIP 8
.Os
.Sh NAME
.Nm kgzip
.Nd compress a kernel
.Sh SYNOPSIS
.Nm
.Op Fl cv
.Op Fl f Ar format
.Op Fl l Ar loader
.Op Fl o Ar output
.Ar file
.Sh DESCRIPTION
.Bf -symbolic
This utility is deprecated.
Users are advised to use
.Xr loader 8
and compress the kernel with
.Xr gzip 1 .
.Ef
.Pp
The
.Nm
utility compresses a kernel or some other bootable binary.
Operation
is in two phases as follows:
.Bl -enum
.It
A load image of the executable file is built which omits all but
the
.Sq text
and
.Sq data
segments.
This image is compressed using
.Xr gzip 1
and output as data in relocatable object format.
.It
The object file is linked with a special self-hosting loader, producing
an executable suitable for booting with either the second- or
third-level bootstraps.
.El
.Pp
Supported object formats are 32-bit ELF and a.out ZMAGIC.
.Pp
If the
.Ar file
operand has a
.Sq .o
suffix, input is assumed to be for the link phase, and the first phase
is omitted.
.Pp
The options are:
.Bl -tag -width Fl
.It Fl c
Omit the link phase.
.It Fl v
Display object file information.
.It Fl f Ar format
Use
.Ar format
as the output format, where
.Ar format
is
.Sq aout
or
.Sq elf .
The default format is ELF.
.It Fl l Ar loader
Link
.Ar loader
as the loader.
.It Fl o Ar output
Name the output file
.Ar output .
The default is to use the input name with the suffix
.Sq .o
(for relocatables) or
.Sq .kgz
(for executables).
.El
.Sh NOTES
Global variables equivalent to the following are defined in the output:
.Bd -literal
struct kgz_hdr {
char ident[4]; /* identification: "KGZ" */
uint32_t dload; /* decoded image load address */
uint32_t dsize; /* decoded image size */
uint32_t isize; /* image size in memory */
uint32_t entry; /* entry point */
uint32_t nsize; /* encoded image size */
} kgz;
uint8_t kgz_ndata[]; /* encoded data */
.Ed
.Pp
The encoded data is simply
.Xr gzip 1
output: a header (with no optional fields); compressed data; and 32-bit
CRC and size values.
.Sh FILES
.Bl -tag -width /usr/lib/kgzldr.o -compact
.It Pa /usr/lib/kgzldr.o
The default loader
.El
.Sh EXIT STATUS
.Ex -std
.Sh SEE ALSO
.Xr gzip 1 ,
.Xr ld 1 ,
.Xr a.out 5 ,
.Xr elf 5 ,
.Xr boot 8 ,
.Xr loader 8
.Sh AUTHORS
.An Robert Nordier Aq Mt rnordier@FreeBSD.org
.Sh BUGS
As symbols are lost, the usefulness of this utility for compressing
kernels is limited to situations where
.Xr loader 8
cannot be used.
.Pp
.Pa kgzldr.o
is only available for the i386 architecture.
.Pp
The preferred method of compressing a kernel
is simply to
.Xr gzip 1
it.

View File

@ -1,178 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* 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.
*/
#ifndef lint
static const char rcsid[] =
"$FreeBSD$";
#endif /* not lint */
#include <sys/types.h>
#include <err.h>
#include <paths.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "kgzip.h"
#define FN_SRC 0 /* Filename: source */
#define FN_OBJ 1 /* Filename: relocatable */
#define FN_KGZ 2 /* Filename: executable */
#define FN_CNT 3 /* Number of filenames */
#define SFX_OBJ ".o" /* Filename suffix: relocatable */
#define SFX_KGZ ".kgz" /* Filename suffix: executable */
#define SFX_MAX 5 /* Size of larger filename suffix */
const char *loader = "/usr/lib/kgzldr.o"; /* Default loader */
int format; /* Output format */
char *tname; /* Name of temporary file */
static void cleanup(void);
static void mk_fn(int, const char *, const char *, char *[]);
static void usage(void);
/*
* Compress a kernel.
*/
int
main(int argc, char *argv[])
{
static char *fn[FN_CNT];
struct kgz_hdr kh;
const char *output;
char *tmpdir;
int cflag, vflag, c;
tmpdir = getenv("TMPDIR");
if (asprintf(&tname, "%s/kgzXXXXXXXXXX",
tmpdir == NULL ? _PATH_TMP : tmpdir) == -1)
errx(1, "Out of memory");
output = NULL;
cflag = vflag = 0;
while ((c = getopt(argc, argv, "cvf:l:o:")) != -1)
switch (c) {
case 'c':
cflag = 1;
break;
case 'v':
vflag = 1;
break;
case 'f':
if (!strcmp(optarg, "aout"))
format = F_AOUT;
else if (!strcmp(optarg, "elf"))
format = F_ELF;
else
errx(1, "%s: Unknown format", optarg);
break;
case 'l':
loader = optarg;
break;
case 'o':
output = optarg;
break;
default:
usage();
}
argc -= optind;
argv += optind;
if (argc != 1)
usage();
atexit(cleanup);
mk_fn(cflag, *argv, output, fn);
memset(&kh, 0, sizeof(kh));
if (fn[FN_SRC]) {
if (!format)
format = F_ELF;
kgzcmp(&kh, fn[FN_SRC], fn[FN_OBJ]);
}
if (!cflag)
kgzld(&kh, fn[FN_OBJ], fn[FN_KGZ]);
if (vflag)
printf("dload=%#x dsize=%#x isize=%#x entry=%#x nsize=%#x\n",
kh.dload, kh.dsize, kh.isize, kh.entry, kh.nsize);
return 0;
}
/*
* Clean up after processing.
*/
static void
cleanup(void)
{
if (tname)
unlink(tname);
}
/*
* Make the required filenames.
*/
static void
mk_fn(int cflag, const char *f1, const char *f2, char *fn[])
{
const char *p, *s;
size_t n;
int i, fd;
i = 0;
s = strrchr(f1, 0);
n = sizeof(SFX_OBJ) - 1;
if ((size_t)(s - f1) > n && !memcmp(s - n, SFX_OBJ, n)) {
s -= n;
i++;
}
fn[i++] = (char *)f1;
if (i == FN_OBJ && !cflag) {
if ((fd = mkstemp(tname)) == -1)
err(1, NULL);
close(fd);
fn[i++] = tname;
}
if (!(fn[i] = (char *)f2)) {
p = (p = strrchr(f1, '/')) ? p + 1 : f1;
n = (size_t)(s - p);
if (!(fn[i] = malloc(n + SFX_MAX)))
err(1, NULL);
memcpy(fn[i], p, n);
strcpy(fn[i] + n, i == FN_OBJ ? SFX_OBJ : SFX_KGZ);
}
}
/*
* Display usage information.
*/
static void
usage(void)
{
fprintf(stderr,
"usage: kgzip [-cv] [-f format] [-l loader] [-o output] file\n");
exit(1);
}

View File

@ -1,53 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* 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.
*
* $FreeBSD$
*/
#include "kgz.h"
#define F_AOUT 1 /* Format: a.out */
#define F_ELF 2 /* Format: ELF32 */
/* Used by I/O routines */
struct iodesc {
const char *fname; /* File name */
int fd; /* File descriptor */
};
extern const char *loader; /* Default loader */
extern int format; /* Output format */
void kgzcmp(struct kgz_hdr *, const char *, const char *);
void kgzld(struct kgz_hdr *, const char *, const char *);
void xclose(const struct iodesc *);
void xcopy(const struct iodesc *, const struct iodesc *, size_t, off_t);
void xzero(const struct iodesc *, size_t);
size_t xread(const struct iodesc *, void *, size_t, off_t);
void xwrite(const struct iodesc *, const void *, size_t);
void xseek(const struct iodesc *, off_t);

View File

@ -1,103 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* 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.
*
* $FreeBSD$
*/
#include <sys/types.h>
#include <sys/endian.h>
#include <sys/wait.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "aouthdr.h"
#include "elfhdr.h"
#include "kgzip.h"
#define align(x, y) (((x) + (y) - 1) & ~((y) - 1))
/*
* Link KGZ file and loader.
*/
void
kgzld(struct kgz_hdr * kh, const char *f1, const char *f2)
{
char addr[16];
struct iodesc idi;
pid_t pid;
size_t n;
int status;
if (strcmp(kh->ident, "KGZ")) {
if ((idi.fd = open(idi.fname = f1, O_RDONLY)) == -1)
err(1, "%s", idi.fname);
if (!format) {
union {
struct exec ex;
Elf32_Ehdr ee;
} hdr;
n = xread(&idi, &hdr, sizeof(hdr), 0);
if (n >= sizeof(hdr.ee) && IS_ELF(hdr.ee))
format = F_ELF;
else if (n >= sizeof(hdr.ex) &&
N_GETMAGIC(hdr.ex) == OMAGIC)
format = F_AOUT;
if (!format)
errx(1, "%s: Format not supported", idi.fname);
}
n = xread(&idi, kh, sizeof(*kh),
format == F_AOUT ? sizeof(struct kgz_aouthdr0)
: sizeof(struct kgz_elfhdr));
xclose(&idi);
if (n != sizeof(*kh) || strcmp(kh->ident, "KGZ"))
errx(1, "%s: Invalid format", idi.fname);
}
sprintf(addr, "%#x", align(kh->dload + kh->dsize, 0x1000));
switch (pid = fork()) {
case -1:
err(1, NULL);
case 0:
if (format == F_AOUT)
execlp("ld", "ld", "-aout", "-Z", "-T", addr, "-o", f2,
loader, f1, (char *)NULL);
else
execlp("ld", "ld", "-Ttext", addr, "-o", f2, loader, f1,
(char *)NULL);
warn(NULL);
_exit(1);
default:
if ((pid = waitpid(pid, &status, 0)) == -1)
err(1, NULL);
if (WIFSIGNALED(status) || WEXITSTATUS(status))
exit(1);
}
}

View File

@ -1,123 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* 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.
*
* $FreeBSD$
*/
#include <err.h>
#include <string.h>
#include <unistd.h>
#include "kgzip.h"
/*
* Close a file.
*/
void
xclose(const struct iodesc *id)
{
if (close(id->fd))
err(1, "%s", id->fname);
}
/*
* Copy bytes from one file to another.
*/
void
xcopy(const struct iodesc * idi, const struct iodesc * ido,
size_t nbyte, off_t offset)
{
char buf[8192];
size_t n;
while (nbyte) {
if ((n = sizeof(buf)) > nbyte)
n = nbyte;
if (xread(idi, buf, n, offset) != n)
errx(1, "%s: Short read", idi->fname);
xwrite(ido, buf, n);
nbyte -= n;
offset = -1;
}
}
/*
* Write binary zeroes to a file.
*/
void
xzero(const struct iodesc * id, size_t nbyte)
{
char buf[8192];
size_t n;
memset(buf, 0, sizeof(buf));
while (nbyte) {
if ((n = sizeof(buf)) > nbyte)
n = nbyte;
xwrite(id, buf, n);
nbyte -= n;
}
}
/*
* Read from a file.
*/
size_t
xread(const struct iodesc * id, void *buf, size_t nbyte, off_t offset)
{
ssize_t n;
if (offset != -1 && lseek(id->fd, offset, SEEK_SET) != offset)
err(1, "%s", id->fname);
if ((n = read(id->fd, buf, nbyte)) == -1)
err(1, "%s", id->fname);
return (size_t)n;
}
/*
* Write to a file.
*/
void
xwrite(const struct iodesc * id, const void *buf, size_t nbyte)
{
ssize_t n;
if ((n = write(id->fd, buf, nbyte)) == -1)
err(1, "%s", id->fname);
if ((size_t)n != nbyte)
errx(1, "%s: Short write", id->fname);
}
/*
* Reposition within a file.
*/
void
xseek(const struct iodesc *id, off_t offset)
{
if (lseek(id->fd, offset, SEEK_SET) != offset)
err(1, "%s", id->fname);
}