diff options
35 files changed, 6052 insertions, 0 deletions
| diff --git a/board/RPXlite/Makefile b/board/RPXlite/Makefile new file mode 100644 index 000000000..ef173d036 --- /dev/null +++ b/board/RPXlite/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/cogent/u-boot.lds b/board/cogent/u-boot.lds new file mode 100644 index 000000000..c3474b455 --- /dev/null +++ b/board/cogent/u-boot.lds @@ -0,0 +1,121 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    *(.text) +    common/environment.o(.text) +    *(.fixup) +    *(.got1) +  } +  _etext = .; +  PROVIDE (etext = .); +  .rodata    : +  { +    *(.rodata) +    *(.rodata1) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x0FFF) & 0xFFFFF000; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __fixup_entries = (. - _FIXUP_TABLE_)>>2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(4096); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(4096); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} + diff --git a/board/esteem192e/Makefile b/board/esteem192e/Makefile new file mode 100644 index 000000000..ef173d036 --- /dev/null +++ b/board/esteem192e/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/etx094/Makefile b/board/etx094/Makefile new file mode 100644 index 000000000..ef173d036 --- /dev/null +++ b/board/etx094/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/fads/Makefile b/board/fads/Makefile new file mode 100644 index 000000000..20a19b998 --- /dev/null +++ b/board/fads/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o lamp.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/hermes/Makefile b/board/hermes/Makefile new file mode 100644 index 000000000..ef173d036 --- /dev/null +++ b/board/hermes/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/ip860/Makefile b/board/ip860/Makefile new file mode 100644 index 000000000..ef173d036 --- /dev/null +++ b/board/ip860/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/lwmon/Makefile b/board/lwmon/Makefile new file mode 100644 index 000000000..35b84288d --- /dev/null +++ b/board/lwmon/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2001 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/lwmon/u-boot.lds b/board/lwmon/u-boot.lds new file mode 100644 index 000000000..6e5252cf7 --- /dev/null +++ b/board/lwmon/u-boot.lds @@ -0,0 +1,122 @@ +/* + * (C) Copyright 2001 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)	} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)	} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)	} +  .rela.got      : { *(.rela.got)	} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)	} +  .rela.bss      : { *(.rela.bss)	} +  .rel.plt       : { *(.rel.plt)	} +  .rela.plt      : { *(.rela.plt)	} +  .init          : { *(.init)		} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc8xx/start.o	(.text) +    common/environment.o(.text) +    *(.text) +    *(.fixup) +    *(.got1) +  } +  _etext = .; +  PROVIDE (etext = .); +  .rodata    : +  { +    *(.rodata) +    *(.rodata1) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x0FF) & 0xFFFFFF00; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __fixup_entries = (. - _FIXUP_TABLE_)>>2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(256); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(256); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} + diff --git a/board/mbx8xx/Makefile b/board/mbx8xx/Makefile new file mode 100644 index 000000000..f8fb581e7 --- /dev/null +++ b/board/mbx8xx/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o vpd.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/mbx8xx/csr.h b/board/mbx8xx/csr.h new file mode 100644 index 000000000..832e9241f --- /dev/null +++ b/board/mbx8xx/csr.h @@ -0,0 +1,60 @@ +#ifndef __csr_h +#define __csr_h + +/* + * (C) Copyright 2000 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Marius Groeger <mgroeger@sysgo.de> + * + * Control and Status Register definitions for the MBX + * + *-------------------------------------------------------------------- + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +/* bits for control register #1 / status register #1 */ +#define CSR1_ETEN       0x80    /* Ethernet Transceiver Enabled             */ +#define CSR1_ELEN       0x40    /* Ethernet XCVR in Internal Loopback       */ +#define CSR1_EAEN       0x20    /* Auto selection TP/AUI Enabled            */ +#define CSR1_TPEN       0x10    /* TP manually selected                     */ +#define CSR1_FDDIS      0x08    /* Full Duplex Mode disabled                */ +#define CSR1_FCTEN      0x04    /* Collision Testing of XCVR disabled       */ +#define CSR1_COM1EN     0x02    /* COM1 signals routed to RS232 Transceiver */ +#define CSR1_XCVRDIS    0x01    /* Onboard RS232 Transceiver Disabled       */ + +/* bits for control register #2 */ +#define CR2_VDDSEL      0xC0    /* PCMCIA Supply Voltage                    */ +#define CR2_VPPSEL      0x30    /* PCMCIA Programming Voltage               */ +#define CR2_BRDFAIL     0x08    /* Board fail                               */ +#define CR2_SWS1        0x04    /* Software Status #2 LED                   */ +#define CR2_SWS2        0x02    /* Software Status #2 LED                   */ +#define CR2_QSPANRST    0x01    /* Reset QSPAN                              */ + +/* bits for status register #2 */ +#define SR2_VDDSEL      0xC0    /* PCMCIA Supply Voltage                    */ +#define SR2_VPPSEL      0x30    /* PCMCIA Programming Voltage               */ +#define SR2_BATGD       0x08    /* Low Voltage indication for onboard bat   */ +#define SR2_NVBATGD     0x04    /* Low Voltage indication for NVRAM         */ +#define SR2_RDY         0x02    /* Flash programming status bit             */ +#define SR2_FT          0x01    /* Reserved for Factory test purposes       */ + +#define MBX_CSR1 (*((uchar *)CFG_CSR_BASE)) +#define MBX_CSR2 (*((uchar *)CFG_CSR_BASE + 1)) + +#endif /* __csr_h */ diff --git a/board/mbx8xx/dimm.h b/board/mbx8xx/dimm.h new file mode 100644 index 000000000..b40f11235 --- /dev/null +++ b/board/mbx8xx/dimm.h @@ -0,0 +1,98 @@ +#ifndef __dimm_h +#define __dimm_h + +/* + * Module name: %M% + * Description: + * Serial Presence Detect Definitions Module + * SCCS identification: %I% + * Branch: %B% + * Sequence: %S% + * Date newest applied delta was created (MM/DD/YY): %G% + * Time newest applied delta was created (HH:MM:SS): %U% + * SCCS file name %F% + * Fully qualified SCCS file name: + * %P% + * Copyright: + * (C) COPYRIGHT MOTOROLA, INC. 1996 + * ALL RIGHTS RESERVED + * Notes: + * 1. All data was taken from an IBM application note titled + * "Serial Presence Detect Definitions". + * History: + * Date Who + * + * 10/24/96 Rob Baxter + * Initial release. + * + */ + +/* + * serial PD byte assignment address map (256 byte EEPROM) + */ +typedef struct dimm +{ +	uchar n_bytes; /* 00 number of bytes written/used */ +	uchar t_bytes; /* 01 total number of bytes in serial PD device */ +	uchar fmt; /* 02 fundamental memory type (FPM/EDO/SDRAM) */ +	uchar n_row; /* 03 number of rows */ +	uchar n_col; /* 04 number of columns */ +	uchar n_banks; /* 05 number of banks */ +	uchar data_w_lo; /* 06 data width */ +	uchar data_w_hi; /* 07 data width */ +	uchar ifl; /* 08 interface levels */ +	uchar a_ras; /* 09 RAS access */ +	uchar a_cas; /* 0A CAS access */ +	uchar ct; /* 0B configuration type (non-parity/parity/ECC) */ +	uchar refresh_rt; /* 0C refresh rate/type */ +	uchar p_dram_o; /* 0D primary DRAM organization */ +	uchar s_dram_o; /* 0E secondary DRAM organization (parity/ECC-checkbits) */ +	uchar reserved[17]; /* 0F reserved fields for future offerings */ +	uchar ss_info[32]; /* 20 superset information (may be used in the future) */ +	uchar m_info[64]; /* 40 manufacturer information (optional) */ +	uchar unused[128]; /* 80 unused storage locations */ +} dimm_t; + +/* + * memory type definitions + */ +#define DIMM_MT_FPM 1 /* standard FPM (fast page mode) DRAM */ +#define DIMM_MT_EDO 2 /* EDO (extended data out) */ +#define DIMM_MT_PN 3 /* pipelined nibble */ +#define DIMM_MT_SDRAM 4 /* SDRAM (synchronous DRAM) */ + +/* + * row addresses definitions + */ +#define DIMM_RA_RDNDNT (1<<7) /* redundant addressing */ +#define DIMM_RA_MASK 0x7f /* number of row addresses mask */ + +/* + * module interface levels definitions + */ +#define DIMM_IFL_TTL 0 /* TTL/5V tolerant */ +#define DIMM_IFL_LVTTL 1 /* LVTTL (not 5V tolerant) */ +#define DIMM_IFL_HSTL15 2 /* HSTL 1.5 */ +#define DIMM_IFL_SSTL33 3 /* SSTL 3.3 */ +#define DIMM_IFL_SSTL25 4 /* SSTL 2.5 */ + +/* + * DIMM configuration type definitions + */ +#define DIMM_CT_NONE 0 /* none */ +#define DIMM_CT_PARITY 1 /* parity */ +#define DIMM_CT_ECC 2 /* ECC */ + +/* + * row addresses definitions + */ +#define DIMM_RRT_SR (1<<7) /* self refresh flag */ +#define DIMM_RRT_MASK 0x7f /* refresh rate mask */ +#define DIMM_RRT_NRML 0x00 /* normal (15.625us) */ +#define DIMM_RRT_R_3_9 0x01 /* reduced .25x (3.9us) */ +#define DIMM_RRT_R_7_8 0x02 /* reduced .5x (7.8us) */ +#define DIMM_RRT_E_31_3 0x03 /* extended 2x (31.3us) */ +#define DIMM_RRT_E_62_5 0x04 /* extended 4x (62.5us) */ +#define DIMM_RRT_E_125 0x05 /* extended 8x (125us) */ + +#endif /* __dimm_h */ diff --git a/board/mbx8xx/u-boot.lds b/board/mbx8xx/u-boot.lds new file mode 100644 index 000000000..d647be362 --- /dev/null +++ b/board/mbx8xx/u-boot.lds @@ -0,0 +1,122 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc8xx/start.o	(.text) + +    *(.text) +    *(.fixup) +    *(.got1) +  } +  _etext = .; +  PROVIDE (etext = .); +  .rodata    : +  { +    *(.rodata) +    *(.rodata1) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x00FF) & 0xFFFFFF00; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __fixup_entries = (. - _FIXUP_TABLE_)>>2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(256); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(256); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} + diff --git a/board/mbx8xx/vpd.h b/board/mbx8xx/vpd.h new file mode 100644 index 000000000..1d9eb7fe2 --- /dev/null +++ b/board/mbx8xx/vpd.h @@ -0,0 +1,119 @@ +#ifndef __vpd_h +#define __vpd_h + +/* + * Module name: %M% + * Description: + * Vital Product Data (VPD) Header Module + * SCCS identification: %I% + * Branch: %B% + * Sequence: %S% + * Date newest applied delta was created (MM/DD/YY): %G% + * Time newest applied delta was created (HH:MM:SS): %U% + * SCCS file name %F% + * Fully qualified SCCS file name: + * %P% + * Copyright: + * (C) COPYRIGHT MOTOROLA, INC. 1996 + * ALL RIGHTS RESERVED + * Notes: + * History: + * Date Who + * + * 10/24/96 Rob Baxter + * Initial release. + * + */ + +#define VPD_EEPROM_SIZE 256 /* EEPROM size in bytes */ + +/* + * packet tuple identifiers + * + * 0x0D - 0xBF reserved + * 0xC0 - 0xFE user defined + */ +#define VPD_PID_GI   0x00 /* guaranteed illegal */ +#define VPD_PID_PID  0x01 /* product identifier (ASCII) */ +#define VPD_PID_FAN  0x02 /* factory assembly-number (ASCII) */ +#define VPD_PID_SN   0x03 /* serial-number (ASCII) */ +#define VPD_PID_PCO  0x04 /* product configuration options(binary) */ +#define VPD_PID_ICS  0x05 /* internal clock speed in HZ (integer) */ +#define VPD_PID_ECS  0x06 /* external clock speed in HZ (integer) */ +#define VPD_PID_RCS  0x07 /* reference clock speed in HZ(integer) */ +#define VPD_PID_EA   0x08 /* ethernet address (binary) */ +#define VPD_PID_MT   0x09 /* microprocessor type (ASCII) */ +#define VPD_PID_CRC  0x0A /* EEPROM CRC (integer) */ +#define VPD_PID_FMC  0x0B /* FLASH memory configuration (binary) */ +#define VPD_PID_VLSI 0x0C /* VLSI revisions/versions (binary) */ +#define VPD_PID_TERM 0xFF /* termination */ + +/* + * VPD structure (format) + */ +#define VPD_EYE_SIZE 8 /* eyecatcher size */ +typedef struct vpd_header +{ +	uchar eyecatcher[VPD_EYE_SIZE]; /* eyecatcher - "MOTOROLA" */ +	ushort size; /* size of EEPROM */ +} vpd_header_t; + +#define VPD_DATA_SIZE (VPD_EEPROM_SIZE-sizeof(vpd_header_t)) +typedef struct vpd +{ +	vpd_header_t header; /* header */ +	uchar packets[VPD_DATA_SIZE]; /* data */ +} vpd_t; + +/* + * packet tuple structure (format) + */ +typedef struct vpd_packet +{ +    uchar identifier; /* identifier (PIDs above) */ +    uchar size;       /* size of the following data area */ +    uchar data[1];    /* data (size is dependent upon PID) */ +} vpd_packet_t; + +/* + * MBX product configuration options bit definitions + * + * Notes: + * 1. The bit numbering is reversed in perspective with the C compiler. + */ +#define PCO_BBRAM    (1<<0)  /* battery-backed RAM (BBRAM) and socket */ +#define PCO_BOOTROM  (1<<1)  /* boot ROM and socket (i.e., socketed FLASH) */ +#define PCO_KAPWR    (1<<2)  /* keep alive power source (lithium battey) and control circuit */ +#define PCO_ENET_TP  (1<<3)  /* ethernet twisted pair (TP) connector (RJ45) */ +#define PCO_ENET_AUI (1<<4)  /* ethernet attachment unit interface (AUI) header */ +#define PCO_PCMCIA   (1<<5)  /* PCMCIA socket */ +#define PCO_DIMM     (1<<6)  /* DIMM module socket */ +#define PCO_DTT      (1<<7)  /* digital thermometer and thermostat (DTT) device */ +#define PCO_LCD      (1<<8)  /* liquid crystal display (LCD) device */ +#define PCO_PCI      (1<<9)  /* PCI-Bus bridge device (QSpan) and ISA-Bus bridge device (Winbond) */ +#define PCO_PCIO     (1<<10) /* PC I/O (COM1, COM2, FDC, LPT, Keyboard/Mouse) */ +#define PCO_EIDE     (1<<11) /* enhanced IDE (EIDE) header */ +#define PCO_FDC      (1<<12) /* floppy disk controller (FDC) header */ +#define PCO_LPT_8XX  (1<<13) /* parallel port header via MPC8xx */ +#define PCO_LPT_PCIO (1<<14) /* parallel port header via PC I/O */ + +/* + * FLASH memory configuration packet data + */ +typedef struct vpd_fmc +{ +    ushort mid; /* manufacturer's idenitfier */ +    ushort did; /* manufacturer's device idenitfier */ +    uchar ddw;  /* device data width (e.g., 8-bits, 16-bits) */ +    uchar nod;  /* number of devices present */ +    uchar noc;  /* number of columns */ +    uchar cw;   /* column width in bits */ +    uchar wedw; /* write/erase data width */ +} vpd_fmc_t; + +/* function prototypes */ +extern void vpd_init(void); +extern int  vpd_read(uint iic_device, uchar *buf, int count, int offset); +extern      vpd_packet_t *vpd_find_packet(u_char ident); + +#endif /* __vpd_h */ diff --git a/board/rpxsuper/u-boot.lds b/board/rpxsuper/u-boot.lds new file mode 100644 index 000000000..1572aca48 --- /dev/null +++ b/board/rpxsuper/u-boot.lds @@ -0,0 +1,117 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc8260/start.o	(.text) +    *(.text) +    *(.fixup) +    *(.got1) +    . = ALIGN(16); +    *(.rodata) +    *(.rodata1) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x0FFF) & 0xFFFFF000; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __fixup_entries = (. - _FIXUP_TABLE_) >> 2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(4096); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(4096); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} + diff --git a/board/rsdproto/flash_asm.S b/board/rsdproto/flash_asm.S new file mode 100644 index 000000000..c65fb8704 --- /dev/null +++ b/board/rsdproto/flash_asm.S @@ -0,0 +1,39 @@ +/* + * -*- mode:c -*- + * + * (C) Copyright 2000 + * Marius Groeger <mgroeger@sysgo.de> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * + * void ull_write(unsigned long long volatile *address, + *                unsigned long long volatile *data) + * r3 = address + * r4 = data + * + * void ull_read(unsigned long long volatile *address, + *                unsigned long long volatile *data) + * r3 = address + * r4 = data + * + * Uses the floating point unit to read and write 64 bit wide + * data (unsigned long long) on the 60x bus. This is necessary + * because all 4 flash chips use the /WE line from byte lane 0 + * + * IMPORTANT: data should always be 8-aligned, otherwise an exception will + * occur. + */ + +#include <ppc_asm.tmpl> +#include <ppc_defs.h> + +.globl	ull_write +ull_write: +	lfd		0,0(r4) +	stfd	0,0(r3) +	blr + +	.globl	ull_read +ull_read: +	lfd		0, 0(r3) +	stfd	0, 0(r4) +	blr diff --git a/board/rsdproto/u-boot.lds b/board/rsdproto/u-boot.lds new file mode 100644 index 000000000..7425be6bb --- /dev/null +++ b/board/rsdproto/u-boot.lds @@ -0,0 +1,122 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc8260/start.o	(.text) +    *(.text) +    *(.fixup) +    *(.got1) +    /*. = env_offset; */ +  } +  _etext = .; +  PROVIDE (etext = .); +  .rodata    : +  { +    *(.rodata) +    *(.rodata1) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x0FFF) & 0xFFFFF000; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __fixup_entries = (. - _FIXUP_TABLE_)>>2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(4096); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(4096); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} + diff --git a/board/sandpoint/speed.h b/board/sandpoint/speed.h new file mode 100644 index 000000000..b66393bec --- /dev/null +++ b/board/sandpoint/speed.h @@ -0,0 +1,54 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +/*----------------------------------------------------------------------- + * Timer value for timer 2, ICLK = 10 + * + * SPEED_FCOUNT2 =  GCLK / (16 * (TIMER_TMR_PS + 1)) + * SPEED_TMR3_PS = (GCLK / (16 * SPEED_FCOUNT3)) - 1 + * + * SPEED_FCOUNT2	timer 2 counting frequency + * GCLK	      		CPU clock + * SPEED_TMR2_PS	prescaler + */ +#define SPEED_TMR2_PS  	(250 - 1)	/* divide by 250	*/ + +/*----------------------------------------------------------------------- + * Timer value for PIT + * + * PIT_TIME = SPEED_PITC / PITRTCLK + * PITRTCLK = 8192 + */ +#define SPEED_PITC	(82 << 16)	/* start counting from 82	*/ + +/* + * The new value for PTA is calculated from + * + *	PTA = (gclk * Trefresh) / (2 ^ (2 * DFBRG) * PTP * NCS) + * + * gclk		CPU clock (not bus clock !) + * Trefresh	Refresh cycle * 4 (four word bursts used) + * DFBRG	For normal mode (no clock reduction) always 0 + * PTP		Prescaler (already adjusted for no. of banks and 4K / 8K refresh) + * NCS		Number of SDRAM banks (chip selects) on this UPM. + */ diff --git a/board/sbc8260/u-boot.lds b/board/sbc8260/u-boot.lds new file mode 100644 index 000000000..1572aca48 --- /dev/null +++ b/board/sbc8260/u-boot.lds @@ -0,0 +1,117 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc8260/start.o	(.text) +    *(.text) +    *(.fixup) +    *(.got1) +    . = ALIGN(16); +    *(.rodata) +    *(.rodata1) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x0FFF) & 0xFFFFF000; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __fixup_entries = (. - _FIXUP_TABLE_) >> 2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(4096); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(4096); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} + diff --git a/board/sixnet/Makefile b/board/sixnet/Makefile new file mode 100644 index 000000000..ef173d036 --- /dev/null +++ b/board/sixnet/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/sixnet/u-boot.lds b/board/sixnet/u-boot.lds new file mode 100644 index 000000000..25a170bb2 --- /dev/null +++ b/board/sixnet/u-boot.lds @@ -0,0 +1,122 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc8xx/start.o	(.text) +    common/environment.o(.text) +    *(.text) +    *(.fixup) +    *(.got1) +  } +  _etext = .; +  PROVIDE (etext = .); +  .rodata    : +  { +    *(.rodata) +    *(.rodata1) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x0FFF) & 0xFFFFF000; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __fixup_entries = (. - _FIXUP_TABLE_)>>2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(4096); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(4096); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} + diff --git a/board/spd8xx/Makefile b/board/spd8xx/Makefile new file mode 100644 index 000000000..ef173d036 --- /dev/null +++ b/board/spd8xx/Makefile @@ -0,0 +1,40 @@ +# +# (C) Copyright 2000 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o flash.o + +$(LIB):	.depend $(OBJS) +	$(AR) crv $@ $^ + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/spd8xx/u-boot.lds b/board/spd8xx/u-boot.lds new file mode 100644 index 000000000..27da78c28 --- /dev/null +++ b/board/spd8xx/u-boot.lds @@ -0,0 +1,122 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc8xx/start.o	(.text) +    common/environment.o(.text) +    *(.text) +    *(.fixup) +    *(.got1) +  } +  _etext = .; +  PROVIDE (etext = .); +  .rodata    : +  { +    *(.rodata) +    *(.rodata1) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x0FF) & 0xFFFFFF00; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __fixup_entries = (. - _FIXUP_TABLE_)>>2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(256); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(256); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} + diff --git a/cpu/mpc8260/speed.h b/cpu/mpc8260/speed.h new file mode 100644 index 000000000..b66393bec --- /dev/null +++ b/cpu/mpc8260/speed.h @@ -0,0 +1,54 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +/*----------------------------------------------------------------------- + * Timer value for timer 2, ICLK = 10 + * + * SPEED_FCOUNT2 =  GCLK / (16 * (TIMER_TMR_PS + 1)) + * SPEED_TMR3_PS = (GCLK / (16 * SPEED_FCOUNT3)) - 1 + * + * SPEED_FCOUNT2	timer 2 counting frequency + * GCLK	      		CPU clock + * SPEED_TMR2_PS	prescaler + */ +#define SPEED_TMR2_PS  	(250 - 1)	/* divide by 250	*/ + +/*----------------------------------------------------------------------- + * Timer value for PIT + * + * PIT_TIME = SPEED_PITC / PITRTCLK + * PITRTCLK = 8192 + */ +#define SPEED_PITC	(82 << 16)	/* start counting from 82	*/ + +/* + * The new value for PTA is calculated from + * + *	PTA = (gclk * Trefresh) / (2 ^ (2 * DFBRG) * PTP * NCS) + * + * gclk		CPU clock (not bus clock !) + * Trefresh	Refresh cycle * 4 (four word bursts used) + * DFBRG	For normal mode (no clock reduction) always 0 + * PTP		Prescaler (already adjusted for no. of banks and 4K / 8K refresh) + * NCS		Number of SDRAM banks (chip selects) on this UPM. + */ diff --git a/include/405_mal.h b/include/405_mal.h new file mode 100644 index 000000000..459924b6b --- /dev/null +++ b/include/405_mal.h @@ -0,0 +1,106 @@ +/* include/mal.h, openbios_walnut, walnut_bios 8/6/99 08:48:40 */ +/*----------------------------------------------------------------------------+ +| +|       This source code has been made available to you by IBM on an AS-IS +|       basis.  Anyone receiving this source is licensed under IBM +|       copyrights to use it in any way he or she deems fit, including +|       copying it, modifying it, compiling it, and redistributing it either +|       with or without modifications.  No license under IBM patents or +|       patent applications is to be implied by the copyright license. +| +|       Any user of this software should understand that IBM cannot provide +|       technical support for this software and will not be responsible for +|       any consequences resulting from the use of this software. +| +|       Any person who transfers this source code or any derivative work +|       must include the IBM copyright notice, this paragraph, and the +|       preceding two paragraphs in the transferred software. +| +|       COPYRIGHT   I B M   CORPORATION 1999 +|       LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M ++----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ +| +|  File Name:   mal.h +| +|  Function:    Header file for the MAL (MADMAL) macro on the 405GP. +| +|  Author:      Mark Wisner +| +|  Change Activity- +| +|  Date        Description of Change                                       BY +|  ---------   ---------------------                                       --- +|  29-Apr-99   Created                                                     MKW +| ++----------------------------------------------------------------------------*/ +#ifndef _mal_h_ +#define _mal_h_ +/* MADMAL transmit and receive status/control bits  */ +/* for COMMAC bits, refer to the COMMAC header file */ + +#define MAL_TX_CTRL_READY 0x8000 +#define MAL_TX_CTRL_WRAP  0x4000 +#define MAL_TX_CTRL_CM    0x2000 +#define MAL_TX_CTRL_LAST  0x1000 +#define MAL_TX_CTRL_INTR  0x0400 + +#define MAL_RX_CTRL_EMPTY 0x8000 +#define MAL_RX_CTRL_WRAP  0x4000 +#define MAL_RX_CTRL_CM	  0x2000 +#define MAL_RX_CTRL_LAST  0x1000 +#define MAL_RX_CTRL_FIRST 0x0800 +#define MAL_RX_CTRL_INTR  0x0400 + +      /* Configuration Reg  */ +#define MAL_CR_MMSR	  0x80000000 +#define MAL_CR_PLBP_1	  0x00400000   /* lowsest is 00 */ +#define MAL_CR_PLBP_2	  0x00800000 +#define MAL_CR_PLBP_3	  0x00C00000   /* highest       */ +#define MAL_CR_GA	  0x00200000 +#define MAL_CR_OA	  0x00100000 +#define MAL_CR_PLBLE	  0x00080000 +#define MAL_CR_PLBLT_1  0x00040000 +#define MAL_CR_PLBLT_2  0x00020000 +#define MAL_CR_PLBLT_3  0x00010000 +#define MAL_CR_PLBLT_4  0x00008000 +#define MAL_CR_PLBLT_DEFAULT 0x00078000 /* ????? */ +#define MAL_CR_PLBB	  0x00004000 +#define MAL_CR_OPBBL	  0x00000080 +#define MAL_CR_EOPIE	  0x00000004 +#define MAL_CR_LEA	  0x00000002 +#define MAL_CR_MSD	  0x00000001 + +    /* Error Status Reg    */ +#define MAL_ESR_EVB	  0x80000000 +#define MAL_ESR_CID	  0x40000000 +#define MAL_ESR_DE	  0x00100000 +#define MAL_ESR_ONE	  0x00080000 +#define MAL_ESR_OTE	  0x00040000 +#define MAL_ESR_OSE	  0x00020000 +#define MAL_ESR_PEIN	  0x00010000 +      /* same bit position as the IER */ +      /* VV                      VV   */ +#define MAL_ESR_DEI	  0x00000010 +#define MAL_ESR_ONEI	  0x00000008 +#define MAL_ESR_OTEI	  0x00000004 +#define MAL_ESR_OSEI	  0x00000002 +#define MAL_ESR_PBEI	  0x00000001 +      /* ^^                      ^^   */ +      /* Mal IER                      */ +#define MAL_IER_DE	  0x00000010 +#define MAL_IER_NE	  0x00000008 +#define MAL_IER_TE	  0x00000004 +#define MAL_IER_OPBE	  0x00000002 +#define MAL_IER_PLBE	  0x00000001 + + +/* MAL Buffer Descriptor structure */ +typedef struct { +  short  ctrl;              /* MAL / Commac status control bits */ +  short  data_len;          /* Max length is 4K-1 (12 bits)     */ +  char  *data_ptr;          /* pointer to actual data buffer    */ +} mal_desc_t; + +#endif + diff --git a/include/asm-ppc/atomic.h b/include/asm-ppc/atomic.h new file mode 100644 index 000000000..23f22df1b --- /dev/null +++ b/include/asm-ppc/atomic.h @@ -0,0 +1,95 @@ +/* + * PowerPC atomic operations + */ + +#ifndef _ASM_PPC_ATOMIC_H_ +#define _ASM_PPC_ATOMIC_H_ + +#include <linux/config.h> + +#ifdef CONFIG_SMP +typedef struct { volatile int counter; } atomic_t; +#else +typedef struct { int counter; } atomic_t; +#endif + +#define ATOMIC_INIT(i)	{ (i) } + +#define atomic_read(v)		((v)->counter) +#define atomic_set(v,i)		(((v)->counter) = (i)) + +extern void atomic_clear_mask(unsigned long mask, unsigned long *addr); +extern void atomic_set_mask(unsigned long mask, unsigned long *addr); + +extern __inline__ int atomic_add_return(int a, atomic_t *v) +{ +	int t; + +	__asm__ __volatile__("\n\ +1:	lwarx	%0,0,%3\n\ +	add	%0,%2,%0\n\ +	stwcx.	%0,0,%3\n\ +	bne-	1b" +	: "=&r" (t), "=m" (*v) +	: "r" (a), "r" (v), "m" (*v) +	: "cc"); + +	return t; +} + +extern __inline__ int atomic_sub_return(int a, atomic_t *v) +{ +	int t; + +	__asm__ __volatile__("\n\ +1:	lwarx	%0,0,%3\n\ +	subf	%0,%2,%0\n\ +	stwcx.	%0,0,%3\n\ +	bne-	1b" +	: "=&r" (t), "=m" (*v) +	: "r" (a), "r" (v), "m" (*v) +	: "cc"); + +	return t; +} + +extern __inline__ int atomic_inc_return(atomic_t *v) +{ +	int t; + +	__asm__ __volatile__("\n\ +1:	lwarx	%0,0,%2\n\ +	addic	%0,%0,1\n\ +	stwcx.	%0,0,%2\n\ +	bne-	1b" +	: "=&r" (t), "=m" (*v) +	: "r" (v), "m" (*v) +	: "cc"); + +	return t; +} + +extern __inline__ int atomic_dec_return(atomic_t *v) +{ +	int t; + +	__asm__ __volatile__("\n\ +1:	lwarx	%0,0,%2\n\ +	addic	%0,%0,-1\n\ +	stwcx.	%0,0,%2\n\ +	bne	1b" +	: "=&r" (t), "=m" (*v) +	: "r" (v), "m" (*v) +	: "cc"); + +	return t; +} + +#define atomic_add(a, v)		((void) atomic_add_return((a), (v))) +#define atomic_sub(a, v)		((void) atomic_sub_return((a), (v))) +#define atomic_sub_and_test(a, v)	(atomic_sub_return((a), (v)) == 0) +#define atomic_inc(v)			((void) atomic_inc_return((v))) +#define atomic_dec(v)			((void) atomic_dec_return((v))) +#define atomic_dec_and_test(v)		(atomic_dec_return((v)) == 0) + +#endif /* _ASM_PPC_ATOMIC_H_ */ diff --git a/include/asm-ppc/posix_types.h b/include/asm-ppc/posix_types.h new file mode 100644 index 000000000..917072811 --- /dev/null +++ b/include/asm-ppc/posix_types.h @@ -0,0 +1,109 @@ +#ifndef _PPC_POSIX_TYPES_H +#define _PPC_POSIX_TYPES_H + +/* + * This file is generally used by user-level software, so you need to + * be a little careful about namespace pollution etc.  Also, we cannot + * assume GCC is being used. + */ + +typedef unsigned int	__kernel_dev_t; +typedef unsigned int	__kernel_ino_t; +typedef unsigned int	__kernel_mode_t; +typedef unsigned short	__kernel_nlink_t; +typedef long		__kernel_off_t; +typedef int		__kernel_pid_t; +typedef unsigned int	__kernel_uid_t; +typedef unsigned int	__kernel_gid_t; +typedef unsigned int	__kernel_size_t; +typedef int		__kernel_ssize_t; +typedef long		__kernel_ptrdiff_t; +typedef long		__kernel_time_t; +typedef long		__kernel_suseconds_t; +typedef long		__kernel_clock_t; +typedef int		__kernel_daddr_t; +typedef char *		__kernel_caddr_t; +typedef short             __kernel_ipc_pid_t; +typedef unsigned short	__kernel_uid16_t; +typedef unsigned short	__kernel_gid16_t; +typedef unsigned int	__kernel_uid32_t; +typedef unsigned int	__kernel_gid32_t; + +typedef unsigned int	__kernel_old_uid_t; +typedef unsigned int	__kernel_old_gid_t; + +#ifdef __GNUC__ +typedef long long	__kernel_loff_t; +#endif + +typedef struct { +	int	val[2]; +} __kernel_fsid_t; + +#ifndef __GNUC__ + +#define	__FD_SET(d, set)	((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) +#define	__FD_CLR(d, set)	((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) +#define	__FD_ISSET(d, set)	((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) +#define	__FD_ZERO(set)	\ +  ((void) memset ((__ptr_t) (set), 0, sizeof (__kernel_fd_set))) + +#else /* __GNUC__ */ + +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) \ +    || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0) +/* With GNU C, use inline functions instead so args are evaluated only once: */ + +#undef __FD_SET +static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) +{ +	unsigned long _tmp = fd / __NFDBITS; +	unsigned long _rem = fd % __NFDBITS; +	fdsetp->fds_bits[_tmp] |= (1UL<<_rem); +} + +#undef __FD_CLR +static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) +{ +	unsigned long _tmp = fd / __NFDBITS; +	unsigned long _rem = fd % __NFDBITS; +	fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); +} + +#undef __FD_ISSET +static __inline__ int __FD_ISSET(unsigned long fd, __kernel_fd_set *p) +{ +	unsigned long _tmp = fd / __NFDBITS; +	unsigned long _rem = fd % __NFDBITS; +	return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; +} + +/* + * This will unroll the loop for the normal constant case (8 ints, + * for a 256-bit fd_set) + */ +#undef __FD_ZERO +static __inline__ void __FD_ZERO(__kernel_fd_set *p) +{ +	unsigned int *tmp = (unsigned int *)p->fds_bits; +	int i; + +	if (__builtin_constant_p(__FDSET_LONGS)) { +		switch (__FDSET_LONGS) { +			case 8: +				tmp[0] = 0; tmp[1] = 0; tmp[2] = 0; tmp[3] = 0; +				tmp[4] = 0; tmp[5] = 0; tmp[6] = 0; tmp[7] = 0; +				return; +		} +	} +	i = __FDSET_LONGS; +	while (i) { +		i--; +		*tmp = 0; +		tmp++; +	} +} + +#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ +#endif /* __GNUC__ */ +#endif /* _PPC_POSIX_TYPES_H */ diff --git a/include/asm-ppc/signal.h b/include/asm-ppc/signal.h new file mode 100644 index 000000000..b11a28efd --- /dev/null +++ b/include/asm-ppc/signal.h @@ -0,0 +1,154 @@ +#ifndef _ASMPPC_SIGNAL_H +#define _ASMPPC_SIGNAL_H + +#include <linux/types.h> + +/* Avoid too many header ordering problems.  */ +struct siginfo; + +/* Most things should be clean enough to redefine this at will, if care +   is taken to make libc match.  */ + +#define _NSIG		64 +#define _NSIG_BPW	32 +#define _NSIG_WORDS	(_NSIG / _NSIG_BPW) + +typedef unsigned long old_sigset_t;		/* at least 32 bits */ + +typedef struct { +	unsigned long sig[_NSIG_WORDS]; +} sigset_t; + +#define SIGHUP		 1 +#define SIGINT		 2 +#define SIGQUIT		 3 +#define SIGILL		 4 +#define SIGTRAP		 5 +#define SIGABRT		 6 +#define SIGIOT		 6 +#define SIGBUS		 7 +#define SIGFPE		 8 +#define SIGKILL		 9 +#define SIGUSR1		10 +#define SIGSEGV		11 +#define SIGUSR2		12 +#define SIGPIPE		13 +#define SIGALRM		14 +#define SIGTERM		15 +#define SIGSTKFLT	16 +#define SIGCHLD		17 +#define SIGCONT		18 +#define SIGSTOP		19 +#define SIGTSTP		20 +#define SIGTTIN		21 +#define SIGTTOU		22 +#define SIGURG		23 +#define SIGXCPU		24 +#define SIGXFSZ		25 +#define SIGVTALRM	26 +#define SIGPROF		27 +#define SIGWINCH	28 +#define SIGIO		29 +#define SIGPOLL		SIGIO +/* +#define SIGLOST		29 +*/ +#define SIGPWR		30 +#define SIGSYS		31 +#define	SIGUNUSED	31 + +/* These should not be considered constants from userland.  */ +#define SIGRTMIN	32 +#define SIGRTMAX	(_NSIG-1) + +/* + * SA_FLAGS values: + * + * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). + * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_RESETHAND clears the handler when the signal is delivered. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_NODEFER prevents the current signal from being masked in the handler. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ +#define SA_NOCLDSTOP	0x00000001 +#define SA_NOCLDWAIT	0x00000002 /* not supported yet */ +#define SA_SIGINFO	0x00000004 +#define SA_ONSTACK	0x08000000 +#define SA_RESTART	0x10000000 +#define SA_NODEFER	0x40000000 +#define SA_RESETHAND	0x80000000 + +#define SA_NOMASK	SA_NODEFER +#define SA_ONESHOT	SA_RESETHAND +#define SA_INTERRUPT	0x20000000 /* dummy -- ignored */ + +#define SA_RESTORER	0x04000000 + +/* + * sigaltstack controls + */ +#define SS_ONSTACK	1 +#define SS_DISABLE	2 + +#define MINSIGSTKSZ	2048 +#define SIGSTKSZ	8192 +#ifdef __KERNEL__ + +/* + * These values of sa_flags are used only by the kernel as part of the + * irq handling routines. + * + * SA_INTERRUPT is also used by the irq handling routines. + * SA_SHIRQ is for shared interrupt support on PCI and EISA. + */ +#define SA_PROBE		SA_ONESHOT +#define SA_SAMPLE_RANDOM	SA_RESTART +#define SA_SHIRQ		0x04000000 +#endif + +#define SIG_BLOCK          0	/* for blocking signals */ +#define SIG_UNBLOCK        1	/* for unblocking signals */ +#define SIG_SETMASK        2	/* for setting the signal mask */ + +/* Type of a signal handler.  */ +typedef void (*__sighandler_t)(int); + +#define SIG_DFL	((__sighandler_t)0)	/* default signal handling */ +#define SIG_IGN	((__sighandler_t)1)	/* ignore signal */ +#define SIG_ERR	((__sighandler_t)-1)	/* error return from signal */ + +struct old_sigaction { +	__sighandler_t sa_handler; +	old_sigset_t sa_mask; +	unsigned long sa_flags; +	void (*sa_restorer)(void); +}; + +struct sigaction { +	__sighandler_t sa_handler; +	unsigned long sa_flags; +	void (*sa_restorer)(void); +	sigset_t sa_mask;		/* mask last for extensibility */ +}; + +struct k_sigaction { +	struct sigaction sa; +}; + +typedef struct sigaltstack { +	void *ss_sp; +	int ss_flags; +	size_t ss_size; +} stack_t; + +#ifdef __KERNEL__ +#include <asm/sigcontext.h> + +#endif + +#endif diff --git a/include/linux/posix_types.h b/include/linux/posix_types.h new file mode 100644 index 000000000..bd37e1faf --- /dev/null +++ b/include/linux/posix_types.h @@ -0,0 +1,48 @@ +#ifndef _LINUX_POSIX_TYPES_H +#define _LINUX_POSIX_TYPES_H + +#include <linux/stddef.h> + +/* + * This allows for 1024 file descriptors: if NR_OPEN is ever grown + * beyond that you'll have to change this too. But 1024 fd's seem to be + * enough even for such "real" unices like OSF/1, so hopefully this is + * one limit that doesn't have to be changed [again]. + * + * Note that POSIX wants the FD_CLEAR(fd,fdsetp) defines to be in + * <sys/time.h> (and thus <linux/time.h>) - but this is a more logical + * place for them. Solved by having dummy defines in <sys/time.h>. + */ + +/* + * Those macros may have been defined in <gnu/types.h>. But we always + * use the ones here. + */ +#undef __NFDBITS +#define __NFDBITS	(8 * sizeof(unsigned long)) + +#undef __FD_SETSIZE +#define __FD_SETSIZE	1024 + +#undef __FDSET_LONGS +#define __FDSET_LONGS	(__FD_SETSIZE/__NFDBITS) + +#undef __FDELT +#define	__FDELT(d)	((d) / __NFDBITS) + +#undef __FDMASK +#define	__FDMASK(d)	(1UL << ((d) % __NFDBITS)) + +typedef struct { +	unsigned long fds_bits [__FDSET_LONGS]; +} __kernel_fd_set; + +/* Type of a signal handler.  */ +typedef void (*__kernel_sighandler_t)(int); + +/* Type of a SYSV IPC key.  */ +typedef int __kernel_key_t; + +#include <asm/posix_types.h> + +#endif /* _LINUX_POSIX_TYPES_H */ diff --git a/include/mpc8xx_irq.h b/include/mpc8xx_irq.h new file mode 100644 index 000000000..d2a81c00d --- /dev/null +++ b/include/mpc8xx_irq.h @@ -0,0 +1,59 @@ +#ifndef _MPC8XX_IRQ_H +#define _MPC8XX_IRQ_H + +/* The MPC8xx cores have 16 possible interrupts.  There are eight + * possible level sensitive interrupts assigned and generated internally + * from such devices as CPM, PCMCIA, RTC, PIT, TimeBase and Decrementer. + * There are eight external interrupts (IRQs) that can be configured + * as either level or edge sensitive. + * + * On some implementations, there is also the possibility of an 8259 + * through the PCI and PCI-ISA bridges. + * + * We don't support the 8259 (yet). + */ +#define NR_SIU_INTS	16 +#define	NR_8259_INTS	0 + +#define NR_IRQS	(NR_SIU_INTS + NR_8259_INTS) + +/* These values must be zero-based and map 1:1 with the SIU configuration. + * They are used throughout the 8xx I/O subsystem to generate + * interrupt masks, flags, and other control patterns.  This is why the + * current kernel assumption of the 8259 as the base controller is such + * a pain in the butt. + */ +#define	SIU_IRQ0	(0)	/* Highest priority */ +#define	SIU_LEVEL0	(1) +#define	SIU_IRQ1	(2) +#define	SIU_LEVEL1	(3) +#define	SIU_IRQ2	(4) +#define	SIU_LEVEL2	(5) +#define	SIU_IRQ3	(6) +#define	SIU_LEVEL3	(7) +#define	SIU_IRQ4	(8) +#define	SIU_LEVEL4	(9) +#define	SIU_IRQ5	(10) +#define	SIU_LEVEL5	(11) +#define	SIU_IRQ6	(12) +#define	SIU_LEVEL6	(13) +#define	SIU_IRQ7	(14) +#define	SIU_LEVEL7	(15) + +/* The internal interrupts we can configure as we see fit. + * My personal preference is CPM at level 2, which puts it above the + * MBX PCI/ISA/IDE interrupts. + */ + +#ifdef CFG_CPM_INTERRUPT +# define CPM_INTERRUPT		CFG_CPM_INTERRUPT +#else +# define CPM_INTERRUPT		SIU_LEVEL2 +#endif + +/* Some internal interrupt registers use an 8-bit mask for the interrupt + * level instead of a number. + */ +#define	mk_int_int_mask(IL) (1 << (7 - (IL/2))) + +#endif /* _MPC8XX_IRQ_H */ diff --git a/include/s_record.h b/include/s_record.h new file mode 100644 index 000000000..07806d5cd --- /dev/null +++ b/include/s_record.h @@ -0,0 +1,114 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 + */ + +/*-------------------------------------------------------------------------- + * + * Motorola S-Record Format: + * + * Motorola S-Records are an industry-standard format for + * transmitting binary files to target systems and PROM + * programmers. LSI Logic have extended this standard to include + * an S4-record containing an address and a symbol. + * + * The extended S-record standard is as follows: + * + * S<type><length><address><data....><checksum> + * S4<length><address><name>,<checksum> + * + * Where: + * + * type + *     is the record type. Where: + * + *     0  starting record (optional) + *     1  data record with 16-bit address + *     2  data record with 24-bit address + *     3  data record with 32-bit address + *     4  symbol record (LSI extension) + *     5  number of data records in preceeding block + *     6  unused + *     7  ending record for S3 records + *     8  ending record for S2 records + *     9  ending record for S1 records + * + * length + *     is two hex characters. This defines the length of the + *     record in bytes (not characters). It includes the address + *     field, the data field, and the checksum field. + * + * address + *     is 4, 6, or 8 characters. Corresponding to a 16-, 24-, or + *     32-bit address. The address field for S4 records is + *     always 32 bits. + * + * data + * + *     Are the data bytes. Each pair of hex characters represent + *     one byte in memory. + * + * name + *     Is the symbol name. The symbol is terminated by a ','. + * + * checksum + *     Is the one's complement of the 8-bit checksum. + * + * Example + * + * S0030000FC + * . + * . + * S325000004403C0880018D08DD900000000011000026000000003C0880012508DC50C50000B401 + * S32500000460C50100B8C50200BCC50300C0C50400C4C50500C8C50600CCC50700D0C50800D4FA + * S32500000480C50900D8C50A00DCC50B00E0C50C00E4C50D00E8C50E00ECC50F00F0C51000F49A + * S325000004A0C51100F8C51200FCC5130100C5140104C5150108C516010CC5170110C518011434 + * . + * . + * S70500000000FA + * + * The S0 record starts the file. The S3 records contain the + * data. The S7 record contains the entry address and terminates + * the download. + * + *-------------------------------------------------------------------------- + */ + +#define SREC_START	0	/* Start Record (module name)		    */ +#define SREC_DATA2	1	/* Data  Record with 2 byte address	    */ +#define SREC_DATA3	2	/* Data  Record with 3 byte address	    */ +#define SREC_DATA4	3	/* Data  Record with 4 byte address	    */ +#define SREC_COUNT	5	/* Count Record (previously transmitted)    */ +#define SREC_END4 	7	/* End   Record with 4 byte start address   */ +#define SREC_END3 	8	/* End   Record with 3 byte start address   */ +#define SREC_END2 	9	/* End   Record with 2 byte start address   */ +#define SREC_EMPTY	10	/* Empty Record without any data	    */ + +#define SREC_REC_OK  SREC_EMPTY /* last code without error condition	    */ + +#define SREC_E_BADTYPE	-1	/* no valid S-Record		            */ +#define SREC_E_NOSREC	-2	/* line format differs from s-record	    */ +#define SREC_E_BADCHKS	-3	/* checksum error in an s-record line	    */ + +#define SREC_MAXRECLEN	(512 + 4)   /* max ASCII record length		    */ +#define SREC_MAXBINLEN	255	    /* resulting binary length		    */ + +int srec_decode (char *input, int *count, ulong *addr, char *data); diff --git a/include/zlib.h b/include/zlib.h new file mode 100644 index 000000000..6958ab8e7 --- /dev/null +++ b/include/zlib.h @@ -0,0 +1,434 @@ +/* + * This file is derived from zlib.h and zconf.h from the zlib-0.95 + * distribution by Jean-loup Gailly and Mark Adler, with some additions + * by Paul Mackerras to aid in implementing Deflate compression and + * decompression for PPP packets. + */ + +/* + *  ==FILEVERSION 960122== + * + * This marker is used by the Linux installation script to determine + * whether an up-to-date version of this file is already installed. + */ + +/* zlib.h -- interface of the 'zlib' general purpose compression library +  version 0.95, Aug 16th, 1995. + +  Copyright (C) 1995 Jean-loup Gailly and Mark Adler + +  This software is provided 'as-is', without any express or implied +  warranty.  In no event will the authors be held liable for any damages +  arising from the use of this software. + +  Permission is granted to anyone to use this software for any purpose, +  including commercial applications, and to alter it and redistribute it +  freely, subject to the following restrictions: + +  1. The origin of this software must not be misrepresented; you must not +     claim that you wrote the original software. If you use this software +     in a product, an acknowledgment in the product documentation would be +     appreciated but is not required. +  2. Altered source versions must be plainly marked as such, and must not be +     misrepresented as being the original software. +  3. This notice may not be removed or altered from any source distribution. + +  Jean-loup Gailly        Mark Adler +  gzip@prep.ai.mit.edu    madler@alumni.caltech.edu + */ + +#ifndef _ZLIB_H +#define _ZLIB_H + +/* #include "zconf.h" */	/* included directly here */ + +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* From: zconf.h,v 1.12 1995/05/03 17:27:12 jloup Exp */ + +/* +     The library does not install any signal handler. It is recommended to +  add at least a handler for SIGSEGV when decompressing; the library checks +  the consistency of the input data whenever possible but may go nuts +  for some forms of corrupted input. + */ + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + * Compile with -DUNALIGNED_OK if it is OK to access shorts or ints + * at addresses which are not a multiple of their size. + * Under DOS, -DFAR=far or -DFAR=__far may be needed. + */ + +#ifndef STDC +#  if defined(MSDOS) || defined(__STDC__) || defined(__cplusplus) +#    define STDC +#  endif +#endif + +#ifdef	__MWERKS__ /* Metrowerks CodeWarrior declares fileno() in unix.h */ +#  include <unix.h> +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +#  ifdef MAXSEG_64K +#    define MAX_MEM_LEVEL 8 +#  else +#    define MAX_MEM_LEVEL 9 +#  endif +#endif + +#ifndef FAR +#  define FAR +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2 */ +#ifndef MAX_WBITS +#  define MAX_WBITS   15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): +            1 << (windowBits+2)   +  1 << (memLevel+9) + that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with +     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + +   The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + +                        /* Type declarations */ + +#ifndef OF /* function prototypes */ +#  ifdef STDC +#    define OF(args)  args +#  else +#    define OF(args)  () +#  endif +#endif + +typedef unsigned char  Byte;  /* 8 bits */ +typedef unsigned int   uInt;  /* 16 bits or more */ +typedef unsigned long  uLong; /* 32 bits or more */ + +typedef Byte FAR Bytef; +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC +   typedef void FAR *voidpf; +   typedef void     *voidp; +#else +   typedef Byte FAR *voidpf; +   typedef Byte     *voidp; +#endif + +/* end of original zconf.h */ + +#define ZLIB_VERSION "0.95P" + +/* +     The 'zlib' compression library provides in-memory compression and +  decompression functions, including integrity checks of the uncompressed +  data.  This version of the library supports only one compression method +  (deflation) but other algorithms may be added later and will have the same +  stream interface. + +     For compression the application must provide the output buffer and +  may optionally provide the input buffer for optimization. For decompression, +  the application must provide the input buffer and may optionally provide +  the output buffer for optimization. + +     Compression can be done in a single step if the buffers are large +  enough (for example if an input file is mmap'ed), or can be done by +  repeated calls of the compression function.  In the latter case, the +  application must provide more input and/or consume the output +  (providing more output space) before each call. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void   (*free_func)  OF((voidpf opaque, voidpf address, uInt nbytes)); + +typedef void   (*cb_func)    OF((Bytef *buf, uInt len)); + +struct internal_state; + +typedef struct z_stream_s { +    Bytef    *next_in;  /* next input byte */ +    uInt     avail_in;  /* number of bytes available at next_in */ +    uLong    total_in;  /* total nb of input bytes read so far */ + +    Bytef    *next_out; /* next output byte should be put there */ +    uInt     avail_out; /* remaining free space at next_out */ +    uLong    total_out; /* total nb of bytes output so far */ + +    char     *msg;      /* last error message, NULL if no error */ +    struct internal_state FAR *state; /* not visible by applications */ + +    alloc_func zalloc;  /* used to allocate the internal state */ +    free_func  zfree;   /* used to free the internal state */ +    voidp      opaque;  /* private data object passed to zalloc and zfree */ + +    Byte     data_type; /* best guess about the data type: ascii or binary */ + +    cb_func  outcb;	/* called regularly just before blocks of output */ + +} z_stream; + +/* +   The application must update next_in and avail_in when avail_in has +   dropped to zero. It must update next_out and avail_out when avail_out +   has dropped to zero. The application must initialize zalloc, zfree and +   opaque before calling the init function. All other fields are set by the +   compression library and must not be updated by the application. + +   The opaque value provided by the application will be passed as the first +   parameter for calls of zalloc and zfree. This can be useful for custom +   memory management. The compression library attaches no meaning to the +   opaque value. + +   zalloc must return Z_NULL if there is not enough memory for the object. +   On 16-bit systems, the functions zalloc and zfree must be able to allocate +   exactly 65536 bytes, but will not be required to allocate more than this +   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, +   pointers returned by zalloc for objects of exactly 65536 bytes *must* +   have their offset normalized to zero. The default allocation function +   provided by this library ensures this (see zutil.c). To reduce memory +   requirements and avoid any allocation of 64K objects, at the expense of +   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + +   The fields total_in and total_out can be used for statistics or +   progress reports. After compression, total_in holds the total size of +   the uncompressed data and may be saved for use in the decompressor +   (particularly if the decompressor wants to decompress everything in +   a single step). +*/ + +                        /* constants */ + +#define Z_NO_FLUSH      0 +#define Z_PARTIAL_FLUSH 1 +#define Z_FULL_FLUSH    2 +#define Z_SYNC_FLUSH    3 /* experimental: partial_flush + byte align */ +#define Z_FINISH        4 +#define Z_PACKET_FLUSH	5 +/* See deflate() below for the usage of these constants */ + +#define Z_OK            0 +#define Z_STREAM_END    1 +#define Z_ERRNO        (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR   (-3) +#define Z_MEM_ERROR    (-4) +#define Z_BUF_ERROR    (-5) +/* error codes for the compression/decompression functions */ + +#define Z_BEST_SPEED             1 +#define Z_BEST_COMPRESSION       9 +#define Z_DEFAULT_COMPRESSION  (-1) +/* compression levels */ + +#define Z_FILTERED            1 +#define Z_HUFFMAN_ONLY        2 +#define Z_DEFAULT_STRATEGY    0 + +#define Z_BINARY   0 +#define Z_ASCII    1 +#define Z_UNKNOWN  2 +/* Used to set the data_type field */ + +#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */ + +extern char *zlib_version; +/* The application can compare zlib_version and ZLIB_VERSION for consistency. +   If the first character differs, the library code actually used is +   not compatible with the zlib.h header file used by the application. + */ + +                        /* basic functions */ + +extern int inflateInit OF((z_stream *strm)); +/* +     Initializes the internal stream state for decompression. The fields +   zalloc and zfree must be initialized before by the caller.  If zalloc and +   zfree are set to Z_NULL, inflateInit updates them to use default allocation +   functions. + +     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not +   enough memory.  msg is set to null if there is no error message. +   inflateInit does not perform any decompression: this will be done by +   inflate(). +*/ + + +extern int inflate OF((z_stream *strm, int flush)); +/* +  Performs one or both of the following actions: + +  - Decompress more input starting at next_in and update next_in and avail_in +    accordingly. If not all input can be processed (because there is not +    enough room in the output buffer), next_in is updated and processing +    will resume at this point for the next call of inflate(). + +  - Provide more output starting at next_out and update next_out and avail_out +    accordingly.  inflate() always provides as much output as possible +    (until there is no more input data or no more space in the output buffer). + +  Before the call of inflate(), the application should ensure that at least +  one of the actions is possible, by providing more input and/or consuming +  more output, and updating the next_* and avail_* values accordingly. +  The application can consume the uncompressed output when it wants, for +  example when the output buffer is full (avail_out == 0), or after each +  call of inflate(). + +    If the parameter flush is set to Z_PARTIAL_FLUSH or Z_PACKET_FLUSH, +  inflate flushes as much output as possible to the output buffer. The +  flushing behavior of inflate is not specified for values of the flush +  parameter other than Z_PARTIAL_FLUSH, Z_PACKET_FLUSH or Z_FINISH, but the +  current implementation actually flushes as much output as possible +  anyway.  For Z_PACKET_FLUSH, inflate checks that once all the input data +  has been consumed, it is expecting to see the length field of a stored +  block; if not, it returns Z_DATA_ERROR. + +    inflate() should normally be called until it returns Z_STREAM_END or an +  error. However if all decompression is to be performed in a single step +  (a single call of inflate), the parameter flush should be set to +  Z_FINISH. In this case all pending input is processed and all pending +  output is flushed; avail_out must be large enough to hold all the +  uncompressed data. (The size of the uncompressed data may have been saved +  by the compressor for this purpose.) The next operation on this stream must +  be inflateEnd to deallocate the decompression state. The use of Z_FINISH +  is never required, but can be used to inform inflate that a faster routine +  may be used for the single inflate() call. + +    inflate() returns Z_OK if some progress has been made (more input +  processed or more output produced), Z_STREAM_END if the end of the +  compressed data has been reached and all uncompressed output has been +  produced, Z_DATA_ERROR if the input data was corrupted, Z_STREAM_ERROR if +  the stream structure was inconsistent (for example if next_in or next_out +  was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no +  progress is possible or if there was not enough room in the output buffer +  when Z_FINISH is used. In the Z_DATA_ERROR case, the application may then +  call inflateSync to look for a good compression block.  */ + + +extern int inflateEnd OF((z_stream *strm)); +/* +     All dynamically allocated data structures for this stream are freed. +   This function discards any unprocessed input and does not flush any +   pending output. + +     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state +   was inconsistent. In the error case, msg may be set but then points to a +   static string (which must not be deallocated). +*/ + +                        /* advanced functions */ + +extern int inflateInit2 OF((z_stream *strm, +                            int  windowBits)); +/* +     This is another version of inflateInit with more compression options. The +   fields next_out, zalloc and zfree must be initialized before by the caller. + +     The windowBits parameter is the base two logarithm of the maximum window +   size (the size of the history buffer).  It should be in the range 8..15 for +   this version of the library (the value 16 will be allowed soon). The +   default value is 15 if inflateInit is used instead. If a compressed stream +   with a larger window size is given as input, inflate() will return with +   the error code Z_DATA_ERROR instead of trying to allocate a larger window. + +     If next_out is not null, the library will use this buffer for the history +   buffer; the buffer must either be large enough to hold the entire output +   data, or have at least 1<<windowBits bytes.  If next_out is null, the +   library will allocate its own buffer (and leave next_out null). next_in +   need not be provided here but must be provided by the application for the +   next call of inflate(). + +     If the history buffer is provided by the application, next_out must +   never be changed by the application since the decompressor maintains +   history information inside this buffer from call to call; the application +   can only reset next_out to the beginning of the history buffer when +   avail_out is zero and all output has been consumed. + +      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was +   not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as +   windowBits < 8). msg is set to null if there is no error message. +   inflateInit2 does not perform any decompression: this will be done by +   inflate(). +*/ + +extern int inflateSync OF((z_stream *strm)); +/* +    Skips invalid compressed data until the special marker (see deflate() +  above) can be found, or until all available input is skipped. No output +  is provided. + +    inflateSync returns Z_OK if the special marker has been found, Z_BUF_ERROR +  if no more input was provided, Z_DATA_ERROR if no marker has been found, +  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success +  case, the application may save the current current value of total_in which +  indicates where valid compressed data was found. In the error case, the +  application may repeatedly call inflateSync, providing more input each time, +  until success or end of the input data. +*/ + +extern int inflateReset OF((z_stream *strm)); +/* +     This function is equivalent to inflateEnd followed by inflateInit, +   but does not free and reallocate all the internal decompression state. +   The stream will keep attributes that may have been set by inflateInit2. + +      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source +   stream state was inconsistent (such as zalloc or state being NULL). +*/ + +extern int inflateIncomp OF((z_stream *strm)); +/* +     This function adds the data at next_in (avail_in bytes) to the output +   history without performing any output.  There must be no pending output, +   and the decompressor must be expecting to see the start of a block. +   Calling this function is equivalent to decompressing a stored block +   containing the data at next_in (except that the data is not output). +*/ + +                        /* checksum functions */ + +/* +     This function is not related to compression but is exported +   anyway because it might be useful in applications using the +   compression library. +*/ + +extern uLong adler32 OF((uLong adler, Bytef *buf, uInt len)); + +/* +     Update a running Adler-32 checksum with the bytes buf[0..len-1] and +   return the updated checksum. If buf is NULL, this function returns +   the required initial value for the checksum. +   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed +   much faster. Usage example: + +     uLong adler = adler32(0L, Z_NULL, 0); + +     while (read_buffer(buffer, length) != EOF) { +       adler = adler32(adler, buffer, length); +     } +     if (adler != original_adler) error(); +*/ + +#ifndef _Z_UTIL_H +    struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +#endif /* _ZLIB_H */ diff --git a/lib_generic/ldiv.c b/lib_generic/ldiv.c new file mode 100644 index 000000000..437b1604c --- /dev/null +++ b/lib_generic/ldiv.c @@ -0,0 +1,55 @@ +/* Copyright (C) 1992, 1997 Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Library General Public License as +   published by the Free Software Foundation; either version 2 of the +   License, or (at your option) any later version. + +   The GNU C Library 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 +   Library General Public License for more details. + +   You should have received a copy of the GNU Library General Public +   License along with the GNU C Library; see the file COPYING.LIB.  If not, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +typedef struct { +        long    quot; +        long    rem; +} ldiv_t; +/* Return the `ldiv_t' representation of NUMER over DENOM.  */ +ldiv_t +ldiv (long int numer, long int denom) +{ +  ldiv_t result; + +  result.quot = numer / denom; +  result.rem = numer % denom; + +  /* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where +     NUMER / DENOM is to be computed in infinite precision.  In +     other words, we should always truncate the quotient towards +     zero, never -infinity.  Machine division and remainer may +     work either way when one or both of NUMER or DENOM is +     negative.  If only one is negative and QUOT has been +     truncated towards -infinity, REM will have the same sign as +     DENOM and the opposite sign of NUMER; if both are negative +     and QUOT has been truncated towards -infinity, REM will be +     positive (will have the opposite sign of NUMER).  These are +     considered `wrong'.  If both are NUM and DENOM are positive, +     RESULT will always be positive.  This all boils down to: if +     NUMER >= 0, but REM < 0, we got the wrong answer.  In that +     case, to get the right answer, add 1 to QUOT and subtract +     DENOM from REM.  */ + +  if (numer >= 0 && result.rem < 0) +    { +      ++result.quot; +      result.rem -= denom; +    } + +  return result; +} diff --git a/lib_generic/zlib.c b/lib_generic/zlib.c new file mode 100644 index 000000000..3b7ab25e5 --- /dev/null +++ b/lib_generic/zlib.c @@ -0,0 +1,2161 @@ +/* + * This file is derived from various .h and .c files from the zlib-0.95 + * distribution by Jean-loup Gailly and Mark Adler, with some additions + * by Paul Mackerras to aid in implementing Deflate compression and + * decompression for PPP packets.  See zlib.h for conditions of + * distribution and use. + * + * Changes that have been made include: + * - changed functions not used outside this file to "local" + * - added minCompression parameter to deflateInit2 + * - added Z_PACKET_FLUSH (see zlib.h for details) + * - added inflateIncomp + */ + +/*+++++*/ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is +   part of the implementation of the compression library and is +   subject to change. Applications should only use zlib.h. + */ + +/* From: zutil.h,v 1.9 1995/05/03 17:27:12 jloup Exp */ + +#define _Z_UTIL_H + +#include "zlib.h" + +#ifndef local +#  define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#define FAR + +typedef unsigned char  uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long  ulg; + +extern char *z_errmsg[]; /* indexed by 1-zlib_error */ + +#define ERR_RETURN(strm,err) return (strm->msg=z_errmsg[1-err], err) +/* To be used only when the state is known to be valid */ + +#ifndef NULL +#define NULL	((void *) 0) +#endif + +        /* common constants */ + +#define DEFLATED   8 + +#ifndef DEF_WBITS +#  define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +#  define DEF_MEM_LEVEL 8 +#else +#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES    2 +/* The three kinds of block type */ + +#define MIN_MATCH  3 +#define MAX_MATCH  258 +/* The minimum and maximum match lengths */ + +         /* functions */ + +#include <linux/string.h> +#define zmemcpy memcpy +#define zmemzero(dest, len)	memset(dest, 0, len) + +/* Diagnostic functions */ +#ifdef DEBUG_ZLIB +#  include <stdio.h> +#  ifndef verbose +#    define verbose 0 +#  endif +#  define Assert(cond,msg) {if(!(cond)) z_error(msg);} +#  define Trace(x) fprintf x +#  define Tracev(x) {if (verbose) fprintf x ;} +#  define Tracevv(x) {if (verbose>1) fprintf x ;} +#  define Tracec(c,x) {if (verbose && (c)) fprintf x ;} +#  define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} +#else +#  define Assert(cond,msg) +#  define Trace(x) +#  define Tracev(x) +#  define Tracevv(x) +#  define Tracec(c,x) +#  define Tracecv(c,x) +#endif + + +typedef uLong (*check_func) OF((uLong check, Bytef *buf, uInt len)); + +/* voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); */ +/* void   zcfree  OF((voidpf opaque, voidpf ptr)); */ + +#define ZALLOC(strm, items, size) \ +           (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr, size)	\ +	   (*((strm)->zfree))((strm)->opaque, (voidpf)(addr), (size)) +#define TRY_FREE(s, p, n) {if (p) ZFREE(s, p, n);} + +/* deflate.h -- internal compression state + * Copyright (C) 1995 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is +   part of the implementation of the compression library and is +   subject to change. Applications should only use zlib.h. + */ + +/*+++++*/ +/* infblock.h -- header to use infblock.c + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is +   part of the implementation of the compression library and is +   subject to change. Applications should only use zlib.h. + */ + +struct inflate_blocks_state; +typedef struct inflate_blocks_state FAR inflate_blocks_statef; + +local inflate_blocks_statef * inflate_blocks_new OF(( +    z_stream *z, +    check_func c,               /* check function */ +    uInt w));                   /* window size */ + +local int inflate_blocks OF(( +    inflate_blocks_statef *, +    z_stream *, +    int));                      /* initial return code */ + +local void inflate_blocks_reset OF(( +    inflate_blocks_statef *, +    z_stream *, +    uLongf *));                  /* check value on output */ + +local int inflate_blocks_free OF(( +    inflate_blocks_statef *, +    z_stream *, +    uLongf *));                  /* check value on output */ + +local int inflate_addhistory OF(( +    inflate_blocks_statef *, +    z_stream *)); + +local int inflate_packet_flush OF(( +    inflate_blocks_statef *)); + +/*+++++*/ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is +   part of the implementation of the compression library and is +   subject to change. Applications should only use zlib.h. + */ + +/* Huffman code lookup table entry--this entry is four bytes for machines +   that have 16-bit pointers (e.g. PC's in the small or medium model). */ + +typedef struct inflate_huft_s FAR inflate_huft; + +struct inflate_huft_s { +  union { +    struct { +      Byte Exop;        /* number of extra bits or operation */ +      Byte Bits;        /* number of bits in this code or subcode */ +    } what; +    uInt Nalloc;	/* number of these allocated here */ +    Bytef *pad;         /* pad structure to a power of 2 (4 bytes for */ +  } word;               /*  16-bit, 8 bytes for 32-bit machines) */ +  union { +    uInt Base;          /* literal, length base, or distance base */ +    inflate_huft *Next; /* pointer to next level of table */ +  } more; +}; + +#ifdef DEBUG_ZLIB +  local uInt inflate_hufts; +#endif + +local int inflate_trees_bits OF(( +    uIntf *,                    /* 19 code lengths */ +    uIntf *,                    /* bits tree desired/actual depth */ +    inflate_huft * FAR *,       /* bits tree result */ +    z_stream *));               /* for zalloc, zfree functions */ + +local int inflate_trees_dynamic OF(( +    uInt,                       /* number of literal/length codes */ +    uInt,                       /* number of distance codes */ +    uIntf *,                    /* that many (total) code lengths */ +    uIntf *,                    /* literal desired/actual bit depth */ +    uIntf *,                    /* distance desired/actual bit depth */ +    inflate_huft * FAR *,       /* literal/length tree result */ +    inflate_huft * FAR *,       /* distance tree result */ +    z_stream *));               /* for zalloc, zfree functions */ + +local int inflate_trees_fixed OF(( +    uIntf *,                    /* literal desired/actual bit depth */ +    uIntf *,                    /* distance desired/actual bit depth */ +    inflate_huft * FAR *,       /* literal/length tree result */ +    inflate_huft * FAR *));     /* distance tree result */ + +local int inflate_trees_free OF(( +    inflate_huft *,             /* tables to free */ +    z_stream *));               /* for zfree function */ + + +/*+++++*/ +/* infcodes.h -- header to use infcodes.c + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is +   part of the implementation of the compression library and is +   subject to change. Applications should only use zlib.h. + */ + +struct inflate_codes_state; +typedef struct inflate_codes_state FAR inflate_codes_statef; + +local inflate_codes_statef *inflate_codes_new OF(( +    uInt, uInt, +    inflate_huft *, inflate_huft *, +    z_stream *)); + +local int inflate_codes OF(( +    inflate_blocks_statef *, +    z_stream *, +    int)); + +local void inflate_codes_free OF(( +    inflate_codes_statef *, +    z_stream *)); + + +/*+++++*/ +/* inflate.c -- zlib interface to inflate modules + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* inflate private state */ +struct internal_state { + +  /* mode */ +  enum { +      METHOD,   /* waiting for method byte */ +      FLAG,     /* waiting for flag byte */ +      BLOCKS,   /* decompressing blocks */ +      CHECK4,   /* four check bytes to go */ +      CHECK3,   /* three check bytes to go */ +      CHECK2,   /* two check bytes to go */ +      CHECK1,   /* one check byte to go */ +      DONE,     /* finished check, done */ +      BAD}      /* got an error--stay here */ +    mode;               /* current inflate mode */ + +  /* mode dependent information */ +  union { +    uInt method;        /* if FLAGS, method byte */ +    struct { +      uLong was;                /* computed check value */ +      uLong need;               /* stream check value */ +    } check;            /* if CHECK, check values to compare */ +    uInt marker;        /* if BAD, inflateSync's marker bytes count */ +  } sub;        /* submode */ + +  /* mode independent information */ +  int  nowrap;          /* flag for no wrapper */ +  uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */ +  inflate_blocks_statef +    *blocks;            /* current inflate_blocks state */ + +}; + + +int inflateReset(z) +z_stream *z; +{ +  uLong c; + +  if (z == Z_NULL || z->state == Z_NULL) +    return Z_STREAM_ERROR; +  z->total_in = z->total_out = 0; +  z->msg = Z_NULL; +  z->state->mode = z->state->nowrap ? BLOCKS : METHOD; +  inflate_blocks_reset(z->state->blocks, z, &c); +  Trace((stderr, "inflate: reset\n")); +  return Z_OK; +} + + +int inflateEnd(z) +z_stream *z; +{ +  uLong c; + +  if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) +    return Z_STREAM_ERROR; +  if (z->state->blocks != Z_NULL) +    inflate_blocks_free(z->state->blocks, z, &c); +  ZFREE(z, z->state, sizeof(struct internal_state)); +  z->state = Z_NULL; +  Trace((stderr, "inflate: end\n")); +  return Z_OK; +} + + +int inflateInit2(z, w) +z_stream *z; +int w; +{ +  /* initialize state */ +  if (z == Z_NULL) +    return Z_STREAM_ERROR; +/*  if (z->zalloc == Z_NULL) z->zalloc = zcalloc; */ +/*  if (z->zfree == Z_NULL) z->zfree = zcfree; */ +  if ((z->state = (struct internal_state FAR *) +       ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) +    return Z_MEM_ERROR; +  z->state->blocks = Z_NULL; + +  /* handle undocumented nowrap option (no zlib header or check) */ +  z->state->nowrap = 0; +  if (w < 0) +  { +    w = - w; +    z->state->nowrap = 1; +  } + +  /* set window size */ +  if (w < 8 || w > 15) +  { +    inflateEnd(z); +    return Z_STREAM_ERROR; +  } +  z->state->wbits = (uInt)w; + +  /* create inflate_blocks state */ +  if ((z->state->blocks = +       inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, 1 << w)) +      == Z_NULL) +  { +    inflateEnd(z); +    return Z_MEM_ERROR; +  } +  Trace((stderr, "inflate: allocated\n")); + +  /* reset state */ +  inflateReset(z); +  return Z_OK; +} + + +int inflateInit(z) +z_stream *z; +{ +  return inflateInit2(z, DEF_WBITS); +} + + +#define NEEDBYTE {if(z->avail_in==0)goto empty;r=Z_OK;} +#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) + +int inflate(z, f) +z_stream *z; +int f; +{ +  int r; +  uInt b; + +  if (z == Z_NULL || z->next_in == Z_NULL) +    return Z_STREAM_ERROR; +  r = Z_BUF_ERROR; +  while (1) switch (z->state->mode) +  { +    case METHOD: +      NEEDBYTE +      if (((z->state->sub.method = NEXTBYTE) & 0xf) != DEFLATED) +      { +        z->state->mode = BAD; +        z->msg = "unknown compression method"; +        z->state->sub.marker = 5;       /* can't try inflateSync */ +        break; +      } +      if ((z->state->sub.method >> 4) + 8 > z->state->wbits) +      { +        z->state->mode = BAD; +        z->msg = "invalid window size"; +        z->state->sub.marker = 5;       /* can't try inflateSync */ +        break; +      } +      z->state->mode = FLAG; +    case FLAG: +      NEEDBYTE +      if ((b = NEXTBYTE) & 0x20) +      { +        z->state->mode = BAD; +        z->msg = "invalid reserved bit"; +        z->state->sub.marker = 5;       /* can't try inflateSync */ +        break; +      } +      if (((z->state->sub.method << 8) + b) % 31) +      { +        z->state->mode = BAD; +        z->msg = "incorrect header check"; +        z->state->sub.marker = 5;       /* can't try inflateSync */ +        break; +      } +      Trace((stderr, "inflate: zlib header ok\n")); +      z->state->mode = BLOCKS; +    case BLOCKS: +      r = inflate_blocks(z->state->blocks, z, r); +      if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0) +	  r = inflate_packet_flush(z->state->blocks); +      if (r == Z_DATA_ERROR) +      { +        z->state->mode = BAD; +        z->state->sub.marker = 0;       /* can try inflateSync */ +        break; +      } +      if (r != Z_STREAM_END) +        return r; +      r = Z_OK; +      inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); +      if (z->state->nowrap) +      { +        z->state->mode = DONE; +        break; +      } +      z->state->mode = CHECK4; +    case CHECK4: +      NEEDBYTE +      z->state->sub.check.need = (uLong)NEXTBYTE << 24; +      z->state->mode = CHECK3; +    case CHECK3: +      NEEDBYTE +      z->state->sub.check.need += (uLong)NEXTBYTE << 16; +      z->state->mode = CHECK2; +    case CHECK2: +      NEEDBYTE +      z->state->sub.check.need += (uLong)NEXTBYTE << 8; +      z->state->mode = CHECK1; +    case CHECK1: +      NEEDBYTE +      z->state->sub.check.need += (uLong)NEXTBYTE; + +      if (z->state->sub.check.was != z->state->sub.check.need) +      { +        z->state->mode = BAD; +        z->msg = "incorrect data check"; +        z->state->sub.marker = 5;       /* can't try inflateSync */ +        break; +      } +      Trace((stderr, "inflate: zlib check ok\n")); +      z->state->mode = DONE; +    case DONE: +      return Z_STREAM_END; +    case BAD: +      return Z_DATA_ERROR; +    default: +      return Z_STREAM_ERROR; +  } + + empty: +  if (f != Z_PACKET_FLUSH) +    return r; +  z->state->mode = BAD; +  z->state->sub.marker = 0;       /* can try inflateSync */ +  return Z_DATA_ERROR; +} + +/* + * This subroutine adds the data at next_in/avail_in to the output history + * without performing any output.  The output buffer must be "caught up"; + * i.e. no pending output (hence s->read equals s->write), and the state must + * be BLOCKS (i.e. we should be willing to see the start of a series of + * BLOCKS).  On exit, the output will also be caught up, and the checksum + * will have been updated if need be. + */ + +int inflateIncomp(z) +z_stream *z; +{ +    if (z->state->mode != BLOCKS) +	return Z_DATA_ERROR; +    return inflate_addhistory(z->state->blocks, z); +} + + +int inflateSync(z) +z_stream *z; +{ +  uInt n;       /* number of bytes to look at */ +  Bytef *p;     /* pointer to bytes */ +  uInt m;       /* number of marker bytes found in a row */ +  uLong r, w;   /* temporaries to save total_in and total_out */ + +  /* set up */ +  if (z == Z_NULL || z->state == Z_NULL) +    return Z_STREAM_ERROR; +  if (z->state->mode != BAD) +  { +    z->state->mode = BAD; +    z->state->sub.marker = 0; +  } +  if ((n = z->avail_in) == 0) +    return Z_BUF_ERROR; +  p = z->next_in; +  m = z->state->sub.marker; + +  /* search */ +  while (n && m < 4) +  { +    if (*p == (Byte)(m < 2 ? 0 : 0xff)) +      m++; +    else if (*p) +      m = 0; +    else +      m = 4 - m; +    p++, n--; +  } + +  /* restore */ +  z->total_in += p - z->next_in; +  z->next_in = p; +  z->avail_in = n; +  z->state->sub.marker = m; + +  /* return no joy or set up to restart on a new block */ +  if (m != 4) +    return Z_DATA_ERROR; +  r = z->total_in;  w = z->total_out; +  inflateReset(z); +  z->total_in = r;  z->total_out = w; +  z->state->mode = BLOCKS; +  return Z_OK; +} + +#undef NEEDBYTE +#undef NEXTBYTE + +/*+++++*/ +/* infutil.h -- types and macros common to blocks and codes + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is +   part of the implementation of the compression library and is +   subject to change. Applications should only use zlib.h. + */ + +/* inflate blocks semi-private state */ +struct inflate_blocks_state { + +  /* mode */ +  enum { +      TYPE,     /* get type bits (3, including end bit) */ +      LENS,     /* get lengths for stored */ +      STORED,   /* processing stored block */ +      TABLE,    /* get table lengths */ +      BTREE,    /* get bit lengths tree for a dynamic block */ +      DTREE,    /* get length, distance trees for a dynamic block */ +      CODES,    /* processing fixed or dynamic block */ +      DRY,      /* output remaining window bytes */ +      DONEB,     /* finished last block, done */ +      BADB}      /* got a data error--stuck here */ +    mode;               /* current inflate_block mode */ + +  /* mode dependent information */ +  union { +    uInt left;          /* if STORED, bytes left to copy */ +    struct { +      uInt table;               /* table lengths (14 bits) */ +      uInt index;               /* index into blens (or border) */ +      uIntf *blens;             /* bit lengths of codes */ +      uInt bb;                  /* bit length tree depth */ +      inflate_huft *tb;         /* bit length decoding tree */ +      int nblens;		/* # elements allocated at blens */ +    } trees;            /* if DTREE, decoding info for trees */ +    struct { +      inflate_huft *tl, *td;    /* trees to free */ +      inflate_codes_statef +         *codes; +    } decode;           /* if CODES, current state */ +  } sub;                /* submode */ +  uInt last;            /* true if this block is the last block */ + +  /* mode independent information */ +  uInt bitk;            /* bits in bit buffer */ +  uLong bitb;           /* bit buffer */ +  Bytef *window;        /* sliding window */ +  Bytef *end;           /* one byte after sliding window */ +  Bytef *read;          /* window read pointer */ +  Bytef *write;         /* window write pointer */ +  check_func checkfn;   /* check function */ +  uLong check;          /* check on output */ + +}; + + +/* defines for inflate input/output */ +/*   update pointers and return */ +#define UPDBITS {s->bitb=b;s->bitk=k;} +#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} +#define UPDOUT {s->write=q;} +#define UPDATE {UPDBITS UPDIN UPDOUT} +#define LEAVE {UPDATE return inflate_flush(s,z,r);} +/*   get bytes and bits */ +#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} +#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} +#define NEXTBYTE (n--,*p++) +#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} +#define DUMPBITS(j) {b>>=(j);k-=(j);} +/*   output bytes */ +#define WAVAIL (q<s->read?s->read-q-1:s->end-q) +#define LOADOUT {q=s->write;m=WAVAIL;} +#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=WAVAIL;}} +#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} +#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} +#define OUTBYTE(a) {*q++=(Byte)(a);m--;} +/*   load local pointers */ +#define LOAD {LOADIN LOADOUT} + +/* + * The IBM 150 firmware munges the data right after _etext[].  This + * protects it. -- Cort + */ +#if 0 +local uInt protect_mask[] = {0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 ,0 ,0}; +#endif +/* And'ing with mask[n] masks the lower n bits */ +local uInt inflate_mask[] = { +    0x0000, +    0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, +    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +}; + +/* copy as much as possible from the sliding window to the output area */ +local int inflate_flush OF(( +    inflate_blocks_statef *, +    z_stream *, +    int)); + +/*+++++*/ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is +   part of the implementation of the compression library and is +   subject to change. Applications should only use zlib.h. + */ + +local int inflate_fast OF(( +    uInt, +    uInt, +    inflate_huft *, +    inflate_huft *, +    inflate_blocks_statef *, +    z_stream *)); + + +/*+++++*/ +/* infblock.c -- interpret and process block types to last block + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* Table for deflate from PKZIP's appnote.txt. */ +local uInt border[] = { /* Order of the bit length code lengths */ +        16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* +   Notes beyond the 1.93a appnote.txt: + +   1. Distance pointers never point before the beginning of the output +      stream. +   2. Distance pointers can point back across blocks, up to 32k away. +   3. There is an implied maximum of 7 bits for the bit length table and +      15 bits for the actual data. +   4. If only one code exists, then it is encoded using one bit.  (Zero +      would be more efficient, but perhaps a little confusing.)  If two +      codes exist, they are coded using one bit each (0 and 1). +   5. There is no way of sending zero distance codes--a dummy must be +      sent if there are none.  (History: a pre 2.0 version of PKZIP would +      store blocks with no distance codes, but this was discovered to be +      too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow +      zero distance codes, which is sent as one code of zero bits in +      length. +   6. There are up to 286 literal/length codes.  Code 256 represents the +      end-of-block.  Note however that the static length tree defines +      288 codes just to fill out the Huffman codes.  Codes 286 and 287 +      cannot be used though, since there is no length base or extra bits +      defined for them.  Similarily, there are up to 30 distance codes. +      However, static trees define 32 codes (all 5 bits) to fill out the +      Huffman codes, but the last two had better not show up in the data. +   7. Unzip can check dynamic Huffman blocks for complete code sets. +      The exception is that a single code would not be complete (see #4). +   8. The five bits following the block type is really the number of +      literal codes sent minus 257. +   9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits +      (1+6+6).  Therefore, to output three times the length, you output +      three codes (1+1+1), whereas to output four times the same length, +      you only need two codes (1+3).  Hmm. +  10. In the tree reconstruction algorithm, Code = Code + Increment +      only if BitLength(i) is not zero.  (Pretty obvious.) +  11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19) +  12. Note: length code 284 can represent 227-258, but length code 285 +      really is 258.  The last length deserves its own, short code +      since it gets used a lot in very redundant files.  The length +      258 is special since 258 - 3 (the min match length) is 255. +  13. The literal/length and distance code bit lengths are read as a +      single stream of lengths.  It is possible (and advantageous) for +      a repeat code (16, 17, or 18) to go across the boundary between +      the two sets of lengths. + */ + + +local void inflate_blocks_reset(s, z, c) +inflate_blocks_statef *s; +z_stream *z; +uLongf *c; +{ +  if (s->checkfn != Z_NULL) +    *c = s->check; +  if (s->mode == BTREE || s->mode == DTREE) +    ZFREE(z, s->sub.trees.blens, s->sub.trees.nblens * sizeof(uInt)); +  if (s->mode == CODES) +  { +    inflate_codes_free(s->sub.decode.codes, z); +    inflate_trees_free(s->sub.decode.td, z); +    inflate_trees_free(s->sub.decode.tl, z); +  } +  s->mode = TYPE; +  s->bitk = 0; +  s->bitb = 0; +  s->read = s->write = s->window; +  if (s->checkfn != Z_NULL) +    s->check = (*s->checkfn)(0L, Z_NULL, 0); +  if (z->outcb != Z_NULL) +    (*z->outcb)(Z_NULL, 0); +  Trace((stderr, "inflate:   blocks reset\n")); +} + + +local inflate_blocks_statef *inflate_blocks_new(z, c, w) +z_stream *z; +check_func c; +uInt w; +{ +  inflate_blocks_statef *s; + +  if ((s = (inflate_blocks_statef *)ZALLOC +       (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) +    return s; +  if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) +  { +    ZFREE(z, s, sizeof(struct inflate_blocks_state)); +    return Z_NULL; +  } +  s->end = s->window + w; +  s->checkfn = c; +  s->mode = TYPE; +  Trace((stderr, "inflate:   blocks allocated\n")); +  inflate_blocks_reset(s, z, &s->check); +  return s; +} + + +local int inflate_blocks(s, z, r) +inflate_blocks_statef *s; +z_stream *z; +int r; +{ +  uInt t;               /* temporary storage */ +  uLong b;              /* bit buffer */ +  uInt k;               /* bits in bit buffer */ +  Bytef *p;             /* input data pointer */ +  uInt n;               /* bytes available there */ +  Bytef *q;             /* output window write pointer */ +  uInt m;               /* bytes to end of window or read pointer */ + +  /* copy input/output information to locals (UPDATE macro restores) */ +  LOAD + +  /* process input based on current state */ +  while (1) switch (s->mode) +  { +    case TYPE: +      NEEDBITS(3) +      t = (uInt)b & 7; +      s->last = t & 1; +      switch (t >> 1) +      { +        case 0:                         /* stored */ +          Trace((stderr, "inflate:     stored block%s\n", +                 s->last ? " (last)" : "")); +          DUMPBITS(3) +          t = k & 7;                    /* go to byte boundary */ +          DUMPBITS(t) +          s->mode = LENS;               /* get length of stored block */ +          break; +        case 1:                         /* fixed */ +          Trace((stderr, "inflate:     fixed codes block%s\n", +                 s->last ? " (last)" : "")); +          { +            uInt bl, bd; +            inflate_huft *tl, *td; + +            inflate_trees_fixed(&bl, &bd, &tl, &td); +            s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); +            if (s->sub.decode.codes == Z_NULL) +            { +              r = Z_MEM_ERROR; +              LEAVE +            } +            s->sub.decode.tl = Z_NULL;  /* don't try to free these */ +            s->sub.decode.td = Z_NULL; +          } +          DUMPBITS(3) +          s->mode = CODES; +          break; +        case 2:                         /* dynamic */ +          Trace((stderr, "inflate:     dynamic codes block%s\n", +                 s->last ? " (last)" : "")); +          DUMPBITS(3) +          s->mode = TABLE; +          break; +        case 3:                         /* illegal */ +          DUMPBITS(3) +          s->mode = BADB; +          z->msg = "invalid block type"; +          r = Z_DATA_ERROR; +          LEAVE +      } +      break; +    case LENS: +      NEEDBITS(32) +      if (((~b) >> 16) != (b & 0xffff)) +      { +        s->mode = BADB; +        z->msg = "invalid stored block lengths"; +        r = Z_DATA_ERROR; +        LEAVE +      } +      s->sub.left = (uInt)b & 0xffff; +      b = k = 0;                      /* dump bits */ +      Tracev((stderr, "inflate:       stored length %u\n", s->sub.left)); +      s->mode = s->sub.left ? STORED : TYPE; +      break; +    case STORED: +      if (n == 0) +        LEAVE +      NEEDOUT +      t = s->sub.left; +      if (t > n) t = n; +      if (t > m) t = m; +      zmemcpy(q, p, t); +      p += t;  n -= t; +      q += t;  m -= t; +      if ((s->sub.left -= t) != 0) +        break; +      Tracev((stderr, "inflate:       stored end, %lu total out\n", +              z->total_out + (q >= s->read ? q - s->read : +              (s->end - s->read) + (q - s->window)))); +      s->mode = s->last ? DRY : TYPE; +      break; +    case TABLE: +      NEEDBITS(14) +      s->sub.trees.table = t = (uInt)b & 0x3fff; +#ifndef PKZIP_BUG_WORKAROUND +      if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) +      { +        s->mode = BADB; +        z->msg = "too many length or distance symbols"; +        r = Z_DATA_ERROR; +        LEAVE +      } +#endif +      t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); +      if (t < 19) +        t = 19; +      if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) +      { +        r = Z_MEM_ERROR; +        LEAVE +      } +      s->sub.trees.nblens = t; +      DUMPBITS(14) +      s->sub.trees.index = 0; +      Tracev((stderr, "inflate:       table sizes ok\n")); +      s->mode = BTREE; +    case BTREE: +      while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) +      { +        NEEDBITS(3) +        s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; +        DUMPBITS(3) +      } +      while (s->sub.trees.index < 19) +        s->sub.trees.blens[border[s->sub.trees.index++]] = 0; +      s->sub.trees.bb = 7; +      t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, +                             &s->sub.trees.tb, z); +      if (t != Z_OK) +      { +        r = t; +        if (r == Z_DATA_ERROR) +          s->mode = BADB; +        LEAVE +      } +      s->sub.trees.index = 0; +      Tracev((stderr, "inflate:       bits tree ok\n")); +      s->mode = DTREE; +    case DTREE: +      while (t = s->sub.trees.table, +             s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) +      { +        inflate_huft *h; +        uInt i, j, c; + +        t = s->sub.trees.bb; +        NEEDBITS(t) +        h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); +        t = h->word.what.Bits; +        c = h->more.Base; +        if (c < 16) +        { +          DUMPBITS(t) +          s->sub.trees.blens[s->sub.trees.index++] = c; +        } +        else /* c == 16..18 */ +        { +          i = c == 18 ? 7 : c - 14; +          j = c == 18 ? 11 : 3; +          NEEDBITS(t + i) +          DUMPBITS(t) +          j += (uInt)b & inflate_mask[i]; +          DUMPBITS(i) +          i = s->sub.trees.index; +          t = s->sub.trees.table; +          if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || +              (c == 16 && i < 1)) +          { +            s->mode = BADB; +            z->msg = "invalid bit length repeat"; +            r = Z_DATA_ERROR; +            LEAVE +          } +          c = c == 16 ? s->sub.trees.blens[i - 1] : 0; +          do { +            s->sub.trees.blens[i++] = c; +          } while (--j); +          s->sub.trees.index = i; +        } +      } +      inflate_trees_free(s->sub.trees.tb, z); +      s->sub.trees.tb = Z_NULL; +      { +        uInt bl, bd; +        inflate_huft *tl, *td; +        inflate_codes_statef *c; + +        bl = 9;         /* must be <= 9 for lookahead assumptions */ +        bd = 6;         /* must be <= 9 for lookahead assumptions */ +        t = s->sub.trees.table; +        t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), +                                  s->sub.trees.blens, &bl, &bd, &tl, &td, z); +        if (t != Z_OK) +        { +          if (t == (uInt)Z_DATA_ERROR) +            s->mode = BADB; +          r = t; +          LEAVE +        } +        Tracev((stderr, "inflate:       trees ok\n")); +        if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) +        { +          inflate_trees_free(td, z); +          inflate_trees_free(tl, z); +          r = Z_MEM_ERROR; +          LEAVE +        } +        ZFREE(z, s->sub.trees.blens, s->sub.trees.nblens * sizeof(uInt)); +        s->sub.decode.codes = c; +        s->sub.decode.tl = tl; +        s->sub.decode.td = td; +      } +      s->mode = CODES; +    case CODES: +      UPDATE +      if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) +        return inflate_flush(s, z, r); +      r = Z_OK; +      inflate_codes_free(s->sub.decode.codes, z); +      inflate_trees_free(s->sub.decode.td, z); +      inflate_trees_free(s->sub.decode.tl, z); +      LOAD +      Tracev((stderr, "inflate:       codes end, %lu total out\n", +              z->total_out + (q >= s->read ? q - s->read : +              (s->end - s->read) + (q - s->window)))); +      if (!s->last) +      { +        s->mode = TYPE; +        break; +      } +      if (k > 7)              /* return unused byte, if any */ +      { +        Assert(k < 16, "inflate_codes grabbed too many bytes") +        k -= 8; +        n++; +        p--;                    /* can always return one */ +      } +      s->mode = DRY; +    case DRY: +      FLUSH +      if (s->read != s->write) +        LEAVE +      s->mode = DONEB; +    case DONEB: +      r = Z_STREAM_END; +      LEAVE +    case BADB: +      r = Z_DATA_ERROR; +      LEAVE +    default: +      r = Z_STREAM_ERROR; +      LEAVE +  } +} + + +local int inflate_blocks_free(s, z, c) +inflate_blocks_statef *s; +z_stream *z; +uLongf *c; +{ +  inflate_blocks_reset(s, z, c); +  ZFREE(z, s->window, s->end - s->window); +  ZFREE(z, s, sizeof(struct inflate_blocks_state)); +  Trace((stderr, "inflate:   blocks freed\n")); +  return Z_OK; +} + +/* + * This subroutine adds the data at next_in/avail_in to the output history + * without performing any output.  The output buffer must be "caught up"; + * i.e. no pending output (hence s->read equals s->write), and the state must + * be BLOCKS (i.e. we should be willing to see the start of a series of + * BLOCKS).  On exit, the output will also be caught up, and the checksum + * will have been updated if need be. + */ +local int inflate_addhistory(s, z) +inflate_blocks_statef *s; +z_stream *z; +{ +    uLong b;              /* bit buffer */  /* NOT USED HERE */ +    uInt k;               /* bits in bit buffer */ /* NOT USED HERE */ +    uInt t;               /* temporary storage */ +    Bytef *p;             /* input data pointer */ +    uInt n;               /* bytes available there */ +    Bytef *q;             /* output window write pointer */ +    uInt m;               /* bytes to end of window or read pointer */ + +    if (s->read != s->write) +	return Z_STREAM_ERROR; +    if (s->mode != TYPE) +	return Z_DATA_ERROR; + +    /* we're ready to rock */ +    LOAD +    /* while there is input ready, copy to output buffer, moving +     * pointers as needed. +     */ +    while (n) { +	t = n;  /* how many to do */ +	/* is there room until end of buffer? */ +	if (t > m) t = m; +	/* update check information */ +	if (s->checkfn != Z_NULL) +	    s->check = (*s->checkfn)(s->check, q, t); +	/* output callback */ +	if (z->outcb != Z_NULL) +	    (*z->outcb)(q, t); +	zmemcpy(q, p, t); +	q += t; +	p += t; +	n -= t; +	z->total_out += t; +	s->read = q;    /* drag read pointer forward */ +/*      WRAP  */ 	/* expand WRAP macro by hand to handle s->read */ +	if (q == s->end) { +	    s->read = q = s->window; +	    m = WAVAIL; +	} +    } +    UPDATE +    return Z_OK; +} + + +/* + * At the end of a Deflate-compressed PPP packet, we expect to have seen + * a `stored' block type value but not the (zero) length bytes. + */ +local int inflate_packet_flush(s) +    inflate_blocks_statef *s; +{ +    if (s->mode != LENS) +	return Z_DATA_ERROR; +    s->mode = TYPE; +    return Z_OK; +} + + +/*+++++*/ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* simplify the use of the inflate_huft type with some defines */ +#define base more.Base +#define next more.Next +#define exop word.what.Exop +#define bits word.what.Bits + + +local int huft_build OF(( +    uIntf *,            /* code lengths in bits */ +    uInt,               /* number of codes */ +    uInt,               /* number of "simple" codes */ +    uIntf *,            /* list of base values for non-simple codes */ +    uIntf *,            /* list of extra bits for non-simple codes */ +    inflate_huft * FAR*,/* result: starting table */ +    uIntf *,            /* maximum lookup bits (returns actual) */ +    z_stream *));       /* for zalloc function */ + +local voidpf falloc OF(( +    voidpf,             /* opaque pointer (not used) */ +    uInt,               /* number of items */ +    uInt));             /* size of item */ + +local void ffree OF(( +    voidpf q,           /* opaque pointer (not used) */ +    voidpf p,           /* what to free (not used) */ +    uInt n));		/* number of bytes (not used) */ + +/* Tables for deflate from PKZIP's appnote.txt. */ +local uInt cplens[] = { /* Copy lengths for literal codes 257..285 */ +        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, +        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; +        /* actually lengths - 2; also see note #13 above about 258 */ +local uInt cplext[] = { /* Extra bits for literal codes 257..285 */ +        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, +        3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 192, 192}; /* 192==invalid */ +local uInt cpdist[] = { /* Copy offsets for distance codes 0..29 */ +        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, +        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, +        8193, 12289, 16385, 24577}; +local uInt cpdext[] = { /* Extra bits for distance codes */ +        0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, +        7, 7, 8, 8, 9, 9, 10, 10, 11, 11, +        12, 12, 13, 13}; + +/* +   Huffman code decoding is performed using a multi-level table lookup. +   The fastest way to decode is to simply build a lookup table whose +   size is determined by the longest code.  However, the time it takes +   to build this table can also be a factor if the data being decoded +   is not very long.  The most common codes are necessarily the +   shortest codes, so those codes dominate the decoding time, and hence +   the speed.  The idea is you can have a shorter table that decodes the +   shorter, more probable codes, and then point to subsidiary tables for +   the longer codes.  The time it costs to decode the longer codes is +   then traded against the time it takes to make longer tables. + +   This results of this trade are in the variables lbits and dbits +   below.  lbits is the number of bits the first level table for literal/ +   length codes can decode in one step, and dbits is the same thing for +   the distance codes.  Subsequent tables are also less than or equal to +   those sizes.  These values may be adjusted either when all of the +   codes are shorter than that, in which case the longest code length in +   bits is used, or when the shortest code is *longer* than the requested +   table size, in which case the length of the shortest code in bits is +   used. + +   There are two different values for the two tables, since they code a +   different number of possibilities each.  The literal/length table +   codes 286 possible values, or in a flat code, a little over eight +   bits.  The distance table codes 30 possible values, or a little less +   than five bits, flat.  The optimum values for speed end up being +   about one bit more than those, so lbits is 8+1 and dbits is 5+1. +   The optimum values may differ though from machine to machine, and +   possibly even between compilers.  Your mileage may vary. + */ + + +/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ +#define BMAX 15         /* maximum bit length of any code */ +#define N_MAX 288       /* maximum number of codes in any set */ + +#ifdef DEBUG_ZLIB +  uInt inflate_hufts; +#endif + +local int huft_build(b, n, s, d, e, t, m, zs) +uIntf *b;               /* code lengths in bits (all assumed <= BMAX) */ +uInt n;                 /* number of codes (assumed <= N_MAX) */ +uInt s;                 /* number of simple-valued codes (0..s-1) */ +uIntf *d;               /* list of base values for non-simple codes */ +uIntf *e;               /* list of extra bits for non-simple codes */ +inflate_huft * FAR *t;  /* result: starting table */ +uIntf *m;               /* maximum lookup bits, returns actual */ +z_stream *zs;           /* for zalloc function */ +/* Given a list of code lengths and a maximum table size, make a set of +   tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR +   if the given code set is incomplete (the tables are still built in this +   case), Z_DATA_ERROR if the input is invalid (all zero length codes or an +   over-subscribed set of lengths), or Z_MEM_ERROR if not enough memory. */ +{ + +  uInt a;                       /* counter for codes of length k */ +  uInt c[BMAX+1];               /* bit length count table */ +  uInt f;                       /* i repeats in table every f entries */ +  int g;                        /* maximum code length */ +  int h;                        /* table level */ +  register uInt i;              /* counter, current code */ +  register uInt j;              /* counter */ +  register int k;               /* number of bits in current code */ +  int l;                        /* bits per table (returned in m) */ +  register uIntf *p;            /* pointer into c[], b[], or v[] */ +  inflate_huft *q;              /* points to current table */ +  struct inflate_huft_s r;      /* table entry for structure assignment */ +  inflate_huft *u[BMAX];        /* table stack */ +  uInt v[N_MAX];                /* values in order of bit length */ +  register int w;               /* bits before this table == (l * h) */ +  uInt x[BMAX+1];               /* bit offsets, then code stack */ +  uIntf *xp;                    /* pointer into x */ +  int y;                        /* number of dummy codes added */ +  uInt z;                       /* number of entries in current table */ + + +  /* Generate counts for each bit length */ +  p = c; +#define C0 *p++ = 0; +#define C2 C0 C0 C0 C0 +#define C4 C2 C2 C2 C2 +  C4                            /* clear c[]--assume BMAX+1 is 16 */ +  p = b;  i = n; +  do { +    c[*p++]++;                  /* assume all entries <= BMAX */ +  } while (--i); +  if (c[0] == n)                /* null input--all zero length codes */ +  { +    *t = (inflate_huft *)Z_NULL; +    *m = 0; +    return Z_OK; +  } + + +  /* Find minimum and maximum length, bound *m by those */ +  l = *m; +  for (j = 1; j <= BMAX; j++) +    if (c[j]) +      break; +  k = j;                        /* minimum code length */ +  if ((uInt)l < j) +    l = j; +  for (i = BMAX; i; i--) +    if (c[i]) +      break; +  g = i;                        /* maximum code length */ +  if ((uInt)l > i) +    l = i; +  *m = l; + + +  /* Adjust last length count to fill out codes, if needed */ +  for (y = 1 << j; j < i; j++, y <<= 1) +    if ((y -= c[j]) < 0) +      return Z_DATA_ERROR; +  if ((y -= c[i]) < 0) +    return Z_DATA_ERROR; +  c[i] += y; + + +  /* Generate starting offsets into the value table for each length */ +  x[1] = j = 0; +  p = c + 1;  xp = x + 2; +  while (--i) {                 /* note that i == g from above */ +    *xp++ = (j += *p++); +  } + + +  /* Make a table of values in order of bit lengths */ +  p = b;  i = 0; +  do { +    if ((j = *p++) != 0) +      v[x[j]++] = i; +  } while (++i < n); + + +  /* Generate the Huffman codes and for each, make the table entries */ +  x[0] = i = 0;                 /* first Huffman code is zero */ +  p = v;                        /* grab values in bit order */ +  h = -1;                       /* no tables yet--level -1 */ +  w = -l;                       /* bits decoded == (l * h) */ +  u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */ +  q = (inflate_huft *)Z_NULL;   /* ditto */ +  z = 0;                        /* ditto */ + +  /* go through the bit lengths (k already is bits in shortest code) */ +  for (; k <= g; k++) +  { +    a = c[k]; +    while (a--) +    { +      /* here i is the Huffman code of length k bits for value *p */ +      /* make tables up to required level */ +      while (k > w + l) +      { +        h++; +        w += l;                 /* previous table always l bits */ + +        /* compute minimum size table less than or equal to l bits */ +        z = (z = g - w) > (uInt)l ? l : z;      /* table size upper limit */ +        if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */ +        {                       /* too few codes for k-w bit table */ +          f -= a + 1;           /* deduct codes from patterns left */ +          xp = c + k; +          if (j < z) +            while (++j < z)     /* try smaller tables up to z bits */ +            { +              if ((f <<= 1) <= *++xp) +                break;          /* enough codes to use up j bits */ +              f -= *xp;         /* else deduct codes from patterns */ +            } +        } +        z = 1 << j;             /* table entries for j-bit table */ + +        /* allocate and link in new table */ +        if ((q = (inflate_huft *)ZALLOC +             (zs,z + 1,sizeof(inflate_huft))) == Z_NULL) +        { +          if (h) +            inflate_trees_free(u[0], zs); +          return Z_MEM_ERROR;   /* not enough memory */ +        } +	q->word.Nalloc = z + 1; +#ifdef DEBUG_ZLIB +        inflate_hufts += z + 1; +#endif +        *t = q + 1;             /* link to list for huft_free() */ +        *(t = &(q->next)) = Z_NULL; +        u[h] = ++q;             /* table starts after link */ + +        /* connect to last table, if there is one */ +        if (h) +        { +          x[h] = i;             /* save pattern for backing up */ +          r.bits = (Byte)l;     /* bits to dump before this table */ +          r.exop = (Byte)j;     /* bits in this table */ +          r.next = q;           /* pointer to this table */ +          j = i >> (w - l);     /* (get around Turbo C bug) */ +          u[h-1][j] = r;        /* connect to last table */ +        } +      } + +      /* set up table entry in r */ +      r.bits = (Byte)(k - w); +      if (p >= v + n) +        r.exop = 128 + 64;      /* out of values--invalid code */ +      else if (*p < s) +      { +        r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */ +        r.base = *p++;          /* simple code is just the value */ +      } +      else +      { +        r.exop = (Byte)e[*p - s] + 16 + 64; /* non-simple--look up in lists */ +        r.base = d[*p++ - s]; +      } + +      /* fill code-like entries with r */ +      f = 1 << (k - w); +      for (j = i >> w; j < z; j += f) +        q[j] = r; + +      /* backwards increment the k-bit code i */ +      for (j = 1 << (k - 1); i & j; j >>= 1) +        i ^= j; +      i ^= j; + +      /* backup over finished tables */ +      while ((i & ((1 << w) - 1)) != x[h]) +      { +        h--;                    /* don't need to update q */ +        w -= l; +      } +    } +  } + + +  /* Return Z_BUF_ERROR if we were given an incomplete table */ +  return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; +} + + +local int inflate_trees_bits(c, bb, tb, z) +uIntf *c;               /* 19 code lengths */ +uIntf *bb;              /* bits tree desired/actual depth */ +inflate_huft * FAR *tb; /* bits tree result */ +z_stream *z;            /* for zfree function */ +{ +  int r; + +  r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z); +  if (r == Z_DATA_ERROR) +    z->msg = "oversubscribed dynamic bit lengths tree"; +  else if (r == Z_BUF_ERROR) +  { +    inflate_trees_free(*tb, z); +    z->msg = "incomplete dynamic bit lengths tree"; +    r = Z_DATA_ERROR; +  } +  return r; +} + + +local int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z) +uInt nl;                /* number of literal/length codes */ +uInt nd;                /* number of distance codes */ +uIntf *c;               /* that many (total) code lengths */ +uIntf *bl;              /* literal desired/actual bit depth */ +uIntf *bd;              /* distance desired/actual bit depth */ +inflate_huft * FAR *tl; /* literal/length tree result */ +inflate_huft * FAR *td; /* distance tree result */ +z_stream *z;            /* for zfree function */ +{ +  int r; + +  /* build literal/length tree */ +  if ((r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z)) != Z_OK) +  { +    if (r == Z_DATA_ERROR) +      z->msg = "oversubscribed literal/length tree"; +    else if (r == Z_BUF_ERROR) +    { +      inflate_trees_free(*tl, z); +      z->msg = "incomplete literal/length tree"; +      r = Z_DATA_ERROR; +    } +    return r; +  } + +  /* build distance tree */ +  if ((r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z)) != Z_OK) +  { +    if (r == Z_DATA_ERROR) +      z->msg = "oversubscribed literal/length tree"; +    else if (r == Z_BUF_ERROR) { +#ifdef PKZIP_BUG_WORKAROUND +      r = Z_OK; +    } +#else +      inflate_trees_free(*td, z); +      z->msg = "incomplete literal/length tree"; +      r = Z_DATA_ERROR; +    } +    inflate_trees_free(*tl, z); +    return r; +#endif +  } + +  /* done */ +  return Z_OK; +} + + +/* build fixed tables only once--keep them here */ +local int fixed_lock = 0; +local int fixed_built = 0; +#define FIXEDH 530      /* number of hufts used by fixed tables */ +local uInt fixed_left = FIXEDH; +local inflate_huft fixed_mem[FIXEDH]; +local uInt fixed_bl; +local uInt fixed_bd; +local inflate_huft *fixed_tl; +local inflate_huft *fixed_td; + + +local voidpf falloc(q, n, s) +voidpf q;        /* opaque pointer (not used) */ +uInt n;         /* number of items */ +uInt s;         /* size of item */ +{ +  Assert(s == sizeof(inflate_huft) && n <= fixed_left, +         "inflate_trees falloc overflow"); +  if (q) s++; /* to make some compilers happy */ +  fixed_left -= n; +  return (voidpf)(fixed_mem + fixed_left); +} + + +local void ffree(q, p, n) +voidpf q; +voidpf p; +uInt n; +{ +  Assert(0, "inflate_trees ffree called!"); +  if (q) q = p; /* to make some compilers happy */ +} + + +local int inflate_trees_fixed(bl, bd, tl, td) +uIntf *bl;               /* literal desired/actual bit depth */ +uIntf *bd;               /* distance desired/actual bit depth */ +inflate_huft * FAR *tl;  /* literal/length tree result */ +inflate_huft * FAR *td;  /* distance tree result */ +{ +  /* build fixed tables if not built already--lock out other instances */ +  while (++fixed_lock > 1) +    fixed_lock--; +  if (!fixed_built) +  { +    int k;              /* temporary variable */ +    unsigned c[288];    /* length list for huft_build */ +    z_stream z;         /* for falloc function */ + +    /* set up fake z_stream for memory routines */ +    z.zalloc = falloc; +    z.zfree = ffree; +    z.opaque = Z_NULL; + +    /* literal table */ +    for (k = 0; k < 144; k++) +      c[k] = 8; +    for (; k < 256; k++) +      c[k] = 9; +    for (; k < 280; k++) +      c[k] = 7; +    for (; k < 288; k++) +      c[k] = 8; +    fixed_bl = 7; +    huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, &z); + +    /* distance table */ +    for (k = 0; k < 30; k++) +      c[k] = 5; +    fixed_bd = 5; +    huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z); + +    /* done */ +    fixed_built = 1; +  } +  fixed_lock--; +  *bl = fixed_bl; +  *bd = fixed_bd; +  *tl = fixed_tl; +  *td = fixed_td; +  return Z_OK; +} + + +local int inflate_trees_free(t, z) +inflate_huft *t;        /* table to free */ +z_stream *z;            /* for zfree function */ +/* Free the malloc'ed tables built by huft_build(), which makes a linked +   list of the tables it made, with the links in a dummy first entry of +   each table. */ +{ +  register inflate_huft *p, *q; + +  /* Go through linked list, freeing from the malloced (t[-1]) address. */ +  p = t; +  while (p != Z_NULL) +  { +    q = (--p)->next; +    ZFREE(z, p, p->word.Nalloc * sizeof(inflate_huft)); +    p = q; +  } +  return Z_OK; +} + +/*+++++*/ +/* infcodes.c -- process literals and length/distance pairs + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* simplify the use of the inflate_huft type with some defines */ +#define base more.Base +#define next more.Next +#define exop word.what.Exop +#define bits word.what.Bits + +/* inflate codes private state */ +struct inflate_codes_state { + +  /* mode */ +  enum {        /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ +      START,    /* x: set up for LEN */ +      LEN,      /* i: get length/literal/eob next */ +      LENEXT,   /* i: getting length extra (have base) */ +      DIST,     /* i: get distance next */ +      DISTEXT,  /* i: getting distance extra */ +      COPY,     /* o: copying bytes in window, waiting for space */ +      LIT,      /* o: got literal, waiting for output space */ +      WASH,     /* o: got eob, possibly still output waiting */ +      END,      /* x: got eob and all data flushed */ +      BADCODE}  /* x: got error */ +    mode;               /* current inflate_codes mode */ + +  /* mode dependent information */ +  uInt len; +  union { +    struct { +      inflate_huft *tree;       /* pointer into tree */ +      uInt need;                /* bits needed */ +    } code;             /* if LEN or DIST, where in tree */ +    uInt lit;           /* if LIT, literal */ +    struct { +      uInt get;                 /* bits to get for extra */ +      uInt dist;                /* distance back to copy from */ +    } copy;             /* if EXT or COPY, where and how much */ +  } sub;                /* submode */ + +  /* mode independent information */ +  Byte lbits;           /* ltree bits decoded per branch */ +  Byte dbits;           /* dtree bits decoder per branch */ +  inflate_huft *ltree;          /* literal/length/eob tree */ +  inflate_huft *dtree;          /* distance tree */ + +}; + + +local inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z) +uInt bl, bd; +inflate_huft *tl, *td; +z_stream *z; +{ +  inflate_codes_statef *c; + +  if ((c = (inflate_codes_statef *) +       ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) +  { +    c->mode = START; +    c->lbits = (Byte)bl; +    c->dbits = (Byte)bd; +    c->ltree = tl; +    c->dtree = td; +    Tracev((stderr, "inflate:       codes new\n")); +  } +  return c; +} + + +local int inflate_codes(s, z, r) +inflate_blocks_statef *s; +z_stream *z; +int r; +{ +  uInt j;               /* temporary storage */ +  inflate_huft *t;      /* temporary pointer */ +  uInt e;               /* extra bits or operation */ +  uLong b;              /* bit buffer */ +  uInt k;               /* bits in bit buffer */ +  Bytef *p;             /* input data pointer */ +  uInt n;               /* bytes available there */ +  Bytef *q;             /* output window write pointer */ +  uInt m;               /* bytes to end of window or read pointer */ +  Bytef *f;             /* pointer to copy strings from */ +  inflate_codes_statef *c = s->sub.decode.codes;  /* codes state */ + +  /* copy input/output information to locals (UPDATE macro restores) */ +  LOAD + +  /* process input and output based on current state */ +  while (1) switch (c->mode) +  {             /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ +    case START:         /* x: set up for LEN */ +#ifndef SLOW +      if (m >= 258 && n >= 10) +      { +        UPDATE +        r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); +        LOAD +        if (r != Z_OK) +        { +          c->mode = r == Z_STREAM_END ? WASH : BADCODE; +          break; +        } +      } +#endif /* !SLOW */ +      c->sub.code.need = c->lbits; +      c->sub.code.tree = c->ltree; +      c->mode = LEN; +    case LEN:           /* i: get length/literal/eob next */ +      j = c->sub.code.need; +      NEEDBITS(j) +      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); +      DUMPBITS(t->bits) +      e = (uInt)(t->exop); +      if (e == 0)               /* literal */ +      { +        c->sub.lit = t->base; +        Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? +                 "inflate:         literal '%c'\n" : +                 "inflate:         literal 0x%02x\n", t->base)); +        c->mode = LIT; +        break; +      } +      if (e & 16)               /* length */ +      { +        c->sub.copy.get = e & 15; +        c->len = t->base; +        c->mode = LENEXT; +        break; +      } +      if ((e & 64) == 0)        /* next table */ +      { +        c->sub.code.need = e; +        c->sub.code.tree = t->next; +        break; +      } +      if (e & 32)               /* end of block */ +      { +        Tracevv((stderr, "inflate:         end of block\n")); +        c->mode = WASH; +        break; +      } +      c->mode = BADCODE;        /* invalid code */ +      z->msg = "invalid literal/length code"; +      r = Z_DATA_ERROR; +      LEAVE +    case LENEXT:        /* i: getting length extra (have base) */ +      j = c->sub.copy.get; +      NEEDBITS(j) +      c->len += (uInt)b & inflate_mask[j]; +      DUMPBITS(j) +      c->sub.code.need = c->dbits; +      c->sub.code.tree = c->dtree; +      Tracevv((stderr, "inflate:         length %u\n", c->len)); +      c->mode = DIST; +    case DIST:          /* i: get distance next */ +      j = c->sub.code.need; +      NEEDBITS(j) +      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); +      DUMPBITS(t->bits) +      e = (uInt)(t->exop); +      if (e & 16)               /* distance */ +      { +        c->sub.copy.get = e & 15; +        c->sub.copy.dist = t->base; +        c->mode = DISTEXT; +        break; +      } +      if ((e & 64) == 0)        /* next table */ +      { +        c->sub.code.need = e; +        c->sub.code.tree = t->next; +        break; +      } +      c->mode = BADCODE;        /* invalid code */ +      z->msg = "invalid distance code"; +      r = Z_DATA_ERROR; +      LEAVE +    case DISTEXT:       /* i: getting distance extra */ +      j = c->sub.copy.get; +      NEEDBITS(j) +      c->sub.copy.dist += (uInt)b & inflate_mask[j]; +      DUMPBITS(j) +      Tracevv((stderr, "inflate:         distance %u\n", c->sub.copy.dist)); +      c->mode = COPY; +    case COPY:          /* o: copying bytes in window, waiting for space */ +#ifndef __TURBOC__ /* Turbo C bug for following expression */ +      f = (uInt)(q - s->window) < c->sub.copy.dist ? +          s->end - (c->sub.copy.dist - (q - s->window)) : +          q - c->sub.copy.dist; +#else +      f = q - c->sub.copy.dist; +      if ((uInt)(q - s->window) < c->sub.copy.dist) +        f = s->end - (c->sub.copy.dist - (q - s->window)); +#endif +      while (c->len) +      { +        NEEDOUT +        OUTBYTE(*f++) +        if (f == s->end) +          f = s->window; +        c->len--; +      } +      c->mode = START; +      break; +    case LIT:           /* o: got literal, waiting for output space */ +      NEEDOUT +      OUTBYTE(c->sub.lit) +      c->mode = START; +      break; +    case WASH:          /* o: got eob, possibly more output */ +      FLUSH +      if (s->read != s->write) +        LEAVE +      c->mode = END; +    case END: +      r = Z_STREAM_END; +      LEAVE +    case BADCODE:       /* x: got error */ +      r = Z_DATA_ERROR; +      LEAVE +    default: +      r = Z_STREAM_ERROR; +      LEAVE +  } +} + + +local void inflate_codes_free(c, z) +inflate_codes_statef *c; +z_stream *z; +{ +  ZFREE(z, c, sizeof(struct inflate_codes_state)); +  Tracev((stderr, "inflate:       codes free\n")); +} + +/*+++++*/ +/* inflate_util.c -- data and routines common to blocks and codes + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* copy as much as possible from the sliding window to the output area */ +local int inflate_flush(s, z, r) +inflate_blocks_statef *s; +z_stream *z; +int r; +{ +  uInt n; +  Bytef *p, *q; + +  /* local copies of source and destination pointers */ +  p = z->next_out; +  q = s->read; + +  /* compute number of bytes to copy as far as end of window */ +  n = (uInt)((q <= s->write ? s->write : s->end) - q); +  if (n > z->avail_out) n = z->avail_out; +  if (n && r == Z_BUF_ERROR) r = Z_OK; + +  /* update counters */ +  z->avail_out -= n; +  z->total_out += n; + +  /* update check information */ +  if (s->checkfn != Z_NULL) +    s->check = (*s->checkfn)(s->check, q, n); + +  /* output callback */ +  if (z->outcb != Z_NULL) +    (*z->outcb)(q, n); + +  /* copy as far as end of window */ +  zmemcpy(p, q, n); +  p += n; +  q += n; + +  /* see if more to copy at beginning of window */ +  if (q == s->end) +  { +    /* wrap pointers */ +    q = s->window; +    if (s->write == s->end) +      s->write = s->window; + +    /* compute bytes to copy */ +    n = (uInt)(s->write - q); +    if (n > z->avail_out) n = z->avail_out; +    if (n && r == Z_BUF_ERROR) r = Z_OK; + +    /* update counters */ +    z->avail_out -= n; +    z->total_out += n; + +    /* update check information */ +    if (s->checkfn != Z_NULL) +      s->check = (*s->checkfn)(s->check, q, n); + +    /* output callback */ +    if (z->outcb != Z_NULL) +	(*z->outcb)(q, n); + +    /* copy */ +    zmemcpy(p, q, n); +    p += n; +    q += n; +  } + +  /* update pointers */ +  z->next_out = p; +  s->read = q; + +  /* done */ +  return r; +} + + +/*+++++*/ +/* inffast.c -- process literals and length/distance pairs fast + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* simplify the use of the inflate_huft type with some defines */ +#define base more.Base +#define next more.Next +#define exop word.what.Exop +#define bits word.what.Bits + +/* macros for bit input with no checking and for returning unused bytes */ +#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} +#define UNGRAB {n+=(c=k>>3);p-=c;k&=7;} + +/* Called with number of bytes left to write in window at least 258 +   (the maximum string length) and number of input bytes available +   at least ten.  The ten bytes are six bytes for the longest length/ +   distance pair plus four bytes for overloading the bit buffer. */ + +local int inflate_fast(bl, bd, tl, td, s, z) +uInt bl, bd; +inflate_huft *tl, *td; +inflate_blocks_statef *s; +z_stream *z; +{ +  inflate_huft *t;      /* temporary pointer */ +  uInt e;               /* extra bits or operation */ +  uLong b;              /* bit buffer */ +  uInt k;               /* bits in bit buffer */ +  Bytef *p;             /* input data pointer */ +  uInt n;               /* bytes available there */ +  Bytef *q;             /* output window write pointer */ +  uInt m;               /* bytes to end of window or read pointer */ +  uInt ml;              /* mask for literal/length tree */ +  uInt md;              /* mask for distance tree */ +  uInt c;               /* bytes to copy */ +  uInt d;               /* distance back to copy from */ +  Bytef *r;             /* copy source pointer */ + +  /* load input, output, bit values */ +  LOAD + +  /* initialize masks */ +  ml = inflate_mask[bl]; +  md = inflate_mask[bd]; + +  /* do until not enough input or output space for fast loop */ +  do {                          /* assume called with m >= 258 && n >= 10 */ +    /* get literal/length code */ +    GRABBITS(20)                /* max bits for literal/length code */ +    if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) +    { +      DUMPBITS(t->bits) +      Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? +                "inflate:         * literal '%c'\n" : +                "inflate:         * literal 0x%02x\n", t->base)); +      *q++ = (Byte)t->base; +      m--; +      continue; +    } +    do { +      DUMPBITS(t->bits) +      if (e & 16) +      { +        /* get extra bits for length */ +        e &= 15; +        c = t->base + ((uInt)b & inflate_mask[e]); +        DUMPBITS(e) +        Tracevv((stderr, "inflate:         * length %u\n", c)); + +        /* decode distance base of block to copy */ +        GRABBITS(15);           /* max bits for distance code */ +        e = (t = td + ((uInt)b & md))->exop; +        do { +          DUMPBITS(t->bits) +          if (e & 16) +          { +            /* get extra bits to add to distance base */ +            e &= 15; +            GRABBITS(e)         /* get extra bits (up to 13) */ +            d = t->base + ((uInt)b & inflate_mask[e]); +            DUMPBITS(e) +            Tracevv((stderr, "inflate:         * distance %u\n", d)); + +            /* do the copy */ +            m -= c; +            if ((uInt)(q - s->window) >= d)     /* offset before dest */ +            {                                   /*  just copy */ +              r = q - d; +              *q++ = *r++;  c--;        /* minimum count is three, */ +              *q++ = *r++;  c--;        /*  so unroll loop a little */ +            } +            else                        /* else offset after destination */ +            { +              e = d - (q - s->window);  /* bytes from offset to end */ +              r = s->end - e;           /* pointer to offset */ +              if (c > e)                /* if source crosses, */ +              { +                c -= e;                 /* copy to end of window */ +                do { +                  *q++ = *r++; +                } while (--e); +                r = s->window;          /* copy rest from start of window */ +              } +            } +            do {                        /* copy all or what's left */ +              *q++ = *r++; +            } while (--c); +            break; +          } +          else if ((e & 64) == 0) +            e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop; +          else +          { +            z->msg = "invalid distance code"; +            UNGRAB +            UPDATE +            return Z_DATA_ERROR; +          } +        } while (1); +        break; +      } +      if ((e & 64) == 0) +      { +        if ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) == 0) +        { +          DUMPBITS(t->bits) +          Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? +                    "inflate:         * literal '%c'\n" : +                    "inflate:         * literal 0x%02x\n", t->base)); +          *q++ = (Byte)t->base; +          m--; +          break; +        } +      } +      else if (e & 32) +      { +        Tracevv((stderr, "inflate:         * end of block\n")); +        UNGRAB +        UPDATE +        return Z_STREAM_END; +      } +      else +      { +        z->msg = "invalid literal/length code"; +        UNGRAB +        UPDATE +        return Z_DATA_ERROR; +      } +    } while (1); +  } while (m >= 258 && n >= 10); + +  /* not enough input or output--restore pointers and return */ +  UNGRAB +  UPDATE +  return Z_OK; +} + + +/*+++++*/ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* From: zutil.c,v 1.8 1995/05/03 17:27:12 jloup Exp */ + +char *zlib_version = ZLIB_VERSION; + +char *z_errmsg[] = { +"stream end",          /* Z_STREAM_END    1 */ +"",                    /* Z_OK            0 */ +"file error",          /* Z_ERRNO        (-1) */ +"stream error",        /* Z_STREAM_ERROR (-2) */ +"data error",          /* Z_DATA_ERROR   (-3) */ +"insufficient memory", /* Z_MEM_ERROR    (-4) */ +"buffer error",        /* Z_BUF_ERROR    (-5) */ +""}; + + +/*+++++*/ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* From: adler32.c,v 1.6 1995/05/03 17:27:08 jloup Exp */ + +#define BASE 65521L /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf)  {s1 += *buf++; s2 += s1;} +#define DO2(buf)  DO1(buf); DO1(buf); +#define DO4(buf)  DO2(buf); DO2(buf); +#define DO8(buf)  DO4(buf); DO4(buf); +#define DO16(buf) DO8(buf); DO8(buf); + +/* ========================================================================= */ +uLong adler32(adler, buf, len) +    uLong adler; +    Bytef *buf; +    uInt len; +{ +    unsigned long s1 = adler & 0xffff; +    unsigned long s2 = (adler >> 16) & 0xffff; +    int k; + +    if (buf == Z_NULL) return 1L; + +    while (len > 0) { +        k = len < NMAX ? len : NMAX; +        len -= k; +        while (k >= 16) { +            DO16(buf); +            k -= 16; +        } +        if (k != 0) do { +            DO1(buf); +        } while (--k); +        s1 %= BASE; +        s2 %= BASE; +    } +    return (s2 << 16) | s1; +} diff --git a/tools/gdb/remote.c b/tools/gdb/remote.c new file mode 100644 index 000000000..b8b247021 --- /dev/null +++ b/tools/gdb/remote.c @@ -0,0 +1,928 @@ +/* + * taken from gdb/remote.c + * + * I am only interested in the write to memory stuff - everything else + * has been ripped out + * + * all the copyright notices etc have been left in + */ + +/* enough so that it will compile */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +/*nicked from gcc..*/ + +#ifndef alloca +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else /* not GNU C.  */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) +#include <alloca.h> +#else /* not sparc */ +#if defined (MSDOS) && !defined (__TURBOC__) +#include <malloc.h> +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +#include <malloc.h> + #pragma alloca +#else /* not MSDOS, __TURBOC__, or _AIX */ +#ifdef __hpux +#endif /* __hpux */ +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc.  */ +#endif /* not GNU C.  */ +#ifdef __cplusplus +extern "C" { +#endif +    void* alloca(size_t); +#ifdef __cplusplus +} +#endif +#endif /* alloca not defined.  */ + + +#include "serial.h" +#include "error.h" +#include "remote.h" +#define REGISTER_BYTES 0 +#define fprintf_unfiltered fprintf +#define fprintf_filtered fprintf +#define fputs_unfiltered fputs +#define fputs_filtered fputs +#define fputc_unfiltered fputc +#define fputc_filtered fputc +#define printf_unfiltered printf +#define printf_filtered printf +#define puts_unfiltered puts +#define puts_filtered puts +#define putchar_unfiltered putchar +#define putchar_filtered putchar +#define fputstr_unfiltered(a,b,c) fputs((a), (c)) +#define gdb_stdlog stderr +#define SERIAL_READCHAR(fd,timo)	serialreadchar((fd), (timo)) +#define SERIAL_WRITE(fd, addr, len)	serialwrite((fd), (addr), (len)) +#define error Error +#define perror_with_name Perror +#define gdb_flush fflush +#define max(a,b) (((a)>(b))?(a):(b)) +#define min(a,b) (((a)<(b))?(a):(b)) +#define target_mourn_inferior() {} +#define ULONGEST unsigned long +#define CORE_ADDR unsigned long + +static int putpkt (char *); +static int putpkt_binary(char *, int); +static void getpkt (char *, int); + +static int remote_debug = 0, remote_register_buf_size = 0, watchdog = 0; + +int remote_desc = -1, remote_timeout = 10; + +static void +fputstrn_unfiltered(char *s, int n, int x, FILE *fp) +{ +    while (n-- > 0) +	fputc(*s++, fp); +} + +void +remote_reset(void) +{ +    SERIAL_WRITE(remote_desc, "+", 1); +} + +void +remote_continue(void) +{ +    putpkt("c"); +} + +/* Remote target communications for serial-line targets in custom GDB protocol +   Copyright 1988, 91, 92, 93, 94, 95, 96, 97, 98, 1999 +   Free Software Foundation, Inc. + +   This file is part of GDB. + +   This program 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.  */ +/* *INDENT-OFF* */ +/* Remote communication protocol. + +   A debug packet whose contents are <data> +   is encapsulated for transmission in the form: + +	$ <data> # CSUM1 CSUM2 + +	<data> must be ASCII alphanumeric and cannot include characters +	'$' or '#'.  If <data> starts with two characters followed by +	':', then the existing stubs interpret this as a sequence number. + +	CSUM1 and CSUM2 are ascii hex representation of an 8-bit +	checksum of <data>, the most significant nibble is sent first. +	the hex digits 0-9,a-f are used. + +   Receiver responds with: + +	+	- if CSUM is correct and ready for next packet +	-	- if CSUM is incorrect + +   <data> is as follows: +   Most values are encoded in ascii hex digits.  Signal numbers are according +   to the numbering in target.h. + +	Request		Packet + +	set thread	Hct...		Set thread for subsequent operations. +					c = 'c' for thread used in step and +					continue; t... can be -1 for all +					threads. +					c = 'g' for thread used in other +					operations.  If zero, pick a thread, +					any thread. +	reply		OK		for success +			ENN		for an error. + +	read registers  g +	reply		XX....X		Each byte of register data +					is described by two hex digits. +					Registers are in the internal order +					for GDB, and the bytes in a register +					are in the same order the machine uses. +			or ENN		for an error. + +	write regs	GXX..XX		Each byte of register data +					is described by two hex digits. +	reply		OK		for success +			ENN		for an error + +        write reg	Pn...=r...	Write register n... with value r..., +					which contains two hex digits for each +					byte in the register (target byte +					order). +	reply		OK		for success +			ENN		for an error +	(not supported by all stubs). + +	read mem	mAA..AA,LLLL	AA..AA is address, LLLL is length. +	reply		XX..XX		XX..XX is mem contents +					Can be fewer bytes than requested +					if able to read only part of the data. +			or ENN		NN is errno + +	write mem	MAA..AA,LLLL:XX..XX +					AA..AA is address, +					LLLL is number of bytes, +					XX..XX is data +	reply		OK		for success +			ENN		for an error (this includes the case +					where only part of the data was +					written). + +        write mem       XAA..AA,LLLL:XX..XX +         (binary)                       AA..AA is address, +                                        LLLL is number of bytes, +                                        XX..XX is binary data +        reply           OK              for success +                        ENN             for an error + +	continue	cAA..AA		AA..AA is address to resume +					If AA..AA is omitted, +					resume at same address. + +	step		sAA..AA		AA..AA is address to resume +					If AA..AA is omitted, +					resume at same address. + +	continue with	Csig;AA..AA	Continue with signal sig (hex signal +	signal				number).  If ;AA..AA is omitted, +					resume at same address. + +	step with	Ssig;AA..AA	Like 'C' but step not continue. +	signal + +	last signal     ?               Reply the current reason for stopping. +                                        This is the same reply as is generated +					for step or cont : SAA where AA is the +					signal number. + +	detach          D               Reply OK. + +	There is no immediate reply to step or cont. +	The reply comes when the machine stops. +	It is		SAA		AA is the signal number. + +	or...		TAAn...:r...;n...:r...;n...:r...; +					AA = signal number +					n... = register number (hex) +					  r... = register contents +					n... = `thread' +					  r... = thread process ID.  This is +						 a hex integer. +					n... = other string not starting +					    with valid hex digit. +					  gdb should ignore this n,r pair +					  and go on to the next.  This way +					  we can extend the protocol. +	or...		WAA		The process exited, and AA is +					the exit status.  This is only +					applicable for certains sorts of +					targets. +	or...		XAA		The process terminated with signal +					AA. +	or (obsolete)	NAA;tttttttt;dddddddd;bbbbbbbb +					AA = signal number +					tttttttt = address of symbol "_start" +					dddddddd = base of data section +					bbbbbbbb = base of bss  section. +					Note: only used by Cisco Systems +					targets.  The difference between this +					reply and the "qOffsets" query is that +					the 'N' packet may arrive spontaneously +					whereas the 'qOffsets' is a query +					initiated by the host debugger. +        or...           OXX..XX	XX..XX  is hex encoding of ASCII data. This +					can happen at any time while the +					program is running and the debugger +					should continue to wait for +					'W', 'T', etc. + +	thread alive	TXX		Find out if the thread XX is alive. +	reply		OK		thread is still alive +			ENN		thread is dead + +	remote restart	RXX		Restart the remote server + +	extended ops 	!		Use the extended remote protocol. +					Sticky -- only needs to be set once. + +	kill request	k + +	toggle debug	d		toggle debug flag (see 386 & 68k stubs) +	reset		r		reset -- see sparc stub. +	reserved	<other>		On other requests, the stub should +					ignore the request and send an empty +					response ($#<checksum>).  This way +					we can extend the protocol and GDB +					can tell whether the stub it is +					talking to uses the old or the new. +	search		tAA:PP,MM	Search backwards starting at address +					AA for a match with pattern PP and +					mask MM.  PP and MM are 4 bytes. +					Not supported by all stubs. + +	general query	qXXXX		Request info about XXXX. +	general set	QXXXX=yyyy	Set value of XXXX to yyyy. +	query sect offs	qOffsets	Get section offsets.  Reply is +					Text=xxx;Data=yyy;Bss=zzz + +	Responses can be run-length encoded to save space.  A '*' means that +	the next character is an ASCII encoding giving a repeat count which +	stands for that many repititions of the character preceding the '*'. +	The encoding is n+29, yielding a printable character where n >=3 +	(which is where rle starts to win).  Don't use an n > 126. + +	So +	"0* " means the same as "0000".  */ +/* *INDENT-ON* */ + +/* This variable (available to the user via "set remotebinarydownload") +   dictates whether downloads are sent in binary (via the 'X' packet). +   We assume that the stub can, and attempt to do it. This will be cleared if +   the stub does not understand it. This switch is still needed, though +   in cases when the packet is supported in the stub, but the connection +   does not allow it (i.e., 7-bit serial connection only). */ +static int remote_binary_download = 1; + +/* Have we already checked whether binary downloads work? */ +static int remote_binary_checked; + +/* Maximum number of bytes to read/write at once.  The value here +   is chosen to fill up a packet (the headers account for the 32).  */ +#define MAXBUFBYTES(N) (((N)-32)/2) + +/* Having this larger than 400 causes us to be incompatible with m68k-stub.c +   and i386-stub.c.  Normally, no one would notice because it only matters +   for writing large chunks of memory (e.g. in downloads).  Also, this needs +   to be more than 400 if required to hold the registers (see below, where +   we round it up based on REGISTER_BYTES).  */ +/* Round up PBUFSIZ to hold all the registers, at least.  */ +#define	PBUFSIZ ((REGISTER_BYTES > MAXBUFBYTES (400)) \ +		 ? (REGISTER_BYTES * 2 + 32) \ +		 : 400) + + +/* This variable sets the number of bytes to be written to the target +   in a single packet.  Normally PBUFSIZ is satisfactory, but some +   targets need smaller values (perhaps because the receiving end +   is slow).  */ + +static int remote_write_size = 0x7fffffff; + +/* This variable sets the number of bits in an address that are to be +   sent in a memory ("M" or "m") packet.  Normally, after stripping +   leading zeros, the entire address would be sent. This variable +   restricts the address to REMOTE_ADDRESS_SIZE bits.  HISTORY: The +   initial implementation of remote.c restricted the address sent in +   memory packets to ``host::sizeof long'' bytes - (typically 32 +   bits).  Consequently, for 64 bit targets, the upper 32 bits of an +   address was never sent.  Since fixing this bug may cause a break in +   some remote targets this variable is principly provided to +   facilitate backward compatibility. */ + +static int remote_address_size; + +/* Convert hex digit A to a number.  */ + +static int +fromhex (int a) +{ +  if (a >= '0' && a <= '9') +    return a - '0'; +  else if (a >= 'a' && a <= 'f') +    return a - 'a' + 10; +  else if (a >= 'A' && a <= 'F') +    return a - 'A' + 10; +  else { +    error ("Reply contains invalid hex digit %d", a); +    return -1; +  } +} + +/* Convert number NIB to a hex digit.  */ + +static int +tohex (int nib) +{ +  if (nib < 10) +    return '0' + nib; +  else +    return 'a' + nib - 10; +} + +/* Return the number of hex digits in num.  */ + +static int +hexnumlen (ULONGEST num) +{ +  int i; + +  for (i = 0; num != 0; i++) +    num >>= 4; + +  return max (i, 1); +} + +/* Set BUF to the hex digits representing NUM.  */ + +static int +hexnumstr (char *buf, ULONGEST num) +{ +  int i; +  int len = hexnumlen (num); + +  buf[len] = '\0'; + +  for (i = len - 1; i >= 0; i--) +    { +      buf[i] = "0123456789abcdef"[(num & 0xf)]; +      num >>= 4; +    } + +  return len; +} + +/* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */ + +static CORE_ADDR +remote_address_masked (CORE_ADDR addr) +{ +  if (remote_address_size > 0 +      && remote_address_size < (sizeof (ULONGEST) * 8)) +    { +      /* Only create a mask when that mask can safely be constructed +         in a ULONGEST variable. */ +      ULONGEST mask = 1; +      mask = (mask << remote_address_size) - 1; +      addr &= mask; +    } +  return addr; +} + +/* Determine whether the remote target supports binary downloading. +   This is accomplished by sending a no-op memory write of zero length +   to the target at the specified address. It does not suffice to send +   the whole packet, since many stubs strip the eighth bit and subsequently +   compute a wrong checksum, which causes real havoc with remote_write_bytes. + +   NOTE: This can still lose if the serial line is not eight-bit clean. In +   cases like this, the user should clear "remotebinarydownload". */ +static void +check_binary_download (CORE_ADDR addr) +{ +  if (remote_binary_download && !remote_binary_checked) +    { +      char *buf = alloca (PBUFSIZ); +      char *p; +      remote_binary_checked = 1; + +      p = buf; +      *p++ = 'X'; +      p += hexnumstr (p, (ULONGEST) addr); +      *p++ = ','; +      p += hexnumstr (p, (ULONGEST) 0); +      *p++ = ':'; +      *p = '\0'; + +      putpkt_binary (buf, (int) (p - buf)); +      getpkt (buf, 0); + +      if (buf[0] == '\0') +	remote_binary_download = 0; +    } + +  if (remote_debug) +    { +      if (remote_binary_download) +	fprintf_unfiltered (gdb_stdlog, +			    "binary downloading suppported by target\n"); +      else +	fprintf_unfiltered (gdb_stdlog, +			    "binary downloading NOT suppported by target\n"); +    } +} + +/* Write memory data directly to the remote machine. +   This does not inform the data cache; the data cache uses this. +   MEMADDR is the address in the remote memory space. +   MYADDR is the address of the buffer in our space. +   LEN is the number of bytes. + +   Returns number of bytes transferred, or 0 for error.  */ + +int +remote_write_bytes (memaddr, myaddr, len) +     CORE_ADDR memaddr; +     char *myaddr; +     int len; +{ +  unsigned char *buf = alloca (PBUFSIZ); +  int max_buf_size;		/* Max size of packet output buffer */ +  int origlen; +  extern int verbose; + +  /* Verify that the target can support a binary download */ +  check_binary_download (memaddr); + +  /* Chop the transfer down if necessary */ + +  max_buf_size = min (remote_write_size, PBUFSIZ); +  if (remote_register_buf_size != 0) +    max_buf_size = min (max_buf_size, remote_register_buf_size); + +  /* Subtract header overhead from max payload size -  $M<memaddr>,<len>:#nn */ +  max_buf_size -= 2 + hexnumlen (memaddr + len - 1) + 1 + hexnumlen (len) + 4; + +  origlen = len; +  while (len > 0) +    { +      unsigned char *p, *plen; +      int todo; +      int i; + +      /* construct "M"<memaddr>","<len>":" */ +      /* sprintf (buf, "M%lx,%x:", (unsigned long) memaddr, todo); */ +      memaddr = remote_address_masked (memaddr); +      p = buf; +      if (remote_binary_download) +	{ +	  *p++ = 'X'; +	  todo = min (len, max_buf_size); +	} +      else +	{ +	  *p++ = 'M'; +	  todo = min (len, max_buf_size / 2);	/* num bytes that will fit */ +	} + +      p += hexnumstr ((char *)p, (ULONGEST) memaddr); +      *p++ = ','; + +      plen = p;			/* remember where len field goes */ +      p += hexnumstr ((char *)p, (ULONGEST) todo); +      *p++ = ':'; +      *p = '\0'; + +      /* We send target system values byte by byte, in increasing byte +         addresses, each byte encoded as two hex characters (or one +         binary character).  */ +      if (remote_binary_download) +	{ +	  int escaped = 0; +	  for (i = 0; +	       (i < todo) && (i + escaped) < (max_buf_size - 2); +	       i++) +	    { +	      switch (myaddr[i] & 0xff) +		{ +		case '$': +		case '#': +		case 0x7d: +		  /* These must be escaped */ +		  escaped++; +		  *p++ = 0x7d; +		  *p++ = (myaddr[i] & 0xff) ^ 0x20; +		  break; +		default: +		  *p++ = myaddr[i] & 0xff; +		  break; +		} +	    } + +	  if (i < todo) +	    { +	      /* Escape chars have filled up the buffer prematurely, +	         and we have actually sent fewer bytes than planned. +	         Fix-up the length field of the packet.  */ + +	      /* FIXME: will fail if new len is a shorter string than +	         old len.  */ + +	      plen += hexnumstr ((char *)plen, (ULONGEST) i); +	      *plen++ = ':'; +	    } +	} +      else +	{ +	  for (i = 0; i < todo; i++) +	    { +	      *p++ = tohex ((myaddr[i] >> 4) & 0xf); +	      *p++ = tohex (myaddr[i] & 0xf); +	    } +	  *p = '\0'; +	} + +      putpkt_binary ((char *)buf, (int) (p - buf)); +      getpkt ((char *)buf, 0); + +      if (buf[0] == 'E') +	{ +	  /* There is no correspondance between what the remote protocol uses +	     for errors and errno codes.  We would like a cleaner way of +	     representing errors (big enough to include errno codes, bfd_error +	     codes, and others).  But for now just return EIO.  */ +	  errno = EIO; +	  return 0; +	} + +      /* Increment by i, not by todo, in case escape chars +         caused us to send fewer bytes than we'd planned.  */ +      myaddr += i; +      memaddr += i; +      len -= i; + +      if (verbose) +	putc('.', stderr); +    } +  return origlen; +} + +/* Stuff for dealing with the packets which are part of this protocol. +   See comment at top of file for details.  */ + +/* Read a single character from the remote end, masking it down to 7 bits. */ + +static int +readchar (int timeout) +{ +  int ch; + +  ch = SERIAL_READCHAR (remote_desc, timeout); + +  switch (ch) +    { +    case SERIAL_EOF: +      error ("Remote connection closed"); +    case SERIAL_ERROR: +      perror_with_name ("Remote communication error"); +    case SERIAL_TIMEOUT: +      return ch; +    default: +      return ch & 0x7f; +    } +} + +static int +putpkt (buf) +     char *buf; +{ +  return putpkt_binary (buf, strlen (buf)); +} + +/* Send a packet to the remote machine, with error checking.  The data +   of the packet is in BUF.  The string in BUF can be at most  PBUFSIZ - 5 +   to account for the $, # and checksum, and for a possible /0 if we are +   debugging (remote_debug) and want to print the sent packet as a string */ + +static int +putpkt_binary (buf, cnt) +     char *buf; +     int cnt; +{ +  int i; +  unsigned char csum = 0; +  char *buf2 = alloca (PBUFSIZ); +  char *junkbuf = alloca (PBUFSIZ); + +  int ch; +  int tcount = 0; +  char *p; + +  /* Copy the packet into buffer BUF2, encapsulating it +     and giving it a checksum.  */ + +  if (cnt > BUFSIZ - 5)		/* Prosanity check */ +    abort (); + +  p = buf2; +  *p++ = '$'; + +  for (i = 0; i < cnt; i++) +    { +      csum += buf[i]; +      *p++ = buf[i]; +    } +  *p++ = '#'; +  *p++ = tohex ((csum >> 4) & 0xf); +  *p++ = tohex (csum & 0xf); + +  /* Send it over and over until we get a positive ack.  */ + +  while (1) +    { +      int started_error_output = 0; + +      if (remote_debug) +	{ +	  *p = '\0'; +	  fprintf_unfiltered (gdb_stdlog, "Sending packet: "); +	  fputstrn_unfiltered (buf2, p - buf2, 0, gdb_stdlog); +	  fprintf_unfiltered (gdb_stdlog, "..."); +	  gdb_flush (gdb_stdlog); +	} +      if (SERIAL_WRITE (remote_desc, buf2, p - buf2)) +	perror_with_name ("putpkt: write failed"); + +      /* read until either a timeout occurs (-2) or '+' is read */ +      while (1) +	{ +	  ch = readchar (remote_timeout); + +	  if (remote_debug) +	    { +	      switch (ch) +		{ +		case '+': +		case SERIAL_TIMEOUT: +		case '$': +		  if (started_error_output) +		    { +		      putchar_unfiltered ('\n'); +		      started_error_output = 0; +		    } +		} +	    } + +	  switch (ch) +	    { +	    case '+': +	      if (remote_debug) +		fprintf_unfiltered (gdb_stdlog, "Ack\n"); +	      return 1; +	    case SERIAL_TIMEOUT: +	      tcount++; +	      if (tcount > 3) +		return 0; +	      break;		/* Retransmit buffer */ +	    case '$': +	      { +		/* It's probably an old response, and we're out of sync. +		   Just gobble up the packet and ignore it.  */ +		getpkt (junkbuf, 0); +		continue;	/* Now, go look for + */ +	      } +	    default: +	      if (remote_debug) +		{ +		  if (!started_error_output) +		    { +		      started_error_output = 1; +		      fprintf_unfiltered (gdb_stdlog, "putpkt: Junk: "); +		    } +		  fputc_unfiltered (ch & 0177, gdb_stdlog); +		} +	      continue; +	    } +	  break;		/* Here to retransmit */ +	} + +#if 0 +      /* This is wrong.  If doing a long backtrace, the user should be +         able to get out next time we call QUIT, without anything as +         violent as interrupt_query.  If we want to provide a way out of +         here without getting to the next QUIT, it should be based on +         hitting ^C twice as in remote_wait.  */ +      if (quit_flag) +	{ +	  quit_flag = 0; +	  interrupt_query (); +	} +#endif +    } +} + +/* Come here after finding the start of the frame.  Collect the rest +   into BUF, verifying the checksum, length, and handling run-length +   compression.  Returns 0 on any error, 1 on success.  */ + +static int +read_frame (char *buf) +{ +  unsigned char csum; +  char *bp; +  int c; + +  csum = 0; +  bp = buf; + +  while (1) +    { +      c = readchar (remote_timeout); + +      switch (c) +	{ +	case SERIAL_TIMEOUT: +	  if (remote_debug) +	    fputs_filtered ("Timeout in mid-packet, retrying\n", gdb_stdlog); +	  return 0; +	case '$': +	  if (remote_debug) +	    fputs_filtered ("Saw new packet start in middle of old one\n", +			    gdb_stdlog); +	  return 0;		/* Start a new packet, count retries */ +	case '#': +	  { +	    unsigned char pktcsum; + +	    *bp = '\000'; + +	    pktcsum = fromhex (readchar (remote_timeout)) << 4; +	    pktcsum |= fromhex (readchar (remote_timeout)); + +	    if (csum == pktcsum) +	      { +		return 1; +	      } + +	    if (remote_debug) +	      { +		fprintf_filtered (gdb_stdlog, +			      "Bad checksum, sentsum=0x%x, csum=0x%x, buf=", +				  pktcsum, csum); +		fputs_filtered (buf, gdb_stdlog); +		fputs_filtered ("\n", gdb_stdlog); +	      } +	    return 0; +	  } +	case '*':		/* Run length encoding */ +	  csum += c; +	  c = readchar (remote_timeout); +	  csum += c; +	  c = c - ' ' + 3;	/* Compute repeat count */ + +	  if (c > 0 && c < 255 && bp + c - 1 < buf + PBUFSIZ - 1) +	    { +	      memset (bp, *(bp - 1), c); +	      bp += c; +	      continue; +	    } + +	  *bp = '\0'; +	  printf_filtered ("Repeat count %d too large for buffer: ", c); +	  puts_filtered (buf); +	  puts_filtered ("\n"); +	  return 0; +	default: +	  if (bp < buf + PBUFSIZ - 1) +	    { +	      *bp++ = c; +	      csum += c; +	      continue; +	    } + +	  *bp = '\0'; +	  puts_filtered ("Remote packet too long: "); +	  puts_filtered (buf); +	  puts_filtered ("\n"); + +	  return 0; +	} +    } +} + +/* Read a packet from the remote machine, with error checking, and +   store it in BUF.  BUF is expected to be of size PBUFSIZ.  If +   FOREVER, wait forever rather than timing out; this is used while +   the target is executing user code.  */ + +static void +getpkt (buf, forever) +     char *buf; +     int forever; +{ +  int c; +  int tries; +  int timeout; +  int val; + +  strcpy (buf, "timeout"); + +  if (forever) +    { +      timeout = watchdog > 0 ? watchdog : -1; +    } + +  else +    timeout = remote_timeout; + +#define MAX_TRIES 3 + +  for (tries = 1; tries <= MAX_TRIES; tries++) +    { +      /* This can loop forever if the remote side sends us characters +         continuously, but if it pauses, we'll get a zero from readchar +         because of timeout.  Then we'll count that as a retry.  */ + +      /* Note that we will only wait forever prior to the start of a packet. +         After that, we expect characters to arrive at a brisk pace.  They +         should show up within remote_timeout intervals.  */ + +      do +	{ +	  c = readchar (timeout); + +	  if (c == SERIAL_TIMEOUT) +	    { +	      if (forever)	/* Watchdog went off.  Kill the target. */ +		{ +		  target_mourn_inferior (); +		  error ("Watchdog has expired.  Target detached.\n"); +		} +	      if (remote_debug) +		fputs_filtered ("Timed out.\n", gdb_stdlog); +	      goto retry; +	    } +	} +      while (c != '$'); + +      /* We've found the start of a packet, now collect the data.  */ + +      val = read_frame (buf); + +      if (val == 1) +	{ +	  if (remote_debug) +	    { +	      fprintf_unfiltered (gdb_stdlog, "Packet received: "); +	      fputstr_unfiltered (buf, 0, gdb_stdlog); +	      fprintf_unfiltered (gdb_stdlog, "\n"); +	    } +	  SERIAL_WRITE (remote_desc, "+", 1); +	  return; +	} + +      /* Try the whole thing again.  */ +    retry: +      SERIAL_WRITE (remote_desc, "-", 1); +    } + +  /* We have tried hard enough, and just can't receive the packet.  Give up. */ + +  printf_unfiltered ("Ignoring packet error, continuing...\n"); +  SERIAL_WRITE (remote_desc, "+", 1); +} |