1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-07-02 20:31:07 +03:00

add initial support for the crisarchitecture used on foxboards to openwrt

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@7439 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
blogic 2007-06-02 00:46:02 +00:00
parent 5bae61fcd1
commit 9b11307b07
235 changed files with 223626 additions and 3 deletions

View File

@ -0,0 +1,44 @@
#
# Copyright (C) 2006 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
ARCH:=cris
BOARD:=etrax
BOARDNAME:=FOXBOARD (ETRAX 100LX)
FEATURES:=squashfs jffs2
LINUX_VERSION:=2.6.19.2
include $(INCLUDE_DIR)/kernel-build.mk
define Target/Description
Build fimware images for the FOXBOARD made by acmesystems.it
endef
define Kernel/Prepare/Fox
bzcat $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(KERNEL_BUILD_DIR) $(TAR_OPTIONS)
if [ -d ./files ]; then $(CP) ./files/* $(LINUX_DIR)/; fi
if [ -d ./patches/generic_2.6 ]; then $(PATCH) $(LINUX_DIR) ./patches/generic_2.6; fi
if [ -d ./patches/cris ]; then $(PATCH) $(LINUX_DIR) ./patches/cris; fi
ln -sf $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/include/asm-cris/arch-v10 $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/include/asm-cris/arch
ln -sf $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/arch/cris/arch-v10 $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/arch/cris/arch
endef
define Kernel/Prepare
$(call Kernel/Prepare/Fox)
endef
include $(INCLUDE_DIR)/prereq.mk
$(eval $(call RequireCommand,/usr/local/cris/gcc-cris, \
Please install the binary cris toolchain. \
))
#include the profiles
-include profiles/*.mk
KERNELNAME:="zImage"
$(eval $(call BuildKernel))

View File

@ -0,0 +1,5 @@
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K stop
console::askfirst:/bin/ash --login
tts/0::askfirst:/bin/ash --login
tty1::askfirst:/bin/ash --login

View File

@ -0,0 +1,214 @@
CONFIG_BASE_SMALL=0
# CONFIG_BLK_DEV_INITRD is not set
CONFIG_CRIS=y
# CONFIG_ETRAX100LX is not set
CONFIG_ETRAX100LX_V2=y
# CONFIG_ETRAXFS is not set
# CONFIG_ETRAXFS_SIM is not set
CONFIG_ETRAX_ARCH_V10=y
# CONFIG_ETRAX_ARCH_V32 is not set
CONFIG_ETRAX_AXISFLASHMAP=y
# CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE is not set
CONFIG_ETRAX_CMDLINE="root=/dev/mtdblock1 rootfstype=squashfs,jffs2 init=/etc/preinit noinitrd console=ttyS0,115200"
# CONFIG_ETRAX_CSP0_LEDS is not set
# CONFIG_ETRAX_DEBUG_PORT0 is not set
# CONFIG_ETRAX_DEBUG_PORT1 is not set
# CONFIG_ETRAX_DEBUG_PORT2 is not set
# CONFIG_ETRAX_DEBUG_PORT3 is not set
CONFIG_ETRAX_DEBUG_PORT_NULL=y
CONFIG_ETRAX_DEF_R_BUS_CONFIG=0x4
# CONFIG_ETRAX_DEF_R_PORT_G_DIR is not set
CONFIG_ETRAX_DEF_R_PORT_PA_DATA=0xf0
CONFIG_ETRAX_DEF_R_PORT_PA_DIR=0x1c
CONFIG_ETRAX_DEF_R_PORT_PB_CONFIG=0x00
CONFIG_ETRAX_DEF_R_PORT_PB_DATA=0x03
CONFIG_ETRAX_DEF_R_PORT_PB_DIR=0xce
CONFIG_ETRAX_DEF_R_SDRAM_CONFIG=0x09603737
CONFIG_ETRAX_DEF_R_SDRAM_TIMING=0x80008002
CONFIG_ETRAX_DEF_R_WAITSTATES=0x95f8
CONFIG_ETRAX_DRAM_SIZE=32
CONFIG_ETRAX_DRAM_VIRTUAL_BASE=c0000000
CONFIG_ETRAX_DS1302=y
CONFIG_ETRAX_DS1302_RSTBIT=2
CONFIG_ETRAX_DS1302_RST_ON_GENERIC_PORT=y
CONFIG_ETRAX_DS1302_SCLBIT=1
CONFIG_ETRAX_DS1302_SDABIT=0
CONFIG_ETRAX_DS1302_TRICKLE_CHARGE=0
CONFIG_ETRAX_ETHERNET=y
CONFIG_ETRAX_FAST_TIMER=y
CONFIG_ETRAX_FLASH1_SIZE=0
CONFIG_ETRAX_FLASH_BUSWIDTH=2
CONFIG_ETRAX_GPIO=y
CONFIG_ETRAX_I2C=y
CONFIG_ETRAX_I2C_CLK_PORT=1
CONFIG_ETRAX_I2C_DATA_PORT=0
# CONFIG_ETRAX_I2C_EEPROM is not set
CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C=y
# CONFIG_ETRAX_IDE is not set
CONFIG_ETRAX_LED1G=2
CONFIG_ETRAX_LED1R=2
CONFIG_ETRAX_LED2G=3
CONFIG_ETRAX_LED2R=3
CONFIG_ETRAX_LED3G=2
CONFIG_ETRAX_LED3R=2
CONFIG_ETRAX_NANDFLASH_BUSWIDTH=1
CONFIG_ETRAX_NETWORK_LED_ON_WHEN_ACTIVITY=y
# CONFIG_ETRAX_NETWORK_LED_ON_WHEN_LINK is not set
# CONFIG_ETRAX_NO_LEDS is not set
# CONFIG_ETRAX_NO_PHY is not set
CONFIG_ETRAX_PA_CHANGEABLE_BITS=0xFF
CONFIG_ETRAX_PA_CHANGEABLE_DIR=0xFF
CONFIG_ETRAX_PA_LEDS=y
CONFIG_ETRAX_PB_CHANGEABLE_BITS=0xFF
CONFIG_ETRAX_PB_CHANGEABLE_DIR=0xFF
# CONFIG_ETRAX_PB_LEDS is not set
# CONFIG_ETRAX_PCF8563 is not set
CONFIG_ETRAX_PTABLE_SECTOR=0
CONFIG_ETRAX_RESCUE_SER0=y
# CONFIG_ETRAX_RESCUE_SER1 is not set
# CONFIG_ETRAX_RESCUE_SER2 is not set
# CONFIG_ETRAX_RESCUE_SER3 is not set
# CONFIG_ETRAX_RS485 is not set
CONFIG_ETRAX_RTC=y
CONFIG_ETRAX_SDRAM=y
CONFIG_ETRAX_SER0_CD_ON_PA_BIT=-1
CONFIG_ETRAX_SER0_CD_ON_PB_BIT=-1
CONFIG_ETRAX_SER0_DSR_ON_PA_BIT=-1
CONFIG_ETRAX_SER0_DSR_ON_PB_BIT=-1
CONFIG_ETRAX_SER0_DTR_ON_PA_BIT=-1
CONFIG_ETRAX_SER0_DTR_ON_PB_BIT=-1
# CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED is not set
CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_NONE=y
# CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PA is not set
# CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PB is not set
CONFIG_ETRAX_SER0_RI_ON_PA_BIT=-1
CONFIG_ETRAX_SER0_RI_ON_PB_BIT=-1
CONFIG_ETRAX_SER2_CD_ON_PA_BIT=7
CONFIG_ETRAX_SER2_CD_ON_PB_BIT=-1
CONFIG_ETRAX_SER2_DSR_ON_PA_BIT=6
CONFIG_ETRAX_SER2_DSR_ON_PB_BIT=-1
CONFIG_ETRAX_SER2_DTR_ON_PA_BIT=4
CONFIG_ETRAX_SER2_DTR_ON_PB_BIT=-1
# CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED is not set
# CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_NONE is not set
CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_PA=y
# CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_PB is not set
CONFIG_ETRAX_SER2_RI_ON_PA_BIT=5
CONFIG_ETRAX_SER2_RI_ON_PB_BIT=-1
CONFIG_ETRAX_SER3_CD_ON_PA_BIT=-1
CONFIG_ETRAX_SER3_CD_ON_PB_BIT=-1
CONFIG_ETRAX_SER3_DSR_ON_PA_BIT=-1
CONFIG_ETRAX_SER3_DSR_ON_PB_BIT=-1
CONFIG_ETRAX_SER3_DTR_ON_PA_BIT=-1
CONFIG_ETRAX_SER3_DTR_ON_PB_BIT=-1
# CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED is not set
CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_ON_NONE=y
# CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_ON_PA is not set
# CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_ON_PB is not set
CONFIG_ETRAX_SER3_RI_ON_PA_BIT=-1
CONFIG_ETRAX_SER3_RI_ON_PB_BIT=-1
CONFIG_ETRAX_SERIAL=y
# CONFIG_ETRAX_SERIAL_FAST_TIMER is not set
# CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST is not set
CONFIG_ETRAX_SERIAL_PORT0=y
# CONFIG_ETRAX_SERIAL_PORT0_DMA6_OUT is not set
# CONFIG_ETRAX_SERIAL_PORT0_DMA7_IN is not set
CONFIG_ETRAX_SERIAL_PORT0_NO_DMA_IN=y
CONFIG_ETRAX_SERIAL_PORT0_NO_DMA_OUT=y
# CONFIG_ETRAX_SERIAL_PORT1 is not set
CONFIG_ETRAX_SERIAL_PORT2=y
CONFIG_ETRAX_SERIAL_PORT2_DMA2_OUT=y
CONFIG_ETRAX_SERIAL_PORT2_DMA3_IN=y
# CONFIG_ETRAX_SERIAL_PORT2_NO_DMA_IN is not set
# CONFIG_ETRAX_SERIAL_PORT2_NO_DMA_OUT is not set
CONFIG_ETRAX_SERIAL_PORT3=y
CONFIG_ETRAX_SERIAL_PORT3_DMA4_OUT=y
CONFIG_ETRAX_SERIAL_PORT3_DMA5_IN=y
# CONFIG_ETRAX_SERIAL_PORT3_NO_DMA_IN is not set
# CONFIG_ETRAX_SERIAL_PORT3_NO_DMA_OUT is not set
CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS=5
# CONFIG_ETRAX_SOFT_SHUTDOWN is not set
# CONFIG_ETRAX_SYNCHRONOUS_SERIAL is not set
CONFIG_ETRAX_SYSFS_NODES=y
CONFIG_ETRAX_USB_HOST=y
CONFIG_ETRAX_USB_HOST_PORT1=y
CONFIG_ETRAX_USB_HOST_PORT2=y
# CONFIG_ETRAX_WATCHDOG is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_GENERIC_FIND_NEXT_BIT=y
CONFIG_GENERIC_IOMAP=y
# CONFIG_GEN_RTC is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_IDE is not set
CONFIG_INITRAMFS_SOURCE=""
CONFIG_IRQ_PER_CPU=y
CONFIG_JFFS2_FS_DEBUG=0
CONFIG_MTD=y
CONFIG_MTDRAM_ABS_POS=0x0
CONFIG_MTDRAM_ERASE_SIZE=128
CONFIG_MTDRAM_TOTAL_SIZE=0
# CONFIG_MTD_ABSENT is not set
CONFIG_MTD_BLOCK=y
# CONFIG_MTD_BLOCK2MTD is not set
CONFIG_MTD_CFI=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
CONFIG_MTD_CFI_AMDSTD=y
# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
# CONFIG_MTD_CFI_GEOMETRY is not set
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
# CONFIG_MTD_CFI_I8 is not set
# CONFIG_MTD_CFI_INTELEXT is not set
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
CONFIG_MTD_CFI_NOSWAP=y
# CONFIG_MTD_CFI_STAA is not set
CONFIG_MTD_CFI_UTIL=y
CONFIG_MTD_CHAR=y
# CONFIG_MTD_CMDLINE_PARTS is not set
CONFIG_MTD_COMPLEX_MAPPINGS=y
CONFIG_MTD_CONCAT=y
# CONFIG_MTD_DEBUG is not set
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOC2001PLUS is not set
CONFIG_MTD_GEN_PROBE=y
CONFIG_MTD_JEDECPROBE=y
CONFIG_MTD_MAP_BANK_WIDTH_1=y
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
CONFIG_MTD_MAP_BANK_WIDTH_2=y
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
CONFIG_MTD_MAP_BANK_WIDTH_4=y
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
CONFIG_MTD_MTDRAM=y
# CONFIG_MTD_OBSOLETE_CHIPS is not set
# CONFIG_MTD_ONENAND is not set
# CONFIG_MTD_OTP is not set
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_PHYSMAP is not set
# CONFIG_MTD_PLATRAM is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_SLRAM is not set
# CONFIG_OOM_REBOOT is not set
# CONFIG_OVERRIDE_SCHED_STARVATION_LIMIT is not set
# CONFIG_RTC is not set
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_SERIAL_8250 is not set
# CONFIG_SMP is not set
# CONFIG_SOFT_WATCHDOG is not set
# CONFIG_SPARSEMEM_STATIC is not set
# CONFIG_SVINTO_SIM is not set
# CONFIG_SYSTEM_PROFILER is not set
CONFIG_UID16=y
# CONFIG_UNUSED_SYMBOLS is not set
# CONFIG_UNWIND_INFO is not set
CONFIG_USB=y
# CONFIG_USBPCWATCHDOG is not set
# CONFIG_USB_ARCH_HAS_EHCI is not set
# CONFIG_USB_ARCH_HAS_HCD is not set
# CONFIG_USB_ARCH_HAS_OHCI is not set
# CONFIG_USB_SERIAL_IR is not set
# CONFIG_BLK_DEV_INITRD is not set

View File

@ -0,0 +1,262 @@
/*
* Simple bitbanged-GPIO SPI driver for ETRAX FS et al.
*
* Copyright (c) 2007 Axis Communications AB
*
* Author: Hans-Peter Nilsson, inspired by earlier work by
* Andre Spanberg but mostly by copying large parts of
* spi_s3c24xx_gpio.c, hence also:
* Copyright (c) 2006 Ben Dooks
* Copyright (c) 2006 Simtec Electronics
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/types.h>
#include <linux/device.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <asm/io.h>
#include <asm/arch/board.h>
/* Our main driver state. */
struct crisv32_spi_hw_info {
struct crisv32_iopin sclk;
struct crisv32_iopin mosi;
struct crisv32_iopin miso;
struct crisv32_iopin cs;
};
/*
* The driver state hides behind the spi_bitbang state. We're
* responsible for allocating that, so we can get a little something
* for ourselves.
*/
struct crisv32_spi_gpio_devdata {
struct spi_bitbang bitbang;
struct crisv32_spi_hw_info pins;
};
/* Helper function getting the driver state from a spi_device. */
static inline struct crisv32_spi_hw_info *spidev_to_hw(struct spi_device *spi)
{
struct crisv32_spi_gpio_devdata *dd = spi_master_get_devdata(spi->master);
return &dd->pins;
}
/* The SPI-bitbang functions: see spi_bitbang.h at EXPAND_BITBANG_TXRX. */
static inline void setsck(struct spi_device *spi, int is_on)
{
crisv32_io_set(&spidev_to_hw(spi)->sclk, is_on != 0);
}
static inline void setmosi(struct spi_device *spi, int is_on)
{
crisv32_io_set(&spidev_to_hw(spi)->mosi, is_on != 0);
}
static inline u32 getmiso(struct spi_device *spi)
{
return crisv32_io_rd(&spidev_to_hw(spi)->miso) != 0 ? 1 : 0;
}
#define spidelay(x) ndelay(x)
#define EXPAND_BITBANG_TXRX
#include <linux/spi/spi_bitbang.h>
/*
* SPI-bitbang word transmit-functions for the four SPI modes,
* dispatching to the inlined functions we just included.
*/
static u32 crisv32_spi_gpio_txrx_mode0(struct spi_device *spi,
unsigned nsecs, u32 word, u8 bits)
{
return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
}
static u32 crisv32_spi_gpio_txrx_mode1(struct spi_device *spi,
unsigned nsecs, u32 word, u8 bits)
{
return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
}
static u32 crisv32_spi_gpio_txrx_mode2(struct spi_device *spi,
unsigned nsecs, u32 word, u8 bits)
{
return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
}
static u32 crisv32_spi_gpio_txrx_mode3(struct spi_device *spi,
unsigned nsecs, u32 word, u8 bits)
{
return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
}
/* SPI-bitbang chip-select function. */
static void crisv32_spi_gpio_chipselect(struct spi_device *spi, int value)
{
if (spi->mode & SPI_CS_HIGH)
crisv32_io_set(&spidev_to_hw(spi)->cs,
value == BITBANG_CS_ACTIVE ? 1 : 0);
else
crisv32_io_set(&spidev_to_hw(spi)->cs,
value == BITBANG_CS_ACTIVE ? 0 : 1);
}
/* Platform-device probe function. */
static int __devinit crisv32_spi_gpio_probe(struct platform_device *dev)
{
struct spi_master *master;
struct crisv32_spi_gpio_devdata *dd;
struct resource *res;
struct crisv32_spi_gpio_controller_data *gc;
int ret = 0;
/*
* We need to get the controller data as a hardware resource,
* or else it wouldn't be available until *after* the
* spi_bitbang_start call!
*/
res = platform_get_resource_byname(dev, 0, "controller_data_ptr");
if (res == NULL) {
dev_err(&dev->dev, "can't get controller_data resource\n");
return -EIO;
}
gc = (struct crisv32_spi_gpio_controller_data *) res->start;
master = spi_alloc_master(&dev->dev, sizeof *dd);
if (master == NULL) {
dev_err(&dev->dev, "failed to allocate spi master\n");
ret = -ENOMEM;
goto err;
}
dd = spi_master_get_devdata(master);
platform_set_drvdata(dev, dd);
/*
* The device data asks for this driver, and holds the id
* number, which must be unique among the same-type devices.
* We use this as the number of this SPI bus.
*/
master->bus_num = dev->id;
/*
* Allocate pins. Note that thus being allocated as GPIO, we
* don't have to deconfigure them at the end or if something
* fails.
*/
if ((ret = crisv32_io_get_name(&dd->pins.cs, gc->cs)) != 0
|| (ret = crisv32_io_get_name(&dd->pins.miso, gc->miso)) != 0
|| (ret = crisv32_io_get_name(&dd->pins.mosi, gc->mosi)) != 0
|| (ret = crisv32_io_get_name(&dd->pins.sclk, gc->sclk)) != 0)
goto err_no_pins;
/* Set directions of the SPI pins. */
crisv32_io_set_dir(&dd->pins.cs, crisv32_io_dir_out);
crisv32_io_set_dir(&dd->pins.sclk, crisv32_io_dir_out);
crisv32_io_set_dir(&dd->pins.miso, crisv32_io_dir_in);
crisv32_io_set_dir(&dd->pins.mosi, crisv32_io_dir_out);
/* Set state of the SPI pins. */
dev_dbg(&dev->dev, "cs.port 0x%x, pin: %d\n"
dd->pins.cs.port, dd->pins.cs.bit);
/*
* Can't use crisv32_spi_gpio_chipselect(spi, 1) here; we
* don't have a proper "spi" until after spi_bitbang_start.
*/
crisv32_io_set(&dd->pins.cs, 1);
crisv32_io_set(&dd->pins.sclk, 0);
crisv32_io_set(&dd->pins.mosi, 0);
/* Setup SPI bitbang adapter hooks. */
dd->bitbang.master = spi_master_get(master);
dd->bitbang.chipselect = crisv32_spi_gpio_chipselect;
dd->bitbang.txrx_word[SPI_MODE_0] = crisv32_spi_gpio_txrx_mode0;
dd->bitbang.txrx_word[SPI_MODE_1] = crisv32_spi_gpio_txrx_mode1;
dd->bitbang.txrx_word[SPI_MODE_2] = crisv32_spi_gpio_txrx_mode2;
dd->bitbang.txrx_word[SPI_MODE_3] = crisv32_spi_gpio_txrx_mode3;
ret = spi_bitbang_start(&dd->bitbang);
if (ret)
goto err_no_bitbang;
printk (KERN_INFO "CRIS v32 SPI driver for GPIO"
" (cs: %s, miso: %s, mosi: %s, sclk: %s)\n",
gc->cs, gc->miso, gc->mosi, gc->sclk);
return 0;
err_no_bitbang:
spi_master_put(dd->bitbang.master);
err_no_pins:
platform_set_drvdata(dev, NULL);
err:
return ret;
}
/* Platform-device remove-function. */
static int __devexit crisv32_spi_gpio_remove(struct platform_device *dev)
{
struct crisv32_spi_gpio_devdata *dd = platform_get_drvdata(dev);
int ret;
ret = spi_bitbang_stop(&dd->bitbang);
if (ret != 0)
return ret;
spi_master_put(dd->bitbang.master);
platform_set_drvdata(dev, NULL);
return 0;
}
/*
* For the time being, there's no suspend/resume support to care
* about, so we let those handlers default to NULL.
*/
static struct platform_driver crisv32_spi_gpio_drv = {
.probe = crisv32_spi_gpio_probe,
.remove = __devexit_p(crisv32_spi_gpio_remove),
.driver = {
.name = "spi_crisv32_gpio",
.owner = THIS_MODULE,
},
};
/* Module init function. */
static int __devinit crisv32_spi_gpio_init(void)
{
return platform_driver_register(&crisv32_spi_gpio_drv);
}
/* Module exit function. */
static void __devexit crisv32_spi_gpio_exit(void)
{
platform_driver_unregister(&crisv32_spi_gpio_drv);
}
module_init(crisv32_spi_gpio_init);
module_exit(crisv32_spi_gpio_exit);
MODULE_DESCRIPTION("CRIS v32 SPI-GPIO Driver");
MODULE_AUTHOR("Hans-Peter Nilsson, <hp@axis.com>");
MODULE_LICENSE("GPL");

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,141 @@
/* macros for debug output */
#define hcd_dbg(hcd, fmt, args...) \
dev_info(hcd->self.controller, fmt, ## args)
#define hcd_err(hcd, fmt, args...) \
dev_err(hcd->self.controller, fmt, ## args)
#define hcd_info(hcd, fmt, args...) \
dev_info(hcd->self.controller, fmt, ## args)
#define hcd_warn(hcd, fmt, args...) \
dev_warn(hcd->self.controller, fmt, ## args)
/*
#define devdrv_dbg(fmt, args...) \
printk(KERN_INFO "usb_devdrv dbg: ");printk(fmt, ## args)
*/
#define devdrv_dbg(fmt, args...) {}
#define devdrv_err(fmt, args...) \
printk(KERN_ERR "usb_devdrv error: ");printk(fmt, ## args)
#define devdrv_info(fmt, args...) \
printk(KERN_INFO "usb_devdrv: ");printk(fmt, ## args)
#define irq_dbg(fmt, args...) \
printk(KERN_INFO "crisv10_irq dbg: ");printk(fmt, ## args)
#define irq_err(fmt, args...) \
printk(KERN_ERR "crisv10_irq error: ");printk(fmt, ## args)
#define irq_warn(fmt, args...) \
printk(KERN_INFO "crisv10_irq warn: ");printk(fmt, ## args)
#define irq_info(fmt, args...) \
printk(KERN_INFO "crisv10_hcd: ");printk(fmt, ## args)
/*
#define rh_dbg(fmt, args...) \
printk(KERN_DEBUG "crisv10_rh dbg: ");printk(fmt, ## args)
*/
#define rh_dbg(fmt, args...) {}
#define rh_err(fmt, args...) \
printk(KERN_ERR "crisv10_rh error: ");printk(fmt, ## args)
#define rh_warn(fmt, args...) \
printk(KERN_INFO "crisv10_rh warning: ");printk(fmt, ## args)
#define rh_info(fmt, args...) \
printk(KERN_INFO "crisv10_rh: ");printk(fmt, ## args)
/*
#define tc_dbg(fmt, args...) \
printk(KERN_INFO "crisv10_tc dbg: ");printk(fmt, ## args)
*/
#define tc_dbg(fmt, args...) {while(0){}}
#define tc_err(fmt, args...) \
printk(KERN_ERR "crisv10_tc error: ");printk(fmt, ## args)
/*
#define tc_warn(fmt, args...) \
printk(KERN_INFO "crisv10_tc warning: ");printk(fmt, ## args)
*/
#define tc_warn(fmt, args...) {while(0){}}
#define tc_info(fmt, args...) \
printk(KERN_INFO "crisv10_tc: ");printk(fmt, ## args)
/* Debug print-outs for various traffic types */
#define intr_warn(fmt, args...) \
printk(KERN_INFO "crisv10_intr warning: ");printk(fmt, ## args)
/*
#define intr_dbg(fmt, args...) \
printk(KERN_DEBUG "crisv10_intr dbg: ");printk(fmt, ## args)
*/
#define intr_dbg(fmt, args...) {while(0){}}
#define isoc_err(fmt, args...) \
printk(KERN_ERR "crisv10_isoc error: ");printk(fmt, ## args)
/*
#define isoc_warn(fmt, args...) \
printk(KERN_INFO "crisv10_isoc warning: ");printk(fmt, ## args)
*/
#define isoc_warn(fmt, args...) {while(0){}}
/*
#define isoc_dbg(fmt, args...) \
printk(KERN_INFO "crisv10_isoc dbg: ");printk(fmt, ## args)
*/
#define isoc_dbg(fmt, args...) {while(0){}}
/*
#define timer_warn(fmt, args...) \
printk(KERN_INFO "crisv10_timer warning: ");printk(fmt, ## args)
*/
#define timer_warn(fmt, args...) {while(0){}}
/*
#define timer_dbg(fmt, args...) \
printk(KERN_INFO "crisv10_timer dbg: ");printk(fmt, ## args)
*/
#define timer_dbg(fmt, args...) {while(0){}}
/* Debug printouts for events related to late finishing of URBs */
/*
#define late_dbg(fmt, args...) \
printk(KERN_INFO "crisv10_late dbg: ");printk(fmt, ## args)
*/
#define late_dbg(fmt, args...) {while(0){}}
#define late_warn(fmt, args...) \
printk(KERN_INFO "crisv10_late warning: ");printk(fmt, ## args)
/*
#define errno_dbg(fmt, args...) \
printk(KERN_INFO "crisv10_errno dbg: ");printk(fmt, ## args)
*/
#define errno_dbg(fmt, args...) {while(0){}}
#define dma_dbg(fmt, args...) \
printk(KERN_INFO "crisv10_dma dbg: ");printk(fmt, ## args)
#define dma_err(fmt, args...) \
printk(KERN_ERR "crisv10_dma error: ");printk(fmt, ## args)
#define dma_warn(fmt, args...) \
printk(KERN_INFO "crisv10_dma warning: ");printk(fmt, ## args)
#define dma_info(fmt, args...) \
printk(KERN_INFO "crisv10_dma: ");printk(fmt, ## args)
#define str_dir(pipe) \
(usb_pipeout(pipe) ? "out" : "in")
#define str_type(pipe) \
({ \
char *s = "?"; \
switch (usb_pipetype(pipe)) { \
case PIPE_ISOCHRONOUS: s = "iso"; break; \
case PIPE_INTERRUPT: s = "intr"; break; \
case PIPE_CONTROL: s = "ctrl"; break; \
case PIPE_BULK: s = "bulk"; break; \
}; \
s; \
})

View File

@ -0,0 +1,10 @@
#ifndef __MTD_MTDRAM_H__
#define __MTD_MTDRAM_H__
#ifdef __KERNEL__
#include <linux/mtd/mtd.h>
int mtdram_init_device(struct mtd_info *mtd, void *mapped_address,
unsigned long size, char *name);
#endif /* __KERNEL__ */
#endif /* __MTD_MTDRAM_H__ */

View File

@ -0,0 +1,5 @@
config AXIS_FIMAGE
bool "Build fimage"
depends LINUX_2_6_ETRAX
default y

View File

@ -0,0 +1,55 @@
#
# Copyright (C) 2006 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/image.mk
FOXBOARD:=custom MCM 416 816 832
FOXBOARD_4MB:=MCM 416
FOXBOARD_8MB:=custom 816 832
define Image/BuildKernel
for f in $(FOXBOARD); do \
cp $(KDIR)/vmlinuz_$$$$f $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-zImage_$$$$f; \
done
endef
define Image/Prepare
for f in $(FOXBOARD); do \
cp $(LINUX_DIR)/arch/cris/boot/zImage_$$$$f $(KDIR)/vmlinuz_$$$$f; \
done
$(MAKE) -C ./e100boot/
$(MAKE) -C ./mkfimage/
$(INSTALL_BIN) ./boot_linux $(BIN_DIR)
endef
define Image/Build/generic
for f in $(2); do \
mkfimage $(KDIR)/vmlinuz_$$$$f $(KDIR)/vmlinuz_$$$$f.tmp ; \
cat $(KDIR)/vmlinuz_$$$$f.tmp $(KDIR)/root.$(1) > $(KDIR)/fimage.$(1)_$$$$f.tmp; \
dd if=$(KDIR)/fimage.$(1)_$$$$f.tmp of=$(KDIR)/fimage.$(1)_$$$$f bs=$(3) conv=sync; \
cp $(KDIR)/fimage.$(1)_$$$$f $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-fimage_$$$$f; \
done
endef
define Image/Build/jffs2-64k
$(call prepare_generic_jffs-64k,$(KDIR)/root.jff2-64k)
$(call Image/Build/generic,$(1),$(FOXBOARD_4MB),4194304)
$(call Image/Build/generic,$(1),$(FOXBOARD_8MB),8388608)
endef
define Image/Build/squashfs
$(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
$(call Image/Build/generic,$(1),$(FOXBOARD_4MB),4194304)
$(call Image/Build/generic,$(1),$(FOXBOARD_8MB),8388608)
endef
define Image/Build
$(call Image/Build/$(1),$(1))
endef
$(eval $(call BuildImage))

View File

@ -0,0 +1,512 @@
#!/usr/bin/perl -w
#*****************************************************************************
#!
#! FILE NAME : boot_linux
#!
#! PARAMETERS : -b <bootimage> the name of the boot image to use
#! -d <device> the interface to use, e.g., eth1
#! (defaults is eth0)
#! -f save it in flash memory at address 0x10000
#! -F save it in flash memory at address 0
#! -h show some help
#! -i <image> name of the image to use (default is fimage)
#! -o <offset> the offset in the flash where the flashing
#! starts
#! -O <offset> the offset in the image file where the
#! flashing starts from
#! -p print the resulting etrax100boot command
#! instead of executing it
#! -s <size> how much to flash (default is the size of
#! the flash minus the offset specified using
#! -o or -f)
#! -S <size> the size of the flash
#!
#! All sizes and offsets above can be specified as decimal
#! numbers, or as hexadecimal numbers by prefixing them with 0x.
#! It is also possible to use the suffixes k and M to specify
#! kilo (1024) or mega (1048576).
#!
#! DESCRIPTION: Extract the start of the image and any registers that should
#! be set from the kimage or fimage file, and then boot it.
#!
#! FUNCTIONS : convert_size
#! extract_hw_settings
#! get_dword
#! calculate_sdram_init
#! sdram_command
#! print_help
#!
#!----------------------------------------------------------------------------
#! HISTORY
#!
#! $Log: boot_linux,v $
#! Revision 1.16 2004/11/01 16:32:27 starvik
#! Corrected help text to avoid confusion
#!
#! Revision 1.15 2003/01/29 11:48:57 pkj
#! Calculate a flash size large enough for the given image if the
#! -S option is not specified.
#!
#! Revision 1.14 2002/11/18 14:40:09 pkj
#! Make use of the --loop option to etrax100boot when initialising
#! SDRAM memories. This requires a lot fewer options to be passed
#! to the boot loader.
#!
#! Revision 1.13 2002/08/15 16:29:02 pkj
#! * The -S option now accepts the size in bytes (just like the -s option).
#! For backwards compatibility it still assumes sizes of 16 and less to
#! be specified in MB.
#! * The suffixes k and M can now be used with all sizes and offsets to
#! specify them in kilo or mega.
#!
#! Revision 1.12 2002/08/15 15:27:34 pkj
#! Use $opts{'x'} instead of $opt_x.
#!
#! Revision 1.11 2002/07/04 17:06:39 pkj
#! * No longer specifies a bootfile by default (not needed any longer).
#! * Implemented option -b to specify a bootfile.
#! * Removed references to option -l (it was never implemented).
#!
#! Revision 1.10 2002/06/04 11:50:23 starvik
#! Check if mrs_data is specified in kernelconfig (necessary for MCM)
#!
#! Revision 1.9 2002/01/29 10:38:26 pkj
#! Change illegal to invalid.
#!
#! Revision 1.8 2001/09/13 12:32:10 pkj
#! * Added option -S to specify the size of the flash (in MB), as -s
#! is used to specify how much to flash nowadays.
#! * Made the default size of the flash depend on the size of the image
#! file. If it is bigger than 0x200100 then the flash is assumed to
#! be 4 MB, otherwise it is assumed to be 2 MB.
#! * Added verification of various options.
#!
#! Revision 1.7 2001/09/13 10:25:11 pkj
#! Minor clean-up.
#!
#! Revision 1.6 2001/06/29 10:05:16 pkj
#! Corrected check for SDRAM.
#!
#! Revision 1.5 2001/06/29 09:11:55 pkj
#! Synchronised boot_elinux and boot_linux.
#!
#!----------------------------------------------------------------------------
#! (C) Copyright 2001, Axis Communications AB, LUND, SWEDEN
#!****************************************************************************
# $Id: boot_linux,v 1.16 2004/11/01 16:32:27 starvik Exp $
#****************** INCLUDE FILES SECTION ************************************
use strict;
use Getopt::Std;
use File::Basename;
#****************** VARIABLE DECLARATION SECTION *****************************
use vars qw($my_name %opts);
use vars qw($text_start $cmd);
use vars qw($image_name $image_size);
use vars qw($offset $source_offset $flash_size $flashing_size);
use vars qw($sdram_timing_address $sdram_config_address);
use vars qw($sdram_precharge $sdram_nop $sdram_refresh $sdram_mrs);
#****************** CONSTANT SECTION *****************************************
# Register addresses
$sdram_timing_address = "b0000008";
$sdram_config_address = "b000000c";
# SDRAM commands
$sdram_precharge = 3;
$sdram_nop = 0;
$sdram_refresh = 2;
$sdram_mrs = 1;
#****************** MAIN PROGRAM SECTION *************************************
# The name of this program.
$my_name = basename($0);
# Get options
getopts('b:d:fFhi:o:O:ps:S:', \%opts);
&print_help if ($opts{'h'});
# Name and existance of the image
$image_name = ($opts{'i'} ? $opts{'i'} : 'fimage');
die "Could not find the image $image_name!\n" unless (-s $image_name);
if ($opts{'f'} || $opts{'F'})
{
$image_size = -s $image_name;
$offset = ($opts{'f'} ? 0x10000 : 0);
$offset = &convert_size($opts{'o'}) if (defined($opts{'o'}));
die("$my_name: Invalid destination offset\n") if ($offset !~ /^\d+$/);
my $base_name = basename($image_name);
if ($base_name eq 'timage' || $base_name eq 'flash1.img')
{
$source_offset = 0;
}
else
{
$source_offset = $offset;
}
$source_offset = &convert_size($opts{'O'}) if (defined($opts{'O'}));
die("$my_name: Invalid source offset\n") if ($source_offset !~ /^\d+$/);
die("$my_name: Source offset > image size\n") if ($source_offset > $image_size);
if (defined($opts{'S'}))
{
# Backwards compatibility to allow specifying the flash size in MB
# without using an M suffix
$opts{'S'} .= 'M' if ($opts{'S'} =~ /^\d+$/ && $opts{'S'} <= 16);
$flash_size = &convert_size($opts{'S'});
}
else
{
# Calculate a flash size large enough for the image without the checksum
# and HWID.
$flash_size = ($image_size - $source_offset + $offset) & 0xFFFF0000;
}
die("$my_name: Invalid flash size\n") if ($flash_size !~ /^\d+$/);
die("$my_name: Destination offset > flash size\n") if ($offset > $flash_size);
if (defined($opts{'s'}))
{
$flashing_size = &convert_size($opts{'s'});
}
else
{
$flashing_size = $flash_size - $offset;
}
die("$my_name: Invalid size to flash\n") if ($flashing_size !~ /^\d+$/);
if ($flashing_size > $flash_size - $offset)
{
$flashing_size = $flash_size - $offset;
printf("Warning: Flashing size limited to 0x%lx due to the offset (0x%lx) and flash size (0x%lx).\n", $flashing_size, $offset, $flash_size);
}
if ($flashing_size > $image_size - $source_offset)
{
$flashing_size = $image_size - $source_offset;
printf("Warning: Flashing size limited to 0x%lx due to the offset (0x%lx) and image size (0x%lx).\n", $flashing_size, $source_offset, $image_size);
}
}
# Create the command line to boot the image
if (system('./etrax100boot --help > /dev/null') == 0)
{
$cmd = './etrax100boot';
}
elsif (system('svinto_boot --help > /dev/null') == 0)
{
$cmd = 'svinto_boot';
}
else
{
die("Cannot find e100boot program in your PATH!\n");
}
$cmd .= " --device $opts{'d'}" if ($opts{'d'});
$cmd .= &extract_hw_settings;
$cmd .= " --bootfile $opts{'b'}" if ($opts{'b'});
$cmd .= " --file $image_name $text_start";
if ($opts{'f'} || $opts{'F'})
{
$cmd .= sprintf(" --flash %lx %lx %lx --jump 0",
hex($text_start) + $source_offset, $offset, $flashing_size);
}
else
{
$cmd .= " --jump $text_start";
}
if ($opts{'p'})
{
print "Command:\n$cmd\n";
}
else
{
system($cmd);
}
exit 0;
#****************** FUNCTION DEFINITION SECTION ******************************
#*****************************************************************************
##
## FUNCTION NAME: convert_size
##
##****************************************************************************
sub convert_size
{
my($arg) = @_;
my $size;
if ($arg =~ /^0x([\da-fA-F]+)([kM])?$/)
{
$size = hex($1);
}
elsif ($arg =~ /^(\d+)([kM])?$/)
{
$size = $1;
}
else
{
return -1;
}
if (!defined($2))
{
return $size;
}
elsif ($2 eq 'k')
{
return $size * 1024;
}
elsif ($2 eq 'M')
{
return $size * 1048576;
}
}
#*****************************************************************************
##
## FUNCTION NAME: extract_hw_settings
##
##****************************************************************************
sub extract_hw_settings
{
my $data;
my $dbg_port;
my $sdram_enabled;
my $return_value = "";
my $sdram_config;
# The hw information table has the following format
#
# "HW_PARAM_MAGIC"
# text_start (dword)
# serial debg port (dword)
# sdram enabled (dword)
# register address (dword)
# register value (dword)
# ...
# 0
open(FILE, "$image_name") || die("Could not open '$image_name'");
while (<FILE>)
{
if (m/HW_PARAM_MAGIC/g)
{
# Seek to first byte after magic
seek(FILE, -length($_) + pos($_), 1);
last;
}
}
$text_start = &get_dword;
$dbg_port = &get_dword;
$sdram_enabled = int(&get_dword);
while (1)
{
my $register = &get_dword;
my $value = &get_dword;
last if ($register eq "00000000");
if ($sdram_enabled)
{
if ($register eq $sdram_config_address)
{
$sdram_config = $value;
}
elsif ($register eq $sdram_timing_address)
{
$return_value .= &calculate_sdram_init($value, $sdram_config);
next;
}
}
$return_value .= " --setreg $register $value";
}
close(FILE);
return $return_value;
}
#*****************************************************************************
##
## FUNCTION NAME: get_dword
##
##****************************************************************************
sub get_dword
{
my $data;
read(FILE, $data, 4);
return unpack("H8", pack("V", unpack("N", $data)));
}
#*****************************************************************************
##
## FUNCTION NAME: calculate_sdram_init
##
##****************************************************************************
sub calculate_sdram_init
{
# Refer to ETRAX 100LX Designers Reference for a description of SDRAM
# initialization
my $sdram_init_val = hex($_[0]);
my $sdram_config_val = hex($_[1]);
my $bus_width = $sdram_config_val & 0x00800000;
my $speed;
my $cas_latency;
my $mrs_data;
my $temp;
my $return_value;
my $value;
$mrs_data = ($sdram_init_val & 0x00ff0000) >> 16;
$sdram_init_val &= 0x8000ffff; # Make sure mrs data is 0
$sdram_init_val |= 0x80000000; # Make sure sdram is enabled
$speed = $sdram_init_val & 0x1000;
$cas_latency = $sdram_init_val & 0x3;
if ($speed) # 100 MHz
{
$cas_latency += 2;
}
else # 50 MHz
{
$cas_latency += 1;
}
# Calculate value of mrs_data
# CAS latency = 2 && bus_width = 32 => 0x40
# CAS latency = 3 && bus_width = 32 => 0x60
# CAS latency = 2 && bus_width = 16 => 0x20
# CAS latency = 3 && bus_width = 16 => 0x30
if ($mrs_data == 0)
{
if ($bus_width == 0) # 16 bits
{
$mrs_data = $cas_latency == 2 ? 0x20 : 0x30;
}
else # 32 bits
{
$mrs_data = $cas_latency == 2 ? 0x40 : 0x60;
}
}
$temp = $sdram_init_val | 0x0000c000; # Disable refresh
$return_value .= &sdram_command($temp);
$return_value .= " --pause 20000";
$return_value .= &sdram_command($temp, $sdram_precharge);
$return_value .= &sdram_command($temp, $sdram_nop);
$return_value .= " --setreg +0 7";
$return_value .= " --label label1";
$return_value .= &sdram_command($temp, $sdram_refresh);
$return_value .= &sdram_command($temp, $sdram_nop);
$return_value .= " --loop +0 label1";
$return_value .= &sdram_command($temp, $sdram_mrs, $mrs_data);
$return_value .= &sdram_command($temp, $sdram_nop);
$return_value .= &sdram_command($sdram_init_val);
return $return_value;
}
#*****************************************************************************
##
## FUNCTION NAME: sdram_command
##
##****************************************************************************
sub sdram_command
{
my($temp, $value, $mrs_data) = @_;
$value ||= 0;
if ($value == $sdram_mrs)
{
$value = sprintf("%lx", $temp | ($value << 9) | ($mrs_data << 16));
}
else
{
$value = sprintf("%lx", $temp | ($value << 9));
}
return " --setreg $sdram_timing_address $value";
}
#*****************************************************************************
##
## FUNCTION NAME: print_help
##
##****************************************************************************
sub print_help
{
print "\nAXIS $my_name, ", '$Revision: 1.16 $ $Date: 2004/11/01 16:32:27 $ ', "\n";
die <<EOT;
Copyright (C) 2001-2002 Axis Communications AB
DESCRIPTION:
This program is used to boot (and flash) a linux image to a box.
It tries to extract the required ETRAX 100 settings from the image file.
SYNTAX:
$my_name [options]
OPTIONS:
-b <bootfile> : The boot image to use.
-d <device> : The network interface to use, default is eth0.
-f : Save the image in the flash memory starting at
address 0x10000.
-F : Save the image in the flash memory starting at
address 0.
-h : Print this help text.
-i <image> : The path and name of the image to use, default
is fimage.
-o <offset> : The offset in the flash where the flashing starts.
-O <offset> : The offset in the image file where the flashing
starts from.
-p : Print the resulting etrax100boot command instead
of executing it.
-s <size> : How much to flash (default is the size of the
flash minus the offset specified using -o or -f).
-S <size> : The size of the flash.
All sizes and offsets above can be specified as decimal numbers, or as
hexadecimal numbers by prefixing them with 0x. It is also possible to use
the suffixes k and M to specify kilo (1024) or mega (1048576).
EOT
}
#****************** END OF FILE boot_linux ***********************************

View File

@ -0,0 +1,32 @@
#
# Copyright (C) 2006 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
# $Id$
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=e100boot
PKG_VERSION:=0.1
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)
CRLF_WORKAROUND=1
include $(INCLUDE_DIR)/package.mk
define Build/Compile
mkdir -p $(PKG_BUILD_DIR)
cp -r ./src/* $(PKG_BUILD_DIR)
make -C $(PKG_BUILD_DIR)
endef
define Build/InstallDev
$(INSTALL_BIN) $(PKG_BUILD_DIR)/sbl/e100boot $(BIN_DIR)/etrax100boot
endef
$(eval $(call Build/DefaultTargets))

View File

@ -0,0 +1,26 @@
Copyright (c) 2004, 2005 Axis Communications AB. 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.
3. Neither the name of Axis Communications AB nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY AXIS COMMUNCATIONS AB ``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 REGENTS 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.

View File

@ -0,0 +1,70 @@
#
# Top Makefile for e100boot
# $Id: Makefile,v 1.20 2003/06/04 12:22:23 pkj Exp $
#
# Change these paths if necessary. Can also be specified on cmdline as
# 'make INSTALL_PATH=/foo/bar/'.
INSTALL_NAME = e100boot
INSTALL_PATH = /usr/local
INSTALL_PATH_BIN = $(INSTALL_PATH)/bin
INSTALL_PATH_DOC = $(INSTALL_PATH)/man/man1
DIRS = libpcap-0.4 sbl doc
-include $(AXIS_TOP_DIR)/tools/build/Rules.axis
ifdef prefix
INSTALL_PATH = $(prefix)
endif
INSTALL ?= install
all: conf $(DIRS)
@for d in $(DIRS); do \
echo -e "\n### Making $$d"; \
$(MAKE) -C $$d || exit; \
done
conf: $(DIRS)
@for d in $(DIRS); do \
if [ -x $$d/configure ] && [ ! -e $$d/Makefile ]; then \
echo -e "\n### Configuring $$d"; \
cd $$d; ./configure || exit; cd ..; \
fi; \
done
tar: clean
@echo -e "\n### Making tarball."
tar -C ../ -zcf e100boot.tgz --exclude e100boot.tgz --exclude RCS --exclude CVS e100boot
install: all
$(INSTALL) -d $(INSTALL_PATH_BIN) $(INSTALL_PATH_DOC)
$(INSTALL) sbl/e100boot.stripped $(INSTALL_PATH_BIN)/$(INSTALL_NAME)
$(INSTALL) -m 0644 doc/e100boot.1 $(INSTALL_PATH_DOC)/$(INSTALL_NAME).1
install.setuid:
@echo -e "\n### Make install.setuid"; \
if ! [ -e $(INSTALL_PATH_BIN)/$(INSTALL_NAME) ]; then \
echo -e "\n### Binary $(INSTALL_PATH_BIN)/$(INSTALL_NAME) does not exist! Make install first."; \
elif [ `id -u` = 0 ]; then \
chown root.root $(INSTALL_PATH_BIN)/$(INSTALL_NAME); \
chmod +s $(INSTALL_PATH_BIN)/$(INSTALL_NAME); \
else \
echo "### You must do this as root!"; \
fi
clean:
@for d in $(DIRS); do \
if [ -e $$d/Makefile ]; then \
echo -e "\n### Cleaning $$d"; \
$(MAKE) -C $$d clean || exit; \
fi; \
done
configsubs: conf configsubs-dirs
configsubs-dirs:
$(MAKE) -C libpcap-0.4 configsubs
$(MAKE) -C sbl configsubs

View File

@ -0,0 +1,25 @@
#
# Makefile to generate .ima files for e100boot
#
# Hacked by ronny, rehacked by ronny
#
# $Id: Makefile,v 1.26 2003/03/13 14:18:31 cii Exp $
#
DIRS := net net_noleds ser ser_noleds
all: $(DIRS)
@for d in $(DIRS); do \
echo -e "\n### Making $$d"; \
make -C $$d || exit; \
done
@echo "***************************************************************"
@./free_size
@echo "***************************************************************"
clean:
rm -f *.ima
@for d in $(DIRS); do \
echo -e "\n### Cleaning $$d"; \
make -C $$d clean || exit; \
done;

View File

@ -0,0 +1,42 @@
#!/bin/sh
#
# Calculates the size left in ETRAX cache when bootloader is loaded.
#
BOOT_FILE=`dirname $0`/net/net.out
HEADER_FILE=`dirname $0`/src/e100boot.h
for FILE in $BOOT_FILE $HEADER_FILE; do
if [ ! -f $FILE ]; then
echo "Could not find the file \"$FILE\"!"
exit 1
fi
done
# The cache size is given in hex
CACHE_SIZE=2000
BSS_SIZE=`nm-cris $BOOT_FILE | grep Ebss | cut -d ' ' -f 1 | tr a-f A-F`
TEXT_SIZE=`nm-cris $BOOT_FILE | grep Stext | cut -d ' ' -f 1 | tr a-f A-F`
IO_BUF_END=`grep IO_BUF_END $HEADER_FILE | awk '{ print $3 }' | \
cut -d x -f 2 | tr a-f A-F`
IO_BUF_START=`grep IO_BUF_START $HEADER_FILE | awk '{ print $3 }' | \
cut -d x -f 2 | tr a-f A-F`
FREE_SIZE=`echo "ibase=16 ; \
$CACHE_SIZE - \
($BSS_SIZE - $TEXT_SIZE + $IO_BUF_END - $IO_BUF_START)" | \
bc`
echo "Free cache size when cbl is loaded will be:"
echo -e "\t$FREE_SIZE bytes - size of stack"
if [ $FREE_SIZE -lt 0 ]; then
echo "Bootloader is too large! You will have to do some optimizing..."
exit 1
fi
exit 0

View File

@ -0,0 +1,6 @@
#
# $Id: Makefile,v 1.1 2002/07/01 14:36:40 pkj Exp $
#
IMAGE := net.ima
include ../rules.cbl

View File

@ -0,0 +1,3 @@
common.o: ../src/common.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/e100boot.h

View File

@ -0,0 +1,3 @@
common_init.o: ../src/common_init.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/e100boot.h

View File

@ -0,0 +1 @@
crt0.o: ../src/crt0.S

View File

@ -0,0 +1 @@
char e100boot_version[] = "This bootloader was built by root on Wed May 16 21:31:41 CEST 2007.\r\n";

View File

@ -0,0 +1 @@
e100boot_version.o: e100boot_version.c

View File

@ -0,0 +1 @@
flash.o: ../src/flash.c ../src/e100boot.h ../src/compiler.h

View File

@ -0,0 +1,2 @@
hwregs.o: ../src/hwregs.c ../src/compiler.h ../src/hwregs.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h

View File

@ -0,0 +1,2 @@
net_init.o: ../src/net_init.c ../src/sv_addr_ag.h ../src/sv_addr.agh \
../src/e100boot.h ../src/compiler.h

View File

@ -0,0 +1,6 @@
#
# $Id: Makefile,v 1.1 2002/07/01 14:36:51 pkj Exp $
#
IMAGE := net_noleds.ima
include ../rules.cbl

View File

@ -0,0 +1,3 @@
common.o: ../src/common.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/e100boot.h

View File

@ -0,0 +1,3 @@
common_init.o: ../src/common_init.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/e100boot.h

View File

@ -0,0 +1 @@
crt0.o: ../src/crt0.S

View File

@ -0,0 +1 @@
char e100boot_version[] = "This bootloader was built by root on Wed May 16 21:31:43 CEST 2007.\r\n";

View File

@ -0,0 +1 @@
e100boot_version.o: e100boot_version.c

View File

@ -0,0 +1 @@
flash.o: ../src/flash.c ../src/e100boot.h ../src/compiler.h

View File

@ -0,0 +1,2 @@
hwregs.o: ../src/hwregs.c ../src/compiler.h ../src/hwregs.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h

View File

@ -0,0 +1,2 @@
net_init.o: ../src/net_init.c ../src/sv_addr_ag.h ../src/sv_addr.agh \
../src/e100boot.h ../src/compiler.h

View File

@ -0,0 +1,55 @@
#
# $Id: rules.cbl,v 1.4 2005/04/20 11:18:54 starvik Exp $
#
VPATH := .:../src
ifeq ($(findstring _noleds,$(IMAGE)),_noleds)
USE_LEDS := 0
else
USE_LEDS := 1
endif
MAKEFLAGS := r
INCS := -I.
DEFS := -DUSE_LEDS=$(USE_LEDS)
CFLAGS := -Os -Wall -Wmissing-prototypes -W -Wa,-N -nostdinc $(INCS) $(DEFS) -MMD
ASFLAGS := $(CFLAGS)
LNFLAGS := -Wl,--section-start,.startup=0x380000f0 -nostdlib -Os -Wl,-T../src/ldscript
CC := cris-axis-elf-gcc
OUT := $(patsubst %.ima,%.out,$(IMAGE))
OBJS = crt0.o common_init.o
ifeq ($(findstring net,$(IMAGE)),net)
OBJS += net_init.o
else
OBJS += ser_init.o
endif
OBJS += common.o flash.o hwregs.o e100boot_version.o
all: ../$(IMAGE)
$(OUT): $(OBJS) ldscript
$(CC) -o $@ $(LNFLAGS) $(OBJS)
../%.ima: %.out
bin-cris -o $@ $<
@find $@ -printf '# Size of image $@ is %s bytes.\n\n'
$(OBJS): ../rules.cbl Makefile
# We don't want this to be a dummy and be recreated every time we build,
# only after a make clean
e100boot_version.c:
@echo "Generating version file....."
@echo 'char e100boot_version[] = "This bootloader was built by '`id -u -n`' on '`date`'.\r\n";' > $@
dummy:
clean:
rm -rf *.o *.d *.out *.ima deps e100boot_version.c
ifneq ($(MAKECMDGOALS),clean)
-include *.d
endif

Binary file not shown.

View File

@ -0,0 +1,6 @@
#
# $Id: Makefile,v 1.1 2002/07/01 14:37:01 pkj Exp $
#
IMAGE := ser.ima
include ../rules.cbl

View File

@ -0,0 +1,3 @@
common.o: ../src/common.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/e100boot.h

View File

@ -0,0 +1,3 @@
common_init.o: ../src/common_init.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/e100boot.h

View File

@ -0,0 +1 @@
crt0.o: ../src/crt0.S

View File

@ -0,0 +1 @@
char e100boot_version[] = "This bootloader was built by root on Wed May 16 21:31:44 CEST 2007.\r\n";

View File

@ -0,0 +1 @@
e100boot_version.o: e100boot_version.c

View File

@ -0,0 +1 @@
flash.o: ../src/flash.c ../src/e100boot.h ../src/compiler.h

View File

@ -0,0 +1,2 @@
hwregs.o: ../src/hwregs.c ../src/compiler.h ../src/hwregs.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h

Binary file not shown.

View File

@ -0,0 +1,3 @@
ser_init.o: ../src/ser_init.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/sv_addr_ag.h ../src/sv_addr.agh ../src/e100boot.h

View File

@ -0,0 +1,6 @@
#
# $Id: Makefile,v 1.1 2002/07/01 14:37:10 pkj Exp $
#
IMAGE := ser_noleds.ima
include ../rules.cbl

View File

@ -0,0 +1,3 @@
common.o: ../src/common.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/e100boot.h

View File

@ -0,0 +1,3 @@
common_init.o: ../src/common_init.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/e100boot.h

View File

@ -0,0 +1 @@
crt0.o: ../src/crt0.S

View File

@ -0,0 +1 @@
char e100boot_version[] = "This bootloader was built by root on Wed May 16 21:31:46 CEST 2007.\r\n";

View File

@ -0,0 +1 @@
e100boot_version.o: e100boot_version.c

View File

@ -0,0 +1 @@
flash.o: ../src/flash.c ../src/e100boot.h ../src/compiler.h

View File

@ -0,0 +1,2 @@
hwregs.o: ../src/hwregs.c ../src/compiler.h ../src/hwregs.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h

View File

@ -0,0 +1,3 @@
ser_init.o: ../src/ser_init.c ../src/hwregs.h ../src/compiler.h \
../src/debug.h ../src/project.h ../src/hwregs_def.h ../src/hwregs_int.h \
../src/sv_addr_ag.h ../src/sv_addr.agh ../src/e100boot.h

View File

@ -0,0 +1,486 @@
#include "hwregs.h"
#include "e100boot.h"
static void toggle_led(void);
static void read_load_info(void);
static void decode_load_info(void);
static void read_file(byte* addr, udword size);
#if USE_PRINT_DESCR
static void print_descr(dma_descr_T *d);
#endif
static int memory_test(udword addr, udword size, udword *failed_address);
static void memory_dump(udword *from, udword *to);
extern byte _Stext[];
extern byte _Edata[];
#ifdef USE_BAUDRATE_CHANGING
byte change_baudrate;
udword new_baudrate;
#endif
void
level2_boot(void)
{
#if USE_LEDS
REG_SET(R_PORT_PA_DATA, data_out, 0xaa);
#endif
#if 0
io_buf_next = (byte*)IO_BUF_START;
io_buf_cur = (byte*)IO_BUF_START;
#endif
#if 1
send_string("\r\n\r\nDevice ID = ");
send_hex(ntohl(tx_header.id), NL);
send_string(e100boot_version);
#endif
#if 1
{
udword sum = 0;
byte *b;
for (b = (byte*)_Stext; b != (byte*)_Edata; b++) {
sum += *b;
}
send_string("Checksum of bootloader is ");
send_hex(sum, NL);
}
#endif
read_load_info();
__asm__ volatile ("jump _start");
}
void
toggle_led(void)
{
#if USE_LEDS
REG_SET(R_PORT_PA_DATA, data_out, 0x55);
while (1) {
REG_SET(R_PORT_PA_DATA, data_out, ~REG_GET(R_PORT_PA_READ, data_in));
{
volatile udword i;
for (i = 0; i != 2000000; i++)
;
}
}
#else
while (1) {
}
#endif
}
void
read_load_info(void)
{
#ifdef USE_BAUDRATE_CHANGING
change_baudrate = 0;
#endif
send_string("Waiting for load info.\r\n");
send_ack();
read_file((byte*)IO_BUF_START, IO_BUF_END - IO_BUF_START - CRC_LEN);
send_string("Got load info.\r\n");
decode_load_info();
#ifdef USE_BAUDRATE_CHANGING
if (change_baudrate) {
REG_WR(R_SERIAL0_BAUD, new_baudrate);
{
udword i = 0;
while (i++ < 1000000)
;
}
send_ack();
}
#endif
toggle_led();
}
void
decode_load_info(void)
{
udword *type_p = (udword*)IO_BUF_START;
udword failed_address;
udword i;
command_T *cmd;
while (type_p != (udword*)(IO_BUF_END - CRC_LEN)) { /* !!! */
// send_hex(type_p, NL);
*type_p = ntohl(*type_p);
// send_hex(*type_p, NL);
type_p++;
}
// memory_dump(IO_BUF_START, IO_BUF_END);
cmd = (command_T*)IO_BUF_START;
while (cmd->type) {
switch (cmd->type) {
case PACKET_INFO:
send_string("PACKET_INFO\r\n");
send_hex(cmd->args.packet_info.addr, NL);
send_hex(cmd->args.packet_info.size, NL);
seq--;
send_ack();
seq++;
read_file((byte*)cmd->args.packet_info.addr, cmd->args.packet_info.size);
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.packet_info;
break;
case SET_REGISTER:
send_string("SET_REGISTER\r\n");
send_hex(cmd->args.set_register.addr, NL);
send_hex(cmd->args.set_register.val, NL);
*(udword*)cmd->args.set_register.addr = cmd->args.set_register.val;
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.set_register;
break;
case GET_REGISTER:
send_string("GET_REGISTER\r\n");
send_hex(cmd->args.get_register.addr, NL);
send_hex(*(udword*)cmd->args.get_register.addr, NL);
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.get_register;
break;
case PAUSE_LOOP:
send_string("PAUSE_LOOP\r\n");
send_hex(cmd->args.pause_loop.pause, NL);
for (i = cmd->args.pause_loop.pause; i; i--)
;
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.pause_loop;
break;
case MEM_VERIFY:
send_string("MEM_VERIFY\r\n");
send_hex(cmd->args.mem_verify.addr, NL);
send_hex(cmd->args.mem_verify.val, NL);
if (*(udword*)cmd->args.mem_verify.addr != cmd->args.mem_verify.val) {
send_string("verify failed\r\n");
goto decode_failed;
}
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.mem_verify;
break;
case MEM_TEST:
send_string("MEM_TEST\r\n");
send_hex(cmd->args.mem_test.from, NL);
send_hex(cmd->args.mem_test.to, NL);
if (!memory_test(cmd->args.mem_test.from,
cmd->args.mem_test.to,
&failed_address)) {
send_string("### Memory test failed at ");
send_hex(failed_address, NL);
memory_dump((udword*)DWORD_ALIGN(failed_address - 64),
(udword*)DWORD_ALIGN(failed_address + 64));
goto decode_failed;
}
send_string("Passed memory test.\r\n");
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.mem_test;
break;
case MEM_DUMP:
send_string("MEM_DUMP\r\n");
send_hex(cmd->args.mem_dump.from_addr, NL);
send_hex(cmd->args.mem_dump.to_addr, NL);
memory_dump((udword*)cmd->args.mem_dump.from_addr,
(udword*)cmd->args.mem_dump.to_addr);
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.mem_dump;
break;
case MEM_CLEAR:
send_string("MEM_CLEAR\r\n");
send_hex(cmd->args.mem_clear.from_addr, NL);
send_hex(cmd->args.mem_clear.to_addr, NL);
for (i = cmd->args.mem_clear.from_addr;
i <= cmd->args.mem_clear.to_addr;
i++) {
*(byte*)i = 0x00;
}
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.mem_clear;
break;
case FLASH:
send_string("FLASH\r\n");
send_hex((udword)cmd->args.flash.source, NL);
send_hex(cmd->args.flash.offset, NL);
send_hex(cmd->args.flash.size, NL);
if ((i = flash_write(cmd->args.flash.source,
cmd->args.flash.offset,
cmd->args.flash.size)) != ERR_FLASH_OK) {
if (i == ERR_FLASH_VERIFY) {
udword size =
(cmd->args.flash.size < 65536 ? cmd->args.flash.size : 65536);
/* Try to erase the first block(s) we tried to flash to prevent a
unit which failed to flash correctly from booting */
flash_write(NULL, cmd->args.flash.offset, size);
}
goto decode_failed;
}
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.flash;
break;
case JUMP:
#if 1
/* for the printf function in our libc */
REG_WR(R_DMA_CH8_FIRST, *(udword*)&tx_header.dest[0]);
REG_WR(R_DMA_CH9_FIRST, *(uword*)&tx_header.dest[4]);
// REG_WR(R_NETWORK_SA_1, &tx_header.dest[4]);
// REG_WR(R_NETWORK_SA_2, tx_header.id);
#endif
send_string("JUMP\r\n");
send_hex(cmd->args.jump.addr, NL);
send_string("END\r\n");
__asm__ volatile ("jump %0" :: "r" (cmd->args.jump.addr));
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.jump;
break;
case LOOP:
send_string("LOOP\r\n");
send_hex(cmd->args.bne.addr, NL);
send_hex(cmd->args.bne.target, NL);
if (*(udword*)cmd->args.bne.addr) {
(*(udword*)cmd->args.bne.addr)--;
(byte*)cmd = cmd->args.bne.target;
}
else {
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.bne;
}
break;
#ifdef USE_BAUDRATE_CHANGING
case BAUDRATE:
send_string("BAUDRATE\r\n");
send_hex(cmd->args.br.baudrate, NL);
new_baudrate = cmd->args.br.baudrate;
(byte*)cmd += sizeof cmd->type + sizeof cmd->args.br;
break;
#endif
default:
send_string("### Unknown type: ");
send_hex(cmd->type, NL);
goto decode_failed;
break;
}
}
decode_failed:
send_string("END\r\n");
}
void
read_file(byte* addr, udword size)
{
udword nbr_read_last;
udword sum;
byte *b;
byte *from;
/* send_string(">read_file\r\n"); */
nbr_read = 0;
nbr_read_last = 0;
target_address = (udword)addr;
if (interface == NETWORK) {
rx_descr2.buf = (udword)addr;
bytes_to_read = size;
rx_descr2.sw_len = size + CRC_LEN > 1500 ? 1500 : size + CRC_LEN;
/* rx_descr2.sw_len = 1500; */
REG_SET(R_DMA_CH1_FIRST, first, (udword)&rx_descr);
/* Restart receiver so descriptor is re-read. */
REG_SET(R_DMA_CH1_CMD, cmd, reset);
while (REG_EQL(R_DMA_CH1_CMD, cmd, reset)) {
}
REG_SET(R_DMA_CH1_CMD, cmd, start);
while (1) {
/* send_hex(rx_descr2.hw_len, NL); */
from = (byte*)rx_descr2.buf;
if (read_data()) {
if (nbr_read < size) {
REG_SET(R_DMA_CH1_CMD, cmd, start);
}
#if USE_PRINT_DESCR
print_descr(&rx_descr);
print_descr(&rx_descr2);
#endif
#if 0
send_string("Read ");
send_hex(rx_descr2.hw_len - CRC_LEN, NO_NL);
send_string(" bytes. ");
send_hex((udword)from, NO_NL);
send_string(" - ");
send_hex(rx_descr2.buf-1, NO_NL);
send_string(" (");
send_hex(nbr_read, NO_NL);
send_string("/");
send_hex(size, NO_NL);
send_string(")\r\n");
#endif
nbr_read_last = nbr_read;
/* from = (byte*)rx_descr2.buf; */
if (nbr_read >= size) {
break;
}
}
}
}
else { /* interface != NETWORK */
while (nbr_read < size) {
read_data();
}
}
sum = 0;
for (b = addr; b != (byte*)(addr+size); b++) {
sum += *b;
}
send_string("Checksum of file is ");
send_hex(sum, NL);
/* memory_dump((udword*)addr, (udword*)addr+size); */
/* send_string("<read_file\r\n"); */
}
#if USE_PRINT_DESCR
void
print_descr(dma_descr_T *d)
{
send_string("Descriptor at ");
send_hex((udword)d, NL);
send_string("ctrl : ");
send_hex(d->ctrl, NL);
send_string("sw_len : ");
send_hex(d->sw_len, NL);
send_string("next : ");
send_hex(d->next, NL);
send_string("buf : ");
send_hex(d->buf, NL);
send_string("status : ");
send_hex(d->status, NL);
send_string("hw_len : ");
send_hex(d->hw_len, NL);
}
#endif
int
memory_test(udword from, udword to, udword *failed_address)
{
udword i;
udword j;
byte b;
/* At each dword (but bytewise) write the inverse of the adress,
check that it worked, then write the inverse of the last byte
written. Exit on fail. The memory after a successfull test will
be:
0xC0000000 : 0xC0000000 0xC0000004 0xC0000008 0xC000000C
0xC0000010 : 0xC0000010 0xC0000014 0xC0000018 0xC000001C
*/
for (i = from; i < to; i += 4) {
for (j = 0; (j != sizeof(udword)) && (i+j < to); j++) {
b = ((~i) >> (j*8)) & 0xff;
*(volatile byte*)(i+j) = b;
if (*(volatile byte*)(i+j) == b) {
*(volatile byte*)(i+j) = ~b;
}
else {
*failed_address = i+j;
send_string("### Memory test 1 failed at ");
send_hex(*failed_address, NL);
return FALSE;
}
}
}
/* Run through entire region, check bytewise that the dwords contain
the address to the dword. Exit on fail. */
for (i = from; i < to; i += 4) {
for (j = 0; (j != sizeof(udword)) && (i+j < to); j++) {
b = (i >> (j*8)) & 0xff;
if (*(volatile byte*)(i+j) != b) {
*failed_address = i+j;
send_string("### Memory test 2 failed at ");
send_hex(*failed_address, NL);
return FALSE;
}
}
}
return TRUE;
}
void
memory_dump(udword *from, udword *to)
{
udword *i = from;
int j;
for (; i <= to; i += 4) {
send_hex((udword)i, NO_NL);
send_string(" :");
for(j = 0; j != 4 && (i+j <= to); j++) {
send_string(" ");
send_hex(*(udword*)(i+j), NO_NL);
}
send_string("\r\n");
}
}

View File

@ -0,0 +1,209 @@
/*****************************************************************************
*!
*! FILE NAME : common_init.c
*!
*! DESCRIPTION: This piece of code is loaded at bootstrap and is put in the
*! cache at 0x380000F0. Depending of how R_BUS_STATUS<2:1> is
*! set different kinds of bootstrap is performed.
*!
*! 00 - Normal boot. No bootstrap is performed and this code
*! is never loaded.
*! 01 - Serial boot. 784 bytes is loaded and execution starts
*! at 0x380000F0.
*! 11 - Parallel boot. 784 bytes is loaded and execution starts
*! at 0x380000F0.
*! 10 - Network boot. 1484 bytes is loaded and execution start
*! at 0x380000F4.
*!
*! ---------------------------------------------------------------------------
*! HISTORY
*!
*! DATE NAME CHANGES
*! ---- ---- -------
*! 980326 Ronny Ranerup Initial version
*! Sep 20 1999 Jonas Dellenvall Added port3 debug support
*! 20020206 ronny Yeah, and I removed it again...
*!
*! ---------------------------------------------------------------------------
*! (C) Copyright 1998-2002, Axis Communications AB, LUND, SWEDEN
*!***************************************************************************/
/*
Misc notes:
It is very important to keep this file short. This and the boot
interface specific parts must fit into the first boot packet.
*/
/****************** INCLUDE FILES SECTION ***********************************/
#include "hwregs.h"
#include "e100boot.h"
/****************** CONSTANT AND MACRO SECTION ******************************/
/****************** TYPE DEFINITION SECTION *********************************/
/****************** LOCAL FUNCTION DECLARATION SECTION **********************/
static int timeout(void);
/****************** GLOBAL VARIABLE DECLARATION SECTION *********************/
udword nbr_read; /* How many bytes has been read from current file */
byte interface; /* Which I/O interface is the current one */
byte set_dest; /* Have we set the destination address in tx_header */
udword last_timeout;
struct packet_header_T tx_header;
dma_descr_T tx_descr; /* For packet header */
dma_descr_T tx_descr2; /* packet data */
struct packet_header_T rx_header;
dma_descr_T rx_descr; /* For packet header */
dma_descr_T rx_descr2; /* packet data */
udword seq; /* Sequence number of next wanted packet */
byte serial_up;
/****************** LOCAL VARIABLE DECLARATION SECTION **********************/
/****************** FUNCTION DEFINITION SECTION *****************************/
void
crt1(void)
{
/* Do this only once so we don't reset the timers and destroy the 32
bit timer-register used as random number generator */
REG_SET__R_TIMER_CTRL(
timerdiv1, 0,
timerdiv0, 0,
presc_timer1, normal,
i1, clr,
tm1, run,
clksel1, cascade0,
presc_ext, prescale,
i0, clr,
tm0, run,
clksel0, c9600Hz);
REG_SET__R_TIMER_CTRL(
timerdiv1, 0,
timerdiv0, 0,
presc_timer1, normal,
i1, nop,
tm1, run,
clksel1, cascade0,
presc_ext, prescale,
i0, nop,
tm0, run,
clksel0, c9600Hz);
start();
}
void
start(void)
{
#if USE_LEDS
REG_SET__R_PORT_PA_DIR(
dir7, output,
dir6, output,
dir5, output,
dir4, output,
dir3, output,
dir2, output,
dir1, output,
dir0, input); /* not for prodtest */
REG_SET__R_PORT_PA_DATA(data_out, 0);
REG_SET__R_PORT_PB_DIR(
dir7, output,
dir6, output,
dir5, output,
dir4, output,
dir3, output,
dir2, output,
dir1, output,
dir0, output);
REG_SET__R_PORT_PB_DATA(data_out, 0xff);
#endif
/* We must initialize all (global) variables here, since the .data
and .bss area are used before they are loaded. */
//serial_up = FALSE;
nbr_read = 0;
/* Get a random value to use as id. */
tx_header.id = htonl(REG_RD(R_TIMER_DATA));
/* timer01 is used as timer. */
last_timeout = REG_GET(R_TIMER01_DATA, count);
interface = REG_GET(R_BUS_STATUS, boot) - 1; /* 0,1,2 */
rx_descr2.status = 0;
/* Initialize the boot interface */
init_interface();
send_ack(); /* Ack the first bootpacket, i.e. this code. seq 0. */
while (1) {
if (read_data()) {
if (nbr_read >= (udword)bytes_to_read) {
break;
}
else if (interface == NETWORK) {
REG_SET(R_DMA_CH1_CMD, cmd, start);
}
}
}
#if USE_LEDS
REG_SET(R_PORT_PA_DATA, data_out, 0x55);
#endif
level2_boot();
}
int
read_data(void)
{
if (handle_read()) {
return TRUE;
}
if (timeout()) {
send_ack();
}
return FALSE;
}
int
timeout(void)
{
volatile int now = REG_GET(R_TIMER01_DATA, count);
int elapsed;
int wait_time = 9600;
elapsed = last_timeout - now;
if (elapsed < 0) {
elapsed = -elapsed;
}
if (elapsed > wait_time) {
last_timeout = now;
return TRUE;
}
return FALSE;
}
/****************** END OF FILE common_init.c *******************************/

View File

@ -0,0 +1,10 @@
#ifndef _COMPILER_H
#define _COMPILER_H
typedef int dword;
typedef unsigned int udword;
typedef signed short word;
typedef unsigned short uword;
typedef unsigned char byte;
#endif

View File

@ -0,0 +1,17 @@
.global crt0 ; Needed because of a bug in binutils
.global _target_address
.global _bytes_to_read
.section .startup, "ax"
nop
nop
crt0:
move.d 0x38001f00, sp
jump _crt1
_bytes_to_read: .dword 0x12345678
_target_address: .dword 0x87654321

View File

@ -0,0 +1,332 @@
/* $Id: e100boot.h,v 1.9 2003/12/16 09:04:07 magnusmn Exp $ */
#include "compiler.h"
#define DMA_DESCR__out_priority__BITNR 5
#define DMA_DESCR__out_priority__WIDTH 1
#define DMA_DESCR__out_priority__normal 0
#define DMA_DESCR__out_priority__high 1
#define DMA_DESCR__ecp_cmd__BITNR 4
#define DMA_DESCR__ecp_cmd__WIDTH 1
#define DMA_DESCR__ecp_cmd__normal 0
#define DMA_DESCR__ecp_cmd__high 1
#define DMA_DESCR__tx_err__BITNR 4
#define DMA_DESCR__tx_err__WIDTH 1
#define DMA_DESCR__tx_err__enable 1
#define DMA_DESCR__tx_err__disable 0
#define DMA_DESCR__intr__BITNR 3
#define DMA_DESCR__intr__WIDTH 1
#define DMA_DESCR__intr__enable 1
#define DMA_DESCR__intr__disable 0
#define DMA_DESCR__wait__BITNR 2
#define DMA_DESCR__wait__WIDTH 1
#define DMA_DESCR__wait__enable 1
#define DMA_DESCR__wait__disable 0
#define DMA_DESCR__eop__BITNR 1
#define DMA_DESCR__eop__WIDTH 1
#define DMA_DESCR__eop__enable 1
#define DMA_DESCR__eop__disable 0
#define DMA_DESCR__eol__BITNR 0
#define DMA_DESCR__eol__WIDTH 1
#define DMA_DESCR__eol__enable 1
#define DMA_DESCR__eol__disable 0
#define DMA_DESCR__sw_len__BITNR 0
#define DMA_DESCR__sw_len__WIDTH 16
#define DMA_DESCR__next__BITNR 0
#define DMA_DESCR__next__WIDTH 32
#define DMA_DESCR__buf__BITNR 0
#define DMA_DESCR__buf__WIDTH 32
#define DMA_DESCR__fifo_len__BITNR 8
#define DMA_DESCR__fifo_len__WIDTH 7
#define DMA_DESCR__crc_err__BITNR 7
#define DMA_DESCR__crc_err__WIDTH 1
#define DMA_DESCR__crc_err__enable 1
#define DMA_DESCR__crc_err__disable 0
#define DMA_DESCR__align_err__BITNR 6
#define DMA_DESCR__align_err__WIDTH 1
#define DMA_DESCR__align_err__enable 1
#define DMA_DESCR__align_err__disable 0
#define DMA_DESCR__in_priority__BITNR 5
#define DMA_DESCR__in_priority__WIDTH 1
#define DMA_DESCR__in_priority__high 1
#define DMA_DESCR__in_priority__normal 0
#define DMA_DESCR__stop__BITNR 4
#define DMA_DESCR__stop__WIDTH 1
#define DMA_DESCR__rd_eop__BITNR 1
#define DMA_DESCR__rd_eop__WIDTH 1
#define DMA_DESCR__hw_len__BITNR 0
#define DMA_DESCR__hw_len__WIDTH 16
#define SET_ETHER_ADDR(a0_0,a0_1,a0_2,a0_3,a0_4,a0_5,a1_0,a1_1,a1_2,a1_3,a1_4,a1_5) \
*R_NETWORK_SA_0 = a0_0 | (a0_1 << 8) | (a0_2 << 16) | (a0_3 << 24); \
*R_NETWORK_SA_1 = a0_4 | (a0_5 << 8) | (a1_0 << 16) | (a1_1 << 24); \
*R_NETWORK_SA_2 = a1_2 | (a1_3 << 8) | (a1_4 << 16) | (a1_5 << 24);
#define DWORD_ALIGN(x) ((x) & 0xfffffffc)
#define CRC_LEN 4
#define TRUE 1
#define FALSE 0
#define NL 1
#define NO_NL 0
#define SERIAL 0
#define NETWORK 1
#define PARALLEL 2
#define STRING 0
#define INT 1
#define ACK 2
#define BOOT_PACKET 3
#define BOOT_CMDS 4
#define NET_INT 5
#define NET_INT_NL 6
#define JUMP 1
#define MEM_TEST 2
#define PACKET_INFO 3
#define SET_REGISTER 4
#define GET_REGISTER 5
#define MEM_DUMP 6
#define MEM_CLEAR 7
#define MEM_VERIFY 8
#define FLASH 9
#define PAUSE_LOOP 10
#define LOOP 11
#define BAUDRATE 12
#define ERR_FLASH_OK 0
#define ERR_FLASH_NONE 1
#define ERR_FLASH_TOO_SMALL 2
#define ERR_FLASH_VERIFY 3
#define ERR_FLASH_ERASE 4
#define TIMEOUT_LIMIT ( ((6250 * 1000) / 0xffff) / 2)
#define TX_CTRL_EOP \
(IO_STATE(DMA_DESCR, intr, disable) |\
IO_STATE(DMA_DESCR, wait, enable) |\
IO_STATE(DMA_DESCR, eop, enable) |\
IO_STATE(DMA_DESCR, eol, enable))
#define TX_CTRL \
(IO_STATE(DMA_DESCR, intr, disable) |\
IO_STATE(DMA_DESCR, wait, disable) |\
IO_STATE(DMA_DESCR, eop, disable) |\
IO_STATE(DMA_DESCR, eol, disable))
#define LOAD_ADDRESS 0x38001000
#define SIZEOF_BOOT_LEVEL_1 2048
/* This is where the commands are transfered to. */
#define IO_BUF_START 0x38001f00
#define IO_BUF_END 0x380020f0 /* bootcode start + cache size */
/* This should only be used in the cbl, but if we compile the sbl for
* elinux then __CRIS__ will be defined, and these are already defined
* in uC-libc. Check that __linux__ is not defined as well!
*/
#if defined(__CRIS__) && !defined(__linux__)
#define NULL ((void*)0)
static inline udword
htonl(udword x)
{
__asm__ ("swapwb %0" : "=r" (x) : "0" (x));
return(x);
}
#ifndef ntohl
#define ntohl(x) htonl(x)
#endif
static inline uword
htons(uword x)
{
__asm__ ("swapb %0" : "=r" (x) : "0" (x));
return(x);
}
#ifndef ntohs
#define ntohs(x) htons(x)
#endif
#endif
/*#define ntohs(x) \*/
/*((unsigned short)((((unsigned short)(x) & 0x00ffU) << 8) | \*/
/* (((unsigned short)(x) & 0xff00U) >> 8)))*/
/* */
/*#define ntohl(x) \*/
/*((unsigned long int)((((unsigned long int)(x) & 0x000000ffU) << 24) | \*/
/* (((unsigned long int)(x) & 0x0000ff00U) << 8) | \*/
/* (((unsigned long int)(x) & 0x00ff0000U) >> 8) | \*/
/* (((unsigned long int)(x) & 0xff000000U) >> 24)))*/
struct packet_header_T /* Size = 38 */
{
byte dest[6];
byte src[6];
uword length;
udword snap1;
udword snap2;
udword tag;
udword seq;
udword type;
udword id;
} __attribute__ ((packed));
typedef struct dma_descr_T {
uword sw_len; /* 0-1 */
uword ctrl; /* 2-3 */
udword next; /* 4-7 */
udword buf; /* 8-11 */
uword hw_len; /* 12-13 */
uword status; /* 14-15 */
} dma_descr_T;
typedef struct packet_info_T {
udword addr;
udword size;
} packet_info_T;
typedef struct set_register_T {
udword addr;
udword val;
} set_register_T;
typedef struct get_register_T {
udword addr;
} get_register_T;
typedef struct pause_loop_T {
udword pause;
} pause_loop_T;
typedef struct mem_verify_T {
udword addr;
udword val;
} mem_verify_T;
typedef struct mem_test_T {
udword from;
udword to;
} mem_test_T;
typedef struct mem_dump_T {
udword from_addr;
udword to_addr;
} mem_dump_T;
typedef struct mem_clear_T {
udword from_addr;
udword to_addr;
} mem_clear_T;
typedef struct flash_T {
unsigned char *source;
udword offset;
udword size;
} flash_T;
typedef struct jump_T {
udword addr;
} jump_T;
typedef struct bne_T {
udword addr;
udword target;
} bne_T;
typedef struct br_T {
udword baudrate;
} br_T;
typedef struct command_T {
udword type;
union {
packet_info_T packet_info;
set_register_T set_register;
get_register_T get_register;
pause_loop_T pause_loop;
mem_verify_T mem_verify;
mem_test_T mem_test;
mem_dump_T mem_dump;
mem_clear_T mem_clear;
flash_T flash;
jump_T jump;
bne_T bne;
br_T br;
} args;
} command_T;
#define NETWORK_HEADER_LENGTH sizeof(struct packet_header_T)
void crt1(void);
void start(void);
void level2_boot(void);
int read_data(void);
int handle_network_read(void);
int flash_write(const unsigned char *source, unsigned int offset, unsigned int size);
void init_interface(void);
int handle_read(void);
void send_ack(void);
void send_string(char *str);
void send_hex(udword v, byte nl);
extern char e100boot_version[];
extern volatile udword bytes_to_read;
extern volatile udword target_address;
extern udword nbr_read;
extern byte interface;
extern byte set_dest;
extern udword last_timeout;
extern byte *io_buf_next;
extern byte *io_buf_cur;
extern struct packet_header_T tx_header;
extern dma_descr_T tx_descr;
extern dma_descr_T tx_descr2;
extern struct packet_header_T rx_header;
extern dma_descr_T rx_descr;
extern dma_descr_T rx_descr2;
extern uword timeout_limit;
extern udword seq;
extern byte serial_up;
enum { /* Available in: */
d_eol = (1 << 0), /* flags */
d_eop = (1 << 1), /* flags & status */
d_wait = (1 << 2), /* flags */
d_int = (1 << 3), /* flags */
d_txerr = (1 << 4), /* flags */
d_stop = (1 << 4), /* status */
d_ecp = (1 << 4), /* flags & status */
d_pri = (1 << 5), /* flags & status */
d_alignerr = (1 << 6), /* status */
d_crcerr = (1 << 7) /* status */
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,38 @@
SECTIONS
{
. = 0x380000f0;
__Stext = .;
.text :
{
KEEP (*(.startup))
KEEP (*(.text))
*(.text.*)
KEEP (*(.rodata))
*(.rodata.*)
} =0
__Etext = .;
.data :
{
__Sdata = .;
KEEP (*(.data))
*(.data.*)
}
__Edata = .;
. = ALIGN (4);
__Sbss = .;
.bss :
{
/* The network crc will land in the first four bytes of the
bss. Move the variables out of the way. */
. = . + 12;
*(.bss.*)
*(COMMON)
}
__Ebss = .;
}

View File

@ -0,0 +1,218 @@
#define net_init init_interface
#define handle_network_read handle_read
#define send_network_ack send_ack
#define send_network_string send_string
#define send_network_hex send_hex
#include "sv_addr_ag.h"
#include "e100boot.h"
static void start_network_trans(void);
void
net_init(void)
{
*R_NETWORK_GA_1 = *R_NETWORK_GA_0 = 0;
SET_ETHER_ADDR(0x01,0x40,0x8c,0x00,0x01,0x00,
0x01,0x40,0x8c,0x00,0x01,0x00);
*R_NETWORK_REC_CONFIG =
IO_STATE (R_NETWORK_REC_CONFIG, duplex, half) |
IO_STATE (R_NETWORK_REC_CONFIG, bad_crc, discard) |
IO_STATE (R_NETWORK_REC_CONFIG, oversize, discard) |
IO_STATE (R_NETWORK_REC_CONFIG, undersize, discard) |
IO_STATE (R_NETWORK_REC_CONFIG, all_roots, discard) |
IO_STATE (R_NETWORK_REC_CONFIG, broadcast, discard) |
IO_STATE (R_NETWORK_REC_CONFIG, individual, discard) |
IO_STATE (R_NETWORK_REC_CONFIG, ma1, disable) |
IO_STATE (R_NETWORK_REC_CONFIG, ma0, enable);
*R_NETWORK_MGM_CTRL =
IO_FIELD(R_NETWORK_MGM_CTRL, txd_pins, 0) |
IO_FIELD(R_NETWORK_MGM_CTRL, txer_pin, 0) |
IO_FIELD(R_NETWORK_MGM_CTRL, mdck, 0) |
IO_STATE(R_NETWORK_MGM_CTRL, mdoe, disable) |
IO_FIELD(R_NETWORK_MGM_CTRL, mdio, 0);
*R_NETWORK_TR_CTRL =
(IO_STATE (R_NETWORK_TR_CTRL, clr_error, clr) |
IO_STATE (R_NETWORK_TR_CTRL, delay, none) |
IO_STATE (R_NETWORK_TR_CTRL, cancel, dont) |
IO_STATE (R_NETWORK_TR_CTRL, cd, enable) |
IO_STATE (R_NETWORK_TR_CTRL, pad, enable) |
IO_STATE (R_NETWORK_TR_CTRL, crc, enable) |
IO_STATE (R_NETWORK_TR_CTRL, retry, enable));
*R_NETWORK_GEN_CONFIG =
IO_STATE (R_NETWORK_GEN_CONFIG, loopback, off) |
IO_STATE (R_NETWORK_GEN_CONFIG, frame, ether) |
IO_STATE (R_NETWORK_GEN_CONFIG, vg, off) |
IO_STATE (R_NETWORK_GEN_CONFIG, phy, mii_clk) |
IO_STATE (R_NETWORK_GEN_CONFIG, enable, on);
*R_DMA_CH0_CMD = IO_STATE(R_DMA_CH0_CMD, cmd, reset);
*R_DMA_CH1_CMD = IO_STATE(R_DMA_CH1_CMD, cmd, reset);
rx_descr.sw_len = NETWORK_HEADER_LENGTH;
rx_descr.ctrl = TX_CTRL;
rx_descr.next = (udword)&rx_descr2;
rx_descr.buf = (udword)&rx_header;
rx_descr2.sw_len = 1500;
rx_descr2.ctrl = TX_CTRL_EOP;
rx_descr2.buf = target_address;
/* Endian dependent, but saves a few bytes... */
*(udword*)&tx_header.src[0] = htonl(0x02408c00);
*(uword*)&tx_header.src[4] = htons(0x0100);
tx_header.length = htons(64);
tx_header.snap1 = htonl(0xaaaa0300);
tx_header.snap2 = htonl(0x408c8856);
tx_header.tag = htonl(0xfffffffe);
tx_header.seq = 0;
tx_header.type = 0;
tx_descr.sw_len = NETWORK_HEADER_LENGTH;
tx_descr.ctrl = TX_CTRL_EOP;
tx_descr.buf = (udword)&tx_header;
set_dest = FALSE;
seq = 0;
*R_DMA_CH1_FIRST = (udword)&rx_descr;
*R_DMA_CH1_CMD = IO_STATE(R_DMA_CH1_CMD, cmd, start);
}
int
handle_network_read(void)
{
if (!(rx_descr2.status & d_eop)) {
return FALSE;
}
/* Even if wasn't to us, we must do this... */
rx_descr2.status = 0;
*R_DMA_CH1_FIRST = (udword)&rx_descr;
/* Was it to me? */
if (ntohl(rx_header.seq) == (seq+1)) {
interface = NETWORK;
last_timeout = *R_TIMER_DATA >> IO_BITNR(R_TIMER_DATA, timer0);
nbr_read += rx_descr2.hw_len - CRC_LEN;
rx_descr2.buf += rx_descr2.hw_len - CRC_LEN;
rx_descr2.sw_len = bytes_to_read - nbr_read - CRC_LEN < 1500 ?
bytes_to_read - nbr_read + CRC_LEN: 1500; /* FIX!!!!! */
rx_descr2.sw_len = rx_descr2.sw_len + NETWORK_HEADER_LENGTH < 64
? 64 - NETWORK_HEADER_LENGTH : rx_descr2.sw_len; /* Less than minimum eth packet? */
seq++;
send_network_ack();
}
return TRUE;
}
void
send_network_ack(void)
{
/* send_serial_string(">send_network_ack.\r\n"); */
if (!set_dest) { /* Copy destination address from first received packet */
set_dest = TRUE;
/* If we have done a bootrom network boot, source address is in a different
place... */
if (((*R_BUS_STATUS & IO_MASK(R_BUS_STATUS, boot))
>> IO_BITNR(R_BUS_STATUS, boot)) - 1 == NETWORK) {
*(udword*)&tx_header.dest[0] = *(udword*)0x380000dc;
*(uword*)&tx_header.dest[4] = *(uword*)0x380000e0;
}
else {
*(udword*)&tx_header.dest[0] = *(udword*)&rx_header.src[0];
*(uword*)&tx_header.dest[4] = *(uword*)&rx_header.src[4];
}
}
#if 1
tx_header.seq = htonl(seq);
tx_header.type = htonl(ACK);
#else
tx_header.seq = htonl(seq);
tx_header.type = htonl(bytes_to_read);
tx_header.id = htonl(target_address);
/* tx_header.id already set in start(). */
#endif
tx_descr.ctrl = TX_CTRL_EOP;
tx_descr.sw_len = NETWORK_HEADER_LENGTH;
start_network_trans();
}
void
start_network_trans(void)
{
/* send_serial_string(">start_network_trans\r\n"); */
/* Clear possible underrun or excessive retry errors */
/* *R_NETWORK_TR_CTRL = */
/* (IO_STATE (R_NETWORK_TR_CTRL, clr_error, clr) | */
/* IO_STATE (R_NETWORK_TR_CTRL, delay, none) | */
/* IO_STATE (R_NETWORK_TR_CTRL, cancel, dont) | */
/* IO_STATE (R_NETWORK_TR_CTRL, cd, enable) | */
/* IO_STATE (R_NETWORK_TR_CTRL, pad, enable) | */
/* IO_STATE (R_NETWORK_TR_CTRL, crc, enable) | */
/* IO_STATE (R_NETWORK_TR_CTRL, retry, enable)); */
*R_DMA_CH0_FIRST = (udword)&tx_descr;
*R_DMA_CH0_CMD = IO_STATE(R_DMA_CH0_CMD, cmd, start);
while(*R_DMA_CH0_FIRST)
;
}
void
send_network_string(char *str)
{
int i;
tx_descr.next = (udword)&tx_descr2;
tx_descr.ctrl = TX_CTRL;
for (i = 0; str[i]; i++) /* strlen */
;
tx_header.type = STRING;
tx_descr2.ctrl = TX_CTRL_EOP;
tx_descr2.buf = (udword)str;
tx_descr2.sw_len = i+1;
start_network_trans();
}
void
send_network_hex(udword v, byte nl)
{
tx_descr.next = (udword)&tx_descr2;
tx_descr.ctrl = TX_CTRL;
tx_header.type = nl ? htonl(NET_INT_NL) : htonl(NET_INT);
/* Pause so we don't saturate network. */
/* Hehe, the asm will fool gcc to not remove the loop even though it
probably should. If we volatile i the code will be a few bytes
longer than this version. Well I really did it like this just
because it is possible... */
{
udword i;
for(i = 0; i != 16384; i++)
__asm__ ("");
}
v = htonl(v);
tx_descr2.ctrl = TX_CTRL_EOP;
tx_descr2.buf = (udword)&v;
tx_descr2.sw_len = (uword)sizeof(udword);
start_network_trans();
}

View File

@ -0,0 +1,10 @@
#define REG_NO_SHADOW 1
#define REG_NO_INIT_SHADOW 1
#define USE_GROUP__Serial_port_registers 1
#define USE_GROUP__Network_interface_registers 1
#define USE_GROUP__Parallel_printer_port_registers 1
#define USE_GROUP__Timer_registers 1
#define USE_GROUP__General_port_configuration_registers 1
#define USE_GROUP__Bus_interface_configuration_registers 1
#define USE_GROUP__DMA_registers 1

View File

@ -0,0 +1,117 @@
#define ser_init init_interface
#define handle_serial_read handle_read
#define send_serial_ack send_ack
#define send_serial_string send_string
#define send_serial_hex send_hex
#include "hwregs.h"
#include "sv_addr_ag.h"
#include "e100boot.h"
void
ser_init(void)
{
REG_SET__R_SERIAL0_XOFF
(
tx_stop, enable,
auto_xoff, disable,
xoff_char, 0
);
REG_SET__R_SERIAL0_BAUD
(
tr_baud, c9600Hz,
rec_baud, c9600Hz
);
REG_SET__R_SERIAL0_REC_CTRL
(
dma_err, stop,
rec_enable, enable,
rts_, inactive,
sampling, middle,
rec_stick_par, normal,
rec_par, even,
rec_par_en, disable,
rec_bitnr, rec_8bit
);
REG_SET__R_SERIAL0_TR_CTRL
(
txd, 0,
tr_enable, enable,
auto_cts, disabled,
stop_bits, one_bit,
tr_stick_par, normal,
tr_par, even,
tr_par_en, disable,
tr_bitnr, tr_8bit
);
serial_up = TRUE;
}
#define SER_MASK (IO_MASK(R_SERIAL0_READ, data_avail) | IO_MASK(R_SERIAL0_READ, data_in))
int
handle_serial_read(void)
{
udword status_and_data_in = *R_SERIAL0_READ & SER_MASK;
if (status_and_data_in & IO_STATE(R_SERIAL0_READ, data_avail, yes)) {
*(char*)(target_address + nbr_read++) = status_and_data_in & 0xff; /* ugly mask */
last_timeout = REG_GET(R_TIMER0_DATA, count);
return TRUE;
}
return FALSE;
}
void
send_serial_ack(void)
{
while (!REG_EQL(R_SERIAL0_STATUS, tr_ready, ready))
;
REG_ISET(0, R_SERIAL0_TR_DATA, data_out, '+');
}
void
send_serial_string(char *str)
{
int i;
for (i = 0; str[i];) {
if (REG_IEQL(0, R_SERIAL0_STATUS, tr_ready, ready)) {
REG_ISET(0, R_SERIAL0_TR_DATA, data_out, str[i]);
i++;
}
}
}
void
send_serial_hex(udword v, byte nl)
{
int i;
byte buf[13];
byte nybble;
buf[0] = '0';
buf[1] = 'x';
buf[10] = '\r';
buf[11] = '\n';
buf[12] = '\0';
if (nl == FALSE) {
buf[10] = '\0';
}
for (i = 0; i != 8; i++) {
nybble = (v >> (i*4)) & 0xf;
if (nybble > 9) {
nybble += 7;
}
buf[7-i+2] = nybble + '0';
}
send_serial_string(buf);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,137 @@
/*!**************************************************************************
*!
*! MACROS:
*! IO_MASK(reg,field)
*! IO_STATE(reg,field,state)
*! IO_EXTRACT(reg,field,val)
*! IO_STATE_VALUE(reg,field,state)
*! IO_BITNR(reg,field)
*! IO_WIDTH(reg,field)
*! IO_FIELD(reg,field,val)
*! IO_RD(reg)
*! All moderegister addresses and fields of these.
*!
*!**************************************************************************/
#ifndef __sv_addr_ag_h__
#define __sv_addr_ag_h__
#define __test_sv_addr__ 0
/*------------------------------------------------------------
!* General macros to manipulate moderegisters.
!*-----------------------------------------------------------*/
/* IO_MASK returns a mask for a specified bitfield in a register.
Note that this macro doesn't work when field width is 32 bits. */
#define IO_MASK(reg, field) IO_MASK_ (reg##_, field##_)
#define IO_MASK_(reg_, field_) \
( ( ( 1 << reg_##_##field_##_WIDTH ) - 1 ) << reg_##_##field_##_BITNR )
/* IO_STATE returns a constant corresponding to a one of the symbolic
states that the bitfield can have. (Shifted to correct position) */
#define IO_STATE(reg, field, state) IO_STATE_ (reg##_, field##_, _##state)
#define IO_STATE_(reg_, field_, _state) \
( reg_##_##field_##_state << reg_##_##field_##_BITNR )
/* IO_EXTRACT returns the masked and shifted value corresponding to the
bitfield can have. */
#define IO_EXTRACT(reg, field, val) IO_EXTRACT_ (reg##_, field##_, val)
#define IO_EXTRACT_(reg_, field_, val) ( (( ( ( 1 << reg_##_##field_##_WIDTH ) \
- 1 ) << reg_##_##field_##_BITNR ) & (val)) >> reg_##_##field_##_BITNR )
/* IO_STATE_VALUE returns a constant corresponding to a one of the symbolic
states that the bitfield can have. (Not shifted) */
#define IO_STATE_VALUE(reg, field, state) \
IO_STATE_VALUE_ (reg##_, field##_, _##state)
#define IO_STATE_VALUE_(reg_, field_, _state) ( reg_##_##field_##_state )
/* IO_FIELD shifts the val parameter to be aligned with the bitfield
specified. */
#define IO_FIELD(reg, field, val) IO_FIELD_ (reg##_, field##_, val)
#define IO_FIELD_(reg_, field_, val) ((val) << reg_##_##field_##_BITNR)
/* IO_BITNR returns the starting bitnumber of a bitfield. Bit 0 is
LSB and the returned bitnumber is LSB of the field. */
#define IO_BITNR(reg, field) IO_BITNR_ (reg##_, field##_)
#define IO_BITNR_(reg_, field_) (reg_##_##field_##_BITNR)
/* IO_WIDTH returns the width, in bits, of a bitfield. */
#define IO_WIDTH(reg, field) IO_WIDTH_ (reg##_, field##_)
#define IO_WIDTH_(reg_, field_) (reg_##_##field_##_WIDTH)
/*--- Obsolete. Kept for backw compatibility. ---*/
/* Reads (or writes) a byte/uword/udword from the specified mode
register. */
#define IO_RD(reg) (*(volatile udword*)(reg))
#define IO_RD_B(reg) (*(volatile byte*)(reg))
#define IO_RD_W(reg) (*(volatile uword*)(reg))
#define IO_RD_D(reg) (*(volatile udword*)(reg))
/*------------------------------------------------------------
!* Start addresses of the different memory areas.
!*-----------------------------------------------------------*/
#define MEM_CSE0_START (0x00000000)
#define MEM_CSE1_START (0x04000000)
#define MEM_CSR0_START (0x08000000)
#define MEM_CSR1_START (0x0c000000)
#define MEM_CSP0_START (0x10000000)
#define MEM_CSP1_START (0x14000000)
#define MEM_CSP2_START (0x18000000)
#define MEM_CSP3_START (0x1c000000)
#define MEM_CSP4_START (0x20000000)
#define MEM_CSP5_START (0x24000000)
#define MEM_CSP6_START (0x28000000)
#define MEM_CSP7_START (0x2c000000)
#define MEM_DRAM_START (0x40000000)
#define MEM_NON_CACHEABLE (0x80000000)
/*------------------------------------------------------------
!* Type casts used in mode register macros, making pointer
!* dereferencing possible. Empty in assembler.
!*-----------------------------------------------------------*/
#ifndef __ASSEMBLER__
# define IO_TYPECAST_UDWORD (volatile udword*)
# define IO_TYPECAST_RO_UDWORD (const volatile udword*)
# define IO_TYPECAST_UWORD (volatile uword*)
# define IO_TYPECAST_RO_UWORD (const volatile uword*)
# define IO_TYPECAST_BYTE (volatile byte*)
# define IO_TYPECAST_RO_BYTE (const volatile byte*)
#else
# define IO_TYPECAST_UDWORD
# define IO_TYPECAST_RO_UDWORD
# define IO_TYPECAST_UWORD
# define IO_TYPECAST_RO_UWORD
# define IO_TYPECAST_BYTE
# define IO_TYPECAST_RO_BYTE
#endif
/*------------------------------------------------------------*/
#include "sv_addr.agh"
#if __test_sv_addr__
/* IO_MASK( R_BUS_CONFIG , CE ) */
IO_MASK( R_WAITSTATES , SRAM_WS )
IO_MASK( R_TEST , W32 )
IO_STATE( R_BUS_CONFIG, CE, DISABLE )
IO_STATE( R_BUS_CONFIG, CE, ENABLE )
IO_STATE( R_DRAM_TIMING, REF, IVAL2 )
IO_MASK( R_DRAM_TIMING, REF )
IO_MASK( R_EXT_DMA_0_STAT, TFR_COUNT ) >> IO_BITNR( R_EXT_DMA_0_STAT, TFR_COUNT )
IO_RD(R_EXT_DMA_0_STAT) & IO_MASK( R_EXT_DMA_0_STAT, S )
== IO_STATE( R_EXT_DMA_0_STAT, S, STARTED )
#endif
#endif /* ifndef __sv_addr_ag_h__ */

View File

@ -0,0 +1,17 @@
OBJS=e100boot.1 e100boot.html
all: $(OBJS)
%.1: %.pod
pod2man $< > $@
%.html: %.pod
pod2html $< > $@
@rm -f pod2htmd.x~~ pod2htmi.x~~
clean:
rm -f *cache *~
# The 'clean' doesn't remove the generated documentation as we want
# them in the distribution.

View File

@ -0,0 +1,401 @@
.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sh \" Subsection heading
.br
.if t .Sp
.ne 5
.PP
\fB\\$1\fR
.PP
..
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
'br\}
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.if \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. nr % 0
. rr F
.\}
.\"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.hy 0
.if n .na
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "E100BOOT 1"
.TH E100BOOT 1 "2003-12-16" "perl v5.8.8" "User Contributed Perl Documentation"
.SH "NAME"
e100boot \- Network and serial port bootloader for the ETRAX100 CPU.
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
\&\fBe100boot\fR [\fB\-\-device\fR \fIdevicename\fR]
[\fB\-\-file\fR \fIfilename\fR|\- \fIaddr\fR [\fIsize\fR]]
[\fB\-\-flash\fR \fIram-source\fR \fIflash-offset\fR \fIsize\fR] [\fB\-\-pause\fR \fIiter\fR]
[\fB\-\-memtest\fR \fIaddr\fR \fIaddr\fR] [\fB\-\-memclear\fR \fIaddr\fR \fIaddr\fR]
[\fB\-\-memdump\fR \fIaddr\fR \fIaddr\fR] [\fB\-\-setreg\fR \fIaddr\fR|\fIregname\fR \fIval\fR]
[\fB\-\-getreg\fR \fIaddr\fR|\fIregname\fR] [\fB\-\-verify\fR \fIaddr\fR \fIval\fR]
[\fB\-\-label\fR \fIlabel\fR] [\fB\-\-loop\fR \fIaddr\fR \fIlabel\fR] [\fB\-\-5400\fR] [\fB\-\-5600\fR]
[\fB\-\-testcard\fR] [\fB\-\-devboard\fR] [\fB\-\-testcardlx\fR] [\fB\-\-network\fR] [\fB\-\-serial\fR]
[\fB\-\-baudrate\fR \fIbaudrate\fR] [\fB\-\-bootfile\fR \fIfile\fR] [\fB\-\-jump\fR \fIaddr\fR]
[\fB\-\-tofiles\fR] [\fB\-\-cmdsonly\fR] [\fB\-\-images\fR] [\fB\-\-noleds\fR] [\fB\-\-help\fR]
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
This boot loader facilitates loading of files over the network or a
serial port to an \s-1ETRAX100\s0. It can also be used for fairly extensive
hardware debugging as you can read and write to any memory addresses,
including the \s-1ETRAX100\s0 registers. You can also perform memory checks
and dumps and copy data to flash memories.
.PP
The first packet (or the first 784 bytes in the case of serial boot)
sent to Etrax100 is loaded into the cache. The code in this packet is
executed and loads the rest of the boot loader into the cache. The
cache is the only thing we can be sure of exists on all \s-1ETRAX100\s0
products, so the boot loader is limited to the size of the cache,
8KB. If further boot loading code is needed you have to set up
external memory and load another boot loader into it, but this is
rarely needed.
.PP
Two programs are involved in this boot loading, one is the program on
your workstation that sends the packets to \s-1ETRAX100\s0, this is called
the server boot loader or \s-1SBL\s0. The other program is the one in
\&\s-1ETRAX100\s0 that receives packets from the \s-1SBL\s0 and acts upon the data
therein, this is called the client boot loader or \s-1CBL\s0.
.PP
We don't want to edit and recompile the \s-1CBL\s0 each time we want to load
level two to different parts of memory, like we do on different
products. We also want to change things like the setup of external
memory before we load data into it. To make the boot loading as
flexible as possible and separate the \s-1CBL\s0 from level two we send a
configuration packet to it. After this packet we load other files, if
we want to.
.PP
The configuration packet can contain information to the \s-1CBL\s0 which lets
you: initialize external memory, read and write to all \s-1ETRAX100\s0
registers, read and write to any part of memory, load as many other
files as you like to any part of memory you like, etc. The
configuration packet is generated on the fly by the \s-1SBL\s0.
.PP
Since the \s-1CBL\s0 is unaware of which product it will be loaded on, it
doesn't do product specific initialization like setting up the
memory. This must be done with the configuration packet.
.Sh "Debugging printout"
.IX Subsection "Debugging printout"
When doing network boot the debugging printout from the \s-1CBL\s0 in \s-1ETRAX\s0
is transmitted back over the network and printed by e100boot. When
doing serial boot that interface will be used. So in either case you
will not need any other software or hardware to receive the debugging
printout.
.Sh "Creating binaries"
.IX Subsection "Creating binaries"
The files containing code to be loaded on the \s-1ETRAX100\s0 must be
stripped using the standard \s-1GCC\s0 binutils.
.Sh "How it works, things you don't want to know."
.IX Subsection "How it works, things you don't want to know."
ack, timeout bla, bla... \s-1RTFS\s0.
.Sh "Compilation and code"
.IX Subsection "Compilation and code"
Noteworthy is that two separate \s-1ETRAX100\s0 binaries are created, one for
network boot and one for serial boot. They actually contain exactly
the same code, but linked in different order. This is because the code
to load the rest of the bootloader over a specific interface must be
contained in the first data sent to the \s-1ETRAX100\s0 and it is too
difficult to cram the code for both interfaces in the beginning of the
same binary. Hence two files.
.PP
Other stuff you don't want to know is that the cache is mapped from
0x380000f0 to 0x380020f0. Code starts at the first address followed by
data up to the symbol \fIEbss\fR. At the other end is the buffer for boot
commands (addresses defined by \fI\s-1IO_BUF_START\s0\fR and \fI\s-1IO_BUF_END\s0\fR below
which the stack lies and hopefully the stack and \fIEbss\fR will never
meet...
.PP
The serial data is loaded from 0x380000f0 to 0x380003ff before
execution starts.
.SH "OPTIONS"
.IX Header "OPTIONS"
The options are done in the order specified on the command line, so
you probably want to do any memory setup before loading a file to the
memory, and you probably do not want to perform a memory test after
you have loaded a file to that memory.
.PP
All addresses and sizes must be in hex with optional '0x' prefix, or a
\&\s-1ETRAX100\s0 register name. Since the \fB\-\-setreg\fR and \fB\-\-getreg\fR options
only can be performed on dword aligned dwords only the registers that
conform to this can be named.
.PP
Note also that all addresses must be in uncached memory (bit 31 set),
as the bootloader lies in the cache. If you access any uncached
address during boot, the bootloader will be destroyed without warning.
.PP
It is also possible to specify an address as \fI+address\fR, in which
case it is considered to be relative to \fI\s-1IO_BUF_START\s0\fR. This is
especially useful in combination with the \fB\-\-loop\fR option below.
.IP "\fB\-\-baudrate\fR \fIbaudrate\fR" 4
.IX Item "--baudrate baudrate"
Set baudrate for files loaded after the boot loader.
.IP "\fB\-\-bootfile\fR \fIfilename\fR" 4
.IX Item "--bootfile filename"
Which boot image to send to \s-1ETRAX\s0 instead of the default ones.
.IP "\fB\-\-cmdsonly\fR" 4
.IX Item "--cmdsonly"
Write the commands to file e100boot.cmds.
.IP "\fB\-\-devboard\fR" 4
.IX Item "--devboard"
Sets registers for the developer board.
.IP "\fB\-\-device\fR \fIdevicename\fR" 4
.IX Item "--device devicename"
Which device to send packets on. For network boot the default is
eth0. For serial boot it is ttyS0.
.IP "\fB\-\-file\fR \fIfilename\fR|\- \fIaddress\fR [\fIsize\fR]" 4
.IX Item "--file filename|- address [size]"
The file to load and the address to load it to. If file is loaded on
stdin, specify filename '\-' followed by a size. Size need only be
given in this case. You can load as many files as you want, each
specified with a \fB\-\-file\fR.
.IP "\fB\-\-flash\fR \fIram-source flash-offset size\fR" 4
.IX Item "--flash ram-source flash-offset size"
Copies the specified \s-1RAM\s0 area to the flash.
.IP "\fB\-\-getreg\fR \fIaddress\fR|\fIregname\fR" 4
.IX Item "--getreg address|regname"
Print value of memory location. Must be uncached address.
.IP "\fB\-\-help\fR" 4
.IX Item "--help"
Print the help information.
.IP "\fB\-\-images\fR" 4
.IX Item "--images"
Print information about the internal boot images, then exit.
.IP "\fB\-\-jump\fR \fIaddress\fR" 4
.IX Item "--jump address"
Jump to specified address.
.IP "\fB\-\-label\fR \fIlabel\fR" 4
.IX Item "--label label"
Define a label to be used as target by the \fB\-\-loop\fR command. This
command is only used by the \s-1SBL\s0 to calculate the address for the
\&\fB\-\-loop\fR and does not take up any space in the configuration packet.
.IP "\fB\-\-loop\fR \fIcheck-address label\fR" 4
.IX Item "--loop check-address label"
If the contents of check-address is nonzero it is decremented and the
command parser continues parsing at the label.
.Sp
If no external memory is initialized yet it can be convenient to use
an address in the area occupied by the configuration packet. Run
e100boot with \fB\-\-help\fR to see which addresses the commands are stored
at. The size of the commands are four bytes for each command plus four
bytes per argument to the command.
.IP "\fB\-\-memclear\fR \fIstart-address end-address\fR" 4
.IX Item "--memclear start-address end-address"
Clears the specified memory area.
.IP "\fB\-\-memdump\fR \fIstart-address end-address\fR" 4
.IX Item "--memdump start-address end-address"
Prints the contents of the specified memory area.
.IP "\fB\-\-memtest\fR \fIstart-address end-address\fR" 4
.IX Item "--memtest start-address end-address"
Does a fairly extensive test of the specified memory area. Not only
catches defect memories but also catches things like wrong memory
setups where memory addresses are mirrored onto each other.
.IP "\fB\-\-network\fR" 4
.IX Item "--network"
Perform a network boot.
.IP "\fB\-\-noleds\fR" 4
.IX Item "--noleds"
When using the internal images use a version that does not toggle
general port \s-1PA\s0 or \s-1PB\s0 in \s-1ETRAX\s0 during the boot procedure.
.IP "\fB\-\-pause\fR \fIiterations\fR" 4
.IX Item "--pause iterations"
How many \fIiterations\fR to do of an empty loop.
.IP "\fB\-\-serial\fR" 4
.IX Item "--serial"
Do a serial boot.
.IP "\fB\-\-setreg\fR \fIaddress\fR|\fIregname\fR \fIvalue\fR" 4
.IX Item "--setreg address|regname value"
Load dword to dword aligned memory location.
.IP "\fB\-\-testcard\fR" 4
.IX Item "--testcard"
Configures the memories for the \s-1ETRAX\s0 100 testcard.
.IP "\fB\-\-testcardlx\fR" 4
.IX Item "--testcardlx"
Configures the memories for the \s-1ETRAX100\s0 \s-1LX\s0 testcard.
.IP "\fB\-\-tofiles\fR" 4
.IX Item "--tofiles"
Write packets to files e100boot.seq[0..]. Does not transmit the data.
.IP "\fB\-\-verify\fR \fIaddress value\fR" 4
.IX Item "--verify address value"
Verify that memory contains dword. If not loader will stop. This is to
avoid booting the wrong unit. If you have the units ethernet address
in the flash memory you can check for that.
.IP "\fB\-\-5400\fR" 4
.IX Item "--5400"
Sets R_WAITSTATES, R_DRAM_TIMING and R_DRAM_CONFIG for the 5400
printserver.
.IP "\fB\-\-5600\fR" 4
.IX Item "--5600"
Sets R_WAITSTATES, R_DRAM_TIMING and R_DRAM_CONFIG for the 5600
printserver.
.SH "EXAMPLES"
.IX Header "EXAMPLES"
If you have a stripped binary (file.ima) linked to 0x08000000 that you want
to boot via the network, do this:
.PP
\&\fBe100boot \-\-file file.ima 88000000 \-\-jump 08000000\fR
.PP
Or something like this. Sets waitstates to zero and loads two files,
the first from stdin:
.PP
\&\fBcat file.ima | e100boot \-\-memtest 88000000 8801ffff \-\-memclear
88000000 8801ffff \-\-setreg b0000000 0 \-\-getreg b0000000 \-\-file \-
88000000 a000 \-\-file file2.ima 88010000 \-\-memdump 88000000 880000ff
\&\-\-jump 08000000\fR
.PP
Or this, enables 16 bit parallel port and flashes the led on \s-1PA0:\s0
.PP
\&\fBe100boot \-\-testcardlx \-\-setreg R_PORT_PA_SET 0x00000000 \-\-setreg
R_GEN_CONFIG 0x80000004 \-\-setreg R_PAR0_CONFIG 0x00000200 \-\-setreg
R_PORT_G_DATA 0x00000000 \-\-pause 0x02000000 \-\-setreg R_PORT_G_DATA
0xffffffff \-\-pause 0x02000000 \-\-setreg R_PORT_G_DATA 0x00000000 \-\-loop
0x38001e0b 0x38001e60\fR
.PP
Setup the memory, test the \s-1SRAM\s0, print the contents of the first 256
bytes of \s-1SRAM\s0, clear \s-1SRAM\s0, test the \s-1DRAM\s0, print R_DMA_CH0_CMD, load a
file to \s-1SRAM\s0, load another file to \s-1SRAM\s0, load file to \s-1DRAM\s0, jump to
code in \s-1SRAM\s0.
.PP
\&\fBe100boot \-\-setreg b0000000 1000 \-\-setreg b0000008 00006543 \-\-setreg
b000000c 12966060 \-\-memtest 88000000 80000 \-\-memdump 88000000 880000ff
\&\-\-memclear 88000000 80000 \-\-memtest c0000000 400000 \-\-getreg b00001d0
\&\-\-file file1.ima 88000000 \-\-file file2.ima 88010000 \-\-file file3.ima
c0000000 \-\-jump 88000000\fR
.PP
Boot Linux on the testcard.
.PP
\&\fBe100boot \-\-setreg b0000000 1000 \-\-setreg b0000008 6557 \-\-setreg
b000000c 1b988080 \-\-file timage c0000500 \-\-jump 40000500\fR
.PP
Booting over serial port and using labels to flash the leds on port
\&\s-1PA\s0.
.PP
\&\fBe100boot \-\-serial \-\-device /dev/ttyS1 \-\-baudrate 9600 \-\-label first
\&\-\-setreg 0x380020e0 00000001 \-\-setreg R_PORT_PA_SET 0x0000ff00 \-\-pause
0x02000000 \-\-setreg R_PORT_PA_SET 0x0000ffff \-\-pause 0x02000000 \-\-loop
0x380020e0 first\fR
.SH "BUGS"
.IX Header "BUGS"
You're kidding, right? Check \s-1AUTHOR\s0 below. The only thing
would be the hubris of the author, but that I consider a feature. If
you find any other 'features' report them to
technology@axis.com. Don't bother the author directly, he is busy
playing PlayStation2.
.SH "COPYING"
.IX Header "COPYING"
Copyright © 1996\-2002 Axis Communications \s-1AB\s0.
.SH "AUTHOR"
.IX Header "AUTHOR"
Written by Ronny Ranerup.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
The fine source, which you can get at http://developer.axis.com.

View File

@ -0,0 +1,395 @@
<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>e100boot - Network and serial port bootloader for the ETRAX100 CPU.</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:root@localhost" />
</head>
<body style="background-color: white">
<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->
<ul>
<li><a href="#name">NAME</a></li>
<li><a href="#synopsis">SYNOPSIS</a></li>
<li><a href="#description">DESCRIPTION</a></li>
<ul>
<li><a href="#debugging_printout">Debugging printout</a></li>
<li><a href="#creating_binaries">Creating binaries</a></li>
<li><a href="#how_it_works__things_you_don_t_want_to_know_">How it works, things you don't want to know.</a></li>
<li><a href="#compilation_and_code">Compilation and code</a></li>
</ul>
<li><a href="#options">OPTIONS</a></li>
<li><a href="#examples">EXAMPLES</a></li>
<li><a href="#bugs">BUGS</a></li>
<li><a href="#copying">COPYING</a></li>
<li><a href="#author">AUTHOR</a></li>
<li><a href="#see_also">SEE ALSO</a></li>
</ul>
<!-- INDEX END -->
<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>e100boot - Network and serial port bootloader for the ETRAX100 CPU.</p>
<p>
</p>
<hr />
<h1><a name="synopsis">SYNOPSIS</a></h1>
<p><strong>e100boot</strong> [<strong>--device</strong> <em>devicename</em>]
[<strong>--file</strong> <em>filename</em>|- <em>addr</em> [<em>size</em>]]
[<strong>--flash</strong> <em>ram-source</em> <em>flash-offset</em> <em>size</em>] [<strong>--pause</strong> <em>iter</em>]
[<strong>--memtest</strong> <em>addr</em> <em>addr</em>] [<strong>--memclear</strong> <em>addr</em> <em>addr</em>]
[<strong>--memdump</strong> <em>addr</em> <em>addr</em>] [<strong>--setreg</strong> <em>addr</em>|<em>regname</em> <em>val</em>]
[<strong>--getreg</strong> <em>addr</em>|<em>regname</em>] [<strong>--verify</strong> <em>addr</em> <em>val</em>]
[<strong>--label</strong> <em>label</em>] [<strong>--loop</strong> <em>addr</em> <em>label</em>] [<strong>--5400</strong>] [<strong>--5600</strong>]
[<strong>--testcard</strong>] [<strong>--devboard</strong>] [<strong>--testcardlx</strong>] [<strong>--network</strong>] [<strong>--serial</strong>]
[<strong>--baudrate</strong> <em>baudrate</em>] [<strong>--bootfile</strong> <em>file</em>] [<strong>--jump</strong> <em>addr</em>]
[<strong>--tofiles</strong>] [<strong>--cmdsonly</strong>] [<strong>--images</strong>] [<strong>--noleds</strong>] [<strong>--help</strong>]</p>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>This boot loader facilitates loading of files over the network or a
serial port to an ETRAX100. It can also be used for fairly extensive
hardware debugging as you can read and write to any memory addresses,
including the ETRAX100 registers. You can also perform memory checks
and dumps and copy data to flash memories.</p>
<p>The first packet (or the first 784 bytes in the case of serial boot)
sent to Etrax100 is loaded into the cache. The code in this packet is
executed and loads the rest of the boot loader into the cache. The
cache is the only thing we can be sure of exists on all ETRAX100
products, so the boot loader is limited to the size of the cache,
8KB. If further boot loading code is needed you have to set up
external memory and load another boot loader into it, but this is
rarely needed.</p>
<p>Two programs are involved in this boot loading, one is the program on
your workstation that sends the packets to ETRAX100, this is called
the server boot loader or SBL. The other program is the one in
ETRAX100 that receives packets from the SBL and acts upon the data
therein, this is called the client boot loader or CBL.</p>
<p>We don't want to edit and recompile the CBL each time we want to load
level two to different parts of memory, like we do on different
products. We also want to change things like the setup of external
memory before we load data into it. To make the boot loading as
flexible as possible and separate the CBL from level two we send a
configuration packet to it. After this packet we load other files, if
we want to.</p>
<p>The configuration packet can contain information to the CBL which lets
you: initialize external memory, read and write to all ETRAX100
registers, read and write to any part of memory, load as many other
files as you like to any part of memory you like, etc. The
configuration packet is generated on the fly by the SBL.</p>
<p>Since the CBL is unaware of which product it will be loaded on, it
doesn't do product specific initialization like setting up the
memory. This must be done with the configuration packet.</p>
<p>
</p>
<h2><a name="debugging_printout">Debugging printout</a></h2>
<p>When doing network boot the debugging printout from the CBL in ETRAX
is transmitted back over the network and printed by e100boot. When
doing serial boot that interface will be used. So in either case you
will not need any other software or hardware to receive the debugging
printout.</p>
<p>
</p>
<h2><a name="creating_binaries">Creating binaries</a></h2>
<p>The files containing code to be loaded on the ETRAX100 must be
stripped using the standard GCC binutils.</p>
<p>
</p>
<h2><a name="how_it_works__things_you_don_t_want_to_know_">How it works, things you don't want to know.</a></h2>
<p>ack, timeout bla, bla... RTFS.</p>
<p>
</p>
<h2><a name="compilation_and_code">Compilation and code</a></h2>
<p>Noteworthy is that two separate ETRAX100 binaries are created, one for
network boot and one for serial boot. They actually contain exactly
the same code, but linked in different order. This is because the code
to load the rest of the bootloader over a specific interface must be
contained in the first data sent to the ETRAX100 and it is too
difficult to cram the code for both interfaces in the beginning of the
same binary. Hence two files.</p>
<p>Other stuff you don't want to know is that the cache is mapped from
0x380000f0 to 0x380020f0. Code starts at the first address followed by
data up to the symbol <em>Ebss</em>. At the other end is the buffer for boot
commands (addresses defined by <em>IO_BUF_START</em> and <em>IO_BUF_END</em> below
which the stack lies and hopefully the stack and <em>Ebss</em> will never
meet...</p>
<p>The serial data is loaded from 0x380000f0 to 0x380003ff before
execution starts.</p>
<p>
</p>
<hr />
<h1><a name="options">OPTIONS</a></h1>
<p>The options are done in the order specified on the command line, so
you probably want to do any memory setup before loading a file to the
memory, and you probably do not want to perform a memory test after
you have loaded a file to that memory.</p>
<p>All addresses and sizes must be in hex with optional '0x' prefix, or a
ETRAX100 register name. Since the <strong>--setreg</strong> and <strong>--getreg</strong> options
only can be performed on dword aligned dwords only the registers that
conform to this can be named.</p>
<p>Note also that all addresses must be in uncached memory (bit 31 set),
as the bootloader lies in the cache. If you access any uncached
address during boot, the bootloader will be destroyed without warning.</p>
<p>It is also possible to specify an address as <em>+address</em>, in which
case it is considered to be relative to <em>IO_BUF_START</em>. This is
especially useful in combination with the <strong>--loop</strong> option below.</p>
<dl>
<dt><strong><a name="item__2d_2dbaudrate_baudrate"><strong>--baudrate</strong> <em>baudrate</em></a></strong>
<dd>
<p>Set baudrate for files loaded after the boot loader.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dbootfile_filename"><strong>--bootfile</strong> <em>filename</em></a></strong>
<dd>
<p>Which boot image to send to ETRAX instead of the default ones.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dcmdsonly"><strong>--cmdsonly</strong></a></strong>
<dd>
<p>Write the commands to file e100boot.cmds.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2ddevboard"><strong>--devboard</strong></a></strong>
<dd>
<p>Sets registers for the developer board.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2ddevice_devicename"><strong>--device</strong> <em>devicename</em></a></strong>
<dd>
<p>Which device to send packets on. For network boot the default is
eth0. For serial boot it is ttyS0.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dfile_filename_7c_2d_address__5bsize_5d"><strong>--file</strong> <em>filename</em>|- <em>address</em> [<em>size</em>]</a></strong>
<dd>
<p>The file to load and the address to load it to. If file is loaded on
stdin, specify filename '-' followed by a size. Size need only be
given in this case. You can load as many files as you want, each
specified with a <strong>--file</strong>.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dflash_ram_2dsource_flash_2doffset_size"><strong>--flash</strong> <em>ram-source flash-offset size</em></a></strong>
<dd>
<p>Copies the specified RAM area to the flash.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dgetreg_address_7cregname"><strong>--getreg</strong> <em>address</em>|<em>regname</em></a></strong>
<dd>
<p>Print value of memory location. Must be uncached address.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dhelp"><strong>--help</strong></a></strong>
<dd>
<p>Print the help information.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dimages"><strong>--images</strong></a></strong>
<dd>
<p>Print information about the internal boot images, then exit.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2djump_address"><strong>--jump</strong> <em>address</em></a></strong>
<dd>
<p>Jump to specified address.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dlabel_label"><strong>--label</strong> <em>label</em></a></strong>
<dd>
<p>Define a label to be used as target by the <strong>--loop</strong> command. This
command is only used by the SBL to calculate the address for the
<strong>--loop</strong> and does not take up any space in the configuration packet.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dloop_check_2daddress_label"><strong>--loop</strong> <em>check-address label</em></a></strong>
<dd>
<p>If the contents of check-address is nonzero it is decremented and the
command parser continues parsing at the label.</p>
</dd>
<dd>
<p>If no external memory is initialized yet it can be convenient to use
an address in the area occupied by the configuration packet. Run
e100boot with <strong>--help</strong> to see which addresses the commands are stored
at. The size of the commands are four bytes for each command plus four
bytes per argument to the command.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dmemclear_start_2daddress_end_2daddress"><strong>--memclear</strong> <em>start-address end-address</em></a></strong>
<dd>
<p>Clears the specified memory area.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dmemdump_start_2daddress_end_2daddress"><strong>--memdump</strong> <em>start-address end-address</em></a></strong>
<dd>
<p>Prints the contents of the specified memory area.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dmemtest_start_2daddress_end_2daddress"><strong>--memtest</strong> <em>start-address end-address</em></a></strong>
<dd>
<p>Does a fairly extensive test of the specified memory area. Not only
catches defect memories but also catches things like wrong memory
setups where memory addresses are mirrored onto each other.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dnetwork"><strong>--network</strong></a></strong>
<dd>
<p>Perform a network boot.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dnoleds"><strong>--noleds</strong></a></strong>
<dd>
<p>When using the internal images use a version that does not toggle
general port PA or PB in ETRAX during the boot procedure.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dpause_iterations"><strong>--pause</strong> <em>iterations</em></a></strong>
<dd>
<p>How many <em>iterations</em> to do of an empty loop.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dserial"><strong>--serial</strong></a></strong>
<dd>
<p>Do a serial boot.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dsetreg_address_7cregname_value"><strong>--setreg</strong> <em>address</em>|<em>regname</em> <em>value</em></a></strong>
<dd>
<p>Load dword to dword aligned memory location.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dtestcard"><strong>--testcard</strong></a></strong>
<dd>
<p>Configures the memories for the ETRAX 100 testcard.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dtestcardlx"><strong>--testcardlx</strong></a></strong>
<dd>
<p>Configures the memories for the ETRAX100 LX testcard.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dtofiles"><strong>--tofiles</strong></a></strong>
<dd>
<p>Write packets to files e100boot.seq[0..]. Does not transmit the data.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dverify_address_value"><strong>--verify</strong> <em>address value</em></a></strong>
<dd>
<p>Verify that memory contains dword. If not loader will stop. This is to
avoid booting the wrong unit. If you have the units ethernet address
in the flash memory you can check for that.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2d5400"><strong>--5400</strong></a></strong>
<dd>
<p>Sets R_WAITSTATES, R_DRAM_TIMING and R_DRAM_CONFIG for the 5400
printserver.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2d5600"><strong>--5600</strong></a></strong>
<dd>
<p>Sets R_WAITSTATES, R_DRAM_TIMING and R_DRAM_CONFIG for the 5600
printserver.</p>
</dd>
</li>
</dl>
<p>
</p>
<hr />
<h1><a name="examples">EXAMPLES</a></h1>
<p>If you have a stripped binary (file.ima) linked to 0x08000000 that you want
to boot via the network, do this:</p>
<p><strong>e100boot --file file.ima 88000000 --jump 08000000</strong></p>
<p>Or something like this. Sets waitstates to zero and loads two files,
the first from stdin:</p>
<p><strong>cat file.ima | e100boot --memtest 88000000 8801ffff --memclear
88000000 8801ffff --setreg b0000000 0 --getreg b0000000 --file -
88000000 a000 --file file2.ima 88010000 --memdump 88000000 880000ff
--jump 08000000</strong></p>
<p>Or this, enables 16 bit parallel port and flashes the led on PA0:</p>
<p><strong>e100boot --testcardlx --setreg R_PORT_PA_SET 0x00000000 --setreg
R_GEN_CONFIG 0x80000004 --setreg R_PAR0_CONFIG 0x00000200 --setreg
R_PORT_G_DATA 0x00000000 --pause 0x02000000 --setreg R_PORT_G_DATA
0xffffffff --pause 0x02000000 --setreg R_PORT_G_DATA 0x00000000 --loop
0x38001e0b 0x38001e60</strong></p>
<p>Setup the memory, test the SRAM, print the contents of the first 256
bytes of SRAM, clear SRAM, test the DRAM, print R_DMA_CH0_CMD, load a
file to SRAM, load another file to SRAM, load file to DRAM, jump to
code in SRAM.</p>
<p><strong>e100boot --setreg b0000000 1000 --setreg b0000008 00006543 --setreg
b000000c 12966060 --memtest 88000000 80000 --memdump 88000000 880000ff
--memclear 88000000 80000 --memtest c0000000 400000 --getreg b00001d0
--file file1.ima 88000000 --file file2.ima 88010000 --file file3.ima
c0000000 --jump 88000000</strong></p>
<p>Boot Linux on the testcard.</p>
<p><strong>e100boot --setreg b0000000 1000 --setreg b0000008 6557 --setreg
b000000c 1b988080 --file timage c0000500 --jump 40000500</strong></p>
<p>Booting over serial port and using labels to flash the leds on port
PA.</p>
<p><strong>e100boot --serial --device /dev/ttyS1 --baudrate 9600 --label first
--setreg 0x380020e0 00000001 --setreg R_PORT_PA_SET 0x0000ff00 --pause
0x02000000 --setreg R_PORT_PA_SET 0x0000ffff --pause 0x02000000 --loop
0x380020e0 first</strong></p>
<p>
</p>
<hr />
<h1><a name="bugs">BUGS</a></h1>
<p>You're kidding, right? Check <a href="#author">AUTHOR</a> below. The only thing
would be the hubris of the author, but that I consider a feature. If
you find any other 'features' report them to
<a href="mailto:technology@axis.com.">technology@axis.com.</a> Don't bother the author directly, he is busy
playing PlayStation2.</p>
<p>
</p>
<hr />
<h1><a name="copying">COPYING</a></h1>
<p>Copyright © 1996-2002 Axis Communications AB.</p>
<p>
</p>
<hr />
<h1><a name="author">AUTHOR</a></h1>
<p>Written by Ronny Ranerup.</p>
<p>
</p>
<hr />
<h1><a name="see_also">SEE ALSO</a></h1>
<p>The fine source, which you can get at <a href="http://developer.axis.com.">http://developer.axis.com.</a></p>
</body>
</html>

View File

@ -0,0 +1,314 @@
=head1 NAME
e100boot - Network and serial port bootloader for the ETRAX100 CPU.
=head1 SYNOPSIS
B<e100boot> [B<--device> I<devicename>]
[B<--file> I<filename>|- I<addr> [I<size>]]
[B<--flash> I<ram-source> I<flash-offset> I<size>] [B<--pause> I<iter>]
[B<--memtest> I<addr> I<addr>] [B<--memclear> I<addr> I<addr>]
[B<--memdump> I<addr> I<addr>] [B<--setreg> I<addr>|I<regname> I<val>]
[B<--getreg> I<addr>|I<regname>] [B<--verify> I<addr> I<val>]
[B<--label> I<label>] [B<--loop> I<addr> I<label>] [B<--5400>] [B<--5600>]
[B<--testcard>] [B<--devboard>] [B<--testcardlx>] [B<--network>] [B<--serial>]
[B<--baudrate> I<baudrate>] [B<--bootfile> I<file>] [B<--jump> I<addr>]
[B<--tofiles>] [B<--cmdsonly>] [B<--images>] [B<--noleds>] [B<--help>]
=head1 DESCRIPTION
This boot loader facilitates loading of files over the network or a
serial port to an ETRAX100. It can also be used for fairly extensive
hardware debugging as you can read and write to any memory addresses,
including the ETRAX100 registers. You can also perform memory checks
and dumps and copy data to flash memories.
The first packet (or the first 784 bytes in the case of serial boot)
sent to Etrax100 is loaded into the cache. The code in this packet is
executed and loads the rest of the boot loader into the cache. The
cache is the only thing we can be sure of exists on all ETRAX100
products, so the boot loader is limited to the size of the cache,
8KB. If further boot loading code is needed you have to set up
external memory and load another boot loader into it, but this is
rarely needed.
Two programs are involved in this boot loading, one is the program on
your workstation that sends the packets to ETRAX100, this is called
the server boot loader or SBL. The other program is the one in
ETRAX100 that receives packets from the SBL and acts upon the data
therein, this is called the client boot loader or CBL.
We don't want to edit and recompile the CBL each time we want to load
level two to different parts of memory, like we do on different
products. We also want to change things like the setup of external
memory before we load data into it. To make the boot loading as
flexible as possible and separate the CBL from level two we send a
configuration packet to it. After this packet we load other files, if
we want to.
The configuration packet can contain information to the CBL which lets
you: initialize external memory, read and write to all ETRAX100
registers, read and write to any part of memory, load as many other
files as you like to any part of memory you like, etc. The
configuration packet is generated on the fly by the SBL.
Since the CBL is unaware of which product it will be loaded on, it
doesn't do product specific initialization like setting up the
memory. This must be done with the configuration packet.
=head2 Debugging printout
When doing network boot the debugging printout from the CBL in ETRAX
is transmitted back over the network and printed by e100boot. When
doing serial boot that interface will be used. So in either case you
will not need any other software or hardware to receive the debugging
printout.
=head2 Creating binaries
The files containing code to be loaded on the ETRAX100 must be
stripped using the standard GCC binutils.
=head2 How it works, things you don't want to know.
ack, timeout bla, bla... RTFS.
=head2 Compilation and code
Noteworthy is that two separate ETRAX100 binaries are created, one for
network boot and one for serial boot. They actually contain exactly
the same code, but linked in different order. This is because the code
to load the rest of the bootloader over a specific interface must be
contained in the first data sent to the ETRAX100 and it is too
difficult to cram the code for both interfaces in the beginning of the
same binary. Hence two files.
Other stuff you don't want to know is that the cache is mapped from
0x380000f0 to 0x380020f0. Code starts at the first address followed by
data up to the symbol I<Ebss>. At the other end is the buffer for boot
commands (addresses defined by I<IO_BUF_START> and I<IO_BUF_END> below
which the stack lies and hopefully the stack and I<Ebss> will never
meet...
The serial data is loaded from 0x380000f0 to 0x380003ff before
execution starts.
=head1 OPTIONS
The options are done in the order specified on the command line, so
you probably want to do any memory setup before loading a file to the
memory, and you probably do not want to perform a memory test after
you have loaded a file to that memory.
All addresses and sizes must be in hex with optional '0x' prefix, or a
ETRAX100 register name. Since the B<--setreg> and B<--getreg> options
only can be performed on dword aligned dwords only the registers that
conform to this can be named.
Note also that all addresses must be in uncached memory (bit 31 set),
as the bootloader lies in the cache. If you access any uncached
address during boot, the bootloader will be destroyed without warning.
It is also possible to specify an address as I<+address>, in which
case it is considered to be relative to I<IO_BUF_START>. This is
especially useful in combination with the B<--loop> option below.
=over 4
=item B<--baudrate> I<baudrate>
Set baudrate for files loaded after the boot loader.
=item B<--bootfile> I<filename>
Which boot image to send to ETRAX instead of the default ones.
=item B<--cmdsonly>
Write the commands to file e100boot.cmds.
=item B<--devboard>
Sets registers for the developer board.
=item B<--device> I<devicename>
Which device to send packets on. For network boot the default is
eth0. For serial boot it is ttyS0.
=item B<--file> I<filename>|- I<address> [I<size>]
The file to load and the address to load it to. If file is loaded on
stdin, specify filename '-' followed by a size. Size need only be
given in this case. You can load as many files as you want, each
specified with a B<--file>.
=item B<--flash> I<ram-source flash-offset size>
Copies the specified RAM area to the flash.
=item B<--getreg> I<address>|I<regname>
Print value of memory location. Must be uncached address.
=item B<--help>
Print the help information.
=item B<--images>
Print information about the internal boot images, then exit.
=item B<--jump> I<address>
Jump to specified address.
=item B<--label> I<label>
Define a label to be used as target by the B<--loop> command. This
command is only used by the SBL to calculate the address for the
B<--loop> and does not take up any space in the configuration packet.
=item B<--loop> I<check-address label>
If the contents of check-address is nonzero it is decremented and the
command parser continues parsing at the label.
If no external memory is initialized yet it can be convenient to use
an address in the area occupied by the configuration packet. Run
e100boot with B<--help> to see which addresses the commands are stored
at. The size of the commands are four bytes for each command plus four
bytes per argument to the command.
=item B<--memclear> I<start-address end-address>
Clears the specified memory area.
=item B<--memdump> I<start-address end-address>
Prints the contents of the specified memory area.
=item B<--memtest> I<start-address end-address>
Does a fairly extensive test of the specified memory area. Not only
catches defect memories but also catches things like wrong memory
setups where memory addresses are mirrored onto each other.
=item B<--network>
Perform a network boot.
=item B<--noleds>
When using the internal images use a version that does not toggle
general port PA or PB in ETRAX during the boot procedure.
=item B<--pause> I<iterations>
How many I<iterations> to do of an empty loop.
=item B<--serial>
Do a serial boot.
=item B<--setreg> I<address>|I<regname> I<value>
Load dword to dword aligned memory location.
=item B<--testcard>
Configures the memories for the ETRAX 100 testcard.
=item B<--testcardlx>
Configures the memories for the ETRAX100 LX testcard.
=item B<--tofiles>
Write packets to files e100boot.seq[0..]. Does not transmit the data.
=item B<--verify> I<address value>
Verify that memory contains dword. If not loader will stop. This is to
avoid booting the wrong unit. If you have the units ethernet address
in the flash memory you can check for that.
=item B<--5400>
Sets R_WAITSTATES, R_DRAM_TIMING and R_DRAM_CONFIG for the 5400
printserver.
=item B<--5600>
Sets R_WAITSTATES, R_DRAM_TIMING and R_DRAM_CONFIG for the 5600
printserver.
=back
=head1 EXAMPLES
If you have a stripped binary (file.ima) linked to 0x08000000 that you want
to boot via the network, do this:
B<e100boot --file file.ima 88000000 --jump 08000000>
Or something like this. Sets waitstates to zero and loads two files,
the first from stdin:
B<cat file.ima | e100boot --memtest 88000000 8801ffff --memclear
88000000 8801ffff --setreg b0000000 0 --getreg b0000000 --file -
88000000 a000 --file file2.ima 88010000 --memdump 88000000 880000ff
--jump 08000000>
Or this, enables 16 bit parallel port and flashes the led on PA0:
B<e100boot --testcardlx --setreg R_PORT_PA_SET 0x00000000 --setreg
R_GEN_CONFIG 0x80000004 --setreg R_PAR0_CONFIG 0x00000200 --setreg
R_PORT_G_DATA 0x00000000 --pause 0x02000000 --setreg R_PORT_G_DATA
0xffffffff --pause 0x02000000 --setreg R_PORT_G_DATA 0x00000000 --loop
0x38001e0b 0x38001e60>
Setup the memory, test the SRAM, print the contents of the first 256
bytes of SRAM, clear SRAM, test the DRAM, print R_DMA_CH0_CMD, load a
file to SRAM, load another file to SRAM, load file to DRAM, jump to
code in SRAM.
B<e100boot --setreg b0000000 1000 --setreg b0000008 00006543 --setreg
b000000c 12966060 --memtest 88000000 80000 --memdump 88000000 880000ff
--memclear 88000000 80000 --memtest c0000000 400000 --getreg b00001d0
--file file1.ima 88000000 --file file2.ima 88010000 --file file3.ima
c0000000 --jump 88000000>
Boot Linux on the testcard.
B<e100boot --setreg b0000000 1000 --setreg b0000008 6557 --setreg
b000000c 1b988080 --file timage c0000500 --jump 40000500>
Booting over serial port and using labels to flash the leds on port
PA.
B<e100boot --serial --device /dev/ttyS1 --baudrate 9600 --label first
--setreg 0x380020e0 00000001 --setreg R_PORT_PA_SET 0x0000ff00 --pause
0x02000000 --setreg R_PORT_PA_SET 0x0000ffff --pause 0x02000000 --loop
0x380020e0 first>
=head1 BUGS
You're kidding, right? Check L<AUTHOR|"AUTHOR"> below. The only thing
would be the hubris of the author, but that I consider a feature. If
you find any other 'features' report them to
technology@axis.com. Don't bother the author directly, he is busy
playing PlayStation2.
=head1 COPYING
Copyright © 1996-2002 Axis Communications AB.
=head1 AUTHOR
Written by Ronny Ranerup.
=head1 SEE ALSO
The fine source, which you can get at http://developer.axis.com.

View File

@ -0,0 +1,2 @@
.

View File

@ -0,0 +1,2 @@
.

View File

@ -0,0 +1,267 @@
@(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/CHANGES,v 1.1 1999/08/26 10:05:17 johana Exp $ (LBL)
v0.4 Sat Jul 25 12:40:09 PDT 1998
- Fix endian problem with DLT_NULL devices. From FreeBSD via Bill
Fenner (fenner@parc.xerox.com)
- Fix alignment problem with FDDI under DLPI. This was causing core
dumps under Solaris.
- Added configure options to disable flex and bison. Resulted from a
bug report by barnett@grymoire.crd.ge.com (Bruce Barnett). Also added
options to disable gcc and to force a particular packet capture type.
- Added support for Fore ATM interfaces (qaa and fa) under IRIX. Thanks
to John Hawkinson (jhawk@mit.edu)
- Change Linux PPP and SLIP to use DLT_RAW since the kernel does not
supply any "link layer" data.
- Change Linux to use SIOCGIFHWADDR ioctl to determine link layer type.
Thanks to Thomas Sailer (sailer@ife.ee.ethz.ch)
- Change IRIX PPP to use DLT_RAW since the kernel does not supply any
"link layer" data.
- Modified to support the new BSD/OS 2.1 PPP and SLIP link layer header
formats.
- Added some new SGI snoop interface types. Thanks to Steve Alexander
(sca@refugee.engr.sgi.com)
- Fixes for HP-UX 10.20 (which is similar to HP-UX 9). Thanks to
Richard Allen (ra@hp.is) and Steinar Haug (sthaug@nethelp.no)
- Fddi supports broadcast as reported by Jeff Macdonald
(jeff@iacnet.com). Also correct ieee802 and arcnet.
- Determine Linux pcap buffer size at run time or else it might not be
big enough for some interface types (e.g. FDDI). Thanks to Jes
Sorensen (Jes.Sorensen@cern.ch)
- Fix some linux alignment problems.
- Document promisc argument to pcap_open_live(). Reported by Ian Marsh
(ianm@sics.se)
- Support Metricom radio packets under Linux. Thanks to Kevin Lai
(laik@gunpowder.stanford.edu)
- Bind to interface name under Linux to avoid packets from multiple
interfaces on multi-homed hosts. Thanks to Kevin Lai
(laik@gunpowder.stanford.edu)
- Change L_SET to SEEK_SET for HP-UX. Thanks to Roland Roberts
(rroberts@muller.com)
- Fixed an uninitialized memory reference found by Kent Vander Velden
(graphix@iastate.edu)
- Fixed lex pattern for IDs to allow leading digits. As reported by
Theo de Raadt (deraadt@cvs.openbsd.org)
- Fixed Linux include file problems when using GNU libc.
- Ifdef ARPHRD_FDDI since not all versions of the Linux kernel have it.
Reported reported by Eric Jacksch (jacksch@tenebris.ca)
- Fixed bug in pcap_dispatch() that kept it from returning on packet
timeouts.
- Changed ISLOOPBACK() macro when IFF_LOOPBACK isn't available to check
for "lo" followed by an eos or digit (newer versions of Linux
apparently call the loopback "lo" instead of "lo0").
- Fixed Linux networking include files to use ints instead of longs to
avoid problems with 64 bit longs on the alpha. Thanks to Cristian
Gafton (gafton@redhat.com)
v0.3 Sat Nov 30 20:56:27 PST 1996
- Added Linux support.
- Fixed savefile bugs.
- Solaris x86 fix from Tim Rylance (t.rylance@elsevier.nl)
- Add support for bpf kernel port filters.
- Remove duplicate atalk protocol table entry. Thanks to Christian
Hopps (chopps@water.emich.edu)
- Fixed pcap_lookupdev() to ignore nonexistent devices. This was
reported to happen under BSD/OS by David Vincenzetti
(vince@cryptonet.it)
- Avoid solaris compiler warnings. Thanks to Bruce Barnett
(barnett@grymoire.crd.ge.com)
v0.2.1 Sun Jul 14 03:02:26 PDT 1996
- Fixes for HP-UX 10. Thanks in part to to Thomas Wolfram
(wolf@prz.tu-berlin.de) and Rick Jones (raj@hpisrdq.cup.hp.com)
- Added support for SINIX. Thanks to Andrej Borsenkow
(borsenkow.msk@sni.de)
- Fixes for AIX (although this system is not yet supported). Thanks to
John Hawkinson (jhawk@mit.edu)
- Use autoconf's idea of the top level directory in install targets.
Thanks to John Hawkinson.
- Add missing autoconf packet capture result message. Thanks to Bill
Fenner (fenner@parc.xerox.com)
- Fixed padding problems in the pf module.
- Fixed some more alignment problems on the alpha.
- Added explicit netmask support. Thanks to Steve Nuchia
(steve@research.oknet.com)
- Fixed to handle raw ip addresses such as 0.0.0.1 without "left
justifing"
- Add "sca" keyword (for DEC cluster services) as suggested by Terry
Kennedy (terry@spcvxa.spc.edu)
- Add "atalk" keyword as suggested by John Hawkinson.
- Add "igrp" keyword.
- Fixed HID definition in grammar.y to be a string, not a value.
- Use $CC when checking gcc version. Thanks to Carl Lindberg
(carl_lindberg@blacksmith.com)
- Removed obsolete reference to pcap_immediate() from the man page.
Michael Stolarchuk (mts@terminator.rs.itd.umich.edu)
- DLT_NULL has a 4 byte family header. Thanks to Jeffrey Honig
(jch@bsdi.com)
v0.2 Sun Jun 23 02:28:42 PDT 1996
- Add support for HP-UX. Resulted from code contributed by Tom Murray
(tmurray@hpindck.cup.hp.com) and Philippe-Andri Prindeville
(philipp@res.enst.fr)
- Update INSTALL with a reminder to install include files. Thanks to
Mark Andrews (mandrews@aw.sgi.com)
- Fix bpf compiler alignment bug on the alpha.
- Use autoconf to detect architectures that can't handle misaligned
accesses.
- Added loopback support for snoop. Resulted from report Steve
Alexander (sca@engr.sgi.com)
v0.1 Fri Apr 28 18:11:03 PDT 1995
- Fixed compiler and optimizer bugs. The BPF filter engine uses unsigned
comparison operators, while the code generator and optimizer assumed
signed semantics in several places. Thanks to Charlie Slater
(cslater@imatek.com) for pointing this out.
- Removed FDDI ifdef's, they aren't really needed. Resulted from report
by Gary Veum (veum@boa.gsfc.nasa.gov).
- Add pcap-null.c which allows offline use of libpcap on systems that
don't support live package capture. This feature resulting from a
request from Jan van Oorschot (j.p.m.voorschot@et.tudelft.nl).
- Make bpf_compile() reentrant. Fix thanks to Pascal Hennequin
(Pascal.Hennequin@hugo.int-evry.fr).
- Port to GNU autoconf.
- Fix pcap-dlpi.c to work with isdn. Resulted from report by Flemming
Johansen (fsj@csd.cri.dk).
- Handle multi-digit interface unit numbers (aka ppa's) under dlpi.
Resulted from report by Daniel Ehrlich (ehrlich@cse.psu.edu).
- Fix pcap-dlpi.c to work in non-promiscuous mode. Resulted from report
by Jeff Murphy (jcmurphy@acsu.buffalo.edu).
- Add support for "long jumps". Thanks to Jeffrey Mogul
(mogul@pa.dec.com).
- Fix minor problems when compiling with BDEBUG as noticed by Scott
Bertilson (scott@unet.umn.edu).
- Declare sys_errlist "const char *const" to avoid problems under
FreeBSD. Resulted from report by jher@eden.com.
v0.0.6 Fri Apr 28 04:07:13 PDT 1995
- Add missing variable declaration missing from 0.0.6
v0.0.5 Fri Apr 28 00:22:21 PDT 1995
- Workaround for problems when pcap_read() returns 0 due to the timeout
expiring.
v0.0.4 Thu Apr 20 20:41:48 PDT 1995
- Change configuration to not use gcc v2 flags with gcc v1.
- Fixed a bug in pcap_next(); if pcap_dispatch() returns 0, pcap_next()
should also return 0. Thanks to Richard Stevens (rstevens@noao.edu).
- Fixed configure to test for snoop before dlpi to avoid problems under
IRIX 5. Thanks to J. Eric Townsend (jet@abulafia.genmagic.com).
- Hack around deficiency in Ultrix's make.
- Fix two bugs related to the Solaris pre-5.3.2 bufmod bug; handle
savefiles that have more than snapshot bytes of data in them (so we
can read old savefiles) and avoid writing such files.
- Added checkioctl which is used with gcc to check that the
"fixincludes" script has been run.
v0.0.3 Tue Oct 18 18:13:46 PDT 1994
- Fixed configure to test for snoop before dlpi to avoid problems under
IRIX 5. Thanks to J. Eric Townsend (jet@abulafia.genmagic.com).
v0.0.2 Wed Oct 12 20:56:37 PDT 1994
- Implement timeout in the dlpi pcap_open_live(). Thanks to Richard
Stevens.
- Determine pcap link type from dlpi media type. Resulted from report
by Mahesh Jethanandani (mahesh@npix.com).
v0.0.1 Fri Jun 24 14:50:57 PDT 1994
- Fixed bug in nit_setflags() in pcap-snit.c. The streams ioctl timeout
wasn't being initialized sometimes resulting in an "NIOCSFLAGS:
Invalid argument" error under OSF/1. Reported by Matt Day
(mday@artisoft.com) and Danny Mitzel (dmitzel@whitney.hitc.com).
- Turn on FDDI support by default.
v0.0 Mon Jun 20 19:20:16 PDT 1994
- Initial release.
- Fixed bug with greater/less keywords, reported by Mark Andrews
(mandrews@alias.com).
- Fix bug where '|' was defined as BPF_AND instead of BPF_OR, reported
by Elan Amir (elan@leeb.cs.berkeley.edu).
- Machines with little-endian byte ordering are supported thanks to
Jeff Mogul.
- Add hack for version 2.3 savefiles which don't have caplen and len
swapped thanks to Vern Paxson.
- Added "&&" and "||" aliases for "and" and "or" thanks to Vern Paxson.
- Added length, inbound and outbound keywords.

View File

@ -0,0 +1,50 @@
CHANGES
FILES
INSTALL
Makefile.in
README
SUNOS4
VERSION
aclocal.m4
bpf/net/bpf.h
bpf/net/bpf_filter.c
bpf_image.c
config.guess
config.sub
configure
configure.in
etherent.c
ethertype.h
gencode.c
gencode.h
grammar.y
inet.c
install-sh
lbl/gnuc.h
lbl/os-solaris2.h
lbl/os-sunos4.h
lbl/os-ultrix4.h
linux-include/netinet/if_ether.h
linux-include/netinet/ip_var.h
mkdep
nametoaddr.c
optimize.c
pcap-bpf.c
pcap-dlpi.c
pcap-enet.c
pcap-int.h
pcap-linux.c
pcap-namedb.h
pcap-nit.c
pcap-nit.h
pcap-null.c
pcap-pf.c
pcap-pf.h
pcap-snit.c
pcap-snoop.c
pcap.3
pcap.c
pcap.h
ppp.h
savefile.c
scanner.l

View File

@ -0,0 +1,328 @@
@(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/INSTALL,v 1.1 1999/08/26 10:05:18 johana Exp $ (LBL)
To build libpcap, first customize any paths in Makefile.in, then run
"./configure" (a shell script). The configure script will determine
your system attributes and generate an appropriate Makefile from
Makefile.in. Next run "make". If everything goes well you can su to
root and run "make install", "make install-incl" and "make
install-man". However, you need not install libpcap if you just want to
build tcpdump; just make sure the tcpdump and libpcap directory trees
have the same parent directory.
If configure says:
configure: warning: cannot determine packet capture interface
configure: warning: (see INSTALL for more info)
then your system either does not support packet capture or your system
does support packet capture but libpcap does not support that
particular type. (If you have HP-UX, see below.) If your system uses a
packet capture not supported by libpcap, please send us patches; don't
forget to include an autoconf fragment suitable for use in
configure.in.
It is possible to override the default packet capture type, although
the circumstance where this works are limited. For example if you have
installed bpf under SunOS 4 and wish to build a snit libpcap:
./configure --with-pcap=snit
Another example is to force a supported packet capture type in the case
where the configure scripts fails to detect it.
You will need an ANSI C compiler to build libpcap. The configure script
will abort if your compiler is not ANSI compliant. If this happens, use
the GNU C compiler, available via anonymous ftp:
ftp://prep.ai.mit.edu/pub/gnu/gcc-*.tar.gz
Note well: If you use gcc, you may need to run its "fixincludes"
script. Running fixincludes is not required with later versions of gcc
and in some cases (e.g. Solaris 2.5) causes problems when run. The
configure script will abort with:
checking for ANSI ioctl definitions... yes
configure: error: see the INSTALL for more info
if it detects if the fixincludes needs to be run. If the fixincludes
test in configure passes, you're probably ok.
If you use flex, you must use version 2.4.6 or higher. The configure
script automatically detects the version of flex and will not use it
unless it is new enough. You can use "flex -V" to see what version you
have (unless it's really old). The current version of flex is available
via anonymous ftp:
ftp://ftp.ee.lbl.gov/flex-*.tar.Z
As of this writing, the current version is 2.5.4.
If you use bison, you must use flex (and visa versa). The configure
script automatically falls back to lex and yacc if both flex and bison
are not found.
Sometimes the stock C compiler does not interact well with flex and
bison. The list of problems includes undefined references for alloca.
You can get around this by installing gcc or manually disabling flex
and bison with:
./configure --without-flex --without-bison
If your system only has AT&T lex, this is okay unless your libpcap
program uses other lex/yacc generated code. (Although it's possible to
map the yy* identifiers with a script, we use flex and bison so we
don't feel this is necessary.)
Some systems support the Berkeley Packet Filter natively; for example
out of the box OSF and BSD/OS have bpf. If your system does not support
bpf, you will need to pick up:
ftp://ftp.ee.lbl.gov/bpf-*.tar.Z
Note well: you MUST have kernel source for your operating system in
order to install bpf. An exception is SunOS 4; the bpf distribution
includes replacement kernel objects for some of the standard SunOS 4
network device drivers. See the bpf INSTALL document for more
information.
If you use Solaris, there is a bug with bufmod(7) that is fixed in
Solaris 2.3.2 (aka SunOS 5.3.2). Setting a snapshot length with the
broken bufmod(7) results in data be truncated from the FRONT of the
packet instead of the end. The work around is to not set a snapshot
length but this results in performance problems since the entire packet
is copied to user space. If you must run an older version of Solaris,
there is a patch available from Sun; ask for bugid 1149065. After
installing the patch, use "setenv BUFMOD_FIXED" to enable use of
bufmod(7). However, we recommend you run a more current release of
Solaris.
If you use the SPARCompiler, you must be careful to not use the
/usr/ucb/cc interface. If you do, you will get bogus warnings and
perhaps errors. Either make sure your path has /opt/SUNWspro/bin
before /usr/ucb or else:
setenv CC /opt/SUNWspro/bin/cc
before running configure. (You might have to do a "make distclean"
if you already ran configure once).
Also note that "make depend" won't work; while all of the known
universe uses -M, the SPARCompiler uses -xM to generate makefile
dependencies.
If you are trying to do packet capture with a FORE ATM card, you may or
may not be able to. They usually only release their driver in object
code so unless their driver supports packet capture, there's not much
libpcap can do.
If you get an error like:
tcpdump: recv_ack: bind error 0x???
when using DLPI, look for the DL_ERROR_ACK error return values, usually
in /usr/include/sys/dlpi.h, and find the corresponding value.
Under OSF, packet capture must be enabled before it can be used. For
instructions on how to enable packet filter support, see:
ftp://ftp.digital.com/pub/Digital/dec-faq/Digital-UNIX
Once you enable packet filter support, your OSF system will support bpf
natively.
Under Ultrix, packet capture must be enabled before it can be used. For
instructions on how to enable packet filter support, see:
ftp://ftp.digital.com/pub/Digital/dec-faq/ultrix
If you use HP-UX, you must have at least version 9 and either the
version of cc that supports ANSI C (cc -Aa) or else use the GNU C
compiler. You must also buy the optional streams package. If you don't
have:
/usr/include/sys/dlpi.h
/usr/include/sys/dlpi_ext.h
then you don't have the streams package. In addition, we believe you
need to install the "9.X LAN and DLPI drivers cumulative" patch
(PHNE_6855) to make the version 9 DLPI work with libpcap.
It's been reported that the DLPI streams package is standard starting
with HP-UX 10.
The HP implementation of DLPI is a little bit eccentric. Unlike
Solaris, you must attach /dev/dlpi instead of the specific /dev/*
network pseudo device entry in order to capture packets. The ppa is
based on the ifnet "index" number. Under HP-UX 9, it is necessary to
read /dev/kmem and the kernel symbol file (/hp-ux). Under HP-UX 10,
dlpi can provide information for determining the ppa. It does not seem
to be possible to trace the loopback interface. Unlike other DLPI
implementations, PHYS implies MULTI and SAP and you get an error if you
try to enable more than one promiscous more than one promiscuous mode
at a time. Finally, testing shows that there can't be more than one
simultaneous dlpi user per network interface and you cannot capture
outbound packets.
If you use Linux, this version of libpcap is known to compile and run
under Red Hat 4.0 with the 2.0.25 kernel. It may work with earlier 2.X
versions but is guaranteed not to work with 1.X kernels. Running more
than one libpcap program at a time can cause problems since promiscuous
mode is implemented by twiddlin the interface flags from the libpcap
application. Also, packet timestamps aren't very good. This appears to
be due to haphazard handling of the timestamp in the kernel.
Note well: there is rumoured to be a version of tcpdump floating around
called 3.0.3 that includes libpcap and is supposed to support Linux.
You should be advised that the Network Research Group at LBNL never
generated a release with this version number. We note with interest
that a standard cracker trick to get people to install trojans is to
distribute bogus packages that have a version number higher than the
current release. We also note with annoyance that 90% of the Linux
related bug reports we get are due to changes made to unofficial
versions of our page. If you are having trouble but aren't using a
version that came from ftp.ee.lbl.gov, please try that before
submitting a bug report!
If you use AIX, you may not be able to build libpcap from this release.
Although AIX 4 ships with tcpdump, it is an old version that predates
libpcap. We do not have an AIX system in house so it's impossible for
us to test AIX patches submitted to us. We are told that you must link
against /lib/pse.exp, that you must use AIX cc or a GNU C compiler
newer than 2.7.2 and that you may need to run strload before running a
libpcap application. Also, it may be necessary to run the configure
script as root in order for it to detect that bpf is available. Another
workaround is to use:
./configure --with-pcap=bpf
If you use NeXTSTEP, you will not be able to build libpcap from this
release. We hope to support this operating system in some future
release of libpcap.
If you use SINIX, you should be able to build libpcap from this
release. It is known to compile and run on SINIX-Y/N 5.42 with the C-DS
V1.0 or V1.1 compiler. But note that in some releases of SINIX, yacc
emits incorrect code; if grammar.y fails to compile, change every
occurence of:
#ifdef YYDEBUG
to:
#if YYDEBUG
Another workaround is to use flex and bison.
If you use SCO, you might have trouble building libpcap from this
release. We do not have a machine running SCO and have not had reports
of anyone successfully building on it. Since SCO apparently supports
dlpi, it's possible the current version works. Meanwhile, sco provides
a tcpdump binary as part of their "Network/Security Tools" package:
http://www.sco.com/technology/internet/goodies/#SECURITY
There is also a README that explains how to enable packet capture.
If you use UnixWare, you will not be able to build libpcap from this
release. We hope to support this operating system in some future
release of libpcap. Meanwhile, there appears to be an UnixWare port of
libpcap 0.0 (and tcpdump 3.0) in:
ftp://ftp1.freebird.org/pub/mirror/freebird/internet/systools/
UnixWare appears to use a hacked version of DLPI.
If linking tcpdump fails with "Undefined: _alloca" when using bison on
a Sun4, your version of bison is broken. In any case version 1.16 or
higher is recommended (1.14 is known to cause problems 1.16 is known to
work). Either pick up a current version from:
ftp://prep.ai.mit.edu/pub/gnu/bison.tar.gz
or hack around it by inserting the lines:
#ifdef __GNUC__
#define alloca __builtin_alloca
#else
#ifdef sparc
#include <alloca.h>
#else
char *alloca ();
#endif
#endif
right after the (100 line!) GNU license comment in bison.simple, remove
grammar.[co] and fire up make again.
If you use SunOS 4, your kernel must support streams NIT. If you run a
libpcap program and it dies with:
/dev/nit: No such device
You must add streams NIT support to your kernel configuration, run
config and boot the new kernel.
If you are running a version of SunOS earlier than 4.1, you will need
to replace the Sun supplied /sys/sun{3,4,4c}/OBJ/nit_if.o with the
appropriate version from this distribution's SUNOS4 subdirectory and
build a new kernel:
nit_if.o.sun3-sunos4 (any flavor of sun3)
nit_if.o.sun4c-sunos4.0.3c (SS1, SS1+, IPC, SLC, etc.)
nit_if.o.sun4-sunos4 (Sun4's not covered by
nit_if.o.sun4c-sunos4.0.3c)
These nit replacements fix a bug that makes nit essentially unusable in
pre-SunOS 4.1. In addition, our sun4c-sunos4.0.3c nit gives you
timestamps to the resolution of the SS-1 clock (1 us) rather than the
lousy 20ms timestamps Sun gives you (tcpdump will print out the full
timestamp resolution if it finds it's running on a SS-1).
FILES
-----
CHANGES - description of differences between releases
FILES - list of files exported as part of the distribution
INSTALL - this file
Makefile.in - compilation rules (input to the configure script)
README - description of distribution
SUNOS4 - pre-SunOS 4.1 replacement kernel nit modules
VERSION - version of this release
aclocal.m4 - autoconf macros
bpf/net - copies of bpf_filter.c and bpf.h
bpf_filter.c - symlink to bpf/net/bpf_filter.c
bpf_image.c - bpf disassembly routine
config.guess - autoconf support
config.sub - autoconf support
configure - configure script (run this first)
configure.in - configure script source
etherent.c - /etc/ethers support routines
ethertype.h - ethernet protocol types and names definitions
gencode.c - bpf code generation routines
gencode.h - bpf code generation definitions
grammar.y - filter string grammar
inet.c - network routines
install-sh - BSD style install script
lbl/gnuc.h - gcc macros and defines
lbl/os-*.h - os dependent defines and prototypes
linux-include/* - network include files missing on Linux
mkdep - construct Makefile dependency list
nametoaddr.c - hostname to address routines
net - symlink to bpf/net
optimize.c - bpf optimization routines
pcap-bpf.c - BSD Packet Filter support
pcap-dlpi.c - Data Link Provider Interface support
pcap-enet.c - enet support
pcap-int.h - internal libpcap definitions
pcap-namedb.h - public libpcap name database definitions
pcap-nit.c - Network Interface Tap support
pcap-nit.h - Network Interface Tap definitions
pcap-null.c - dummy monitor support (allows offline use of libpcap)
pcap-pf.c - Packet Filter support
pcap-pf.h - Packet Filter definitions
pcap-snit.c - Streams based Network Interface Tap support
pcap-snoop.c - Snoop network monitoring support
pcap.3 - manual entry
pcap.c - pcap utility routines
pcap.h - public libpcap definitions
ppp.h - Point to Point Protocol definitions
savefile.c - offline support
scanner.l - filter string scanner

View File

@ -0,0 +1,173 @@
# Generated automatically from Makefile.in by configure.
# $Id: Makefile.in,v 1.7 2002/09/18 15:29:46 pkj Exp $
# Copyright (c) 1993, 1994, 1995, 1996
# The Regents of the University of California. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that: (1) source code distributions
# retain the above copyright notice and this paragraph in its entirety, (2)
# distributions including binary code include the above copyright notice and
# this paragraph in its entirety in the documentation or other materials
# provided with the distribution, and (3) all advertising materials mentioning
# features or use of this software display the following acknowledgement:
# ``This product includes software developed by the University of California,
# Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
# the University nor the names of its contributors may be used to endorse
# or promote products derived from this software without specific prior
# written permission.
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# @(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/Makefile.in,v 1.7 2002/09/18 15:29:46 pkj Exp $ (LBL)
#
# Various configurable paths (remember to edit Makefile.in, not Makefile)
#
# Top level hierarchy
prefix = /usr/local
exec_prefix = ${prefix}
# Pathname of directory to install the include files
INCLDEST = ${prefix}/include
# Pathname of directory to install the library
LIBDEST = ${exec_prefix}/lib
# Pathname of directory to install the man page
MANDEST = ${prefix}/man
# VPATH
srcdir = .
#
# You shouldn't need to edit anything below.
#
CFLAGS =
CC = gcc
AR = ar
INSTALL = install_elinux -p
RANLIB = ranlib
prefix =
AXIS_USABLE_LIBS = UCLIBC GLIBC
-include $(AXIS_TOP_DIR)/tools/build/Rules.axis
ifndef AXIS_BUILDTYPE
prefix = /usr/local
endif
CCOPT = -O2
INCLS = -I. -Ilinux-include
DEFS = -DHAVE_MALLOC_H=1 -DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_NET_IF_ARP_H=1
# Standard CFLAGS
CFLAGS += $(CCOPT) $(INCLS) $(DEFS)
#
# Flex and bison allow you to specify the prefixes of the global symbols
# used by the generated parser. This allows programs to use lex/yacc
# and link against libpcap. If you don't have flex or bison, get them.
#
LEX = flex -Ppcap_
YACC = bison -y -p pcap_
# Explicitly define compilation rule since SunOS 4's make doesn't like gcc.
# Also, gcc does not remove the .o before forking 'as', which can be a
# problem if you don't own the file but can write to the directory.
.c.o:
@rm -f $@
$(CC) $(CFLAGS) -c $(srcdir)/$*.c
PSRC = pcap-linux.c
CSRC = pcap.c inet.c gencode.c optimize.c nametoaddr.c \
etherent.c savefile.c bpf_filter.c bpf_image.c
GENSRC = scanner.c grammar.c version.c
SRC = $(PSRC) $(CSRC) $(GENSRC)
# We would like to say "OBJ = $(SRC:.c=.o)" but Ultrix's make cannot
# hack the extra indirection
OBJ = $(PSRC:.c=.o) $(CSRC:.c=.o) $(GENSRC:.c=.o)
HDR = pcap.h pcap-int.h pcap-namedb.h pcap-nit.h pcap-pf.h \
ethertype.h gencode.h gnuc.h
GENHDR = \
tokdefs.h
TAGHDR = \
bpf/net/bpf.h
TAGFILES = \
$(SRC) $(HDR) $(TAGHDR)
CLEANFILES = $(OBJ) libpcap.a $(GENSRC) $(GENHDR) lex.yy.c
all: libpcap.a
libpcap.a: $(OBJ)
@rm -f $@
$(AR) rc $@ $(OBJ)
$(RANLIB) $@
scanner.c: $(srcdir)/scanner.l
@rm -f $@
$(LEX) -t $< > $$$$.$@; mv $$$$.$@ $@
scanner.o: scanner.c tokdefs.h
tokdefs.h: grammar.c
grammar.c: $(srcdir)/grammar.y
@rm -f grammar.c tokdefs.h
$(YACC) -d $<
mv y.tab.c grammar.c
mv y.tab.h tokdefs.h
grammar.o: grammar.c
@rm -f $@
$(CC) $(CFLAGS) -Dyylval=pcap_lval -c grammar.c
version.o: version.c
version.c: $(srcdir)/VERSION
@rm -f $@
sed -e 's/.*/char pcap_version[] = "&";/' $(srcdir)/VERSION > $@
install: force
$(INSTALL) -m 444 -o bin -g bin libpcap.a $(DESTDIR)$(LIBDEST)/libpcap.a
$(RANLIB) $(DESTDIR)$(LIBDEST)/libpcap.a
install-incl: force
$(INSTALL) -m 444 -o bin -g bin $(srcdir)/pcap.h \
$(DESTDIR)$(INCLDEST)/pcap.h
$(INSTALL) -m 444 -o bin -g bin $(srcdir)/pcap-namedb.h \
$(DESTDIR)$(INCLDEST)/pcap-namedb.h
$(INSTALL) -m 444 -o bin -g bin $(srcdir)/net/bpf.h \
$(DESTDIR)$(INCLDEST)/net/bpf.h
install-man: force
$(INSTALL) -m 444 -o bin -g bin $(srcdir)/pcap.3 \
$(DESTDIR)$(MANDEST)/man3/pcap.3
clean:
rm -f $(CLEANFILES)
distclean:
rm -f $(CLEANFILES) Makefile config.cache config.log config.status \
gnuc.h os-proto.h bpf_filter.c net
tags: $(TAGFILES)
ctags -wtd $(TAGFILES)
tar: force
@cwd=`pwd` ; dir=`basename $$cwd` ; name=libpcap-`cat VERSION` ; \
list="" ; tar="tar chFFf" ; \
for i in `cat FILES` ; do list="$$list $$name/$$i" ; done; \
echo \
"rm -f ../$$name; ln -s $$dir ../$$name" ; \
rm -f ../$$name; ln -s $$dir ../$$name ; \
echo \
"(cd .. ; $$tar - [lots of files]) | compress > /tmp/$$name.tar.Z" ; \
(cd .. ; $$tar - $$list) | compress > /tmp/$$name.tar.Z ; \
echo \
"rm -f ../$$name" ; \
rm -f ../$$name
force: /tmp
depend: $(GENSRC) force
./mkdep -c $(CC) $(DEFS) $(INCLS) $(SRC)

View File

@ -0,0 +1,2 @@
conf:
./configure

View File

@ -0,0 +1,173 @@
# $Id: Makefile.in,v 1.7 2002/09/18 15:29:46 pkj Exp $
# Copyright (c) 1993, 1994, 1995, 1996
# The Regents of the University of California. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that: (1) source code distributions
# retain the above copyright notice and this paragraph in its entirety, (2)
# distributions including binary code include the above copyright notice and
# this paragraph in its entirety in the documentation or other materials
# provided with the distribution, and (3) all advertising materials mentioning
# features or use of this software display the following acknowledgement:
# ``This product includes software developed by the University of California,
# Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
# the University nor the names of its contributors may be used to endorse
# or promote products derived from this software without specific prior
# written permission.
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# @(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/Makefile.in,v 1.7 2002/09/18 15:29:46 pkj Exp $ (LBL)
#
# Various configurable paths (remember to edit Makefile.in, not Makefile)
#
# Top level hierarchy
prefix = @prefix@
exec_prefix = @exec_prefix@
# Pathname of directory to install the include files
INCLDEST = @includedir@
# Pathname of directory to install the library
LIBDEST = @libdir@
# Pathname of directory to install the man page
MANDEST = @mandir@
# VPATH
srcdir = @srcdir@
VPATH = @srcdir@
#
# You shouldn't need to edit anything below.
#
CFLAGS =
CC = @CC@
AR = ar
INSTALL = @INSTALL@
RANLIB = @V_RANLIB@
prefix =
AXIS_USABLE_LIBS = UCLIBC GLIBC
-include $(AXIS_TOP_DIR)/tools/build/Rules.axis
ifndef AXIS_BUILDTYPE
prefix = @prefix@
endif
CCOPT = @V_CCOPT@
INCLS = -I. @V_INCLS@
DEFS = @DEFS@
# Standard CFLAGS
CFLAGS += $(CCOPT) $(INCLS) $(DEFS)
#
# Flex and bison allow you to specify the prefixes of the global symbols
# used by the generated parser. This allows programs to use lex/yacc
# and link against libpcap. If you don't have flex or bison, get them.
#
LEX = @V_LEX@
YACC = @V_YACC@
# Explicitly define compilation rule since SunOS 4's make doesn't like gcc.
# Also, gcc does not remove the .o before forking 'as', which can be a
# problem if you don't own the file but can write to the directory.
.c.o:
@rm -f $@
$(CC) $(CFLAGS) -c $(srcdir)/$*.c
PSRC = pcap-@V_PCAP@.c
CSRC = pcap.c inet.c gencode.c optimize.c nametoaddr.c \
etherent.c savefile.c bpf_filter.c bpf_image.c
GENSRC = scanner.c grammar.c version.c
SRC = $(PSRC) $(CSRC) $(GENSRC)
# We would like to say "OBJ = $(SRC:.c=.o)" but Ultrix's make cannot
# hack the extra indirection
OBJ = $(PSRC:.c=.o) $(CSRC:.c=.o) $(GENSRC:.c=.o)
HDR = pcap.h pcap-int.h pcap-namedb.h pcap-nit.h pcap-pf.h \
ethertype.h gencode.h gnuc.h
GENHDR = \
tokdefs.h
TAGHDR = \
bpf/net/bpf.h
TAGFILES = \
$(SRC) $(HDR) $(TAGHDR)
CLEANFILES = $(OBJ) libpcap.a $(GENSRC) $(GENHDR) lex.yy.c
all: libpcap.a
libpcap.a: $(OBJ)
@rm -f $@
$(AR) rc $@ $(OBJ)
$(RANLIB) $@
scanner.c: $(srcdir)/scanner.l
@rm -f $@
$(LEX) -t $< > $$$$.$@; mv $$$$.$@ $@
scanner.o: scanner.c tokdefs.h
tokdefs.h: grammar.c
grammar.c: $(srcdir)/grammar.y
@rm -f grammar.c tokdefs.h
$(YACC) -d $<
mv y.tab.c grammar.c
mv y.tab.h tokdefs.h
grammar.o: grammar.c
@rm -f $@
$(CC) $(CFLAGS) -Dyylval=pcap_lval -c grammar.c
version.o: version.c
version.c: $(srcdir)/VERSION
@rm -f $@
sed -e 's/.*/char pcap_version[] = "&";/' $(srcdir)/VERSION > $@
install: force
$(INSTALL) -m 444 -o bin -g bin libpcap.a $(DESTDIR)$(LIBDEST)/libpcap.a
$(RANLIB) $(DESTDIR)$(LIBDEST)/libpcap.a
install-incl: force
$(INSTALL) -m 444 -o bin -g bin $(srcdir)/pcap.h \
$(DESTDIR)$(INCLDEST)/pcap.h
$(INSTALL) -m 444 -o bin -g bin $(srcdir)/pcap-namedb.h \
$(DESTDIR)$(INCLDEST)/pcap-namedb.h
$(INSTALL) -m 444 -o bin -g bin $(srcdir)/net/bpf.h \
$(DESTDIR)$(INCLDEST)/net/bpf.h
install-man: force
$(INSTALL) -m 444 -o bin -g bin $(srcdir)/pcap.3 \
$(DESTDIR)$(MANDEST)/man3/pcap.3
clean:
rm -f $(CLEANFILES)
distclean:
rm -f $(CLEANFILES) Makefile config.cache config.log config.status \
gnuc.h os-proto.h bpf_filter.c net
tags: $(TAGFILES)
ctags -wtd $(TAGFILES)
tar: force
@cwd=`pwd` ; dir=`basename $$cwd` ; name=libpcap-`cat VERSION` ; \
list="" ; tar="tar chFFf" ; \
for i in `cat FILES` ; do list="$$list $$name/$$i" ; done; \
echo \
"rm -f ../$$name; ln -s $$dir ../$$name" ; \
rm -f ../$$name; ln -s $$dir ../$$name ; \
echo \
"(cd .. ; $$tar - [lots of files]) | compress > /tmp/$$name.tar.Z" ; \
(cd .. ; $$tar - $$list) | compress > /tmp/$$name.tar.Z ; \
echo \
"rm -f ../$$name" ; \
rm -f ../$$name
force: /tmp
depend: $(GENSRC) force
./mkdep -c $(CC) $(DEFS) $(INCLS) $(SRC)

View File

@ -0,0 +1,49 @@
@(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/README,v 1.1 1999/08/26 10:05:19 johana Exp $ (LBL)
LIBPCAP 0.4
Lawrence Berkeley National Laboratory
Network Research Group
libpcap@ee.lbl.gov
ftp://ftp.ee.lbl.gov/libpcap.tar.Z
This directory contains source code for libpcap, a system-independent
interface for user-level packet capture. libpcap provides a portable
framework for low-level network monitoring. Applications include
network statistics collection, security monitoring, network debugging,
etc. Since almost every system vendor provides a different interface
for packet capture, and since we've developed several tools that
require this functionality, we've created this system-independent API
to ease in porting and to alleviate the need for several
system-dependent packet capture modules in each application.
Note well: this interface is new and is likely to change.
The libpcap interface supports a filtering mechanism based on the
architecture in the BSD packet filter. BPF is described in the 1993
Winter Usenix paper ``The BSD Packet Filter: A New Architecture for
User-level Packet Capture''. A compressed postscript version is in:
ftp://ftp.ee.lbl.gov/papers/bpf-usenix93.ps.Z.
Although most packet capture interfaces support in-kernel filtering,
libpcap utilizes in-kernel filtering only for the BPF interface.
On systems that don't have BPF, all packets are read into user-space
and the BPF filters are evaluated in the libpcap library, incurring
added overhead (especially, for selective filters). Ideally, libpcap
would translate BPF filters into a filter program that is compatible
with the underlying kernel subsystem, but this is not yet implemented.
BPF is standard in 4.4BSD, BSD/386, NetBSD, and FreeBSD. DEC OSF/1
uses the packetfilter interface but has been extended to accept BPF
filters (which libpcap utilizes). Also, you can add BPF filter support
to Ultrix using the kernel source and/or object patches available in:
ftp://gatekeeper.dec.com/pub/DEC/net/bpfext42.tar.Z.
Problems, bugs, questions, desirable enhancements, source code
contributions, etc., should be sent to the email address
"libpcap@ee.lbl.gov".
- Steve McCanne
Craig Leres
Van Jacobson

View File

@ -0,0 +1 @@
0.4

View File

@ -0,0 +1,706 @@
dnl @(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/aclocal.m4,v 1.1 1999/08/26 10:05:19 johana Exp $ (LBL)
dnl
dnl Copyright (c) 1995, 1996, 1997, 1998
dnl The Regents of the University of California. All rights reserved.
dnl
dnl Redistribution and use in source and binary forms, with or without
dnl modification, are permitted provided that: (1) source code distributions
dnl retain the above copyright notice and this paragraph in its entirety, (2)
dnl distributions including binary code include the above copyright notice and
dnl this paragraph in its entirety in the documentation or other materials
dnl provided with the distribution, and (3) all advertising materials mentioning
dnl features or use of this software display the following acknowledgement:
dnl ``This product includes software developed by the University of California,
dnl Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
dnl the University nor the names of its contributors may be used to endorse
dnl or promote products derived from this software without specific prior
dnl written permission.
dnl THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
dnl WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
dnl
dnl LBL autoconf macros
dnl
dnl
dnl Determine which compiler we're using (cc or gcc)
dnl If using gcc, determine the version number
dnl If using cc, require that it support ansi prototypes
dnl If using gcc, use -O2 (otherwise use -O)
dnl If using cc, explicitly specify /usr/local/include
dnl
dnl usage:
dnl
dnl AC_LBL_C_INIT(copt, incls)
dnl
dnl results:
dnl
dnl $1 (copt set)
dnl $2 (incls set)
dnl CC
dnl LDFLAGS
dnl ac_cv_lbl_gcc_vers
dnl LBL_CFLAGS
dnl
AC_DEFUN(AC_LBL_C_INIT,
[AC_PREREQ(2.12)
AC_BEFORE([$0], [AC_PROG_CC])
AC_BEFORE([$0], [AC_LBL_FIXINCLUDES])
AC_BEFORE([$0], [AC_LBL_DEVEL])
AC_ARG_WITH(gcc, [ --without-gcc don't use gcc])
$1="-O"
$2=""
if test "${srcdir}" != "." ; then
$2="-I\$\(srcdir\)"
fi
if test "${CFLAGS+set}" = set; then
LBL_CFLAGS="$CFLAGS"
fi
if test -z "$CC" ; then
case "$target_os" in
bsdi*)
AC_CHECK_PROG(SHLICC2, shlicc2, yes, no)
if test $SHLICC2 = yes ; then
CC=shlicc2
export CC
fi
;;
esac
fi
if test -z "$CC" -a "$with_gcc" = no ; then
CC=cc
export CC
fi
AC_PROG_CC
if test "$GCC" = yes ; then
if test "$SHLICC2" = yes ; then
ac_cv_lbl_gcc_vers=2
$1="-O2"
else
AC_MSG_CHECKING(gcc version)
AC_CACHE_VAL(ac_cv_lbl_gcc_vers,
ac_cv_lbl_gcc_vers=`$CC -v 2>&1 | \
sed -e '/^gcc version /!d' \
-e 's/^gcc version //' \
-e 's/ .*//' -e 's/^[[[^0-9]]]*//' \
-e 's/\..*//'`)
AC_MSG_RESULT($ac_cv_lbl_gcc_vers)
if test $ac_cv_lbl_gcc_vers -gt 1 ; then
$1="-O2"
fi
fi
else
AC_MSG_CHECKING(that $CC handles ansi prototypes)
AC_CACHE_VAL(ac_cv_lbl_cc_ansi_prototypes,
AC_TRY_COMPILE(
[#include <sys/types.h>],
[int frob(int, char *)],
ac_cv_lbl_cc_ansi_prototypes=yes,
ac_cv_lbl_cc_ansi_prototypes=no))
AC_MSG_RESULT($ac_cv_lbl_cc_ansi_prototypes)
if test $ac_cv_lbl_cc_ansi_prototypes = no ; then
case "$target_os" in
hpux*)
AC_MSG_CHECKING(for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE))
savedcflags="$CFLAGS"
CFLAGS="-Aa -D_HPUX_SOURCE $CFLAGS"
AC_CACHE_VAL(ac_cv_lbl_cc_hpux_cc_aa,
AC_TRY_COMPILE(
[#include <sys/types.h>],
[int frob(int, char *)],
ac_cv_lbl_cc_hpux_cc_aa=yes,
ac_cv_lbl_cc_hpux_cc_aa=no))
AC_MSG_RESULT($ac_cv_lbl_cc_hpux_cc_aa)
if test $ac_cv_lbl_cc_hpux_cc_aa = no ; then
AC_MSG_ERROR(see the INSTALL doc for more info)
fi
CFLAGS="$savedcflags"
V_CCOPT="-Aa $V_CCOPT"
AC_DEFINE(_HPUX_SOURCE)
;;
*)
AC_MSG_ERROR(see the INSTALL doc for more info)
;;
esac
fi
$2="$$2 -I/usr/local/include"
LDFLAGS="$LDFLAGS -L/usr/local/lib"
case "$target_os" in
irix*)
V_CCOPT="$V_CCOPT -xansi -signed -g3"
;;
osf*)
V_CCOPT="$V_CCOPT -std1 -g3"
;;
ultrix*)
AC_MSG_CHECKING(that Ultrix $CC hacks const in prototypes)
AC_CACHE_VAL(ac_cv_lbl_cc_const_proto,
AC_TRY_COMPILE(
[#include <sys/types.h>],
[struct a { int b; };
void c(const struct a *)],
ac_cv_lbl_cc_const_proto=yes,
ac_cv_lbl_cc_const_proto=no))
AC_MSG_RESULT($ac_cv_lbl_cc_const_proto)
if test $ac_cv_lbl_cc_const_proto = no ; then
AC_DEFINE(const,)
fi
;;
esac
fi
])
dnl
dnl Use pfopen.c if available and pfopen() not in standard libraries
dnl Require libpcap
dnl Look for libpcap in ..
dnl Use the installed libpcap if there is no local version
dnl
dnl usage:
dnl
dnl AC_LBL_LIBPCAP(pcapdep, incls)
dnl
dnl results:
dnl
dnl $1 (pcapdep set)
dnl $2 (incls appended)
dnl LIBS
dnl LBL_LIBS
dnl
AC_DEFUN(AC_LBL_LIBPCAP,
[AC_REQUIRE([AC_LBL_LIBRARY_NET])
dnl
dnl save a copy before locating libpcap.a
dnl
LBL_LIBS="$LIBS"
pfopen=/usr/examples/packetfilter/pfopen.c
if test -f $pfopen ; then
AC_CHECK_FUNCS(pfopen)
if test $ac_cv_func_pfopen = "no" ; then
AC_MSG_RESULT(Using $pfopen)
LIBS="$LIBS $pfopen"
fi
fi
AC_MSG_CHECKING(for local pcap library)
libpcap=FAIL
lastdir=FAIL
places=`ls .. | sed -e 's,/$,,' -e 's,^,../,' | \
egrep '/libpcap-[[0-9]]*\.[[0-9]]*(\.[[0-9]]*)?([[ab]][[0-9]]*)?$'`
for dir in $places ../libpcap libpcap ; do
basedir=`echo $dir | sed -e 's/[[ab]][[0-9]]*$//'`
if test $lastdir = $basedir ; then
dnl skip alphas when an actual release is present
continue;
fi
lastdir=$dir
if test -r $dir/pcap.c ; then
libpcap=$dir/libpcap.a
d=$dir
dnl continue and select the last one that exists
fi
done
if test $libpcap = FAIL ; then
AC_MSG_RESULT(not found)
AC_CHECK_LIB(pcap, main, libpcap="-lpcap")
if test $libpcap = FAIL ; then
AC_MSG_ERROR(see the INSTALL doc for more info)
fi
else
$1=$libpcap
$2="-I$d $$2"
AC_MSG_RESULT($libpcap)
fi
LIBS="$libpcap $LIBS"
case "$target_os" in
aix*)
pseexe="/lib/pse.exp"
AC_MSG_CHECKING(for $pseexe)
if test -f $pseexe ; then
AC_MSG_RESULT(yes)
LIBS="$LIBS -I:$pseexe"
fi
;;
esac])
dnl
dnl Define RETSIGTYPE and RETSIGVAL
dnl
dnl usage:
dnl
dnl AC_LBL_TYPE_SIGNAL
dnl
dnl results:
dnl
dnl RETSIGTYPE (defined)
dnl RETSIGVAL (defined)
dnl
AC_DEFUN(AC_LBL_TYPE_SIGNAL,
[AC_BEFORE([$0], [AC_LBL_LIBPCAP])
AC_TYPE_SIGNAL
if test "$ac_cv_type_signal" = void ; then
AC_DEFINE(RETSIGVAL,)
else
AC_DEFINE(RETSIGVAL,(0))
fi
case "$target_os" in
irix*)
AC_DEFINE(_BSD_SIGNALS)
;;
*)
dnl prefer sigset() to sigaction()
AC_CHECK_FUNCS(sigset)
if test $ac_cv_func_sigset = no ; then
AC_CHECK_FUNCS(sigaction)
fi
;;
esac])
dnl
dnl If using gcc, make sure we have ANSI ioctl definitions
dnl
dnl usage:
dnl
dnl AC_LBL_FIXINCLUDES
dnl
AC_DEFUN(AC_LBL_FIXINCLUDES,
[if test "$GCC" = yes ; then
AC_MSG_CHECKING(for ANSI ioctl definitions)
AC_CACHE_VAL(ac_cv_lbl_gcc_fixincludes,
AC_TRY_COMPILE(
[/*
* This generates a "duplicate case value" when fixincludes
* has not be run.
*/
# include <sys/types.h>
# include <sys/time.h>
# include <sys/ioctl.h>
# ifdef HAVE_SYS_IOCCOM_H
# include <sys/ioccom.h>
# endif],
[switch (0) {
case _IO('A', 1):;
case _IO('B', 1):;
}],
ac_cv_lbl_gcc_fixincludes=yes,
ac_cv_lbl_gcc_fixincludes=no))
AC_MSG_RESULT($ac_cv_lbl_gcc_fixincludes)
if test $ac_cv_lbl_gcc_fixincludes = no ; then
# Don't cache failure
unset ac_cv_lbl_gcc_fixincludes
AC_MSG_ERROR(see the INSTALL for more info)
fi
fi])
dnl
dnl Check for flex, default to lex
dnl Require flex 2.4 or higher
dnl Check for bison, default to yacc
dnl Default to lex/yacc if both flex and bison are not available
dnl Define the yy prefix string if using flex and bison
dnl
dnl usage:
dnl
dnl AC_LBL_LEX_AND_YACC(lex, yacc, yyprefix)
dnl
dnl results:
dnl
dnl $1 (lex set)
dnl $2 (yacc appended)
dnl $3 (optional flex and bison -P prefix)
dnl
AC_DEFUN(AC_LBL_LEX_AND_YACC,
[AC_ARG_WITH(flex, [ --without-flex don't use flex])
AC_ARG_WITH(bison, [ --without-bison don't use bison])
if test "$with_flex" = no ; then
$1=lex
else
AC_CHECK_PROGS($1, flex, lex)
fi
if test "$$1" = flex ; then
# The -V flag was added in 2.4
AC_MSG_CHECKING(for flex 2.4 or higher)
AC_CACHE_VAL(ac_cv_lbl_flex_v24,
if flex -V >/dev/null 2>&1; then
ac_cv_lbl_flex_v24=yes
else
ac_cv_lbl_flex_v24=no
fi)
AC_MSG_RESULT($ac_cv_lbl_flex_v24)
if test $ac_cv_lbl_flex_v24 = no ; then
s="2.4 or higher required"
AC_MSG_WARN(ignoring obsolete flex executable ($s))
$1=lex
fi
fi
if test "$with_bison" = no ; then
$2=yacc
else
AC_CHECK_PROGS($2, bison, yacc)
fi
if test "$$2" = bison ; then
$2="$$2 -y"
fi
if test "$$1" != lex -a "$$2" = yacc -o "$$1" = lex -a "$$2" != yacc ; then
AC_MSG_WARN(don't have both flex and bison; reverting to lex/yacc)
$1=lex
$2=yacc
fi
if test "$$1" = flex -a -n "$3" ; then
$1="$$1 -P$3"
$2="$$2 -p $3"
fi])
dnl
dnl Checks to see if union wait is used with WEXITSTATUS()
dnl
dnl usage:
dnl
dnl AC_LBL_UNION_WAIT
dnl
dnl results:
dnl
dnl DECLWAITSTATUS (defined)
dnl
AC_DEFUN(AC_LBL_UNION_WAIT,
[AC_MSG_CHECKING(if union wait is used)
AC_CACHE_VAL(ac_cv_lbl_union_wait,
AC_TRY_COMPILE([
# include <sys/types.h>
# include <sys/wait.h>],
[int status;
u_int i = WEXITSTATUS(status);
u_int j = waitpid(0, &status, 0);],
ac_cv_lbl_union_wait=no,
ac_cv_lbl_union_wait=yes))
AC_MSG_RESULT($ac_cv_lbl_union_wait)
if test $ac_cv_lbl_union_wait = yes ; then
AC_DEFINE(DECLWAITSTATUS,union wait)
else
AC_DEFINE(DECLWAITSTATUS,int)
fi])
dnl
dnl Checks to see if the sockaddr struct has the 4.4 BSD sa_len member
dnl
dnl usage:
dnl
dnl AC_LBL_SOCKADDR_SA_LEN
dnl
dnl results:
dnl
dnl HAVE_SOCKADDR_SA_LEN (defined)
dnl
AC_DEFUN(AC_LBL_SOCKADDR_SA_LEN,
[AC_MSG_CHECKING(if sockaddr struct has sa_len member)
AC_CACHE_VAL(ac_cv_lbl_sockaddr_has_sa_len,
AC_TRY_COMPILE([
# include <sys/types.h>
# include <sys/socket.h>],
[u_int i = sizeof(((struct sockaddr *)0)->sa_len)],
ac_cv_lbl_sockaddr_has_sa_len=yes,
ac_cv_lbl_sockaddr_has_sa_len=no))
AC_MSG_RESULT($ac_cv_lbl_sockaddr_has_sa_len)
if test $ac_cv_lbl_sockaddr_has_sa_len = yes ; then
AC_DEFINE(HAVE_SOCKADDR_SA_LEN)
fi])
dnl
dnl Checks to see if -R is used
dnl
dnl usage:
dnl
dnl AC_LBL_HAVE_RUN_PATH
dnl
dnl results:
dnl
dnl ac_cv_lbl_have_run_path (yes or no)
dnl
AC_DEFUN(AC_LBL_HAVE_RUN_PATH,
[AC_MSG_CHECKING(for ${CC-cc} -R)
AC_CACHE_VAL(ac_cv_lbl_have_run_path,
[echo 'main(){}' > conftest.c
${CC-cc} -o conftest conftest.c -R/a1/b2/c3 >conftest.out 2>&1
if test ! -s conftest.out ; then
ac_cv_lbl_have_run_path=yes
else
ac_cv_lbl_have_run_path=no
fi
rm -f conftest*])
AC_MSG_RESULT($ac_cv_lbl_have_run_path)
])
dnl
dnl Due to the stupid way it's implemented, AC_CHECK_TYPE is nearly useless.
dnl
dnl usage:
dnl
dnl AC_LBL_CHECK_TYPE
dnl
dnl results:
dnl
dnl int32_t (defined)
dnl u_int32_t (defined)
dnl
AC_DEFUN(AC_LBL_CHECK_TYPE,
[AC_MSG_CHECKING(for $1 using $CC)
AC_CACHE_VAL(ac_cv_lbl_have_$1,
AC_TRY_COMPILE([
# include "confdefs.h"
# include <sys/types.h>
# if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
# endif],
[$1 i],
ac_cv_lbl_have_$1=yes,
ac_cv_lbl_have_$1=no))
AC_MSG_RESULT($ac_cv_lbl_have_$1)
if test $ac_cv_lbl_have_$1 = no ; then
AC_DEFINE($1, $2)
fi])
dnl
dnl Checks to see if unaligned memory accesses fail
dnl
dnl usage:
dnl
dnl AC_LBL_UNALIGNED_ACCESS
dnl
dnl results:
dnl
dnl LBL_ALIGN (DEFINED)
dnl
AC_DEFUN(AC_LBL_UNALIGNED_ACCESS,
[AC_MSG_CHECKING(if unaligned accesses fail)
AC_CACHE_VAL(ac_cv_lbl_unaligned_fail,
[case "$target_cpu" in
alpha|hp*|mips|sparc)
ac_cv_lbl_unaligned_fail=yes
;;
*)
cat >conftest.c <<EOF
# include <sys/types.h>
# include <sys/wait.h>
# include <stdio.h>
unsigned char a[[5]] = { 1, 2, 3, 4, 5 };
main() {
unsigned int i;
pid_t pid;
int status;
/* avoid "core dumped" message */
pid = fork();
if (pid < 0)
exit(2);
if (pid > 0) {
/* parent */
pid = waitpid(pid, &status, 0);
if (pid < 0)
exit(3);
exit(!WIFEXITED(status));
}
/* child */
i = *(unsigned int *)&a[[1]];
printf("%d\n", i);
exit(0);
}
EOF
${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS \
conftest.c $LIBS >/dev/null 2>&1
if test ! -x conftest ; then
dnl failed to compile for some reason
ac_cv_lbl_unaligned_fail=yes
else
./conftest >conftest.out
if test ! -s conftest.out ; then
ac_cv_lbl_unaligned_fail=yes
else
ac_cv_lbl_unaligned_fail=no
fi
fi
rm -f conftest* core core.conftest
;;
esac])
AC_MSG_RESULT($ac_cv_lbl_unaligned_fail)
if test $ac_cv_lbl_unaligned_fail = yes ; then
AC_DEFINE(LBL_ALIGN)
fi])
dnl
dnl If using gcc and the file .devel exists:
dnl Compile with -g (if supported) and -Wall
dnl If using gcc 2, do extra prototype checking
dnl If an os prototype include exists, symlink os-proto.h to it
dnl
dnl usage:
dnl
dnl AC_LBL_DEVEL(copt)
dnl
dnl results:
dnl
dnl $1 (copt appended)
dnl HAVE_OS_PROTO_H (defined)
dnl os-proto.h (symlinked)
dnl
AC_DEFUN(AC_LBL_DEVEL,
[rm -f os-proto.h
if test "${LBL_CFLAGS+set}" = set; then
$1="$$1 ${LBL_CFLAGS}"
fi
if test -f .devel ; then
if test "$GCC" = yes ; then
if test "${LBL_CFLAGS+set}" != set; then
if test "$ac_cv_prog_cc_g" = yes ; then
$1="-g $$1"
fi
$1="$$1 -Wall"
if test $ac_cv_lbl_gcc_vers -gt 1 ; then
$1="$$1 -Wmissing-prototypes -Wstrict-prototypes"
fi
fi
else
case "$target_os" in
irix6*)
V_CCOPT="$V_CCOPT -n32"
;;
*)
;;
esac
fi
os=`echo $target_os | sed -e 's/\([[0-9]][[0-9]]*\)[[^0-9]].*$/\1/'`
name="lbl/os-$os.h"
if test -f $name ; then
ln -s $name os-proto.h
AC_DEFINE(HAVE_OS_PROTO_H)
else
AC_MSG_WARN(can't find $name)
fi
fi])
dnl
dnl Improved version of AC_CHECK_LIB
dnl
dnl Thanks to John Hawkinson (jhawk@mit.edu)
dnl
dnl usage:
dnl
dnl AC_LBL_CHECK_LIB(LIBRARY, FUNCTION [, ACTION-IF-FOUND [,
dnl ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]])
dnl
dnl results:
dnl
dnl LIBS
dnl
define(AC_LBL_CHECK_LIB,
[AC_MSG_CHECKING([for $2 in -l$1])
dnl Use a cache variable name containing both the library and function name,
dnl because the test really is for library $1 defining function $2, not
dnl just for library $1. Separate tests with the same $1 and different $2's
dnl may have different results.
ac_lib_var=`echo $1['_']$2['_']$5 | sed 'y%./+- %__p__%'`
AC_CACHE_VAL(ac_cv_lbl_lib_$ac_lib_var,
[ac_save_LIBS="$LIBS"
LIBS="-l$1 $5 $LIBS"
AC_TRY_LINK(dnl
ifelse([$2], [main], , dnl Avoid conflicting decl of main.
[/* Override any gcc2 internal prototype to avoid an error. */
]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus
extern "C"
#endif
])dnl
[/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $2();
]),
[$2()],
eval "ac_cv_lbl_lib_$ac_lib_var=yes",
eval "ac_cv_lbl_lib_$ac_lib_var=no")
LIBS="$ac_save_LIBS"
])dnl
if eval "test \"`echo '$ac_cv_lbl_lib_'$ac_lib_var`\" = yes"; then
AC_MSG_RESULT(yes)
ifelse([$3], ,
[changequote(, )dnl
ac_tr_lib=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
changequote([, ])dnl
AC_DEFINE_UNQUOTED($ac_tr_lib)
LIBS="-l$1 $LIBS"
], [$3])
else
AC_MSG_RESULT(no)
ifelse([$4], , , [$4
])dnl
fi
])
dnl
dnl AC_LBL_LIBRARY_NET
dnl
dnl This test is for network applications that need socket() and
dnl gethostbyname() -ish functions. Under Solaris, those applications
dnl need to link with "-lsocket -lnsl". Under IRIX, they need to link
dnl with "-lnsl" but should *not* link with "-lsocket" because
dnl libsocket.a breaks a number of things (for instance:
dnl gethostbyname() under IRIX 5.2, and snoop sockets under most
dnl versions of IRIX).
dnl
dnl Unfortunately, many application developers are not aware of this,
dnl and mistakenly write tests that cause -lsocket to be used under
dnl IRIX. It is also easy to write tests that cause -lnsl to be used
dnl under operating systems where neither are necessary (or useful),
dnl such as SunOS 4.1.4, which uses -lnsl for TLI.
dnl
dnl This test exists so that every application developer does not test
dnl this in a different, and subtly broken fashion.
dnl It has been argued that this test should be broken up into two
dnl seperate tests, one for the resolver libraries, and one for the
dnl libraries necessary for using Sockets API. Unfortunately, the two
dnl are carefully intertwined and allowing the autoconf user to use
dnl them independantly potentially results in unfortunate ordering
dnl dependancies -- as such, such component macros would have to
dnl carefully use indirection and be aware if the other components were
dnl executed. Since other autoconf macros do not go to this trouble,
dnl and almost no applications use sockets without the resolver, this
dnl complexity has not been implemented.
dnl
dnl The check for libresolv is in case you are attempting to link
dnl statically and happen to have a libresolv.a lying around (and no
dnl libnsl.a).
dnl
AC_DEFUN(AC_LBL_LIBRARY_NET, [
# Most operating systems have gethostbyname() in the default searched
# libraries (i.e. libc):
AC_CHECK_FUNC(gethostbyname, ,
# Some OSes (eg. Solaris) place it in libnsl:
AC_LBL_CHECK_LIB(nsl, gethostbyname, ,
# Some strange OSes (SINIX) have it in libsocket:
AC_LBL_CHECK_LIB(socket, gethostbyname, ,
# Unfortunately libsocket sometimes depends on libnsl.
# AC_CHECK_LIB's API is essentially broken so the
# following ugliness is necessary:
AC_LBL_CHECK_LIB(socket, gethostbyname,
LIBS="-lsocket -lnsl $LIBS",
AC_CHECK_LIB(resolv, gethostbyname),
-lnsl))))
AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket, ,
AC_LBL_CHECK_LIB(socket, socket, LIBS="-lsocket -lnsl $LIBS", ,
-lnsl)))
# DLPI needs putmsg under HPUX so test for -lstr while we're at it
AC_CHECK_LIB(str, putmsg)
])

View File

@ -0,0 +1,264 @@
/*-
* Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
* The Regents of the University of California. All rights reserved.
*
* This code is derived from the Stanford/CMU enet packet filter,
* (net/enet.c) distributed as part of 4.3BSD, and code contributed
* to Berkeley by Steven McCanne and Van Jacobson both of Lawrence
* Berkeley Laboratory.
*
* 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
*
* @(#)bpf.h 7.1 (Berkeley) 5/7/91
*
* @(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/bpf/net/bpf.h,v 1.1 1999/08/26 10:07:57 johana Exp $ (LBL)
*/
#ifndef BPF_MAJOR_VERSION
/* BSD style release date */
#define BPF_RELEASE 199606
typedef int bpf_int32;
typedef u_int bpf_u_int32;
/*
* Alignment macros. BPF_WORDALIGN rounds up to the next
* even multiple of BPF_ALIGNMENT.
*/
#define BPF_ALIGNMENT sizeof(bpf_int32)
#define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1))
#define BPF_MAXINSNS 512
#define BPF_MAXBUFSIZE 0x8000
#define BPF_MINBUFSIZE 32
/*
* Structure for BIOCSETF.
*/
struct bpf_program {
u_int bf_len;
struct bpf_insn *bf_insns;
};
/*
* Struct returned by BIOCGSTATS.
*/
struct bpf_stat {
u_int bs_recv; /* number of packets received */
u_int bs_drop; /* number of packets dropped */
};
/*
* Struct return by BIOCVERSION. This represents the version number of
* the filter language described by the instruction encodings below.
* bpf understands a program iff kernel_major == filter_major &&
* kernel_minor >= filter_minor, that is, if the value returned by the
* running kernel has the same major number and a minor number equal
* equal to or less than the filter being downloaded. Otherwise, the
* results are undefined, meaning an error may be returned or packets
* may be accepted haphazardly.
* It has nothing to do with the source code version.
*/
struct bpf_version {
u_short bv_major;
u_short bv_minor;
};
/* Current version number of filter architecture. */
#define BPF_MAJOR_VERSION 1
#define BPF_MINOR_VERSION 1
/*
* BPF ioctls
*
* The first set is for compatibility with Sun's pcc style
* header files. If your using gcc, we assume that you
* have run fixincludes so the latter set should work.
*/
#if (defined(sun) || defined(ibm032)) && !defined(__GNUC__)
#define BIOCGBLEN _IOR(B,102, u_int)
#define BIOCSBLEN _IOWR(B,102, u_int)
#define BIOCSETF _IOW(B,103, struct bpf_program)
#define BIOCFLUSH _IO(B,104)
#define BIOCPROMISC _IO(B,105)
#define BIOCGDLT _IOR(B,106, u_int)
#define BIOCGETIF _IOR(B,107, struct ifreq)
#define BIOCSETIF _IOW(B,108, struct ifreq)
#define BIOCSRTIMEOUT _IOW(B,109, struct timeval)
#define BIOCGRTIMEOUT _IOR(B,110, struct timeval)
#define BIOCGSTATS _IOR(B,111, struct bpf_stat)
#define BIOCIMMEDIATE _IOW(B,112, u_int)
#define BIOCVERSION _IOR(B,113, struct bpf_version)
#define BIOCSTCPF _IOW(B,114, struct bpf_program)
#define BIOCSUDPF _IOW(B,115, struct bpf_program)
#else
#define BIOCGBLEN _IOR('B',102, u_int)
#define BIOCSBLEN _IOWR('B',102, u_int)
#define BIOCSETF _IOW('B',103, struct bpf_program)
#define BIOCFLUSH _IO('B',104)
#define BIOCPROMISC _IO('B',105)
#define BIOCGDLT _IOR('B',106, u_int)
#define BIOCGETIF _IOR('B',107, struct ifreq)
#define BIOCSETIF _IOW('B',108, struct ifreq)
#define BIOCSRTIMEOUT _IOW('B',109, struct timeval)
#define BIOCGRTIMEOUT _IOR('B',110, struct timeval)
#define BIOCGSTATS _IOR('B',111, struct bpf_stat)
#define BIOCIMMEDIATE _IOW('B',112, u_int)
#define BIOCVERSION _IOR('B',113, struct bpf_version)
#define BIOCSTCPF _IOW('B',114, struct bpf_program)
#define BIOCSUDPF _IOW('B',115, struct bpf_program)
#endif
/*
* Structure prepended to each packet.
*/
struct bpf_hdr {
struct timeval bh_tstamp; /* time stamp */
bpf_u_int32 bh_caplen; /* length of captured portion */
bpf_u_int32 bh_datalen; /* original length of packet */
u_short bh_hdrlen; /* length of bpf header (this struct
plus alignment padding) */
};
/*
* Because the structure above is not a multiple of 4 bytes, some compilers
* will insist on inserting padding; hence, sizeof(struct bpf_hdr) won't work.
* Only the kernel needs to know about it; applications use bh_hdrlen.
*/
#ifdef KERNEL
#define SIZEOF_BPF_HDR 18
#endif
/*
* Data-link level type codes.
*/
#define DLT_NULL 0 /* no link-layer encapsulation */
#define DLT_EN10MB 1 /* Ethernet (10Mb) */
#define DLT_EN3MB 2 /* Experimental Ethernet (3Mb) */
#define DLT_AX25 3 /* Amateur Radio AX.25 */
#define DLT_PRONET 4 /* Proteon ProNET Token Ring */
#define DLT_CHAOS 5 /* Chaos */
#define DLT_IEEE802 6 /* IEEE 802 Networks */
#define DLT_ARCNET 7 /* ARCNET */
#define DLT_SLIP 8 /* Serial Line IP */
#define DLT_PPP 9 /* Point-to-point Protocol */
#define DLT_FDDI 10 /* FDDI */
#define DLT_ATM_RFC1483 11 /* LLC/SNAP encapsulated atm */
#define DLT_RAW 12 /* raw IP */
#define DLT_SLIP_BSDOS 13 /* BSD/OS Serial Line IP */
#define DLT_PPP_BSDOS 14 /* BSD/OS Point-to-point Protocol */
/*
* The instruction encondings.
*/
/* instruction classes */
#define BPF_CLASS(code) ((code) & 0x07)
#define BPF_LD 0x00
#define BPF_LDX 0x01
#define BPF_ST 0x02
#define BPF_STX 0x03
#define BPF_ALU 0x04
#define BPF_JMP 0x05
#define BPF_RET 0x06
#define BPF_MISC 0x07
/* ld/ldx fields */
#define BPF_SIZE(code) ((code) & 0x18)
#define BPF_W 0x00
#define BPF_H 0x08
#define BPF_B 0x10
#define BPF_MODE(code) ((code) & 0xe0)
#define BPF_IMM 0x00
#define BPF_ABS 0x20
#define BPF_IND 0x40
#define BPF_MEM 0x60
#define BPF_LEN 0x80
#define BPF_MSH 0xa0
/* alu/jmp fields */
#define BPF_OP(code) ((code) & 0xf0)
#define BPF_ADD 0x00
#define BPF_SUB 0x10
#define BPF_MUL 0x20
#define BPF_DIV 0x30
#define BPF_OR 0x40
#define BPF_AND 0x50
#define BPF_LSH 0x60
#define BPF_RSH 0x70
#define BPF_NEG 0x80
#define BPF_JA 0x00
#define BPF_JEQ 0x10
#define BPF_JGT 0x20
#define BPF_JGE 0x30
#define BPF_JSET 0x40
#define BPF_SRC(code) ((code) & 0x08)
#define BPF_K 0x00
#define BPF_X 0x08
/* ret - BPF_K and BPF_X also apply */
#define BPF_RVAL(code) ((code) & 0x18)
#define BPF_A 0x10
/* misc */
#define BPF_MISCOP(code) ((code) & 0xf8)
#define BPF_TAX 0x00
#define BPF_TXA 0x80
/*
* The instruction data structure.
*/
struct bpf_insn {
u_short code;
u_char jt;
u_char jf;
bpf_int32 k;
};
/*
* Macros for insn array initializers.
*/
#define BPF_STMT(code, k) { (u_short)(code), 0, 0, k }
#define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k }
#ifdef KERNEL
extern u_int bpf_filter();
extern void bpfattach();
extern void bpf_tap();
extern void bpf_mtap();
#else
#if __STDC__
extern u_int bpf_filter(struct bpf_insn *, u_char *, u_int, u_int);
#endif
#endif
/*
* Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
*/
#define BPF_MEMWORDS 16
#endif

View File

@ -0,0 +1,532 @@
/*-
* Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
* The Regents of the University of California. All rights reserved.
*
* This code is derived from the Stanford/CMU enet packet filter,
* (net/enet.c) distributed as part of 4.3BSD, and code contributed
* to Berkeley by Steven McCanne and Van Jacobson both of Lawrence
* Berkeley Laboratory.
*
* 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
*
* @(#)bpf.c 7.5 (Berkeley) 7/15/91
*/
#if !(defined(lint) || defined(KERNEL))
static const char rcsid[] =
"@(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/bpf/net/bpf_filter.c,v 1.1 1999/08/26 10:07:57 johana Exp $ (LBL)";
#endif
#include <sys/param.h>
#include <sys/types.h>
#include <sys/time.h>
#include <net/bpf.h>
#ifndef KERNEL
#include <stdlib.h>
#endif
#define int32 bpf_int32
#define u_int32 bpf_u_int32
#ifndef LBL_ALIGN
#if defined(sparc) || defined(mips) || defined(ibm032) || \
defined(__alpha) || defined(__hpux)
#define LBL_ALIGN
#endif
#endif
#ifndef LBL_ALIGN
#include <netinet/in.h>
#define EXTRACT_SHORT(p) ((u_short)ntohs(*(u_short *)p))
#define EXTRACT_LONG(p) (ntohl(*(u_int32 *)p))
#else
#define EXTRACT_SHORT(p)\
((u_short)\
((u_short)*((u_char *)p+0)<<8|\
(u_short)*((u_char *)p+1)<<0))
#define EXTRACT_LONG(p)\
((u_int32)*((u_char *)p+0)<<24|\
(u_int32)*((u_char *)p+1)<<16|\
(u_int32)*((u_char *)p+2)<<8|\
(u_int32)*((u_char *)p+3)<<0)
#endif
#ifdef KERNEL
#include <sys/mbuf.h>
#define MINDEX(len, m, k) \
{ \
len = m->m_len; \
while (k >= len) { \
k -= len; \
m = m->m_next; \
if (m == 0) \
return 0; \
len = m->m_len; \
} \
}
static int
m_xword(m, k, err)
register struct mbuf *m;
register int k, *err;
{
register int len;
register u_char *cp, *np;
register struct mbuf *m0;
MINDEX(len, m, k);
cp = mtod(m, u_char *) + k;
if (len - k >= 4) {
*err = 0;
return EXTRACT_LONG(cp);
}
m0 = m->m_next;
if (m0 == 0 || m0->m_len + len - k < 4)
goto bad;
*err = 0;
np = mtod(m0, u_char *);
switch (len - k) {
case 1:
return (cp[0] << 24) | (np[0] << 16) | (np[1] << 8) | np[2];
case 2:
return (cp[0] << 24) | (cp[1] << 16) | (np[0] << 8) | np[1];
default:
return (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | np[0];
}
bad:
*err = 1;
return 0;
}
static int
m_xhalf(m, k, err)
register struct mbuf *m;
register int k, *err;
{
register int len;
register u_char *cp;
register struct mbuf *m0;
MINDEX(len, m, k);
cp = mtod(m, u_char *) + k;
if (len - k >= 2) {
*err = 0;
return EXTRACT_SHORT(cp);
}
m0 = m->m_next;
if (m0 == 0)
goto bad;
*err = 0;
return (cp[0] << 8) | mtod(m0, u_char *)[0];
bad:
*err = 1;
return 0;
}
#endif
/*
* Execute the filter program starting at pc on the packet p
* wirelen is the length of the original packet
* buflen is the amount of data present
*/
u_int
bpf_filter(pc, p, wirelen, buflen)
register struct bpf_insn *pc;
register u_char *p;
u_int wirelen;
register u_int buflen;
{
register u_int32 A, X;
register int k;
int32 mem[BPF_MEMWORDS];
if (pc == 0)
/*
* No filter means accept all.
*/
return (u_int)-1;
A = 0;
X = 0;
--pc;
while (1) {
++pc;
switch (pc->code) {
default:
#ifdef KERNEL
return 0;
#else
abort();
#endif
case BPF_RET|BPF_K:
return (u_int)pc->k;
case BPF_RET|BPF_A:
return (u_int)A;
case BPF_LD|BPF_W|BPF_ABS:
k = pc->k;
if (k + sizeof(int32) > buflen) {
#ifdef KERNEL
int merr;
if (buflen != 0)
return 0;
A = m_xword((struct mbuf *)p, k, &merr);
if (merr != 0)
return 0;
continue;
#else
return 0;
#endif
}
A = EXTRACT_LONG(&p[k]);
continue;
case BPF_LD|BPF_H|BPF_ABS:
k = pc->k;
if (k + sizeof(short) > buflen) {
#ifdef KERNEL
int merr;
if (buflen != 0)
return 0;
A = m_xhalf((struct mbuf *)p, k, &merr);
continue;
#else
return 0;
#endif
}
A = EXTRACT_SHORT(&p[k]);
continue;
case BPF_LD|BPF_B|BPF_ABS:
k = pc->k;
if (k >= buflen) {
#ifdef KERNEL
register struct mbuf *m;
register int len;
if (buflen != 0)
return 0;
m = (struct mbuf *)p;
MINDEX(len, m, k);
A = mtod(m, u_char *)[k];
continue;
#else
return 0;
#endif
}
A = p[k];
continue;
case BPF_LD|BPF_W|BPF_LEN:
A = wirelen;
continue;
case BPF_LDX|BPF_W|BPF_LEN:
X = wirelen;
continue;
case BPF_LD|BPF_W|BPF_IND:
k = X + pc->k;
if (k + sizeof(int32) > buflen) {
#ifdef KERNEL
int merr;
if (buflen != 0)
return 0;
A = m_xword((struct mbuf *)p, k, &merr);
if (merr != 0)
return 0;
continue;
#else
return 0;
#endif
}
A = EXTRACT_LONG(&p[k]);
continue;
case BPF_LD|BPF_H|BPF_IND:
k = X + pc->k;
if (k + sizeof(short) > buflen) {
#ifdef KERNEL
int merr;
if (buflen != 0)
return 0;
A = m_xhalf((struct mbuf *)p, k, &merr);
if (merr != 0)
return 0;
continue;
#else
return 0;
#endif
}
A = EXTRACT_SHORT(&p[k]);
continue;
case BPF_LD|BPF_B|BPF_IND:
k = X + pc->k;
if (k >= buflen) {
#ifdef KERNEL
register struct mbuf *m;
register int len;
if (buflen != 0)
return 0;
m = (struct mbuf *)p;
MINDEX(len, m, k);
A = mtod(m, u_char *)[k];
continue;
#else
return 0;
#endif
}
A = p[k];
continue;
case BPF_LDX|BPF_MSH|BPF_B:
k = pc->k;
if (k >= buflen) {
#ifdef KERNEL
register struct mbuf *m;
register int len;
if (buflen != 0)
return 0;
m = (struct mbuf *)p;
MINDEX(len, m, k);
X = (mtod(m, char *)[k] & 0xf) << 2;
continue;
#else
return 0;
#endif
}
X = (p[pc->k] & 0xf) << 2;
continue;
case BPF_LD|BPF_IMM:
A = pc->k;
continue;
case BPF_LDX|BPF_IMM:
X = pc->k;
continue;
case BPF_LD|BPF_MEM:
A = mem[pc->k];
continue;
case BPF_LDX|BPF_MEM:
X = mem[pc->k];
continue;
case BPF_ST:
mem[pc->k] = A;
continue;
case BPF_STX:
mem[pc->k] = X;
continue;
case BPF_JMP|BPF_JA:
pc += pc->k;
continue;
case BPF_JMP|BPF_JGT|BPF_K:
pc += (A > pc->k) ? pc->jt : pc->jf;
continue;
case BPF_JMP|BPF_JGE|BPF_K:
pc += (A >= pc->k) ? pc->jt : pc->jf;
continue;
case BPF_JMP|BPF_JEQ|BPF_K:
pc += (A == pc->k) ? pc->jt : pc->jf;
continue;
case BPF_JMP|BPF_JSET|BPF_K:
pc += (A & pc->k) ? pc->jt : pc->jf;
continue;
case BPF_JMP|BPF_JGT|BPF_X:
pc += (A > X) ? pc->jt : pc->jf;
continue;
case BPF_JMP|BPF_JGE|BPF_X:
pc += (A >= X) ? pc->jt : pc->jf;
continue;
case BPF_JMP|BPF_JEQ|BPF_X:
pc += (A == X) ? pc->jt : pc->jf;
continue;
case BPF_JMP|BPF_JSET|BPF_X:
pc += (A & X) ? pc->jt : pc->jf;
continue;
case BPF_ALU|BPF_ADD|BPF_X:
A += X;
continue;
case BPF_ALU|BPF_SUB|BPF_X:
A -= X;
continue;
case BPF_ALU|BPF_MUL|BPF_X:
A *= X;
continue;
case BPF_ALU|BPF_DIV|BPF_X:
if (X == 0)
return 0;
A /= X;
continue;
case BPF_ALU|BPF_AND|BPF_X:
A &= X;
continue;
case BPF_ALU|BPF_OR|BPF_X:
A |= X;
continue;
case BPF_ALU|BPF_LSH|BPF_X:
A <<= X;
continue;
case BPF_ALU|BPF_RSH|BPF_X:
A >>= X;
continue;
case BPF_ALU|BPF_ADD|BPF_K:
A += pc->k;
continue;
case BPF_ALU|BPF_SUB|BPF_K:
A -= pc->k;
continue;
case BPF_ALU|BPF_MUL|BPF_K:
A *= pc->k;
continue;
case BPF_ALU|BPF_DIV|BPF_K:
A /= pc->k;
continue;
case BPF_ALU|BPF_AND|BPF_K:
A &= pc->k;
continue;
case BPF_ALU|BPF_OR|BPF_K:
A |= pc->k;
continue;
case BPF_ALU|BPF_LSH|BPF_K:
A <<= pc->k;
continue;
case BPF_ALU|BPF_RSH|BPF_K:
A >>= pc->k;
continue;
case BPF_ALU|BPF_NEG:
A = -A;
continue;
case BPF_MISC|BPF_TAX:
X = A;
continue;
case BPF_MISC|BPF_TXA:
A = X;
continue;
}
}
}
#ifdef KERNEL
/*
* Return true if the 'fcode' is a valid filter program.
* The constraints are that each jump be forward and to a valid
* code. The code must terminate with either an accept or reject.
* 'valid' is an array for use by the routine (it must be at least
* 'len' bytes long).
*
* The kernel needs to be able to verify an application's filter code.
* Otherwise, a bogus program could easily crash the system.
*/
int
bpf_validate(f, len)
struct bpf_insn *f;
int len;
{
register int i;
register struct bpf_insn *p;
for (i = 0; i < len; ++i) {
/*
* Check that that jumps are forward, and within
* the code block.
*/
p = &f[i];
if (BPF_CLASS(p->code) == BPF_JMP) {
register int from = i + 1;
if (BPF_OP(p->code) == BPF_JA) {
if (from + p->k >= (unsigned)len)
return 0;
}
else if (from + p->jt >= len || from + p->jf >= len)
return 0;
}
/*
* Check that memory operations use valid addresses.
*/
if ((BPF_CLASS(p->code) == BPF_ST ||
(BPF_CLASS(p->code) == BPF_LD &&
(p->code & 0xe0) == BPF_MEM)) &&
(p->k >= BPF_MEMWORDS || p->k < 0))
return 0;
/*
* Check for constant division by 0.
*/
if (p->code == (BPF_ALU|BPF_DIV|BPF_K) && p->k == 0)
return 0;
}
return BPF_CLASS(f[len - 1].code) == BPF_RET;
}
#endif

View File

@ -0,0 +1 @@
bpf/net/bpf_filter.c

View File

@ -0,0 +1,288 @@
/*
* Copyright (c) 1990, 1991, 1992, 1994, 1995, 1996
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the University of California,
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef lint
static const char rcsid[] =
"@(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/bpf_image.c,v 1.1 1999/08/26 10:05:20 johana Exp $ (LBL)";
#endif
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include "pcap-int.h"
#include "gnuc.h"
#ifdef HAVE_OS_PROTO_H
#include "os-proto.h"
#endif
char *
bpf_image(p, n)
struct bpf_insn *p;
int n;
{
int v;
char *fmt, *op;
static char image[256];
char operand[64];
v = p->k;
switch (p->code) {
default:
op = "unimp";
fmt = "0x%x";
v = p->code;
break;
case BPF_RET|BPF_K:
op = "ret";
fmt = "#%d";
break;
case BPF_RET|BPF_A:
op = "ret";
fmt = "";
break;
case BPF_LD|BPF_W|BPF_ABS:
op = "ld";
fmt = "[%d]";
break;
case BPF_LD|BPF_H|BPF_ABS:
op = "ldh";
fmt = "[%d]";
break;
case BPF_LD|BPF_B|BPF_ABS:
op = "ldb";
fmt = "[%d]";
break;
case BPF_LD|BPF_W|BPF_LEN:
op = "ld";
fmt = "#pktlen";
break;
case BPF_LD|BPF_W|BPF_IND:
op = "ld";
fmt = "[x + %d]";
break;
case BPF_LD|BPF_H|BPF_IND:
op = "ldh";
fmt = "[x + %d]";
break;
case BPF_LD|BPF_B|BPF_IND:
op = "ldb";
fmt = "[x + %d]";
break;
case BPF_LD|BPF_IMM:
op = "ld";
fmt = "#0x%x";
break;
case BPF_LDX|BPF_IMM:
op = "ldx";
fmt = "#0x%x";
break;
case BPF_LDX|BPF_MSH|BPF_B:
op = "ldxb";
fmt = "4*([%d]&0xf)";
break;
case BPF_LD|BPF_MEM:
op = "ld";
fmt = "M[%d]";
break;
case BPF_LDX|BPF_MEM:
op = "ldx";
fmt = "M[%d]";
break;
case BPF_ST:
op = "st";
fmt = "M[%d]";
break;
case BPF_STX:
op = "stx";
fmt = "M[%d]";
break;
case BPF_JMP|BPF_JA:
op = "ja";
fmt = "%d";
v = n + 1 + p->k;
break;
case BPF_JMP|BPF_JGT|BPF_K:
op = "jgt";
fmt = "#0x%x";
break;
case BPF_JMP|BPF_JGE|BPF_K:
op = "jge";
fmt = "#0x%x";
break;
case BPF_JMP|BPF_JEQ|BPF_K:
op = "jeq";
fmt = "#0x%x";
break;
case BPF_JMP|BPF_JSET|BPF_K:
op = "jset";
fmt = "#0x%x";
break;
case BPF_JMP|BPF_JGT|BPF_X:
op = "jgt";
fmt = "x";
break;
case BPF_JMP|BPF_JGE|BPF_X:
op = "jge";
fmt = "x";
break;
case BPF_JMP|BPF_JEQ|BPF_X:
op = "jeq";
fmt = "x";
break;
case BPF_JMP|BPF_JSET|BPF_X:
op = "jset";
fmt = "x";
break;
case BPF_ALU|BPF_ADD|BPF_X:
op = "add";
fmt = "x";
break;
case BPF_ALU|BPF_SUB|BPF_X:
op = "sub";
fmt = "x";
break;
case BPF_ALU|BPF_MUL|BPF_X:
op = "mul";
fmt = "x";
break;
case BPF_ALU|BPF_DIV|BPF_X:
op = "div";
fmt = "x";
break;
case BPF_ALU|BPF_AND|BPF_X:
op = "and";
fmt = "x";
break;
case BPF_ALU|BPF_OR|BPF_X:
op = "or";
fmt = "x";
break;
case BPF_ALU|BPF_LSH|BPF_X:
op = "lsh";
fmt = "x";
break;
case BPF_ALU|BPF_RSH|BPF_X:
op = "rsh";
fmt = "x";
break;
case BPF_ALU|BPF_ADD|BPF_K:
op = "add";
fmt = "#%d";
break;
case BPF_ALU|BPF_SUB|BPF_K:
op = "sub";
fmt = "#%d";
break;
case BPF_ALU|BPF_MUL|BPF_K:
op = "mul";
fmt = "#%d";
break;
case BPF_ALU|BPF_DIV|BPF_K:
op = "div";
fmt = "#%d";
break;
case BPF_ALU|BPF_AND|BPF_K:
op = "and";
fmt = "#0x%x";
break;
case BPF_ALU|BPF_OR|BPF_K:
op = "or";
fmt = "#0x%x";
break;
case BPF_ALU|BPF_LSH|BPF_K:
op = "lsh";
fmt = "#%d";
break;
case BPF_ALU|BPF_RSH|BPF_K:
op = "rsh";
fmt = "#%d";
break;
case BPF_ALU|BPF_NEG:
op = "neg";
fmt = "";
break;
case BPF_MISC|BPF_TAX:
op = "tax";
fmt = "";
break;
case BPF_MISC|BPF_TXA:
op = "txa";
fmt = "";
break;
}
(void)sprintf(operand, fmt, v);
(void)sprintf(image,
(BPF_CLASS(p->code) == BPF_JMP &&
BPF_OP(p->code) != BPF_JA) ?
"(%03d) %-8s %-16s jt %d\tjf %d"
: "(%03d) %-8s %s",
n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
return image;
}

View File

@ -0,0 +1,35 @@
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs. It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already. You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
ac_cv_func_ether_hostton=${ac_cv_func_ether_hostton=yes}
ac_cv_func_strerror=${ac_cv_func_strerror=yes}
ac_cv_header_malloc_h=${ac_cv_header_malloc_h=yes}
ac_cv_header_net_if_arp_h=${ac_cv_header_net_if_arp_h=yes}
ac_cv_header_sys_ioccom_h=${ac_cv_header_sys_ioccom_h=no}
ac_cv_header_sys_sockio_h=${ac_cv_header_sys_sockio_h=no}
ac_cv_lbl_flex_v24=${ac_cv_lbl_flex_v24=yes}
ac_cv_lbl_gcc_fixincludes=${ac_cv_lbl_gcc_fixincludes=yes}
ac_cv_lbl_gcc_vers=${ac_cv_lbl_gcc_vers=4}
ac_cv_lbl_sockaddr_has_sa_len=${ac_cv_lbl_sockaddr_has_sa_len=no}
ac_cv_lbl_unaligned_fail=${ac_cv_lbl_unaligned_fail=no}
ac_cv_linux_vers=${ac_cv_linux_vers=2}
ac_cv_prog_CC=${ac_cv_prog_CC=gcc}
ac_cv_prog_CPP=${ac_cv_prog_CPP='gcc -E'}
ac_cv_prog_V_LEX=${ac_cv_prog_V_LEX=flex}
ac_cv_prog_V_RANLIB=${ac_cv_prog_V_RANLIB=ranlib}
ac_cv_prog_V_YACC=${ac_cv_prog_V_YACC=bison}
ac_cv_prog_cc_cross=${ac_cv_prog_cc_cross=no}
ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes}
ac_cv_prog_cc_works=${ac_cv_prog_cc_works=yes}
ac_cv_prog_gcc=${ac_cv_prog_gcc=yes}

View File

@ -0,0 +1,693 @@
#! /bin/sh
# Attempt to guess a canonical system name.
# Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Written by Per Bothner <bothner@cygnus.com>.
# The master version of this file is at the FSF in /home/gd/gnu/lib.
#
# This script attempts to guess a canonical system name similar to
# config.sub. If it succeeds, it prints the system name on stdout, and
# exits with 0. Otherwise, it exits with 1.
#
# The plan is that this can be called by configure scripts if you
# don't specify an explicit system type (host/target name).
#
# Only a few systems have been added to this list; please add others
# (but try to keep the structure clean).
#
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (ghazi@noc.rutgers.edu 8/24/94.)
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
PATH=$PATH:/.attbin ; export PATH
fi
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
# Note: order is significant - the case branches are not exclusive.
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
alpha:OSF1:*:*)
# A Vn.n version is a released version.
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
exit 0 ;;
21064:Windows_NT:50:3)
echo alpha-dec-winnt3.5
exit 0 ;;
Amiga*:UNIX_System_V:4.0:*)
echo m68k-cbm-sysv4
exit 0;;
amiga:NetBSD:*:*)
echo m68k-cbm-netbsd${UNAME_RELEASE}
exit 0 ;;
amiga:OpenBSD:*:*)
echo m68k-cbm-openbsd${UNAME_RELEASE}
exit 0 ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
exit 0;;
Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
if test "`(/bin/universe) 2>/dev/null`" = att ; then
echo pyramid-pyramid-sysv3
else
echo pyramid-pyramid-bsd
fi
exit 0 ;;
NILE:*:*:dcosx)
echo pyramid-pyramid-svr4
exit 0 ;;
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
i86pc:SunOS:5.*:*)
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
sun4*:SunOS:6*:*)
# According to config.sub, this is the proper way to canonicalize
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
# it's likely to be more like Solaris than SunOS4.
echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
sun4*:SunOS:*:*)
case "`/usr/bin/arch -k`" in
Series*|S4*)
UNAME_RELEASE=`uname -v`
;;
esac
# Japanese Language versions have a version number like `4.1.3-JL'.
echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
exit 0 ;;
sun3*:SunOS:*:*)
echo m68k-sun-sunos${UNAME_RELEASE}
exit 0 ;;
aushp:SunOS:*:*)
echo sparc-auspex-sunos${UNAME_RELEASE}
exit 0 ;;
atari*:NetBSD:*:*)
echo m68k-atari-netbsd${UNAME_RELEASE}
exit 0 ;;
atari*:OpenBSD:*:*)
echo m68k-atari-openbsd${UNAME_RELEASE}
exit 0 ;;
sun3*:NetBSD:*:*)
echo m68k-sun-netbsd${UNAME_RELEASE}
exit 0 ;;
sun3*:OpenBSD:*:*)
echo m68k-sun-openbsd${UNAME_RELEASE}
exit 0 ;;
mac68k:NetBSD:*:*)
echo m68k-apple-netbsd${UNAME_RELEASE}
exit 0 ;;
mac68k:OpenBSD:*:*)
echo m68k-apple-openbsd${UNAME_RELEASE}
exit 0 ;;
powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE}
exit 0 ;;
RISC*:Mach:*:*)
echo mips-dec-mach_bsd4.3
exit 0 ;;
RISC*:ULTRIX:*:*)
echo mips-dec-ultrix${UNAME_RELEASE}
exit 0 ;;
VAX*:ULTRIX*:*:*)
echo vax-dec-ultrix${UNAME_RELEASE}
exit 0 ;;
mips:*:*:UMIPS | mips:*:*:RISCos)
sed 's/^ //' << EOF >dummy.c
int main (argc, argv) int argc; char **argv; {
#if defined (host_mips) && defined (MIPSEB)
#if defined (SYSTYPE_SYSV)
printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
#endif
#if defined (SYSTYPE_SVR4)
printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
#endif
#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
#endif
#endif
exit (-1);
}
EOF
${CC-cc} dummy.c -o dummy \
&& ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
&& rm dummy.c dummy && exit 0
rm -f dummy.c dummy
echo mips-mips-riscos${UNAME_RELEASE}
exit 0 ;;
Night_Hawk:Power_UNIX:*:*)
echo powerpc-harris-powerunix
exit 0 ;;
m88k:CX/UX:7*:*)
echo m88k-harris-cxux7
exit 0 ;;
m88k:*:4*:R4*)
echo m88k-motorola-sysv4
exit 0 ;;
m88k:*:3*:R3*)
echo m88k-motorola-sysv3
exit 0 ;;
AViiON:dgux:*:*)
# DG/UX returns AViiON for all architectures
UNAME_PROCESSOR=`/usr/bin/uname -p`
if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
-o ${TARGET_BINARY_INTERFACE}x = x ] ; then
echo m88k-dg-dgux${UNAME_RELEASE}
else
echo m88k-dg-dguxbcs${UNAME_RELEASE}
fi
else echo i586-dg-dgux${UNAME_RELEASE}
fi
exit 0 ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
exit 0 ;;
M88*:*:R3*:*)
# Delta 88k system running SVR3
echo m88k-motorola-sysv3
exit 0 ;;
XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
echo m88k-tektronix-sysv3
exit 0 ;;
Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
echo m68k-tektronix-bsd
exit 0 ;;
*:IRIX*:*:*)
echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
exit 0 ;;
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
i?86:AIX:*:*)
echo i386-ibm-aix
exit 0 ;;
*:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
sed 's/^ //' << EOF >dummy.c
#include <sys/systemcfg.h>
main()
{
if (!__power_pc())
exit(1);
puts("powerpc-ibm-aix3.2.5");
exit(0);
}
EOF
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
echo rs6000-ibm-aix3.2.5
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
echo rs6000-ibm-aix3.2.4
else
echo rs6000-ibm-aix3.2
fi
exit 0 ;;
*:AIX:*:4)
if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
IBM_ARCH=rs6000
else
IBM_ARCH=powerpc
fi
if [ -x /usr/bin/oslevel ] ; then
IBM_REV=`/usr/bin/oslevel`
else
IBM_REV=4.${UNAME_RELEASE}
fi
echo ${IBM_ARCH}-ibm-aix${IBM_REV}
exit 0 ;;
*:AIX:*:*)
echo rs6000-ibm-aix
exit 0 ;;
ibmrt:4.4BSD:*|romp-ibm:BSD:*)
echo romp-ibm-bsd4.4
exit 0 ;;
ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
exit 0 ;; # report: romp-ibm BSD 4.3
*:BOSX:*:*)
echo rs6000-bull-bosx
exit 0 ;;
DPX/2?00:B.O.S.:*:*)
echo m68k-bull-sysv3
exit 0 ;;
9000/[34]??:4.3bsd:1.*:*)
echo m68k-hp-bsd
exit 0 ;;
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
echo m68k-hp-bsd4.4
exit 0 ;;
9000/[3478]??:HP-UX:*:*)
case "${UNAME_MACHINE}" in
9000/31? ) HP_ARCH=m68000 ;;
9000/[34]?? ) HP_ARCH=m68k ;;
9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
9000/8?? ) HP_ARCH=hppa1.0 ;;
esac
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
exit 0 ;;
3050*:HI-UX:*:*)
sed 's/^ //' << EOF >dummy.c
#include <unistd.h>
int
main ()
{
long cpu = sysconf (_SC_CPU_VERSION);
/* The order matters, because CPU_IS_HP_MC68K erroneously returns
true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
results, however. */
if (CPU_IS_PA_RISC (cpu))
{
switch (cpu)
{
case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
default: puts ("hppa-hitachi-hiuxwe2"); break;
}
}
else if (CPU_IS_HP_MC68K (cpu))
puts ("m68k-hitachi-hiuxwe2");
else puts ("unknown-hitachi-hiuxwe2");
exit (0);
}
EOF
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
echo unknown-hitachi-hiuxwe2
exit 0 ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
echo hppa1.1-hp-bsd
exit 0 ;;
9000/8??:4.3bsd:*:*)
echo hppa1.0-hp-bsd
exit 0 ;;
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
echo hppa1.1-hp-osf
exit 0 ;;
hp8??:OSF1:*:*)
echo hppa1.0-hp-osf
exit 0 ;;
i?86:OSF1:*:*)
if [ -x /usr/sbin/sysversion ] ; then
echo ${UNAME_MACHINE}-unknown-osf1mk
else
echo ${UNAME_MACHINE}-unknown-osf1
fi
exit 0 ;;
parisc*:Lites*:*:*)
echo hppa1.1-hp-lites
exit 0 ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd
exit 0 ;;
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
exit 0 ;;
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
echo c34-convex-bsd
exit 0 ;;
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
echo c38-convex-bsd
exit 0 ;;
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
echo c4-convex-bsd
exit 0 ;;
CRAY*X-MP:*:*:*)
echo xmp-cray-unicos
exit 0 ;;
CRAY*Y-MP:*:*:*)
echo ymp-cray-unicos${UNAME_RELEASE}
exit 0 ;;
CRAY*[A-Z]90:*:*:*)
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
exit 0 ;;
CRAY*TS:*:*:*)
echo t90-cray-unicos${UNAME_RELEASE}
exit 0 ;;
CRAY-2:*:*:*)
echo cray2-cray-unicos
exit 0 ;;
F300:UNIX_System_V:*:*)
FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;;
F301:UNIX_System_V:*:*)
echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
exit 0 ;;
hp3[0-9][05]:NetBSD:*:*)
echo m68k-hp-netbsd${UNAME_RELEASE}
exit 0 ;;
hp3[0-9][05]:OpenBSD:*:*)
echo m68k-hp-openbsd${UNAME_RELEASE}
exit 0 ;;
i?86:BSD/386:*:* | *:BSD/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit 0 ;;
*:FreeBSD:*:*)
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit 0 ;;
*:NetBSD:*:*)
echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
exit 0 ;;
*:OpenBSD:*:*)
echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
exit 0 ;;
i*:CYGWIN*:*)
echo i386-pc-cygwin32
exit 0 ;;
p*:CYGWIN*:*)
echo powerpcle-unknown-cygwin32
exit 0 ;;
prep*:SunOS:5.*:*)
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
*:GNU:*:*)
echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit 0 ;;
*:Linux:*:*)
# The BFD linker knows what the default object file format is, so
# first see if it will tell us.
ld_help_string=`ld --help 2>&1`
if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then
echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0
elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then
echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0
elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then
echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0
elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0
elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0
elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then
echo "powerpc-unknown-linux-gnu" ; exit 0
elif test "${UNAME_MACHINE}" = "alpha" ; then
echo alpha-unknown-linux-gnu ; exit 0
elif test "${UNAME_MACHINE}" = "sparc" ; then
echo sparc-unknown-linux-gnu ; exit 0
else
# Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us
# useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout.
test ! -d /usr/lib/ldscripts/. \
&& echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
# Determine whether the default compiler is a.out or elf
cat >dummy.c <<EOF
main(argc, argv)
int argc;
char *argv[];
{
#ifdef __ELF__
printf ("%s-pc-linux-gnu\n", argv[1]);
#else
printf ("%s-pc-linux-gnuaout\n", argv[1]);
#endif
return 0;
}
EOF
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
fi ;;
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
# are messed up and put the nodename in both sysname and nodename.
i?86:DYNIX/ptx:4*:*)
echo i386-sequent-sysv4
exit 0 ;;
i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
else
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
fi
exit 0 ;;
i?86:*:3.2:*)
if test -f /usr/options/cb.name; then
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
elif /bin/uname -X 2>/dev/null >/dev/null ; then
UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
else
echo ${UNAME_MACHINE}-pc-sysv32
fi
exit 0 ;;
Intel:Mach:3*:*)
echo i386-pc-mach3
exit 0 ;;
paragon:*:*:*)
echo i860-intel-osf1
exit 0 ;;
i860:*:4.*:*) # i860-SVR4
if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
else # Add other i860-SVR4 vendors below as they are discovered.
echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
fi
exit 0 ;;
mini*:CTIX:SYS*5:*)
# "miniframe"
echo m68010-convergent-sysv
exit 0 ;;
M68*:*:R3V[567]*:*)
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
OS_REL=''
test -r /etc/.relid \
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& echo i486-ncr-sysv4.3${OS_REL} && exit 0
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
&& echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& echo i486-ncr-sysv4 && exit 0 ;;
m68*:LynxOS:2.*:*)
echo m68k-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
mc68030:UNIX_System_V:4.*:*)
echo m68k-atari-sysv4
exit 0 ;;
i?86:LynxOS:2.*:*)
echo i386-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
TSUNAMI:LynxOS:2.*:*)
echo sparc-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
echo rs6000-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
SM[BE]S:UNIX_SV:*:*)
echo mips-dde-sysv${UNAME_RELEASE}
exit 0 ;;
RM*:SINIX-*:*:*)
echo mips-sni-sysv4
exit 0 ;;
*:SINIX-*:*:*)
if uname -p 2>/dev/null >/dev/null ; then
UNAME_MACHINE=`(uname -p) 2>/dev/null`
echo ${UNAME_MACHINE}-sni-sysv4
else
echo ns32k-sni-sysv
fi
exit 0 ;;
*:UNIX_System_V:4*:FTX*)
# From Gerald Hewes <hewes@openmarket.com>.
# How about differentiating between stratus architectures? -djm
echo hppa1.1-stratus-sysv4
exit 0 ;;
*:*:*:FTX*)
# From seanf@swdc.stratus.com.
echo i860-stratus-sysv4
exit 0 ;;
mc68*:A/UX:*:*)
echo m68k-apple-aux${UNAME_RELEASE}
exit 0 ;;
R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
if [ -d /usr/nec ]; then
echo mips-nec-sysv${UNAME_RELEASE}
else
echo mips-unknown-sysv${UNAME_RELEASE}
fi
exit 0 ;;
PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
# says <Richard.M.Bartel@ccMail.Census.GOV>
echo i586-unisys-sysv4
exit 0 ;;
esac
#echo '(No uname command or uname output not recognized.)' 1>&2
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
cat >dummy.c <<EOF
#ifdef _SEQUENT_
# include <sys/types.h>
# include <sys/utsname.h>
#endif
main ()
{
#if defined (sony)
#if defined (MIPSEB)
/* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
I don't know.... */
printf ("mips-sony-bsd\n"); exit (0);
#else
#include <sys/param.h>
printf ("m68k-sony-newsos%s\n",
#ifdef NEWSOS4
"4"
#else
""
#endif
); exit (0);
#endif
#endif
#if defined (__arm) && defined (__acorn) && defined (__unix)
printf ("arm-acorn-riscix"); exit (0);
#endif
#if defined (hp300) && !defined (hpux)
printf ("m68k-hp-bsd\n"); exit (0);
#endif
#if defined (NeXT)
#if !defined (__ARCHITECTURE__)
#define __ARCHITECTURE__ "m68k"
#endif
int version;
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
exit (0);
#endif
#if defined (MULTIMAX) || defined (n16)
#if defined (UMAXV)
printf ("ns32k-encore-sysv\n"); exit (0);
#else
#if defined (CMU)
printf ("ns32k-encore-mach\n"); exit (0);
#else
printf ("ns32k-encore-bsd\n"); exit (0);
#endif
#endif
#endif
#if defined (__386BSD__)
printf ("i386-pc-bsd\n"); exit (0);
#endif
#if defined (sequent)
#if defined (i386)
printf ("i386-sequent-dynix\n"); exit (0);
#endif
#if defined (ns32000)
printf ("ns32k-sequent-dynix\n"); exit (0);
#endif
#endif
#if defined (_SEQUENT_)
struct utsname un;
uname(&un);
if (strncmp(un.version, "V2", 2) == 0) {
printf ("i386-sequent-ptx2\n"); exit (0);
}
if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
printf ("i386-sequent-ptx1\n"); exit (0);
}
printf ("i386-sequent-ptx\n"); exit (0);
#endif
#if defined (vax)
#if !defined (ultrix)
printf ("vax-dec-bsd\n"); exit (0);
#else
printf ("vax-dec-ultrix\n"); exit (0);
#endif
#endif
#if defined (alliant) && defined (i860)
printf ("i860-alliant-bsd\n"); exit (0);
#endif
exit (1);
}
EOF
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
# Apollos put the system type in the environment.
test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
# Convex versions that predate uname can use getsysinfo(1)
if [ -x /usr/convex/getsysinfo ]
then
case `getsysinfo -f cpu_type` in
c1*)
echo c1-convex-bsd
exit 0 ;;
c2*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
exit 0 ;;
c34*)
echo c34-convex-bsd
exit 0 ;;
c38*)
echo c38-convex-bsd
exit 0 ;;
c4*)
echo c4-convex-bsd
exit 0 ;;
esac
fi
#echo '(Unable to guess system type)' 1>&2
exit 1

View File

@ -0,0 +1,61 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
configure:578: checking host system type
configure:599: checking target system type
configure:617: checking build system type
configure:711: checking for gcc
configure:788: checking whether the C compiler (gcc ) works
configure:802: gcc -o conftest conftest.c 1>&5
configure:822: checking whether the C compiler (gcc ) is a cross-compiler
configure:827: checking whether we are using GNU C
configure:836: gcc -E conftest.c
configure:851: checking whether gcc accepts -g
configure:884: checking gcc version
configure:1028: checking how to run the C preprocessor
configure:1049: gcc -E conftest.c >/dev/null 2>conftest.out
configure:1092: checking for malloc.h
configure:1102: gcc -E conftest.c >/dev/null 2>conftest.out
configure:1092: checking for sys/ioccom.h
configure:1102: gcc -E conftest.c >/dev/null 2>conftest.out
configure:1098:24: error: sys/ioccom.h: No such file or directory
configure: failed program was:
#line 1097 "configure"
#include "confdefs.h"
#include <sys/ioccom.h>
configure:1092: checking for sys/sockio.h
configure:1102: gcc -E conftest.c >/dev/null 2>conftest.out
configure:1098:24: error: sys/sockio.h: No such file or directory
configure: failed program was:
#line 1097 "configure"
#include "confdefs.h"
#include <sys/sockio.h>
configure:1131: checking for ANSI ioctl definitions
configure:1155: gcc -c -g -O2 conftest.c 1>&5
configure:1178: checking for ether_hostton
configure:1206: gcc -o conftest -g -O2 conftest.c 1>&5
configure:1178: checking for strerror
configure:1206: gcc -o conftest -g -O2 conftest.c 1>&5
configure:1238: checking packet capture type
configure:1341: checking for net/if_arp.h
configure:1351: gcc -E conftest.c >/dev/null 2>conftest.out
configure:1378: checking Linux kernel version
configure:1419: checking for flex
configure:1452: checking for flex 2.4 or higher
configure:1478: checking for bison
configure:1602: checking for ranlib
configure:1672: checking if sockaddr struct has sa_len member
configure:1686: gcc -c -g -O2 conftest.c 1>&5
configure: In function 'main':
configure:1682: error: 'struct sockaddr' has no member named 'sa_len'
configure: failed program was:
#line 1677 "configure"
#include "confdefs.h"
# include <sys/types.h>
# include <sys/socket.h>
int main() {
u_int i = sizeof(((struct sockaddr *)0)->sa_len)
; return 0; }
configure:1707: checking if unaligned accesses fail
configure:1803: checking for a BSD compatible install

View File

@ -0,0 +1,179 @@
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host bertha:
#
# ./configure
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.
ac_cs_usage="Usage: ./config.status [--recheck] [--version] [--help]"
for ac_option
do
case "$ac_option" in
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
echo "running ${CONFIG_SHELL-/bin/sh} ./configure --no-create --no-recursion"
exec ${CONFIG_SHELL-/bin/sh} ./configure --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
echo "./config.status generated by autoconf version 2.12"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "$ac_cs_usage"; exit 0 ;;
*) echo "$ac_cs_usage"; exit 1 ;;
esac
done
ac_given_srcdir=.
ac_given_INSTALL=" install_elinux -p"
trap 'rm -fr Makefile conftest*; exit 1' 1 2 15
# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\&%]/\\&/g;
s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF
/^[ ]*VPATH[ ]*=[^:]*$/d
s%@CFLAGS@%-g -O2%g
s%@CPPFLAGS@%%g
s%@CXXFLAGS@%%g
s%@DEFS@% -DHAVE_MALLOC_H=1 -DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_NET_IF_ARP_H=1 %g
s%@LDFLAGS@%%g
s%@LIBS@%%g
s%@exec_prefix@%${prefix}%g
s%@prefix@%/usr/local%g
s%@program_transform_name@%s,x,x,%g
s%@bindir@%${exec_prefix}/bin%g
s%@sbindir@%${exec_prefix}/sbin%g
s%@libexecdir@%${exec_prefix}/libexec%g
s%@datadir@%${prefix}/share%g
s%@sysconfdir@%${prefix}/etc%g
s%@sharedstatedir@%${prefix}/com%g
s%@localstatedir@%${prefix}/var%g
s%@libdir@%${exec_prefix}/lib%g
s%@includedir@%${prefix}/include%g
s%@oldincludedir@%/usr/include%g
s%@infodir@%${prefix}/info%g
s%@mandir@%${prefix}/man%g
s%@host@%i686-pc-linux-gnu%g
s%@host_alias@%i686-pc-linux-gnu%g
s%@host_cpu@%i686%g
s%@host_vendor@%pc%g
s%@host_os@%linux-gnu%g
s%@target@%i686-pc-linux-gnu%g
s%@target_alias@%i686-pc-linux-gnu%g
s%@target_cpu@%i686%g
s%@target_vendor@%pc%g
s%@target_os@%linux-gnu%g
s%@build@%i686-pc-linux-gnu%g
s%@build_alias@%i686-pc-linux-gnu%g
s%@build_cpu@%i686%g
s%@build_vendor@%pc%g
s%@build_os@%linux-gnu%g
s%@SHLICC2@%%g
s%@CC@%gcc%g
s%@CPP@%gcc -E%g
s%@V_LEX@%flex -Ppcap_%g
s%@V_YACC@%bison -y -p pcap_%g
s%@V_RANLIB@%ranlib%g
s%@V_CCOPT@%-O2%g
s%@V_INCLS@% -Ilinux-include%g
s%@V_PCAP@%linux%g
s%@INSTALL_PROGRAM@%${INSTALL}%g
s%@INSTALL_DATA@%${INSTALL} -m 644%g
CEOF
# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
if test $ac_beg -gt 1; then
sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
else
sed "${ac_end}q" conftest.subs > conftest.s$ac_file
fi
if test ! -s conftest.s$ac_file; then
ac_more_lines=false
rm -f conftest.s$ac_file
else
if test -z "$ac_sed_cmds"; then
ac_sed_cmds="sed -f conftest.s$ac_file"
else
ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
fi
ac_file=`expr $ac_file + 1`
ac_beg=$ac_end
ac_end=`expr $ac_end + $ac_max_sed_cmds`
fi
done
if test -z "$ac_sed_cmds"; then
ac_sed_cmds=cat
fi
CONFIG_FILES=${CONFIG_FILES-"Makefile"}
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
# Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
case "$ac_file" in
*:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
*) ac_file_in="${ac_file}.in" ;;
esac
# Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
# Remove last slash and all that follows it. Not all systems have dirname.
ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
# The file is in a subdirectory.
test ! -d "$ac_dir" && mkdir "$ac_dir"
ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
# A "../" for each directory in $ac_dir_suffix.
ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
else
ac_dir_suffix= ac_dots=
fi
case "$ac_given_srcdir" in
.) srcdir=.
if test -z "$ac_dots"; then top_srcdir=.
else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
/*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
*) # Relative path.
srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
top_srcdir="$ac_dots$ac_given_srcdir" ;;
esac
case "$ac_given_INSTALL" in
[/$]*) INSTALL="$ac_given_INSTALL" ;;
*) INSTALL="$ac_dots$ac_given_INSTALL" ;;
esac
echo creating "$ac_file"
rm -f "$ac_file"
configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
case "$ac_file" in
*Makefile*) ac_comsub="1i\\
# $configure_input" ;;
*) ac_comsub= ;;
esac
ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
s%@INSTALL@%$INSTALL%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*
exit 0

View File

@ -0,0 +1,927 @@
#! /bin/sh
# Configuration validation subroutine script, version 1.1.
# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
# can handle that machine. It does not imply ALL GNU software can.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument.
# If it is invalid, we print an error message on stderr and exit with code 1.
# Otherwise, we print the canonical config type on stdout and succeed.
# This file is supposed to be the same for all GNU packages
# and recognize all the CPU types, system types and aliases
# that are meaningful with *any* GNU software.
# Each package is responsible for reporting which valid configurations
# it does not support. The user should be able to distinguish
# a failure to support a valid configuration from a meaningless
# configuration.
# The goal of this file is to map all the various variations of a given
# machine specification into a single specification in the form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
# or in some cases, the newer four-part form:
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
# It is wrong to echo any other type of specification.
if [ x$1 = x ]
then
echo Configuration name missing. 1>&2
echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
echo "or $0 ALIAS" 1>&2
echo where ALIAS is a recognized configuration type. 1>&2
exit 1
fi
# First pass through any local machine types.
case $1 in
*local*)
echo $1
exit 0
;;
*)
;;
esac
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
linux-gnu*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
*)
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
if [ $basic_machine != $1 ]
then os=`echo $1 | sed 's/.*-/-/'`
else os=; fi
;;
esac
### Let's recognize common machines as not being operating systems so
### that things like config.sub decstation-3100 work. We also
### recognize some manufacturers as not being operating systems, so we
### can provide default operating systems below.
case $os in
-sun*os*)
# Prevent following clause from handling this invalid input.
;;
-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-apple)
os=
basic_machine=$1
;;
-hiux*)
os=-hiuxwe2
;;
-sco5)
os=sco3.2v5
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco4)
os=-sco3.2v4
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco3.2.[4-9]*)
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco3.2v[4-9]*)
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco*)
os=-sco3.2v2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-isc)
os=-isc2.2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-clix*)
basic_machine=clipper-intergraph
;;
-isc*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-lynx*)
os=-lynxos
;;
-ptx*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
;;
-windowsnt*)
os=`echo $os | sed -e 's/windowsnt/winnt/'`
;;
-psos*)
os=-psos
;;
esac
# Decode aliases for certain CPU-COMPANY combinations.
case $basic_machine in
# Recognize the basic CPU types without company name.
# Some are omitted here because they have special meanings below.
tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \
| arme[lb] | pyramid \
| tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
| alpha | we32k | ns16k | clipper | i370 | sh \
| powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \
| pdp11 | mips64el | mips64orion | mips64orionel \
| sparc | sparclet | sparclite | sparc64)
basic_machine=$basic_machine-unknown
;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
i[3456]86)
basic_machine=$basic_machine-pc
;;
# Object if more than one company name word.
*-*-*)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
# Recognize the basic CPU types with company name.
vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \
| sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
| none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
| hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
| pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
| pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
| mips64el-* | mips64orion-* | mips64orionel-* | f301-*)
;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
basic_machine=m68000-att
;;
3b*)
basic_machine=we32k-att
;;
alliant | fx80)
basic_machine=fx80-alliant
;;
altos | altos3068)
basic_machine=m68k-altos
;;
am29k)
basic_machine=a29k-none
os=-bsd
;;
amdahl)
basic_machine=580-amdahl
os=-sysv
;;
amiga | amiga-*)
basic_machine=m68k-cbm
;;
amigados)
basic_machine=m68k-cbm
os=-amigados
;;
amigaunix | amix)
basic_machine=m68k-cbm
os=-sysv4
;;
apollo68)
basic_machine=m68k-apollo
os=-sysv
;;
aux)
basic_machine=m68k-apple
os=-aux
;;
balance)
basic_machine=ns32k-sequent
os=-dynix
;;
convex-c1)
basic_machine=c1-convex
os=-bsd
;;
convex-c2)
basic_machine=c2-convex
os=-bsd
;;
convex-c32)
basic_machine=c32-convex
os=-bsd
;;
convex-c34)
basic_machine=c34-convex
os=-bsd
;;
convex-c38)
basic_machine=c38-convex
os=-bsd
;;
cray | ymp)
basic_machine=ymp-cray
os=-unicos
;;
cray2)
basic_machine=cray2-cray
os=-unicos
;;
[ctj]90-cray)
basic_machine=c90-cray
os=-unicos
;;
crds | unos)
basic_machine=m68k-crds
;;
da30 | da30-*)
basic_machine=m68k-da30
;;
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
basic_machine=mips-dec
;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
basic_machine=m68k-motorola
;;
delta88)
basic_machine=m88k-motorola
os=-sysv3
;;
dpx20 | dpx20-*)
basic_machine=rs6000-bull
os=-bosx
;;
dpx2* | dpx2*-bull)
basic_machine=m68k-bull
os=-sysv3
;;
ebmon29k)
basic_machine=a29k-amd
os=-ebmon
;;
elxsi)
basic_machine=elxsi-elxsi
os=-bsd
;;
encore | umax | mmax)
basic_machine=ns32k-encore
;;
fx2800)
basic_machine=i860-alliant
;;
genix)
basic_machine=ns32k-ns
;;
gmicro)
basic_machine=tron-gmicro
os=-sysv
;;
h3050r* | hiux*)
basic_machine=hppa1.1-hitachi
os=-hiuxwe2
;;
h8300hms)
basic_machine=h8300-hitachi
os=-hms
;;
harris)
basic_machine=m88k-harris
os=-sysv3
;;
hp300-*)
basic_machine=m68k-hp
;;
hp300bsd)
basic_machine=m68k-hp
os=-bsd
;;
hp300hpux)
basic_machine=m68k-hp
os=-hpux
;;
hp9k2[0-9][0-9] | hp9k31[0-9])
basic_machine=m68000-hp
;;
hp9k3[2-9][0-9])
basic_machine=m68k-hp
;;
hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
basic_machine=hppa1.1-hp
;;
hp9k8[0-9][0-9] | hp8[0-9][0-9])
basic_machine=hppa1.0-hp
;;
hppa-next)
os=-nextstep3
;;
i370-ibm* | ibm*)
basic_machine=i370-ibm
os=-mvs
;;
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
i[3456]86v32)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv32
;;
i[3456]86v4*)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv4
;;
i[3456]86v)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv
;;
i[3456]86sol2)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-solaris2
;;
iris | iris4d)
basic_machine=mips-sgi
case $os in
-irix*)
;;
*)
os=-irix4
;;
esac
;;
isi68 | isi)
basic_machine=m68k-isi
os=-sysv
;;
m88k-omron*)
basic_machine=m88k-omron
;;
magnum | m3230)
basic_machine=mips-mips
os=-sysv
;;
merlin)
basic_machine=ns32k-utek
os=-sysv
;;
miniframe)
basic_machine=m68000-convergent
;;
mips3*-*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
;;
mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;;
ncr3000)
basic_machine=i486-ncr
os=-sysv4
;;
news | news700 | news800 | news900)
basic_machine=m68k-sony
os=-newsos
;;
news1000)
basic_machine=m68030-sony
os=-newsos
;;
news-3600 | risc-news)
basic_machine=mips-sony
os=-newsos
;;
next | m*-next )
basic_machine=m68k-next
case $os in
-nextstep* )
;;
-ns2*)
os=-nextstep2
;;
*)
os=-nextstep3
;;
esac
;;
nh3000)
basic_machine=m68k-harris
os=-cxux
;;
nh[45]000)
basic_machine=m88k-harris
os=-cxux
;;
nindy960)
basic_machine=i960-intel
os=-nindy
;;
np1)
basic_machine=np1-gould
;;
pa-hitachi)
basic_machine=hppa1.1-hitachi
os=-hiuxwe2
;;
paragon)
basic_machine=i860-intel
os=-osf
;;
pbd)
basic_machine=sparc-tti
;;
pbb)
basic_machine=m68k-tti
;;
pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
pentium | p5)
basic_machine=i586-intel
;;
pentiumpro | p6)
basic_machine=i686-intel
;;
pentium-* | p5-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumpro-* | p6-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
k5)
# We don't have specific support for AMD's K5 yet, so just call it a Pentium
basic_machine=i586-amd
;;
nexen)
# We don't have specific support for Nexgen yet, so just call it a Pentium
basic_machine=i586-nexgen
;;
pn)
basic_machine=pn-gould
;;
power) basic_machine=rs6000-ibm
;;
ppc) basic_machine=powerpc-unknown
;;
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
;;
ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ps2)
basic_machine=i386-ibm
;;
rm[46]00)
basic_machine=mips-siemens
;;
rtpc | rtpc-*)
basic_machine=romp-ibm
;;
sequent)
basic_machine=i386-sequent
;;
sh)
basic_machine=sh-hitachi
os=-hms
;;
sps7)
basic_machine=m68k-bull
os=-sysv2
;;
spur)
basic_machine=spur-unknown
;;
sun2)
basic_machine=m68000-sun
;;
sun2os3)
basic_machine=m68000-sun
os=-sunos3
;;
sun2os4)
basic_machine=m68000-sun
os=-sunos4
;;
sun3os3)
basic_machine=m68k-sun
os=-sunos3
;;
sun3os4)
basic_machine=m68k-sun
os=-sunos4
;;
sun4os3)
basic_machine=sparc-sun
os=-sunos3
;;
sun4os4)
basic_machine=sparc-sun
os=-sunos4
;;
sun4sol2)
basic_machine=sparc-sun
os=-solaris2
;;
sun3 | sun3-*)
basic_machine=m68k-sun
;;
sun4)
basic_machine=sparc-sun
;;
sun386 | sun386i | roadrunner)
basic_machine=i386-sun
;;
symmetry)
basic_machine=i386-sequent
os=-dynix
;;
tower | tower-32)
basic_machine=m68k-ncr
;;
udi29k)
basic_machine=a29k-amd
os=-udi
;;
ultra3)
basic_machine=a29k-nyu
os=-sym1
;;
vaxv)
basic_machine=vax-dec
os=-sysv
;;
vms)
basic_machine=vax-dec
os=-vms
;;
vpp*|vx|vx-*)
basic_machine=f301-fujitsu
;;
vxworks960)
basic_machine=i960-wrs
os=-vxworks
;;
vxworks68)
basic_machine=m68k-wrs
os=-vxworks
;;
vxworks29k)
basic_machine=a29k-wrs
os=-vxworks
;;
xmp)
basic_machine=xmp-cray
os=-unicos
;;
xps | xps100)
basic_machine=xps100-honeywell
;;
none)
basic_machine=none-none
os=-none
;;
# Here we handle the default manufacturer of certain CPU types. It is in
# some cases the only manufacturer, in others, it is the most popular.
mips)
basic_machine=mips-mips
;;
romp)
basic_machine=romp-ibm
;;
rs6000)
basic_machine=rs6000-ibm
;;
vax)
basic_machine=vax-dec
;;
pdp11)
basic_machine=pdp11-dec
;;
we32k)
basic_machine=we32k-att
;;
sparc)
basic_machine=sparc-sun
;;
cydra)
basic_machine=cydra-cydrome
;;
orion)
basic_machine=orion-highlevel
;;
orion105)
basic_machine=clipper-highlevel
;;
*)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
esac
# Here we canonicalize certain aliases for manufacturers.
case $basic_machine in
*-digital*)
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
;;
*-commodore*)
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
;;
*)
;;
esac
# Decode manufacturer-specific aliases for certain operating systems.
if [ x"$os" != x"" ]
then
case $os in
# First match some system type aliases
# that might get confused with valid system types.
# -solaris* is a basic system type, with this one exception.
-solaris1 | -solaris1.*)
os=`echo $os | sed -e 's|solaris1|sunos4|'`
;;
-solaris)
os=-solaris2
;;
-unixware* | svr4*)
os=-sysv4
;;
-gnu/linux*)
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
;;
# First accept the basic system types.
# The portable systems comes first.
# Each alternative MUST END IN A *, to match a version number.
# -sysv* is not here because it comes later, after sysvr4.
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
| -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -linux-gnu* | -uxpv*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-linux*)
os=`echo $os | sed -e 's|linux|linux-gnu|'`
;;
-sunos5*)
os=`echo $os | sed -e 's|sunos5|solaris2|'`
;;
-sunos6*)
os=`echo $os | sed -e 's|sunos6|solaris3|'`
;;
-osfrose*)
os=-osfrose
;;
-osf*)
os=-osf
;;
-utek*)
os=-bsd
;;
-dynix*)
os=-bsd
;;
-acis*)
os=-aos
;;
-ctix* | -uts*)
os=-sysv
;;
-ns2 )
os=-nextstep2
;;
# Preserve the version number of sinix5.
-sinix5.*)
os=`echo $os | sed -e 's|sinix|sysv|'`
;;
-sinix*)
os=-sysv4
;;
-triton*)
os=-sysv3
;;
-oss*)
os=-sysv3
;;
-svr4)
os=-sysv4
;;
-svr3)
os=-sysv3
;;
-sysvr4)
os=-sysv4
;;
# This must come after -sysvr4.
-sysv*)
;;
-xenix)
os=-xenix
;;
-none)
;;
*)
# Get rid of the `-' at the beginning of $os.
os=`echo $os | sed 's/[^-]*-//'`
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
exit 1
;;
esac
else
# Here we handle the default operating systems that come with various machines.
# The value should be what the vendor currently ships out the door with their
# machine or put another way, the most popular os provided with the machine.
# Note that if you're going to try to match "-MANUFACTURER" here (say,
# "-sun"), then you have to tell the case statement up towards the top
# that MANUFACTURER isn't an operating system. Otherwise, code above
# will signal an error saying that MANUFACTURER isn't an operating
# system, and we'll never get to this point.
case $basic_machine in
*-acorn)
os=-riscix1.2
;;
arm*-semi)
os=-aout
;;
pdp11-*)
os=-none
;;
*-dec | vax-*)
os=-ultrix4.2
;;
m68*-apollo)
os=-domain
;;
i386-sun)
os=-sunos4.0.2
;;
m68000-sun)
os=-sunos3
# This also exists in the configure program, but was not the
# default.
# os=-sunos4
;;
*-tti) # must be before sparc entry or we get the wrong os.
os=-sysv3
;;
sparc-* | *-sun)
os=-sunos4.1.1
;;
*-ibm)
os=-aix
;;
*-hp)
os=-hpux
;;
*-hitachi)
os=-hiux
;;
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
os=-sysv
;;
*-cbm)
os=-amigados
;;
*-dg)
os=-dgux
;;
*-dolphin)
os=-sysv3
;;
m68k-ccur)
os=-rtu
;;
m88k-omron*)
os=-luna
;;
*-next )
os=-nextstep
;;
*-sequent)
os=-ptx
;;
*-crds)
os=-unos
;;
*-ns)
os=-genix
;;
i370-*)
os=-mvs
;;
*-next)
os=-nextstep3
;;
*-gould)
os=-sysv
;;
*-highlevel)
os=-bsd
;;
*-encore)
os=-bsd
;;
*-sgi)
os=-irix
;;
*-siemens)
os=-sysv4
;;
*-masscomp)
os=-rtu
;;
f301-fujitsu)
os=-uxpv
;;
*)
os=-none
;;
esac
fi
# Here we handle the case where we know the os, and the CPU type, but not the
# manufacturer. We pick the logical manufacturer.
vendor=unknown
case $basic_machine in
*-unknown)
case $os in
-riscix*)
vendor=acorn
;;
-sunos*)
vendor=sun
;;
-aix*)
vendor=ibm
;;
-hpux*)
vendor=hp
;;
-hiux*)
vendor=hitachi
;;
-unos*)
vendor=crds
;;
-dgux*)
vendor=dg
;;
-luna*)
vendor=omron
;;
-genix*)
vendor=ns
;;
-mvs*)
vendor=ibm
;;
-ptx*)
vendor=sequent
;;
-vxsim* | -vxworks*)
vendor=wrs
;;
-aux*)
vendor=apple
;;
esac
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
;;
esac
echo $basic_machine$os

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,189 @@
dnl @(#) $Header: /usr/local/cvs/linux/tools/build/e100boot/libpcap-0.4/configure.in,v 1.1 1999/08/26 10:05:21 johana Exp $ (LBL)
dnl
dnl Copyright (c) 1994, 1995, 1996, 1997
dnl The Regents of the University of California. All rights reserved.
dnl
dnl Process this file with autoconf to produce a configure script.
dnl
AC_INIT(pcap.c)
AC_CANONICAL_SYSTEM
umask 002
if test -z "$PWD" ; then
PWD=`pwd`
fi
AC_LBL_C_INIT(V_CCOPT, V_INCLS)
AC_CHECK_HEADERS(malloc.h sys/ioccom.h sys/sockio.h)
AC_LBL_FIXINCLUDES
AC_CHECK_FUNCS(ether_hostton strerror)
dnl
dnl Not all versions of test support -c (character special) but it's a
dnl better way of testing since the device might be protected. So we
dnl check in our normal order using -r and then check the for the /dev
dnl guys again using -c.
dnl
AC_ARG_WITH(pcap, [ --with-pcap=TYPE use packet capture TYPE])
AC_MSG_CHECKING(packet capture type)
if test ! -z "$with_pcap" ; then
V_PCAP="$withval"
elif test -r /dev/bpf0 ; then
V_PCAP=bpf
elif test -r /usr/include/net/pfilt.h ; then
V_PCAP=pf
elif test -r /dev/enet ; then
V_PCAP=enet
elif test -r /dev/nit ; then
V_PCAP=snit
elif test -r /usr/include/sys/net/nit.h ; then
V_PCAP=nit
elif test -r /usr/include/net/raw.h ; then
V_PCAP=snoop
elif test -r /usr/include/sys/dlpi.h ; then
V_PCAP=dlpi
elif test -r /usr/include/linux/socket.h ; then
V_PCAP=linux
elif test -c /dev/bpf0 ; then # check again in case not readable
V_PCAP=bpf
elif test -c /dev/enet ; then # check again in case not readable
V_PCAP=enet
elif test -c /dev/nit ; then # check again in case not readable
V_PCAP=snit
else
V_PCAP=null
fi
AC_MSG_RESULT($V_PCAP)
case "$V_PCAP" in
dlpi)
AC_CHECK_HEADERS(sys/bufmod.h sys/dlpi_ext.h)
AC_MSG_CHECKING(for /dev/dlpi device)
if test -c /dev/dlpi ; then
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_DEV_DLPI)
else
AC_MSG_RESULT(no)
dir="/dev/dlpi"
AC_MSG_CHECKING(for $dir directory)
if test -d $dir ; then
AC_MSG_RESULT(yes)
AC_DEFINE_UNQUOTED(PCAP_DEV_PREFIX, "$dir")
else
AC_MSG_RESULT(no)
fi
fi
;;
linux)
AC_CHECK_HEADERS(net/if_arp.h)
AC_MSG_CHECKING(Linux kernel version)
AC_CACHE_VAL(ac_cv_linux_vers,
ac_cv_linux_vers=`uname -r 2>&1 | \
sed -n -e '$s/.* //' -e '$s/\..*//p'`)
AC_MSG_RESULT($ac_cv_linux_vers)
if test $ac_cv_linux_vers -lt 2 ; then
AC_MSG_ERROR(version 2 or higher required; see the INSTALL doc for more info)
fi
;;
null)
AC_MSG_WARN(cannot determine packet capture interface)
AC_MSG_WARN((see the INSTALL doc for more info))
;;
esac
AC_LBL_LEX_AND_YACC(V_LEX, V_YACC, pcap_)
case "$target_os" in
aix*)
dnl Workaround to enable certain features
AC_DEFINE(_SUN)
;;
hpux9*)
AC_DEFINE(HAVE_HPUX9)
;;
hpux10.0*)
;;
hpux10.1*)
;;
hpux*)
dnl HPUX 10.20 and above is similar to HPUX 9...
AC_DEFINE(HAVE_HPUX10_20)
;;
sinix*)
AC_MSG_CHECKING(if SINIX compiler defines sinix)
AC_CACHE_VAL(ac_cv_cc_sinix_defined,
AC_TRY_COMPILE(
[],
[int i = sinix;],
ac_cv_cc_sinix_defined=yes,
ac_cv_cc_sinix_defined=no))
AC_MSG_RESULT($ac_cv_cc_sinix_defined)
if test $ac_cv_cc_sinix_defined = no ; then
AC_DEFINE(sinix)
fi
;;
solaris*)
AC_DEFINE(HAVE_SOLARIS)
;;
linux*)
V_INCLS="$V_INCLS -Ilinux-include"
;;
esac
AC_CHECK_PROGS(V_RANLIB, ranlib, @true)
AC_LBL_DEVEL(V_CCOPT)
AC_LBL_SOCKADDR_SA_LEN
AC_LBL_UNALIGNED_ACCESS
if test "${srcdir}" = "." ; then
srcdirprefix=""
else
srcdirprefix="./"
fi
if test -r ${srcdirprefix}lbl/gnuc.h ; then
rm -f gnuc.h
ln -s ${srcdirprefix}lbl/gnuc.h gnuc.h
fi
rm -f bpf_filter.c
ln -s ${srcdirprefix}bpf/net/bpf_filter.c bpf_filter.c
rm -f net
ln -s ${srcdirprefix}bpf/net net
AC_SUBST(V_CCOPT)
AC_SUBST(V_INCLS)
AC_SUBST(V_LEX)
AC_SUBST(V_PCAP)
AC_SUBST(V_RANLIB)
AC_SUBST(V_YACC)
AC_PROG_INSTALL
AC_OUTPUT(Makefile)
if test -f .devel ; then
make depend
fi
exit 0

Some files were not shown because too many files have changed in this diff Show More