From af8c147a572933c47d2b1e126e9f71c5be11ec43 Mon Sep 17 00:00:00 2001 From: Jiri Gaisler Date: Fri, 14 Nov 2014 23:19:09 +0100 Subject: gdb patch to add leon2/3 support to sis This fixes the commit 4bdba3e552f22bbd82ffc9ab2c915a7b4f2eadd5 which added a patch patch. --- .../sparc/gdb-7.7-7.8-sis-leon2-leon3-fixup.diff | 17839 +++++++++---------- 1 file changed, 8910 insertions(+), 8929 deletions(-) (limited to 'tools') diff --git a/tools/4.11/gdb/sparc/gdb-7.7-7.8-sis-leon2-leon3-fixup.diff b/tools/4.11/gdb/sparc/gdb-7.7-7.8-sis-leon2-leon3-fixup.diff index 242a8ab..e19e30a 100644 --- a/tools/4.11/gdb/sparc/gdb-7.7-7.8-sis-leon2-leon3-fixup.diff +++ b/tools/4.11/gdb/sparc/gdb-7.7-7.8-sis-leon2-leon3-fixup.diff @@ -1,8934 +1,8915 @@ -From 458324b419f29cd473a6ed13ed7c61005453ab7a Mon Sep 17 00:00:00 2001 -From: Jiri Gaisler -Date: Fri, 14 Nov 2014 23:19:09 +0100 -Subject: [PATCH] gdb patch to add leon2/3 support to sis - ---- - .../gdb/sparc/gdb-7.7-sis-leon2-leon3-fixup.diff | 8915 ++++++++++++++++++++ - 1 file changed, 8915 insertions(+) - create mode 100644 tools/4.11/gdb/sparc/gdb-7.7-sis-leon2-leon3-fixup.diff - -diff --git a/tools/4.11/gdb/sparc/gdb-7.7-sis-leon2-leon3-fixup.diff b/tools/4.11/gdb/sparc/gdb-7.7-sis-leon2-leon3-fixup.diff +diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c +index 66ef84e..424e390 100644 +--- a/gdb/sparc-tdep.c ++++ b/gdb/sparc-tdep.c +@@ -1713,6 +1713,8 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) + /* Hook in ABI-specific overrides, if they have been registered. */ + gdbarch_init_osabi (info, gdbarch); + ++ dwarf2_append_unwinders (gdbarch); /* DWARF CFI frame unwinder */ ++ + frame_unwind_append_unwinder (gdbarch, &sparc32_frame_unwind); + + /* If we have register sets, enable the generic core file support. */ +diff --git a/sim/erc32/Makefile.in b/sim/erc32/Makefile.in +index 0ce58a6..3f09b0e 100644 +--- a/sim/erc32/Makefile.in ++++ b/sim/erc32/Makefile.in +@@ -21,7 +21,7 @@ + TERMCAP_LIB = @TERMCAP@ + READLINE_LIB = @READLINE@ + +-SIM_OBJS = exec.o erc32.o func.o help.o float.o interf.o ++SIM_OBJS = exec.o erc32.o func.o help.o float.o interf.o leon2.o leon3.o grlib.o + SIM_EXTRA_LIBS = $(READLINE_LIB) $(TERMCAP_LIB) -lm + SIM_EXTRA_ALL = sis + SIM_EXTRA_INSTALL = install-sis +@@ -30,32 +30,24 @@ SIM_EXTRA_CLEAN = clean-sis + # UARTS run at about 115200 baud (simulator time). Add -DFAST_UART to + # CFLAGS if faster (infinite) UART speed is desired. Might affect the + # behaviour of UART interrupt routines ... +-SIM_EXTRA_CFLAGS = -DSTAT -DFAST_UART -DIUREV0 -DMECREV0 ++SIM_EXTRA_CFLAGS = -DFAST_UART -I$(srcdir)/../.. + + ## COMMON_POST_CONFIG_FRAG + + # `sis' doesn't need interf.o. +-SIS_OFILES = exec.o erc32.o func.o help.o float.o ++SIS_OFILES = exec.o erc32.o func.o help.o float.o grlib.o leon2.o leon3.o + + sis: sis.o $(SIS_OFILES) $(COMMON_OBJS) $(LIBDEPS) + $(CC) $(ALL_CFLAGS) -o sis \ + sis.o $(SIS_OFILES) $(COMMON_OBJS) $(EXTRA_LIBS) + +-# FIXME: This computes the build host's endianness, doesn't it? +-# There is AC_C_BIGENDIAN but it doesn't handle float endianness. +-# [Are int/float endians every different on a sparc?] +-end: $(srcdir)/end.c +- $(CC_FOR_BUILD) -I. $(srcdir)/end.c -o end +-end.h: end +- ./end > end.h +- + # Copy the files into directories where they will be run. + install-sis: installdirs + n=`echo sis | sed '$(program_transform_name)'`; \ + $(INSTALL_PROGRAM) sis$(EXEEXT) $(DESTDIR)$(bindir)/$$n$(EXEEXT) + + clean-sis: +- rm -f sis end end.h ++ rm -f sis + + configure: + @echo "Rebuilding configure..." +@@ -65,10 +57,13 @@ configure: + (cd $${srcdir}; autoconf --localdir=../common) + + # Circumvent Sun Make bug with VPATH. +-erc32.o: erc32.c sis.h end.h +-exec.o: exec.c sis.h end.h +-float.o: float.c sis.h end.h +-func.o: func.c sis.h end.h +-help.o: help.c sis.h end.h +-interf.o: interf.c sis.h end.h +-sis.o: sis.c sis.h end.h ++erc32.o: erc32.c sis.h ++exec.o: exec.c sis.h ++float.o: float.c sis.h ++func.o: func.c sis.h ++help.o: help.c sis.h ++interf.o: interf.c sis.h ++sis.o: sis.c sis.h ++grlib.o: grlib.c sis.h grlib.h ++leon3.o: leon3.c sis.h grlib.h ++leon2.o: leon2.c sis.h +diff --git a/sim/erc32/NEWS b/sim/erc32/NEWS +deleted file mode 100644 +index dd24b7b..0000000 +--- a/sim/erc32/NEWS ++++ /dev/null +@@ -1,108 +0,0 @@ +- +-version 2.0 05-02-96 +--------------------- +- +-* Switched to bfd library. Any supported format (elf, coff, ...) can be used. +-* The UART devices can be set through -uart1 and -uart2 switches. +-* Switched to GNU readline. +-* Added -c option to run batch files at startup +-* 'reg' command can show different register windows (eg 'reg w3'). +-* Use 'help' for online help on simulator commands +- +-version 1.8.1 20-01-96 +--------------------- +- +-* added -mevrev0 switch to simulate MEC rev.0 bugs in timer and uart +- +-* added -iurev0 switch to simulate IU rev.0 jmpl/restore bug +- +-* Added sis command 'batch' to run batch files +- +- +-version 1.8 30-10-95 +--------------------- +- +-* Added s-record support. Use the '-s' switch with sis or the 'load' command. +- +-* IU load dependencies are now modelled +- +-version 1.7 30-10-95 +--------------------- +- +-* Power-down mode implemented in erc32.c. +- +-* Performance display shows the ratio between simulator-time and real-time. +- +- +-version 1.6.2 25-10-95 +--------------------- +- +-* The UARTs can now be run at a given speed (simulator time) to better +- simulate the behaviour of interrupt routines. The "true mode" is +- selected through a compile switch in the makefile. +- +- +-version 1.6 28-09-95 +--------------------- +- +-* Major reorganisation of the code. mec.c and mem.c merged into erc32.c. +- +-* The load command does NOT longer load the initialised data at an address +- defined by .bdata. This is done in srt0.s using _environ. +- +-* Additional MEC functionallity added - software reset, memory access +- protection and waitstate configuration register. +- +-* interf.c - a GDB interface added +- +-* -v switch (verbose) added +- +-version 1.5 14-09-95 +--------------------- +- +-* Added a instruction trace buffer, enabled through the 'hist' command. +- +-* Added a 'perf' command to display statistics such as instruction mix, +- CPI, FPU holds etc. +- +-* Added -nfp switch to disable FPU. +- +-* Added -freq switch to set simulated frequency. +- +-version 1.4 22-08-95 +--------------------- +- +-* A -g is provided for those who have problems with GNU readline(). +- +-version 1.3 26-07-95 +--------------------- +- +-* No major news, just a bug fix release ... +- +- +-version 1.2 13-07-95 +--------------------- +- +-* Added setting of IU registers through the 'reg' command. See README. +- +-* The GNU readline() function is used for command input. However, a +-ctrl-D still kills the simulator ... +- +- +-version 1.1 07-07-95 +--------------------- +- +- +-* Added a 'go' command +- +-* Added cycle counting for interrupt overhead. +- +-* Function 'get_mem_ptr' takes one more parameter to avoid segmentation +- faults if a.out files are loaded outside the simulated memory. See README. +- +-* Added user-defined function sim_stop(). +- +-* Added a reset command. See README. +- +-* Implemented buffered output for MEC uarts to improve output speed. +- +diff --git a/sim/erc32/README.gdb b/sim/erc32/README.gdb +deleted file mode 100644 +index 619fcb3..0000000 +--- a/sim/erc32/README.gdb ++++ /dev/null +@@ -1,67 +0,0 @@ +-How to use SIS with GDB +------------------------ +- +-1. Building GDB with SIS +- +-To build GDB with the SIS/ERC32 simulator, configure with option +-'--target sparc-erc32-aout' and build as usual. +- +-2. Attaching the simulator +- +-To attach GDB to the simulator, use: +- +-target sim [options] [files] +- +-The following options are supported: +- +- -nfp Disable FPU. FPops will cause an FPU disabled trap. +- +- -freq Set the simulated "system clock" to MHz. +- +- -v Verbose mode. +- +- -nogdb Disable GDB breakpoint handling (see below) +- +-The listed [files] are expected to be in aout format and will be +-loaded in the simulator memory prior. This could be used to load +-a boot block at address 0x0 if the application is linked to run +-from RAM (0x2000000). +- +-To start debugging a program type 'load ' and debug as +-usual. +- +-The native simulator commands can be reached using the GDB 'sim' +-command: +- +-sim +- +-Direct simulator commands during a GDB session must be issued +-with care not to disturb GDB's operation ... +- +-For info on supported ERC32 functionality, see README.sis. +- +- +-3. Loading aout files +- +-The GDB load command loads an aout file into the simulator +-memory with the data section starting directly after the text +-section regardless of wich start address was specified for the data +-at link time! This means that your applications either has to include +-a routine that initialise the data segment at the proper address or +-link with the data placed directly after the text section. +- +-A copying routine is fairly simple, just copy all data between +-_etext and _data to a memory loaction starting at _environ. This +-should be done at the same time as the bss is cleared (in srt0.s). +- +- +-4. GDB breakpoint handling +- +-GDB inserts breakpoint in the form of the 'ta 1' instruction. The +-GDB-integrated simulator will therefore recognize the breakpoint +-instruction and return control to GDB. If the application uses +-'ta 1', the breakpoint detection can be disabled with the -nogdb +-switch. In this case however, GDB breakpoints will not work. +- +- +-Report problems to Jiri Gaisler ESA/ESTEC (jgais@wd.estec.esa.nl) +diff --git a/sim/erc32/README.leon2 b/sim/erc32/README.leon2 new file mode 100644 -index 0000000..e19e30a +index 0000000..3820eca --- /dev/null -+++ b/tools/4.11/gdb/sparc/gdb-7.7-sis-leon2-leon3-fixup.diff -@@ -0,0 +1,8915 @@ -+diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c -+index 66ef84e..424e390 100644 -+--- a/gdb/sparc-tdep.c -++++ b/gdb/sparc-tdep.c -+@@ -1713,6 +1713,8 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) -+ /* Hook in ABI-specific overrides, if they have been registered. */ -+ gdbarch_init_osabi (info, gdbarch); -+ -++ dwarf2_append_unwinders (gdbarch); /* DWARF CFI frame unwinder */ -++ -+ frame_unwind_append_unwinder (gdbarch, &sparc32_frame_unwind); -+ -+ /* If we have register sets, enable the generic core file support. */ -+diff --git a/sim/erc32/Makefile.in b/sim/erc32/Makefile.in -+index 0ce58a6..3f09b0e 100644 -+--- a/sim/erc32/Makefile.in -++++ b/sim/erc32/Makefile.in -+@@ -21,7 +21,7 @@ -+ TERMCAP_LIB = @TERMCAP@ -+ READLINE_LIB = @READLINE@ -+ -+-SIM_OBJS = exec.o erc32.o func.o help.o float.o interf.o -++SIM_OBJS = exec.o erc32.o func.o help.o float.o interf.o leon2.o leon3.o grlib.o -+ SIM_EXTRA_LIBS = $(READLINE_LIB) $(TERMCAP_LIB) -lm -+ SIM_EXTRA_ALL = sis -+ SIM_EXTRA_INSTALL = install-sis -+@@ -30,32 +30,24 @@ SIM_EXTRA_CLEAN = clean-sis -+ # UARTS run at about 115200 baud (simulator time). Add -DFAST_UART to -+ # CFLAGS if faster (infinite) UART speed is desired. Might affect the -+ # behaviour of UART interrupt routines ... -+-SIM_EXTRA_CFLAGS = -DSTAT -DFAST_UART -DIUREV0 -DMECREV0 -++SIM_EXTRA_CFLAGS = -DFAST_UART -I$(srcdir)/../.. -+ -+ ## COMMON_POST_CONFIG_FRAG -+ -+ # `sis' doesn't need interf.o. -+-SIS_OFILES = exec.o erc32.o func.o help.o float.o -++SIS_OFILES = exec.o erc32.o func.o help.o float.o grlib.o leon2.o leon3.o -+ -+ sis: sis.o $(SIS_OFILES) $(COMMON_OBJS) $(LIBDEPS) -+ $(CC) $(ALL_CFLAGS) -o sis \ -+ sis.o $(SIS_OFILES) $(COMMON_OBJS) $(EXTRA_LIBS) -+ -+-# FIXME: This computes the build host's endianness, doesn't it? -+-# There is AC_C_BIGENDIAN but it doesn't handle float endianness. -+-# [Are int/float endians every different on a sparc?] -+-end: $(srcdir)/end.c -+- $(CC_FOR_BUILD) -I. $(srcdir)/end.c -o end -+-end.h: end -+- ./end > end.h -+- -+ # Copy the files into directories where they will be run. -+ install-sis: installdirs -+ n=`echo sis | sed '$(program_transform_name)'`; \ -+ $(INSTALL_PROGRAM) sis$(EXEEXT) $(DESTDIR)$(bindir)/$$n$(EXEEXT) -+ -+ clean-sis: -+- rm -f sis end end.h -++ rm -f sis -+ -+ configure: -+ @echo "Rebuilding configure..." -+@@ -65,10 +57,13 @@ configure: -+ (cd $${srcdir}; autoconf --localdir=../common) -+ -+ # Circumvent Sun Make bug with VPATH. -+-erc32.o: erc32.c sis.h end.h -+-exec.o: exec.c sis.h end.h -+-float.o: float.c sis.h end.h -+-func.o: func.c sis.h end.h -+-help.o: help.c sis.h end.h -+-interf.o: interf.c sis.h end.h -+-sis.o: sis.c sis.h end.h -++erc32.o: erc32.c sis.h -++exec.o: exec.c sis.h -++float.o: float.c sis.h -++func.o: func.c sis.h -++help.o: help.c sis.h -++interf.o: interf.c sis.h -++sis.o: sis.c sis.h -++grlib.o: grlib.c sis.h grlib.h -++leon3.o: leon3.c sis.h grlib.h -++leon2.o: leon2.c sis.h -+diff --git a/sim/erc32/NEWS b/sim/erc32/NEWS -+deleted file mode 100644 -+index dd24b7b..0000000 -+--- a/sim/erc32/NEWS -++++ /dev/null -+@@ -1,108 +0,0 @@ -+- -+-version 2.0 05-02-96 -+--------------------- -+- -+-* Switched to bfd library. Any supported format (elf, coff, ...) can be used. -+-* The UART devices can be set through -uart1 and -uart2 switches. -+-* Switched to GNU readline. -+-* Added -c option to run batch files at startup -+-* 'reg' command can show different register windows (eg 'reg w3'). -+-* Use 'help' for online help on simulator commands -+- -+-version 1.8.1 20-01-96 -+--------------------- -+- -+-* added -mevrev0 switch to simulate MEC rev.0 bugs in timer and uart -+- -+-* added -iurev0 switch to simulate IU rev.0 jmpl/restore bug -+- -+-* Added sis command 'batch' to run batch files -+- -+- -+-version 1.8 30-10-95 -+--------------------- -+- -+-* Added s-record support. Use the '-s' switch with sis or the 'load' command. -+- -+-* IU load dependencies are now modelled -+- -+-version 1.7 30-10-95 -+--------------------- -+- -+-* Power-down mode implemented in erc32.c. -+- -+-* Performance display shows the ratio between simulator-time and real-time. -+- -+- -+-version 1.6.2 25-10-95 -+--------------------- -+- -+-* The UARTs can now be run at a given speed (simulator time) to better -+- simulate the behaviour of interrupt routines. The "true mode" is -+- selected through a compile switch in the makefile. -+- -+- -+-version 1.6 28-09-95 -+--------------------- -+- -+-* Major reorganisation of the code. mec.c and mem.c merged into erc32.c. -+- -+-* The load command does NOT longer load the initialised data at an address -+- defined by .bdata. This is done in srt0.s using _environ. -+- -+-* Additional MEC functionallity added - software reset, memory access -+- protection and waitstate configuration register. -+- -+-* interf.c - a GDB interface added -+- -+-* -v switch (verbose) added -+- -+-version 1.5 14-09-95 -+--------------------- -+- -+-* Added a instruction trace buffer, enabled through the 'hist' command. -+- -+-* Added a 'perf' command to display statistics such as instruction mix, -+- CPI, FPU holds etc. -+- -+-* Added -nfp switch to disable FPU. -+- -+-* Added -freq switch to set simulated frequency. -+- -+-version 1.4 22-08-95 -+--------------------- -+- -+-* A -g is provided for those who have problems with GNU readline(). -+- -+-version 1.3 26-07-95 -+--------------------- -+- -+-* No major news, just a bug fix release ... -+- -+- -+-version 1.2 13-07-95 -+--------------------- -+- -+-* Added setting of IU registers through the 'reg' command. See README. -+- -+-* The GNU readline() function is used for command input. However, a -+-ctrl-D still kills the simulator ... -+- -+- -+-version 1.1 07-07-95 -+--------------------- -+- -+- -+-* Added a 'go' command -+- -+-* Added cycle counting for interrupt overhead. -+- -+-* Function 'get_mem_ptr' takes one more parameter to avoid segmentation -+- faults if a.out files are loaded outside the simulated memory. See README. -+- -+-* Added user-defined function sim_stop(). -+- -+-* Added a reset command. See README. -+- -+-* Implemented buffered output for MEC uarts to improve output speed. -+- -+diff --git a/sim/erc32/README.gdb b/sim/erc32/README.gdb -+deleted file mode 100644 -+index 619fcb3..0000000 -+--- a/sim/erc32/README.gdb -++++ /dev/null -+@@ -1,67 +0,0 @@ -+-How to use SIS with GDB -+------------------------ -+- -+-1. Building GDB with SIS -+- -+-To build GDB with the SIS/ERC32 simulator, configure with option -+-'--target sparc-erc32-aout' and build as usual. -+- -+-2. Attaching the simulator -+- -+-To attach GDB to the simulator, use: -+- -+-target sim [options] [files] -+- -+-The following options are supported: -+- -+- -nfp Disable FPU. FPops will cause an FPU disabled trap. -+- -+- -freq Set the simulated "system clock" to MHz. -+- -+- -v Verbose mode. -+- -+- -nogdb Disable GDB breakpoint handling (see below) -+- -+-The listed [files] are expected to be in aout format and will be -+-loaded in the simulator memory prior. This could be used to load -+-a boot block at address 0x0 if the application is linked to run -+-from RAM (0x2000000). -+- -+-To start debugging a program type 'load ' and debug as -+-usual. -+- -+-The native simulator commands can be reached using the GDB 'sim' -+-command: -+- -+-sim -+- -+-Direct simulator commands during a GDB session must be issued -+-with care not to disturb GDB's operation ... -+- -+-For info on supported ERC32 functionality, see README.sis. -+- -+- -+-3. Loading aout files -+- -+-The GDB load command loads an aout file into the simulator -+-memory with the data section starting directly after the text -+-section regardless of wich start address was specified for the data -+-at link time! This means that your applications either has to include -+-a routine that initialise the data segment at the proper address or -+-link with the data placed directly after the text section. -+- -+-A copying routine is fairly simple, just copy all data between -+-_etext and _data to a memory loaction starting at _environ. This -+-should be done at the same time as the bss is cleared (in srt0.s). -+- -+- -+-4. GDB breakpoint handling -+- -+-GDB inserts breakpoint in the form of the 'ta 1' instruction. The -+-GDB-integrated simulator will therefore recognize the breakpoint -+-instruction and return control to GDB. If the application uses -+-'ta 1', the breakpoint detection can be disabled with the -nogdb -+-switch. In this case however, GDB breakpoints will not work. -+- -+- -+-Report problems to Jiri Gaisler ESA/ESTEC (jgais@wd.estec.esa.nl) -+diff --git a/sim/erc32/README.leon2 b/sim/erc32/README.leon2 -+new file mode 100644 -+index 0000000..3820eca -+--- /dev/null -++++ b/sim/erc32/README.leon2 -+@@ -0,0 +1,53 @@ -++ -++1. LEON2 emulation -++ -++The file 'leon2.c' contains a model of simple LEON2 sub-system. It -++contains 16 Mbyte ROM and 16 Mbyte RAM. Standard peripherals -++such as interrupt controller, UART and timer are provided. -++The model can execute leon2 binaries that do not require an -++MMU. -++ -++To start sis in Leon2 mode, add the -leon2 switch. In gdb, -++use 'target sim -leon2' . -++ -++1.1 UART -++ -++One LEON2 UART is emaulted, and is located at address 0x80000070. -++The following registers are implemeted: -++ -++- UART RX and TX register (0x80000070) -++- UART status register (0x80000074) -++ -++The UART generates interrupt 3. -++ -++1.2 Timer unit -++ -++The LEON2 timer unit is emulated and located at address 0x80000040. -++It is configured with two timers and separate interrupts (8 and 9). -++The scaler is configured to 16 bits, while the counters are 32 bits. -++ -++1.3 Interrupt controller -++ -++The interrupt controller is implemented as described in the -++LEON2 IP manual, with the exception of the interrupt level register. -++Secondary interrupts are not supported. The registers are located -++at address 0x80000090. -++ -++1.5 Memory interface -++ -++The following memory areas are valid for the Leon3 simulator: -++ -++0x00000000 - 0x01000000 ROM (16 Mbyte, loaded at start-up) -++0x40000000 - 0x41000000 RAM (16 Mbyte, loaded at start-up) -++0x80000000 - 0x81000000 APB bus, including plug&play -++0xFFFFF000 - 0xFFFFFFFF AHB plug&play area -++ -++Access to non-existing memory will result in a memory exception trap. -++ -++1.8 Power-down mode -++ -++The Leon2 power-down register (0x80000018) is supported. When power-down is -++entered, time is skipped forward until the next event in the event queue. -++However, if the simulator event queue is empty, power-down mode is not -++entered since no interrupt would be generated to exit from the mode. A -++Ctrl-C in the simulator window will exit the power-down mode. -+diff --git a/sim/erc32/README.leon3 b/sim/erc32/README.leon3 -+new file mode 100644 -+index 0000000..00ab14a -+--- /dev/null -++++ b/sim/erc32/README.leon3 -+@@ -0,0 +1,53 @@ -++ -++1. LEON3 emulation -++ -++The file 'leon3.c' contains a model of simple LEON3 sub-system. It -++contains 16 Mbyte ROM and 16 Mbyte RAM. Standard peripherals -++such as interrupt controller, UART and timer are provided. -++The model can execute leon3 binaries that do not require an -++MMU. -++ -++To start sis in Leon3 mode, add the -leon3 switch. In gdb, -++use 'target sim -leon3' . -++ -++1.1 UART -++ -++The UART emulates an APBUART and is located at address 0x80000100. -++The following registers are implemeted: -++ -++- UART RX and TX register (0x80000100) -++- UART status register (0x80000104) -++ -++The UART generates interrupt 3. -++ -++1.2 Timer unit (GPTIMER) -++ -++The GPTIMER programmable counter is emulated and located at -++address 0x80000300. It is configured with two timers and separate -++interrupts (8 and 9). -++ -++1.3 Interrupt controller -++ -++The IRQMP interrupt controller is implemented as described in the -++GRLIB IP manual, with the exception of the interrupt level register. -++Extended interrupts are not supported. The registers are located -++at address 0x80000200. -++ -++1.5 Memory interface -++ -++The following memory areas are valid for the Leon3 simulator: -++ -++0x00000000 - 0x01000000 ROM (16 Mbyte, loaded at start-up) -++0x40000000 - 0x41000000 RAM (16 Mbyte, loaded at start-up) -++0x80000000 - 0x81000000 APB bus, including plug&play -++0xFFFFF000 - 0xFFFFFFFF AHB plug&play area -++ -++Access to non-existing memory will result in a memory exception trap. -++ -++1.8 Power-down mode -++ -++The Leon3 power-down feature (%asr19) is supported. When power-down is -++entered, time is skipped forward until the next event in the event queue. -++However, if the simulator event queue is empty, power-down mode is not -++entered since no interrupt would be generated to exit from the mode. A -++Ctrl-C in the simulator window will exit the power-down mode. -+diff --git a/sim/erc32/README.sis b/sim/erc32/README.sis -+index b119f03..59c4c64 100644 -+--- a/sim/erc32/README.sis -++++ b/sim/erc32/README.sis -+@@ -1,10 +1,10 @@ -+ -+-SIS - Sparc Instruction Simulator README file (v2.0, 05-02-1996) -++SIS - Sparc Instruction Simulator README file (v2.8, 10-11-2014) -+ ------------------------------------------------------------------- -+ -+ 1. Introduction -+ -+-The SIS is a SPARC V7 architecture simulator. It consist of two parts, -++The SIS is a SPARC V7/V8 architecture simulator. It consist of two parts, -+ the simulator core and a user defined memory module. The simulator -+ core executes the instructions while the memory module emulates memory -+ and peripherals. -+@@ -13,28 +13,29 @@ and peripherals. -+ -+ The simulator is started as follows: -+ -+-sis [-uart1 uart_device1] [-uart2 uart_device2] -++sis [-leon2] [-leon3] [-uart1 uart_device1] [-uart2 uart_device2] -+ [-nfp] [-freq frequency] [-c batch_file] [files] -+ -+-The default uart devices for SIS are /dev/ptypc and /dev/ptypd. The -+--uart[1,2] switch can be used to connect the uarts to other devices. -+-Use 'tip /dev/ttypc' to connect a terminal emulator to the uarts. -++By default, SIS emaultes an ERC32 system. The -leon2 switch enables -++LEON2 emaultion, while the -leon3 switch enables emulation of a -++LEON3 SOC system. -++ -++The emulated console uart is connected stdin/stdout. The -uart[1,2] -++switch can be used to connect the uarts to other devices. -++ -+ The '-nfp' will disable the simulated FPU, so each FPU instruction will -+ generate a FPU disabled trap. The '-freq' switch can be used to define -+ which "frequency" the simulator runs at. This is used by the 'perf' -+ command to calculated the MIPS figure for a particular configuration. -+-The give frequency must be an integer indicating the frequency in MHz. -++The frequency must be an integer indicating the frequency in MHz. -+ -+ The -c option indicates that sis commands should be read from 'batch_file' -+ at startup. -+ -+-Files to be loaded must be in one of the supported formats (see INSTALLATION), -+-and will be loaded into the simulated memory. The file formats are -+-automatically recognised. -++Files to be loaded must be in one of the supported formats (elf, a.out, srec), -++and will be loaded into the simulated memory. -+ -+-The script 'startsim' will start the simulator in one xterm window and -+-open a terminal emulator (tip) connected to the UART A in a second -+-xterm window. Below is description of commands that are recognized by -++Below is description of commands that are recognized by -+ the simulator. The command-line is parsed using GNU readline. A command -+ history of 64 commands is maintained. Use the up/down arrows to recall -+ previous commands. For more details, see the readline documentation. -+@@ -77,8 +78,8 @@ Prints the FPU registers -+ go
[inst_count] -+ -+ The go command will set pc to
and npc to
+ 4, and start -+-execution. No other initialisation will be done. If inst_count is given, -+-execution will stop after the specified number of instructions. -++execution. If inst_count is given, execution will stop after the specified -++number of instructions. -+ -+ help -+ -+@@ -143,136 +144,67 @@ Typing a 'Ctrl-C' will interrupt a running simulator. -+ Short forms of the commands are allowed, e.g 'c' 'co' or 'con' are all -+ interpreted as 'cont'. -+ -++2 Using SIS with gdb -++ -++2.1 Attaching the simulator -++ -++To attach GDB to the simulator, use: -++ -++target sim [options] -++ -++The following options are supported: -++ -++ -leon2 Emulate a LEON2 system -++ -++ -leon3 Emulate a LEON3 system -++ -++ -nfp Disable FPU. FPops will cause an FPU disabled trap. -++ -++ -freq Set the simulated "system clock" to MHz. -++ -++ -v Verbose mode. -++ -++ -nogdb Disable GDB breakpoint handling (see below) -++ -++To start debugging a program type 'load ' and debug as -++usual. -++ -++The native simulator commands can be reached using the GDB 'sim' -++command: -++ -++sim -++ -++Direct simulator commands during a GDB session must be issued -++with care not to disturb GDB's operation ... -++ -++A program can be restarted in gdb by first issuing the load command, -++followed by run. -++ -++2.2 GDB breakpoint handling -++ -++GDB inserts breakpoint in the form of the 'ta 1' instruction. The -++GDB-integrated simulator will therefore recognize the breakpoint -++instruction and return control to GDB. If the application uses -++'ta 1', the breakpoint detection can be disabled with the -nogdb -++switch. In this case however, GDB breakpoints will not work. -++ -+ -+ 3. Simulator core -+ -+-The SIS emulates the behavior of the 90C601E and 90C602E sparc IU and -+-FPU from Matra MHS. These are roughly equivalent to the Cypress C601 -+-and C602. The simulator is cycle true, i.e a simulator time is -++In ERC32 mode, SIS emulates the behavior of the 90C601E and 90C602E -++sparc IU and FPU from Matra MHS. These are roughly equivalent to the -++Cypress C601 and C602. The simulator is cycle true, i.e a simulator time is -+ maintained and inremented according the IU and FPU instruction timing. -+ The parallel execution between the IU and FPU is modelled, as well as -+-stalls due to operand dependencies (FPU). The core interacts with the -+-user-defined memory modules through a number of functions. The memory -+-module must provide the following functions: -+- -+-int memory_read(asi,addr,data,ws) -+-int asi; -+-unsigned int addr; -+-unsigned int *data; -+-int *ws; -+- -+-int memory_write(asi,addr,data,sz,ws) -+-int asi; -+-unsigned int addr; -+-unsigned int *data; -+-int sz; -+-int *ws; -+- -+-int sis_memory_read(addr, data, length) -+-unsigned int addr; -+-char *data; -+-unsigned int length; -+- -+-int sis_memory_write(addr, data, length) -+-unsigned int addr; -+-char *data; -+-unsigned int length; -+- -+-int init_sim() -+- -+-int reset() -+- -+-int error_mode(pc) -+-unsigned int pc; -+- -+-memory_read() is used by the simulator to fetch instructions and -+-operands. The address space identifier (asi) and address is passed as -+-parameters. The read data should be assigned to the data pointer -+-(*data) and the number of waitstate to *ws. 'memory_read' should return -+-0 on success and 1 on failure. A failure will cause a data or -+-instruction fetch trap. memory_read() always reads one 32-bit word. -+- -+-sis_memory_read() is used by the simulator to display and disassemble -+-memory contants. The function should copy 'length' bytes of the simulated -+-memory starting at 'addr' to '*data'. -+-The sis_memory_read() should return 1 on success and 0 on failure. -+-Failure should only be indicated if access to unimplemented memory is attempted. -+- -+-memory_write() is used to write to memory. In addition to the asi -+-and address parameters, the size of the written data is given by 'sz'. -+-The pointer *data points to the data to be written. The 'sz' is coded -+-as follows: -+- -+- sz access type -+- 0 byte -+- 1 halfword -+- 2 word -+- 3 double-word -+- -+-If a double word is written, the most significant word is in data[0] and -+-the least significant in data[1]. -+- -+-sis_memory_write() is used by the simulator during loading of programs. -+-The function should copy 'length' bytes from *data to the simulated -+-memory starting at 'addr'. sis_memory_write() should return 1 on -+-success and 0 on failure. Failure should only be indicated if access -+-to unimplemented memory is attempted. See erc32.c for more details -+-on how to define the memory emulation functions. -+- -+-The 'init_sim' is called once when the simulator is started. This function -+-should be used to perform initialisations of user defined memory or -+-peripherals that only have to be done once, such as opening files etc. -+- -+-The 'reset' is called every time the simulator is reset, i.e. when a -+-'run' command is given. This function should be used to simulate a power -+-on reset of memory and peripherals. -+- -+-error_mode() is called by the simulator when the IU goes into error mode, -+-typically if a trap is caused when traps are disabled. The memory module -+-can then take actions, such as issue a reset. -+- -+-sys_reset() can be called by the memory module to reset the simulator. A -+-reset will empty the event queue and perform a power-on reset. -+- -+-4. Events and interrupts -+- -+-The simulator supports an event queue and the generation of processor -+-interrupts. The following functions are available to the user-defined -+-memory module: -+- -+-event(cfunc,arg,delta) -+-void (*cfunc)(); -+-int arg; -+-unsigned int delta; -+- -+-set_int(level,callback,arg) -+-int level; -+-void (*callback)(); -+-int arg; -+- -+-clear_int(level) -+-int level; -+- -+-sim_stop() -+- -+-The 'event' functions will schedule the execution of the function 'cfunc' -+-at time 'now + delta' clock cycles. The parameter 'arg' is passed as a -+-parameter to 'cfunc'. -+- -+-The 'set_int' function set the processor interrupt 'level'. When the interrupt -+-is taken, the function 'callback' is called with the argument 'arg'. This -+-will also clear the interrupt. An interrupt can be cleared before it is -+-taken by calling 'clear_int' with the appropriate interrupt level. -+- -+-The sim_stop function is called each time the simulator stops execution. -+-It can be used to flush buffered devices to get a clean state during -+-single stepping etc. -++stalls due to operand dependencies (FPU). -+ -+-See 'erc32.c' for examples on how to use events and interrupts. -++In Leon2/3 mode, the core emulates the Leon2/3 SPARC V8 core from -++Gaisler Research. All SPARC V8 instructions are supported but -++emaultion is not fully cycle-true as the cache is not emulated. -+ -+ 5. Memory module -+ -+-The supplied memory module (erc32.c) emulates the functions of memory and -++The ERC32 memory module (erc32.c) emulates the functions of memory and -+ the MEC asic developed for the 90C601/2. It includes the following functions: -+ -+ * UART A & B -+@@ -284,28 +216,38 @@ the MEC asic developed for the 90C601/2. It includes the following functions: -+ * 512 Kbyte ROM -+ * 4 Mbyte RAM -+ -+-See README.erc32 on how the MEC functions are emulated. For a detailed MEC -+-specification, look at the ERC32 home page at URL: -++See README.erc32 on how the MEC functions are emulated. -++ -++The Leon2 memory module (leon2.c) emulates on-chip peripherals and -++external memory for a simple Leon2 system. The modules includes the -++following functions: -++ -++* AHB and APB buses -++* One UART -++* Interrupt controller -++* Timer unit with two timers -++* PROM/SRAM memory controller -++* 16 Mbyte PROM, 16 Mbyte SRAM -+ -+-http://www.estec.esa.nl/wsmwww/erc32 -++See README.leon2 for further details on Leon3 emulation. -+ -+-6. Compile and linking programs -++The Leon3 memory module (leon3.c) emulates on-chip peripherals and -++external memory for a simple Leon3 system. The modules includes the -++following functions: -+ -+-The directory 'examples' contain some code fragments for SIS. -+-The script gccx indicates how the native sunos gcc and linker can be used -+-to produce executables for the simulator. To compile and link the provided -+-'hello.c', type 'gccx hello.c'. This will build the executable 'hello'. -+-Start the simulator by running 'startsim hello', and issue the command 'run. -+-After the program is terminated, the IU will be force to error mode through -+-a software trap and halt. -++* AHB and APB buses with plug&play -++* UART (APBUART) -++* Interrupt controller (IRQMP) -++* Timer unit with two timers (GPTIMER) -++* PROM/SRAM memory controller (SRCTRL) -++* 16 Mbyte PROM, 16 Mbyte SRAM -+ -+-The programs are linked with a start-up file, srt0.S. This file includes -+-the traptable and window underflow/overflow trap routines. -++See README.leon3 for further details on Leon3 emulation. -+ -+-7. IU and FPU instruction timing. -++6. IU and FPU instruction timing. -+ -+-The simulator provides cycle true simulation. The following table shows -+-the emulated instruction timing for 90C601E & 90C602E: -++The simulator provides cycle true simulation for ERC32. The following table -++shows the emulated instruction timing for 90C601E & 90C602E: -+ -+ Instructions Cycles -+ -+diff --git a/sim/erc32/config.in b/sim/erc32/config.in -+index 0db6f1e..0f712af 100644 -+--- a/sim/erc32/config.in -++++ b/sim/erc32/config.in -+@@ -1,5 +1,8 @@ -+ /* config.in. Generated from configure.ac by autoheader. */ -+ -++/* Define if building universal (internal helper macro) */ -++#undef AC_APPLE_UNIVERSAL_BUILD -++ -+ /* Define to 1 if translation of program messages to the user's native -+ language is requested. */ -+ #undef ENABLE_NLS -+@@ -73,6 +76,10 @@ -+ /* Define to 1 if you have the `__setfpucw' function. */ -+ #undef HAVE___SETFPUCW -+ -++/* Define to the sub-directory in which libtool stores uninstalled libraries. -++ */ -++#undef LT_OBJDIR -++ -+ /* Name of this package. */ -+ #undef PACKAGE -+ -+@@ -128,6 +135,18 @@ -+ #endif -+ -+ -++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most -++ significant byte first (like Motorola and SPARC, unlike Intel). */ -++#if defined AC_APPLE_UNIVERSAL_BUILD -++# if defined __BIG_ENDIAN__ -++# define WORDS_BIGENDIAN 1 -++# endif -++#else -++# ifndef WORDS_BIGENDIAN -++# undef WORDS_BIGENDIAN -++# endif -++#endif -++ -+ /* Define to 1 if on MINIX. */ -+ #undef _MINIX -+ -+diff --git a/sim/erc32/configure b/sim/erc32/configure -+index b8fd852..9d1b373 100755 -+--- a/sim/erc32/configure -++++ b/sim/erc32/configure -+@@ -1,10 +1,10 @@ -+ #! /bin/sh -+ # Guess values for system-dependent variables and create Makefiles. -+-# Generated by GNU Autoconf 2.64. -++# Generated by GNU Autoconf 2.69. -++# -++# -++# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -+ # -+-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -+-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software -+-# Foundation, Inc. -+ # -+ # This configure script is free software; the Free Software Foundation -+ # gives unlimited permission to copy, distribute and modify it. -+@@ -87,6 +87,7 @@ fi -+ IFS=" "" $as_nl" -+ -+ # Find who we are. Look in the path if we contain no directory separator. -++as_myself= -+ case $0 in #(( -+ *[\\/]* ) as_myself=$0 ;; -+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+@@ -131,6 +132,31 @@ export LANGUAGE -+ # CDPATH. -+ (unset CDPATH) >/dev/null 2>&1 && unset CDPATH -+ -++# Use a proper internal environment variable to ensure we don't fall -++ # into an infinite loop, continuously re-executing ourselves. -++ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then -++ _as_can_reexec=no; export _as_can_reexec; -++ # We cannot yet assume a decent shell, so we have to provide a -++# neutralization value for shells without unset; and this also -++# works around shells that cannot unset nonexistent variables. -++# Preserve -v and -x to the replacement shell. -++BASH_ENV=/dev/null -++ENV=/dev/null -++(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -++case $- in # (((( -++ *v*x* | *x*v* ) as_opts=-vx ;; -++ *v* ) as_opts=-v ;; -++ *x* ) as_opts=-x ;; -++ * ) as_opts= ;; -++esac -++exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -++# Admittedly, this is quite paranoid, since all the known shells bail -++# out after a failed `exec'. -++$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -++as_fn_exit 255 -++ fi -++ # We don't want this to propagate to other subprocesses. -++ { _as_can_reexec=; unset _as_can_reexec;} -+ if test "x$CONFIG_SHELL" = x; then -+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : -+ emulate sh -+@@ -164,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : -+ else -+ exitcode=1; echo positional parameters were not saved. -+ fi -+-test x\$exitcode = x0 || exit 1" -++test x\$exitcode = x0 || exit 1 -++test -x / || exit 1" -+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO -+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO -+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && -+@@ -217,14 +244,25 @@ IFS=$as_save_IFS -+ -+ -+ if test "x$CONFIG_SHELL" != x; then : -+- # We cannot yet assume a decent shell, so we have to provide a -+- # neutralization value for shells without unset; and this also -+- # works around shells that cannot unset nonexistent variables. -+- BASH_ENV=/dev/null -+- ENV=/dev/null -+- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -+- export CONFIG_SHELL -+- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -++ export CONFIG_SHELL -++ # We cannot yet assume a decent shell, so we have to provide a -++# neutralization value for shells without unset; and this also -++# works around shells that cannot unset nonexistent variables. -++# Preserve -v and -x to the replacement shell. -++BASH_ENV=/dev/null -++ENV=/dev/null -++(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -++case $- in # (((( -++ *v*x* | *x*v* ) as_opts=-vx ;; -++ *v* ) as_opts=-v ;; -++ *x* ) as_opts=-x ;; -++ * ) as_opts= ;; -++esac -++exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -++# Admittedly, this is quite paranoid, since all the known shells bail -++# out after a failed `exec'. -++$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -++exit 255 -+ fi -+ -+ if test x$as_have_required = xno; then : -+@@ -322,10 +360,18 @@ $as_echo X"$as_dir" | -+ test -d "$as_dir" && break -+ done -+ test -z "$as_dirs" || eval "mkdir $as_dirs" -+- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" -++ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" -+ -+ -+ } # as_fn_mkdir_p -++ -++# as_fn_executable_p FILE -++# ----------------------- -++# Test if FILE is an executable regular file. -++as_fn_executable_p () -++{ -++ test -f "$1" && test -x "$1" -++} # as_fn_executable_p -+ # as_fn_append VAR VALUE -+ # ---------------------- -+ # Append the text in VALUE to the end of the definition contained in VAR. Take -+@@ -362,19 +408,19 @@ else -+ fi # as_fn_arith -+ -+ -+-# as_fn_error ERROR [LINENO LOG_FD] -+-# --------------------------------- -++# as_fn_error STATUS ERROR [LINENO LOG_FD] -++# ---------------------------------------- -+ # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -+ # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -+-# script with status $?, using 1 if that was 0. -++# script with STATUS, using 1 if that was 0. -+ as_fn_error () -+ { -+- as_status=$?; test $as_status -eq 0 && as_status=1 -+- if test "$3"; then -+- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -+- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 -++ as_status=$1; test $as_status -eq 0 && as_status=1 -++ if test "$4"; then -++ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 -+ fi -+- $as_echo "$as_me: error: $1" >&2 -++ $as_echo "$as_me: error: $2" >&2 -+ as_fn_exit $as_status -+ } # as_fn_error -+ -+@@ -447,6 +493,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits -+ chmod +x "$as_me.lineno" || -+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } -+ -++ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have -++ # already done that, so ensure we don't try to do so again and fall -++ # in an infinite loop. This has already happened in practice. -++ _as_can_reexec=no; export _as_can_reexec -+ # Don't try to exec as it changes $[0], causing all sort of problems -+ # (the dirname of $[0] is not the place where we might find the -+ # original and so on. Autoconf is especially sensitive to this). -+@@ -481,16 +531,16 @@ if (echo >conf$$.file) 2>/dev/null; then -+ # ... but there are two gotchas: -+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. -+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. -+- # In both cases, we have to default to `cp -p'. -++ # In both cases, we have to default to `cp -pR'. -+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || -+- as_ln_s='cp -p' -++ as_ln_s='cp -pR' -+ elif ln conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s=ln -+ else -+- as_ln_s='cp -p' -++ as_ln_s='cp -pR' -+ fi -+ else -+- as_ln_s='cp -p' -++ as_ln_s='cp -pR' -+ fi -+ rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -+ rmdir conf$$.dir 2>/dev/null -+@@ -502,28 +552,8 @@ else -+ as_mkdir_p=false -+ fi -+ -+-if test -x / >/dev/null 2>&1; then -+- as_test_x='test -x' -+-else -+- if ls -dL / >/dev/null 2>&1; then -+- as_ls_L_option=L -+- else -+- as_ls_L_option= -+- fi -+- as_test_x=' -+- eval sh -c '\'' -+- if test -d "$1"; then -+- test -d "$1/."; -+- else -+- case $1 in #( -+- -*)set "./$1";; -+- esac; -+- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( -+- ???[sx]*):;;*)false;;esac;fi -+- '\'' sh -+- ' -+-fi -+-as_executable_p=$as_test_x -++as_test_x='test -x' -++as_executable_p=as_fn_executable_p -+ -+ # Sed expression to map a string onto a valid CPP name. -+ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" -+@@ -534,10 +564,11 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -+ SHELL=${CONFIG_SHELL-/bin/sh} -+ -+ -+-exec 7<&0 &1 -++test -n "$DJDIR" || exec 7<&0 &1 -+ -+ # Name of the host. -+-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -++# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -+ # so uname gets run too. -+ ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -+ -+@@ -833,8 +864,9 @@ do -+ fi -+ -+ case $ac_option in -+- *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; -+- *) ac_optarg=yes ;; -++ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; -++ *=) ac_optarg= ;; -++ *) ac_optarg=yes ;; -+ esac -+ -+ # Accept the important Cygnus configure options, so we can diagnose typos. -+@@ -879,7 +911,7 @@ do -+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && -+- as_fn_error "invalid feature name: $ac_useropt" -++ as_fn_error $? "invalid feature name: $ac_useropt" -+ ac_useropt_orig=$ac_useropt -+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` -+ case $ac_user_opts in -+@@ -905,7 +937,7 @@ do -+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && -+- as_fn_error "invalid feature name: $ac_useropt" -++ as_fn_error $? "invalid feature name: $ac_useropt" -+ ac_useropt_orig=$ac_useropt -+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` -+ case $ac_user_opts in -+@@ -1109,7 +1141,7 @@ do -+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && -+- as_fn_error "invalid package name: $ac_useropt" -++ as_fn_error $? "invalid package name: $ac_useropt" -+ ac_useropt_orig=$ac_useropt -+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` -+ case $ac_user_opts in -+@@ -1125,7 +1157,7 @@ do -+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && -+- as_fn_error "invalid package name: $ac_useropt" -++ as_fn_error $? "invalid package name: $ac_useropt" -+ ac_useropt_orig=$ac_useropt -+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` -+ case $ac_user_opts in -+@@ -1155,8 +1187,8 @@ do -+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) -+ x_libraries=$ac_optarg ;; -+ -+- -*) as_fn_error "unrecognized option: \`$ac_option' -+-Try \`$0 --help' for more information." -++ -*) as_fn_error $? "unrecognized option: \`$ac_option' -++Try \`$0 --help' for more information" -+ ;; -+ -+ *=*) -+@@ -1164,7 +1196,7 @@ Try \`$0 --help' for more information." -+ # Reject names that are not valid shell variable names. -+ case $ac_envvar in #( -+ '' | [0-9]* | *[!_$as_cr_alnum]* ) -+- as_fn_error "invalid variable name: \`$ac_envvar'" ;; -++ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; -+ esac -+ eval $ac_envvar=\$ac_optarg -+ export $ac_envvar ;; -+@@ -1174,7 +1206,7 @@ Try \`$0 --help' for more information." -+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 -+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && -+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 -+- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} -++ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" -+ ;; -+ -+ esac -+@@ -1182,13 +1214,13 @@ done -+ -+ if test -n "$ac_prev"; then -+ ac_option=--`echo $ac_prev | sed 's/_/-/g'` -+- as_fn_error "missing argument to $ac_option" -++ as_fn_error $? "missing argument to $ac_option" -+ fi -+ -+ if test -n "$ac_unrecognized_opts"; then -+ case $enable_option_checking in -+ no) ;; -+- fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; -++ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; -+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; -+ esac -+ fi -+@@ -1211,7 +1243,7 @@ do -+ [\\/$]* | ?:[\\/]* ) continue;; -+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;; -+ esac -+- as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" -++ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -+ done -+ -+ # There might be people who depend on the old broken behavior: `$host' -+@@ -1225,8 +1257,6 @@ target=$target_alias -+ if test "x$host_alias" != x; then -+ if test "x$build_alias" = x; then -+ cross_compiling=maybe -+- $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. -+- If a cross compiler is detected then cross compile mode will be used." >&2 -+ elif test "x$build_alias" != "x$host_alias"; then -+ cross_compiling=yes -+ fi -+@@ -1241,9 +1271,9 @@ test "$silent" = yes && exec 6>/dev/null -+ ac_pwd=`pwd` && test -n "$ac_pwd" && -+ ac_ls_di=`ls -di .` && -+ ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || -+- as_fn_error "working directory cannot be determined" -++ as_fn_error $? "working directory cannot be determined" -+ test "X$ac_ls_di" = "X$ac_pwd_ls_di" || -+- as_fn_error "pwd does not report name of working directory" -++ as_fn_error $? "pwd does not report name of working directory" -+ -+ -+ # Find the source files, if location was not specified. -+@@ -1282,11 +1312,11 @@ else -+ fi -+ if test ! -r "$srcdir/$ac_unique_file"; then -+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." -+- as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" -++ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -+ fi -+ ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -+ ac_abs_confdir=`( -+- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" -++ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" -+ pwd)` -+ # When building in place, set srcdir=. -+ if test "$ac_abs_confdir" = "$ac_pwd"; then -+@@ -1326,7 +1356,7 @@ Configuration: -+ --help=short display options specific to this package -+ --help=recursive display the short help of all the included packages -+ -V, --version display version information and exit -+- -q, --quiet, --silent do not print \`checking...' messages -++ -q, --quiet, --silent do not print \`checking ...' messages -+ --cache-file=FILE cache test results in FILE [disabled] -+ -C, --config-cache alias for \`--cache-file=config.cache' -+ -n, --no-create do not create output files -+@@ -1420,7 +1450,7 @@ Some influential environment variables: -+ LDFLAGS linker flags, e.g. -L if you have libraries in a -+ nonstandard directory -+ LIBS libraries to pass to the linker, e.g. -l -+- CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if -++ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if -+ you have headers in a nonstandard directory -+ CPP C preprocessor -+ -+@@ -1491,9 +1521,9 @@ test -n "$ac_init_help" && exit $ac_status -+ if $ac_init_version; then -+ cat <<\_ACEOF -+ configure -+-generated by GNU Autoconf 2.64 -++generated by GNU Autoconf 2.69 -+ -+-Copyright (C) 2009 Free Software Foundation, Inc. -++Copyright (C) 2012 Free Software Foundation, Inc. -+ This configure script is free software; the Free Software Foundation -+ gives unlimited permission to copy, distribute and modify it. -+ _ACEOF -+@@ -1537,8 +1567,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_retval=1 -+ fi -+- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -+- return $ac_retval -++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -++ as_fn_set_status $ac_retval -+ -+ } # ac_fn_c_try_compile -+ -+@@ -1563,7 +1593,7 @@ $as_echo "$ac_try_echo"; } >&5 -+ mv -f conftest.er1 conftest.err -+ fi -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+- test $ac_status = 0; } >/dev/null && { -++ test $ac_status = 0; } > conftest.i && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then : -+@@ -1574,8 +1604,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_retval=1 -+ fi -+- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -+- return $ac_retval -++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -++ as_fn_set_status $ac_retval -+ -+ } # ac_fn_c_try_cpp -+ -+@@ -1587,10 +1617,10 @@ fi -+ ac_fn_c_check_header_mongrel () -+ { -+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -+- if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : -++ if eval \${$3+:} false; then : -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -+ $as_echo_n "checking for $2... " >&6; } -+-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : -++if eval \${$3+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ fi -+ eval ac_res=\$$3 -+@@ -1626,7 +1656,7 @@ if ac_fn_c_try_cpp "$LINENO"; then : -+ else -+ ac_header_preproc=no -+ fi -+-rm -f conftest.err conftest.$ac_ext -++rm -f conftest.err conftest.i conftest.$ac_ext -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -+ $as_echo "$ac_header_preproc" >&6; } -+ -+@@ -1653,7 +1683,7 @@ $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -+ esac -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -+ $as_echo_n "checking for $2... " >&6; } -+-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : -++if eval \${$3+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ eval "$3=\$ac_header_compiler" -+@@ -1662,7 +1692,7 @@ eval ac_res=\$$3 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -+ $as_echo "$ac_res" >&6; } -+ fi -+- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -+ -+ } # ac_fn_c_check_header_mongrel -+ -+@@ -1703,8 +1733,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 -+ ac_retval=$ac_status -+ fi -+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo -+- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -+- return $ac_retval -++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -++ as_fn_set_status $ac_retval -+ -+ } # ac_fn_c_try_run -+ -+@@ -1717,7 +1747,7 @@ ac_fn_c_check_header_compile () -+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -+ $as_echo_n "checking for $2... " >&6; } -+-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : -++if eval \${$3+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+@@ -1735,7 +1765,7 @@ fi -+ eval ac_res=\$$3 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -+ $as_echo "$ac_res" >&6; } -+- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -+ -+ } # ac_fn_c_check_header_compile -+ -+@@ -1766,7 +1796,7 @@ $as_echo "$ac_try_echo"; } >&5 -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && { -+ test "$cross_compiling" = yes || -+- $as_test_x conftest$ac_exeext -++ test -x conftest$ac_exeext -+ }; then : -+ ac_retval=0 -+ else -+@@ -1780,8 +1810,8 @@ fi -+ # interfere with the next link command; also delete a directory that is -+ # left behind by Apple's compiler. We do this before executing the actions. -+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo -+- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -+- return $ac_retval -++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -++ as_fn_set_status $ac_retval -+ -+ } # ac_fn_c_try_link -+ -+@@ -1793,7 +1823,7 @@ ac_fn_c_check_func () -+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -+ $as_echo_n "checking for $2... " >&6; } -+-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : -++if eval \${$3+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+@@ -1848,7 +1878,7 @@ fi -+ eval ac_res=\$$3 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -+ $as_echo "$ac_res" >&6; } -+- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -+ -+ } # ac_fn_c_check_func -+ cat >config.log <<_ACEOF -+@@ -1856,7 +1886,7 @@ This file contains any messages produced by compilers while -+ running configure, to aid debugging if configure makes a mistake. -+ -+ It was created by $as_me, which was -+-generated by GNU Autoconf 2.64. Invocation command line was -++generated by GNU Autoconf 2.69. Invocation command line was -+ -+ $ $0 $@ -+ -+@@ -1966,11 +1996,9 @@ trap 'exit_status=$? -+ { -+ echo -+ -+- cat <<\_ASBOX -+-## ---------------- ## -++ $as_echo "## ---------------- ## -+ ## Cache variables. ## -+-## ---------------- ## -+-_ASBOX -++## ---------------- ##" -+ echo -+ # The following way of writing the cache mishandles newlines in values, -+ ( -+@@ -2004,11 +2032,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; -+ ) -+ echo -+ -+- cat <<\_ASBOX -+-## ----------------- ## -++ $as_echo "## ----------------- ## -+ ## Output variables. ## -+-## ----------------- ## -+-_ASBOX -++## ----------------- ##" -+ echo -+ for ac_var in $ac_subst_vars -+ do -+@@ -2021,11 +2047,9 @@ _ASBOX -+ echo -+ -+ if test -n "$ac_subst_files"; then -+- cat <<\_ASBOX -+-## ------------------- ## -++ $as_echo "## ------------------- ## -+ ## File substitutions. ## -+-## ------------------- ## -+-_ASBOX -++## ------------------- ##" -+ echo -+ for ac_var in $ac_subst_files -+ do -+@@ -2039,11 +2063,9 @@ _ASBOX -+ fi -+ -+ if test -s confdefs.h; then -+- cat <<\_ASBOX -+-## ----------- ## -++ $as_echo "## ----------- ## -+ ## confdefs.h. ## -+-## ----------- ## -+-_ASBOX -++## ----------- ##" -+ echo -+ cat confdefs.h -+ echo -+@@ -2098,7 +2120,12 @@ _ACEOF -+ ac_site_file1=NONE -+ ac_site_file2=NONE -+ if test -n "$CONFIG_SITE"; then -+- ac_site_file1=$CONFIG_SITE -++ # We do not want a PATH search for config.site. -++ case $CONFIG_SITE in #(( -++ -*) ac_site_file1=./$CONFIG_SITE;; -++ */*) ac_site_file1=$CONFIG_SITE;; -++ *) ac_site_file1=./$CONFIG_SITE;; -++ esac -+ elif test "x$prefix" != xNONE; then -+ ac_site_file1=$prefix/share/config.site -+ ac_site_file2=$prefix/etc/config.site -+@@ -2109,18 +2136,22 @@ fi -+ for ac_site_file in "$ac_site_file1" "$ac_site_file2" -+ do -+ test "x$ac_site_file" = xNONE && continue -+- if test -r "$ac_site_file"; then -++ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -+ $as_echo "$as_me: loading site script $ac_site_file" >&6;} -+ sed 's/^/| /' "$ac_site_file" >&5 -+- . "$ac_site_file" -++ . "$ac_site_file" \ -++ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -++as_fn_error $? "failed to load site script $ac_site_file -++See \`config.log' for more details" "$LINENO" 5; } -+ fi -+ done -+ -+ if test -r "$cache_file"; then -+- # Some versions of bash will fail to source /dev/null (special -+- # files actually), so we avoid doing that. -+- if test -f "$cache_file"; then -++ # Some versions of bash will fail to source /dev/null (special files -++ # actually), so we avoid doing that. DJGPP emulates it as a regular file. -++ if test /dev/null != "$cache_file" && test -f "$cache_file"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -+ $as_echo "$as_me: loading cache $cache_file" >&6;} -+ case $cache_file in -+@@ -2189,7 +2220,7 @@ if $ac_cache_corrupted; then -+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -+ $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} -+- as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -++ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -+ fi -+ ## -------------------- ## -+ ## Main body of script. ## -+@@ -2249,21 +2280,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -+ -+ -+ -+-# _AC_CHECK_DECL_BODY -+-# ------------------- -+-# Shell function body for AC_CHECK_DECL. -+-# _AC_CHECK_DECL_BODY -+- -+-# _AC_CHECK_DECLS(SYMBOL, ACTION-IF_FOUND, ACTION-IF-NOT-FOUND, -+-# INCLUDES) -+-# ------------------------------------------------------------- -+-# Helper to AC_CHECK_DECLS, which generates the check for a single -+-# SYMBOL with INCLUDES, performs the AC_DEFINE, then expands -+-# ACTION-IF-FOUND or ACTION-IF-NOT-FOUND. -+- -+- -+- -+- -+ -+ -+ -+@@ -4057,7 +4073,7 @@ if test -n "$ac_tool_prefix"; then -+ set dummy ${ac_tool_prefix}gcc; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_CC+set}" = set; then : -++if ${ac_cv_prog_CC+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$CC"; then -+@@ -4069,7 +4085,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_CC="${ac_tool_prefix}gcc" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -4097,7 +4113,7 @@ if test -z "$ac_cv_prog_CC"; then -+ set dummy gcc; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : -++if ${ac_cv_prog_ac_ct_CC+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_CC"; then -+@@ -4109,7 +4125,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_CC="gcc" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -4150,7 +4166,7 @@ if test -z "$CC"; then -+ set dummy ${ac_tool_prefix}cc; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_CC+set}" = set; then : -++if ${ac_cv_prog_CC+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$CC"; then -+@@ -4162,7 +4178,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_CC="${ac_tool_prefix}cc" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -4190,7 +4206,7 @@ if test -z "$CC"; then -+ set dummy cc; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_CC+set}" = set; then : -++if ${ac_cv_prog_CC+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$CC"; then -+@@ -4203,7 +4219,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then -+ ac_prog_rejected=yes -+ continue -+@@ -4249,7 +4265,7 @@ if test -z "$CC"; then -+ set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_CC+set}" = set; then : -++if ${ac_cv_prog_CC+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$CC"; then -+@@ -4261,7 +4277,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -4293,7 +4309,7 @@ do -+ set dummy $ac_prog; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : -++if ${ac_cv_prog_ac_ct_CC+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_CC"; then -+@@ -4305,7 +4321,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_CC="$ac_prog" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -4347,8 +4363,8 @@ fi -+ -+ test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+-as_fn_error "no acceptable C compiler found in \$PATH -+-See \`config.log' for more details." "$LINENO" 5; } -++as_fn_error $? "no acceptable C compiler found in \$PATH -++See \`config.log' for more details" "$LINENO" 5; } -+ -+ # Provide some information about the compiler. -+ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -+@@ -4369,8 +4385,8 @@ $as_echo "$ac_try_echo"; } >&5 -+ ... rest of stderr output deleted ... -+ 10q' conftest.err >conftest.er1 -+ cat conftest.er1 >&5 -+- rm -f conftest.er1 conftest.err -+ fi -++ rm -f conftest.er1 conftest.err -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; } -+ done -+@@ -4387,12 +4403,12 @@ main () -+ } -+ _ACEOF -+ ac_clean_files_save=$ac_clean_files -+-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" -++ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -+ # Try to create an executable without -o first, disregard a.out. -+ # It will help us diagnose broken compilers, and finding out an intuition -+ # of exeext. -+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -+-$as_echo_n "checking for C compiler default output file name... " >&6; } -++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -++$as_echo_n "checking whether the C compiler works... " >&6; } -+ ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -+ -+ # The possible output files: -+@@ -4454,62 +4470,28 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= -+ else -+ ac_file='' -+ fi -+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -+-$as_echo "$ac_file" >&6; } -+ if test -z "$ac_file"; then : -+- $as_echo "$as_me: failed program was:" >&5 -++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -++$as_echo "no" >&6; } -++$as_echo "$as_me: failed program was:" >&5 -+ sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+-{ as_fn_set_status 77 -+-as_fn_error "C compiler cannot create executables -+-See \`config.log' for more details." "$LINENO" 5; }; } -++as_fn_error 77 "C compiler cannot create executables -++See \`config.log' for more details" "$LINENO" 5; } -++else -++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -++$as_echo "yes" >&6; } -+ fi -++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -++$as_echo_n "checking for C compiler default output file name... " >&6; } -++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -++$as_echo "$ac_file" >&6; } -+ ac_exeext=$ac_cv_exeext -+ -+-# Check that the compiler produces executables we can run. If not, either -+-# the compiler is broken, or we cross compile. -+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -+-$as_echo_n "checking whether the C compiler works... " >&6; } -+-# If not cross compiling, check that we can run a simple program. -+-if test "$cross_compiling" != yes; then -+- if { ac_try='./$ac_file' -+- { { case "(($ac_try" in -+- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+- *) ac_try_echo=$ac_try;; -+-esac -+-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -+-$as_echo "$ac_try_echo"; } >&5 -+- (eval "$ac_try") 2>&5 -+- ac_status=$? -+- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+- test $ac_status = 0; }; }; then -+- cross_compiling=no -+- else -+- if test "$cross_compiling" = maybe; then -+- cross_compiling=yes -+- else -+- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -+-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+-as_fn_error "cannot run C compiled programs. -+-If you meant to cross compile, use \`--host'. -+-See \`config.log' for more details." "$LINENO" 5; } -+- fi -+- fi -+-fi -+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+-$as_echo "yes" >&6; } -+- -+-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out -++rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -+ ac_clean_files=$ac_clean_files_save -+-# Check that the compiler produces executables we can run. If not, either -+-# the compiler is broken, or we cross compile. -+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -+-$as_echo_n "checking whether we are cross compiling... " >&6; } -+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -+-$as_echo "$cross_compiling" >&6; } -+- -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -+ $as_echo_n "checking for suffix of executables... " >&6; } -+ if { { ac_try="$ac_link" -+@@ -4539,19 +4521,78 @@ done -+ else -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+-as_fn_error "cannot compute suffix of executables: cannot compile and link -+-See \`config.log' for more details." "$LINENO" 5; } -++as_fn_error $? "cannot compute suffix of executables: cannot compile and link -++See \`config.log' for more details" "$LINENO" 5; } -+ fi -+-rm -f conftest$ac_cv_exeext -++rm -f conftest conftest$ac_cv_exeext -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -+ $as_echo "$ac_cv_exeext" >&6; } -+ -+ rm -f conftest.$ac_ext -+ EXEEXT=$ac_cv_exeext -+ ac_exeext=$EXEEXT -++cat confdefs.h - <<_ACEOF >conftest.$ac_ext -++/* end confdefs.h. */ -++#include -++int -++main () -++{ -++FILE *f = fopen ("conftest.out", "w"); -++ return ferror (f) || fclose (f) != 0; -++ -++ ; -++ return 0; -++} -++_ACEOF -++ac_clean_files="$ac_clean_files conftest.out" -++# Check that the compiler produces executables we can run. If not, either -++# the compiler is broken, or we cross compile. -++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -++$as_echo_n "checking whether we are cross compiling... " >&6; } -++if test "$cross_compiling" != yes; then -++ { { ac_try="$ac_link" -++case "(($ac_try" in -++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -++ *) ac_try_echo=$ac_try;; -++esac -++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -++$as_echo "$ac_try_echo"; } >&5 -++ (eval "$ac_link") 2>&5 -++ ac_status=$? -++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -++ test $ac_status = 0; } -++ if { ac_try='./conftest$ac_cv_exeext' -++ { { case "(($ac_try" in -++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -++ *) ac_try_echo=$ac_try;; -++esac -++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -++$as_echo "$ac_try_echo"; } >&5 -++ (eval "$ac_try") 2>&5 -++ ac_status=$? -++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -++ test $ac_status = 0; }; }; then -++ cross_compiling=no -++ else -++ if test "$cross_compiling" = maybe; then -++ cross_compiling=yes -++ else -++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -++as_fn_error $? "cannot run C compiled programs. -++If you meant to cross compile, use \`--host'. -++See \`config.log' for more details" "$LINENO" 5; } -++ fi -++ fi -++fi -++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -++$as_echo "$cross_compiling" >&6; } -++ -++rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -++ac_clean_files=$ac_clean_files_save -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -+ $as_echo_n "checking for suffix of object files... " >&6; } -+-if test "${ac_cv_objext+set}" = set; then : -++if ${ac_cv_objext+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+@@ -4591,8 +4632,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+-as_fn_error "cannot compute suffix of object files: cannot compile -+-See \`config.log' for more details." "$LINENO" 5; } -++as_fn_error $? "cannot compute suffix of object files: cannot compile -++See \`config.log' for more details" "$LINENO" 5; } -+ fi -+ rm -f conftest.$ac_cv_objext conftest.$ac_ext -+ fi -+@@ -4602,7 +4643,7 @@ OBJEXT=$ac_cv_objext -+ ac_objext=$OBJEXT -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -+ $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -+-if test "${ac_cv_c_compiler_gnu+set}" = set; then : -++if ${ac_cv_c_compiler_gnu+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+@@ -4639,7 +4680,7 @@ ac_test_CFLAGS=${CFLAGS+set} -+ ac_save_CFLAGS=$CFLAGS -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -+ $as_echo_n "checking whether $CC accepts -g... " >&6; } -+-if test "${ac_cv_prog_cc_g+set}" = set; then : -++if ${ac_cv_prog_cc_g+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_save_c_werror_flag=$ac_c_werror_flag -+@@ -4717,7 +4758,7 @@ else -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -+ $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -+-if test "${ac_cv_prog_cc_c89+set}" = set; then : -++if ${ac_cv_prog_cc_c89+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_cv_prog_cc_c89=no -+@@ -4726,8 +4767,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+ /* end confdefs.h. */ -+ #include -+ #include -+-#include -+-#include -++struct stat; -+ /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -+ struct buf { int x; }; -+ FILE * (*rcsopen) (struct buf *, struct stat *, int); -+@@ -4814,16 +4854,22 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -+ -+ ac_aux_dir= -+ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do -+- for ac_t in install-sh install.sh shtool; do -+- if test -f "$ac_dir/$ac_t"; then -+- ac_aux_dir=$ac_dir -+- ac_install_sh="$ac_aux_dir/$ac_t -c" -+- break 2 -+- fi -+- done -++ if test -f "$ac_dir/install-sh"; then -++ ac_aux_dir=$ac_dir -++ ac_install_sh="$ac_aux_dir/install-sh -c" -++ break -++ elif test -f "$ac_dir/install.sh"; then -++ ac_aux_dir=$ac_dir -++ ac_install_sh="$ac_aux_dir/install.sh -c" -++ break -++ elif test -f "$ac_dir/shtool"; then -++ ac_aux_dir=$ac_dir -++ ac_install_sh="$ac_aux_dir/shtool install -c" -++ break -++ fi -+ done -+ if test -z "$ac_aux_dir"; then -+- as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -++ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -+ fi -+ -+ # These three variables are undocumented and unsupported, -+@@ -4837,27 +4883,27 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -+ -+ # Make sure we can run config.sub. -+ $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || -+- as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -++ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -+ $as_echo_n "checking build system type... " >&6; } -+-if test "${ac_cv_build+set}" = set; then : -++if ${ac_cv_build+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_build_alias=$build_alias -+ test "x$ac_build_alias" = x && -+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -+ test "x$ac_build_alias" = x && -+- as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 -++ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -+ ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || -+- as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 -++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 -+ -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -+ $as_echo "$ac_cv_build" >&6; } -+ case $ac_cv_build in -+ *-*-*) ;; -+-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; -++*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -+ esac -+ build=$ac_cv_build -+ ac_save_IFS=$IFS; IFS='-' -+@@ -4875,14 +4921,14 @@ case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -+ $as_echo_n "checking host system type... " >&6; } -+-if test "${ac_cv_host+set}" = set; then : -++if ${ac_cv_host+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test "x$host_alias" = x; then -+ ac_cv_host=$ac_cv_build -+ else -+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || -+- as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -+ fi -+ -+ fi -+@@ -4890,7 +4936,7 @@ fi -+ $as_echo "$ac_cv_host" >&6; } -+ case $ac_cv_host in -+ *-*-*) ;; -+-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; -++*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -+ esac -+ host=$ac_cv_host -+ ac_save_IFS=$IFS; IFS='-' -+@@ -4908,14 +4954,14 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -+ $as_echo_n "checking target system type... " >&6; } -+-if test "${ac_cv_target+set}" = set; then : -++if ${ac_cv_target+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test "x$target_alias" = x; then -+ ac_cv_target=$ac_cv_host -+ else -+ ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || -+- as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 -++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 -+ fi -+ -+ fi -+@@ -4923,7 +4969,7 @@ fi -+ $as_echo "$ac_cv_target" >&6; } -+ case $ac_cv_target in -+ *-*-*) ;; -+-*) as_fn_error "invalid value of canonical target" "$LINENO" 5;; -++*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; -+ esac -+ target=$ac_cv_target -+ ac_save_IFS=$IFS; IFS='-' -+@@ -4958,7 +5004,7 @@ if test -n "$CPP" && test -d "$CPP"; then -+ CPP= -+ fi -+ if test -z "$CPP"; then -+- if test "${ac_cv_prog_CPP+set}" = set; then : -++ if ${ac_cv_prog_CPP+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ # Double quotes because CPP needs to be expanded -+@@ -4988,7 +5034,7 @@ else -+ # Broken: fails on valid input. -+ continue -+ fi -+-rm -f conftest.err conftest.$ac_ext -++rm -f conftest.err conftest.i conftest.$ac_ext -+ -+ # OK, works on sane cases. Now check whether nonexistent headers -+ # can be detected and how. -+@@ -5004,11 +5050,11 @@ else -+ ac_preproc_ok=: -+ break -+ fi -+-rm -f conftest.err conftest.$ac_ext -++rm -f conftest.err conftest.i conftest.$ac_ext -+ -+ done -+ # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -+-rm -f conftest.err conftest.$ac_ext -++rm -f conftest.i conftest.err conftest.$ac_ext -+ if $ac_preproc_ok; then : -+ break -+ fi -+@@ -5047,7 +5093,7 @@ else -+ # Broken: fails on valid input. -+ continue -+ fi -+-rm -f conftest.err conftest.$ac_ext -++rm -f conftest.err conftest.i conftest.$ac_ext -+ -+ # OK, works on sane cases. Now check whether nonexistent headers -+ # can be detected and how. -+@@ -5063,18 +5109,18 @@ else -+ ac_preproc_ok=: -+ break -+ fi -+-rm -f conftest.err conftest.$ac_ext -++rm -f conftest.err conftest.i conftest.$ac_ext -+ -+ done -+ # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -+-rm -f conftest.err conftest.$ac_ext -++rm -f conftest.i conftest.err conftest.$ac_ext -+ if $ac_preproc_ok; then : -+ -+ else -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+-as_fn_error "C preprocessor \"$CPP\" fails sanity check -+-See \`config.log' for more details." "$LINENO" 5; } -++as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -++See \`config.log' for more details" "$LINENO" 5; } -+ fi -+ -+ ac_ext=c -+@@ -5086,7 +5132,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -+ $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -+-if test "${ac_cv_path_GREP+set}" = set; then : -++if ${ac_cv_path_GREP+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -z "$GREP"; then -+@@ -5100,7 +5146,7 @@ do -+ for ac_prog in grep ggrep; do -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" -+- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -++ as_fn_executable_p "$ac_path_GREP" || continue -+ # Check for GNU ac_path_GREP and select it if it is found. -+ # Check for GNU $ac_path_GREP -+ case `"$ac_path_GREP" --version 2>&1` in -+@@ -5135,7 +5181,7 @@ esac -+ done -+ IFS=$as_save_IFS -+ if test -z "$ac_cv_path_GREP"; then -+- as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 -++ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 -+ fi -+ else -+ ac_cv_path_GREP=$GREP -+@@ -5149,7 +5195,7 @@ $as_echo "$ac_cv_path_GREP" >&6; } -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -+ $as_echo_n "checking for egrep... " >&6; } -+-if test "${ac_cv_path_EGREP+set}" = set; then : -++if ${ac_cv_path_EGREP+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 -+@@ -5166,7 +5212,7 @@ do -+ for ac_prog in egrep; do -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" -+- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -++ as_fn_executable_p "$ac_path_EGREP" || continue -+ # Check for GNU ac_path_EGREP and select it if it is found. -+ # Check for GNU $ac_path_EGREP -+ case `"$ac_path_EGREP" --version 2>&1` in -+@@ -5201,7 +5247,7 @@ esac -+ done -+ IFS=$as_save_IFS -+ if test -z "$ac_cv_path_EGREP"; then -+- as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 -++ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 -+ fi -+ else -+ ac_cv_path_EGREP=$EGREP -+@@ -5216,7 +5262,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; } -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -+ $as_echo_n "checking for ANSI C header files... " >&6; } -+-if test "${ac_cv_header_stdc+set}" = set; then : -++if ${ac_cv_header_stdc+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+@@ -5333,8 +5379,7 @@ do : -+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -+ ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -+ " -+-eval as_val=\$$as_ac_Header -+- if test "x$as_val" = x""yes; then : -++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : -+ cat >>confdefs.h <<_ACEOF -+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+ _ACEOF -+@@ -5346,7 +5391,7 @@ done -+ -+ -+ ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -+-if test "x$ac_cv_header_minix_config_h" = x""yes; then : -++if test "x$ac_cv_header_minix_config_h" = xyes; then : -+ MINIX=yes -+ else -+ MINIX= -+@@ -5368,14 +5413,14 @@ $as_echo "#define _MINIX 1" >>confdefs.h -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 -+ $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -+-if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : -++if ${ac_cv_safe_to_define___extensions__+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+ /* end confdefs.h. */ -+ -+-# define __EXTENSIONS__ 1 -+- $ac_includes_default -++# define __EXTENSIONS__ 1 -++ $ac_includes_default -+ int -+ main () -+ { -+@@ -5432,7 +5477,7 @@ program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -+ $as_echo_n "checking for a BSD-compatible install... " >&6; } -+ if test -z "$INSTALL"; then -+-if test "${ac_cv_path_install+set}" = set; then : -++if ${ac_cv_path_install+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+@@ -5452,7 +5497,7 @@ case $as_dir/ in #(( -+ # by default. -+ for ac_prog in ginstall scoinst install; do -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then -+ if test $ac_prog = install && -+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then -+ # AIX install. It has an incompatible calling convention. -+@@ -5615,7 +5660,7 @@ esac -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -+ $as_echo_n "checking for a sed that does not truncate output... " >&6; } -+-if test "${ac_cv_path_SED+set}" = set; then : -++if ${ac_cv_path_SED+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ -+@@ -5635,7 +5680,7 @@ do -+ for ac_prog in sed gsed; do -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" -+- { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue -++ as_fn_executable_p "$ac_path_SED" || continue -+ # Check for GNU ac_path_SED and select it if it is found. -+ # Check for GNU $ac_path_SED -+ case `"$ac_path_SED" --version 2>&1` in -+@@ -5670,7 +5715,7 @@ esac -+ done -+ IFS=$as_save_IFS -+ if test -z "$ac_cv_path_SED"; then -+- as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 -++ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 -+ fi -+ else -+ ac_cv_path_SED=$SED -+@@ -5697,7 +5742,7 @@ Xsed="$SED -e 1s/^X//" -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -+ $as_echo_n "checking for fgrep... " >&6; } -+-if test "${ac_cv_path_FGREP+set}" = set; then : -++if ${ac_cv_path_FGREP+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 -+@@ -5714,7 +5759,7 @@ do -+ for ac_prog in fgrep; do -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" -+- { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue -++ as_fn_executable_p "$ac_path_FGREP" || continue -+ # Check for GNU ac_path_FGREP and select it if it is found. -+ # Check for GNU $ac_path_FGREP -+ case `"$ac_path_FGREP" --version 2>&1` in -+@@ -5749,7 +5794,7 @@ esac -+ done -+ IFS=$as_save_IFS -+ if test -z "$ac_cv_path_FGREP"; then -+- as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 -++ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 -+ fi -+ else -+ ac_cv_path_FGREP=$FGREP -+@@ -5828,7 +5873,7 @@ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -+ $as_echo_n "checking for non-GNU ld... " >&6; } -+ fi -+-if test "${lt_cv_path_LD+set}" = set; then : -++if ${lt_cv_path_LD+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -z "$LD"; then -+@@ -5865,10 +5910,10 @@ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+ $as_echo "no" >&6; } -+ fi -+-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 -++test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -+ $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -+-if test "${lt_cv_prog_gnu_ld+set}" = set; then : -++if ${lt_cv_prog_gnu_ld+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ # I'd rather use --version here, but apparently some GNU lds only accept -v. -+@@ -5895,7 +5940,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -+ $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -+-if test "${lt_cv_path_NM+set}" = set; then : -++if ${lt_cv_path_NM+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$NM"; then -+@@ -5958,7 +6003,7 @@ else -+ set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_DUMPBIN+set}" = set; then : -++if ${ac_cv_prog_DUMPBIN+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$DUMPBIN"; then -+@@ -5970,7 +6015,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6002,7 +6047,7 @@ do -+ set dummy $ac_prog; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : -++if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_DUMPBIN"; then -+@@ -6014,7 +6059,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6074,7 +6119,7 @@ test -z "$NM" && NM=nm -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -+ $as_echo_n "checking the name lister ($NM) interface... " >&6; } -+-if test "${lt_cv_nm_interface+set}" = set; then : -++if ${lt_cv_nm_interface+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_nm_interface="BSD nm" -+@@ -6109,7 +6154,7 @@ fi -+ # find the maximum length of command line arguments -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -+ $as_echo_n "checking the maximum length of command line arguments... " >&6; } -+-if test "${lt_cv_sys_max_cmd_len+set}" = set; then : -++if ${lt_cv_sys_max_cmd_len+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ i=0 -+@@ -6306,7 +6351,7 @@ esac -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -+ $as_echo_n "checking for $LD option to reload object files... " >&6; } -+-if test "${lt_cv_ld_reload_flag+set}" = set; then : -++if ${lt_cv_ld_reload_flag+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_ld_reload_flag='-r' -+@@ -6342,7 +6387,7 @@ if test -n "$ac_tool_prefix"; then -+ set dummy ${ac_tool_prefix}objdump; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_OBJDUMP+set}" = set; then : -++if ${ac_cv_prog_OBJDUMP+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$OBJDUMP"; then -+@@ -6354,7 +6399,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6382,7 +6427,7 @@ if test -z "$ac_cv_prog_OBJDUMP"; then -+ set dummy objdump; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : -++if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_OBJDUMP"; then -+@@ -6394,7 +6439,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_OBJDUMP="objdump" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6441,7 +6486,7 @@ test -z "$OBJDUMP" && OBJDUMP=objdump -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -+ $as_echo_n "checking how to recognize dependent libraries... " >&6; } -+-if test "${lt_cv_deplibs_check_method+set}" = set; then : -++if ${lt_cv_deplibs_check_method+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_file_magic_cmd='$MAGIC_CMD' -+@@ -6662,7 +6707,7 @@ if test -n "$ac_tool_prefix"; then -+ set dummy ${ac_tool_prefix}ar; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_AR+set}" = set; then : -++if ${ac_cv_prog_AR+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$AR"; then -+@@ -6674,7 +6719,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_AR="${ac_tool_prefix}ar" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6702,7 +6747,7 @@ if test -z "$ac_cv_prog_AR"; then -+ set dummy ar; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : -++if ${ac_cv_prog_ac_ct_AR+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_AR"; then -+@@ -6714,7 +6759,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_AR="ar" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6767,7 +6812,7 @@ if test -n "$ac_tool_prefix"; then -+ set dummy ${ac_tool_prefix}strip; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_STRIP+set}" = set; then : -++if ${ac_cv_prog_STRIP+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$STRIP"; then -+@@ -6779,7 +6824,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_STRIP="${ac_tool_prefix}strip" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6807,7 +6852,7 @@ if test -z "$ac_cv_prog_STRIP"; then -+ set dummy strip; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : -++if ${ac_cv_prog_ac_ct_STRIP+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_STRIP"; then -+@@ -6819,7 +6864,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_STRIP="strip" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6866,7 +6911,7 @@ if test -n "$ac_tool_prefix"; then -+ set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_RANLIB+set}" = set; then : -++if ${ac_cv_prog_RANLIB+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$RANLIB"; then -+@@ -6878,7 +6923,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -6906,7 +6951,7 @@ if test -z "$ac_cv_prog_RANLIB"; then -+ set dummy ranlib; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : -++if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_RANLIB"; then -+@@ -6918,7 +6963,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_RANLIB="ranlib" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7010,7 +7055,7 @@ do -+ set dummy $ac_prog; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_AWK+set}" = set; then : -++if ${ac_cv_prog_AWK+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$AWK"; then -+@@ -7022,7 +7067,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_AWK="$ac_prog" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7077,7 +7122,7 @@ compiler=$CC -+ # Check for command to grab the raw symbol name followed by C symbol from nm. -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -+ $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -+-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : -++if ${lt_cv_sys_global_symbol_pipe+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ -+@@ -7461,7 +7506,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) -+ CFLAGS="$CFLAGS -belf" -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -+ $as_echo_n "checking whether the C compiler needs -belf... " >&6; } -+-if test "${lt_cv_cc_needs_belf+set}" = set; then : -++if ${lt_cv_cc_needs_belf+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_ext=c -+@@ -7537,7 +7582,7 @@ need_locks="$enable_libtool_lock" -+ set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : -++if ${ac_cv_prog_DSYMUTIL+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$DSYMUTIL"; then -+@@ -7549,7 +7594,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7577,7 +7622,7 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then -+ set dummy dsymutil; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : -++if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_DSYMUTIL"; then -+@@ -7589,7 +7634,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7629,7 +7674,7 @@ fi -+ set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_NMEDIT+set}" = set; then : -++if ${ac_cv_prog_NMEDIT+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$NMEDIT"; then -+@@ -7641,7 +7686,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7669,7 +7714,7 @@ if test -z "$ac_cv_prog_NMEDIT"; then -+ set dummy nmedit; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : -++if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_NMEDIT"; then -+@@ -7681,7 +7726,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_NMEDIT="nmedit" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7721,7 +7766,7 @@ fi -+ set dummy ${ac_tool_prefix}lipo; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_LIPO+set}" = set; then : -++if ${ac_cv_prog_LIPO+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$LIPO"; then -+@@ -7733,7 +7778,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7761,7 +7806,7 @@ if test -z "$ac_cv_prog_LIPO"; then -+ set dummy lipo; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : -++if ${ac_cv_prog_ac_ct_LIPO+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_LIPO"; then -+@@ -7773,7 +7818,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_LIPO="lipo" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7813,7 +7858,7 @@ fi -+ set dummy ${ac_tool_prefix}otool; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_OTOOL+set}" = set; then : -++if ${ac_cv_prog_OTOOL+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$OTOOL"; then -+@@ -7825,7 +7870,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7853,7 +7898,7 @@ if test -z "$ac_cv_prog_OTOOL"; then -+ set dummy otool; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : -++if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_OTOOL"; then -+@@ -7865,7 +7910,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_OTOOL="otool" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7905,7 +7950,7 @@ fi -+ set dummy ${ac_tool_prefix}otool64; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_OTOOL64+set}" = set; then : -++if ${ac_cv_prog_OTOOL64+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$OTOOL64"; then -+@@ -7917,7 +7962,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -7945,7 +7990,7 @@ if test -z "$ac_cv_prog_OTOOL64"; then -+ set dummy otool64; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : -++if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_OTOOL64"; then -+@@ -7957,7 +8002,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_OTOOL64="otool64" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -8020,7 +8065,7 @@ fi -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -+ $as_echo_n "checking for -single_module linker flag... " >&6; } -+-if test "${lt_cv_apple_cc_single_mod+set}" = set; then : -++if ${lt_cv_apple_cc_single_mod+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_apple_cc_single_mod=no -+@@ -8049,7 +8094,7 @@ fi -+ $as_echo "$lt_cv_apple_cc_single_mod" >&6; } -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -+ $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -+-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : -++if ${lt_cv_ld_exported_symbols_list+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_ld_exported_symbols_list=no -+@@ -8081,7 +8126,7 @@ fi -+ $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -+ $as_echo_n "checking for -force_load linker flag... " >&6; } -+-if test "${lt_cv_ld_force_load+set}" = set; then : -++if ${lt_cv_ld_force_load+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_ld_force_load=no -+@@ -8148,7 +8193,7 @@ for ac_header in dlfcn.h -+ do : -+ ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -+ " -+-if test "x$ac_cv_header_dlfcn_h" = x""yes; then : -++if test "x$ac_cv_header_dlfcn_h" = xyes; then : -+ cat >>confdefs.h <<_ACEOF -+ #define HAVE_DLFCN_H 1 -+ _ACEOF -+@@ -8184,7 +8229,7 @@ if test -n "$ac_tool_prefix"; then -+ set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_RANLIB+set}" = set; then : -++if ${ac_cv_prog_RANLIB+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$RANLIB"; then -+@@ -8196,7 +8241,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -8224,7 +8269,7 @@ if test -z "$ac_cv_prog_RANLIB"; then -+ set dummy ranlib; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : -++if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$ac_ct_RANLIB"; then -+@@ -8236,7 +8281,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_RANLIB="ranlib" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -8292,7 +8337,7 @@ depcc="$CC" am_compiler_list= -+ am_depcomp=$ac_aux_dir/depcomp -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -+ $as_echo_n "checking dependency style of $depcc... " >&6; } -+-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : -++if ${am_cv_CC_dependencies_compiler_type+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -f "$am_depcomp"; then -+@@ -8378,7 +8423,7 @@ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -+ $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -+ if test x${am_cv_CC_dependencies_compiler_type-none} = xnone -+-then as_fn_error "no usable dependency style found" "$LINENO" 5 -++then as_fn_error $? "no usable dependency style found" "$LINENO" 5 -+ else CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type -+ -+ fi -+@@ -8391,7 +8436,7 @@ do -+ set dummy $ac_prog; ac_word=$2 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+ $as_echo_n "checking for $ac_word... " >&6; } -+-if test "${ac_cv_prog_MAKE+set}" = set; then : -++if ${ac_cv_prog_MAKE+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test -n "$MAKE"; then -+@@ -8403,7 +8448,7 @@ do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_MAKE="$ac_prog" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+@@ -8521,8 +8566,7 @@ for ac_header in stdlib.h string.h strings.h unistd.h time.h -+ do : -+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -+ ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -+-eval as_val=\$$as_ac_Header -+- if test "x$as_val" = x""yes; then : -++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : -+ cat >>confdefs.h <<_ACEOF -+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+ _ACEOF -+@@ -8535,8 +8579,7 @@ for ac_header in sys/time.h sys/resource.h -+ do : -+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -+ ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -+-eval as_val=\$$as_ac_Header -+- if test "x$as_val" = x""yes; then : -++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : -+ cat >>confdefs.h <<_ACEOF -+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+ _ACEOF -+@@ -8549,8 +8592,7 @@ for ac_header in fcntl.h fpu_control.h -+ do : -+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -+ ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -+-eval as_val=\$$as_ac_Header -+- if test "x$as_val" = x""yes; then : -++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : -+ cat >>confdefs.h <<_ACEOF -+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+ _ACEOF -+@@ -8563,8 +8605,7 @@ for ac_header in dlfcn.h errno.h sys/stat.h -+ do : -+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -+ ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -+-eval as_val=\$$as_ac_Header -+- if test "x$as_val" = x""yes; then : -++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : -+ cat >>confdefs.h <<_ACEOF -+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+ _ACEOF -+@@ -8577,8 +8618,7 @@ for ac_func in getrusage time sigaction __setfpucw -+ do : -+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -+-eval as_val=\$$as_ac_var -+- if test "x$as_val" = x""yes; then : -++if eval test \"x\$"$as_ac_var"\" = x"yes"; then : -+ cat >>confdefs.h <<_ACEOF -+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -+ _ACEOF -+@@ -8590,7 +8630,7 @@ done -+ # Check for socket libraries -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bind in -lsocket" >&5 -+ $as_echo_n "checking for bind in -lsocket... " >&6; } -+-if test "${ac_cv_lib_socket_bind+set}" = set; then : -++if ${ac_cv_lib_socket_bind+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_check_lib_save_LIBS=$LIBS -+@@ -8624,7 +8664,7 @@ LIBS=$ac_check_lib_save_LIBS -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_bind" >&5 -+ $as_echo "$ac_cv_lib_socket_bind" >&6; } -+-if test "x$ac_cv_lib_socket_bind" = x""yes; then : -++if test "x$ac_cv_lib_socket_bind" = xyes; then : -+ cat >>confdefs.h <<_ACEOF -+ #define HAVE_LIBSOCKET 1 -+ _ACEOF -+@@ -8635,7 +8675,7 @@ fi -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 -+ $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } -+-if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : -++if ${ac_cv_lib_nsl_gethostbyname+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_check_lib_save_LIBS=$LIBS -+@@ -8669,7 +8709,7 @@ LIBS=$ac_check_lib_save_LIBS -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 -+ $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } -+-if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : -++if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : -+ cat >>confdefs.h <<_ACEOF -+ #define HAVE_LIBNSL 1 -+ _ACEOF -+@@ -8695,7 +8735,7 @@ fi -+ if test "$with_zlib" != "no"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing zlibVersion" >&5 -+ $as_echo_n "checking for library containing zlibVersion... " >&6; } -+-if test "${ac_cv_search_zlibVersion+set}" = set; then : -++if ${ac_cv_search_zlibVersion+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_func_search_save_LIBS=$LIBS -+@@ -8729,11 +8769,11 @@ for ac_lib in '' z; do -+ fi -+ rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext -+- if test "${ac_cv_search_zlibVersion+set}" = set; then : -++ if ${ac_cv_search_zlibVersion+:} false; then : -+ break -+ fi -+ done -+-if test "${ac_cv_search_zlibVersion+set}" = set; then : -++if ${ac_cv_search_zlibVersion+:} false; then : -+ -+ else -+ ac_cv_search_zlibVersion=no -+@@ -8749,7 +8789,7 @@ if test "$ac_res" != no; then : -+ for ac_header in zlib.h -+ do : -+ ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" -+-if test "x$ac_cv_header_zlib_h" = x""yes; then : -++if test "x$ac_cv_header_zlib_h" = xyes; then : -+ cat >>confdefs.h <<_ACEOF -+ #define HAVE_ZLIB_H 1 -+ _ACEOF -+@@ -8761,7 +8801,7 @@ done -+ fi -+ -+ if test "$with_zlib" = "yes" -a "$ac_cv_header_zlib_h" != "yes"; then -+- as_fn_error "zlib (libz) library was explicitly requested but not found" "$LINENO" 5 -++ as_fn_error $? "zlib (libz) library was explicitly requested but not found" "$LINENO" 5 -+ fi -+ fi -+ -+@@ -8965,7 +9005,7 @@ fi -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -+ $as_echo_n "checking for objdir... " >&6; } -+-if test "${lt_cv_objdir+set}" = set; then : -++if ${lt_cv_objdir+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ rm -f .libs 2>/dev/null -+@@ -9043,7 +9083,7 @@ file_magic*) -+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -+ $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -+-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : -++if ${lt_cv_path_MAGIC_CMD+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ case $MAGIC_CMD in -+@@ -9109,7 +9149,7 @@ if test -z "$lt_cv_path_MAGIC_CMD"; then -+ if test -n "$ac_tool_prefix"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -+ $as_echo_n "checking for file... " >&6; } -+-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : -++if ${lt_cv_path_MAGIC_CMD+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ case $MAGIC_CMD in -+@@ -9251,7 +9291,7 @@ if test "$GCC" = yes; then -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -+ $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -+-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : -++if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_prog_compiler_rtti_exceptions=no -+@@ -9604,7 +9644,7 @@ $as_echo "$lt_prog_compiler_pic" >&6; } -+ if test -n "$lt_prog_compiler_pic"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -+ $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -+-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : -++if ${lt_cv_prog_compiler_pic_works+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_prog_compiler_pic_works=no -+@@ -9663,7 +9703,7 @@ fi -+ wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -+ $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -+-if test "${lt_cv_prog_compiler_static_works+set}" = set; then : -++if ${lt_cv_prog_compiler_static_works+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_prog_compiler_static_works=no -+@@ -9706,7 +9746,7 @@ fi -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -+ $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -+-if test "${lt_cv_prog_compiler_c_o+set}" = set; then : -++if ${lt_cv_prog_compiler_c_o+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_prog_compiler_c_o=no -+@@ -9761,7 +9801,7 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -+ $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -+-if test "${lt_cv_prog_compiler_c_o+set}" = set; then : -++if ${lt_cv_prog_compiler_c_o+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_prog_compiler_c_o=no -+@@ -10577,7 +10617,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -+ $as_echo_n "checking if $CC understands -b... " >&6; } -+-if test "${lt_cv_prog_compiler__b+set}" = set; then : -++if ${lt_cv_prog_compiler__b+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_prog_compiler__b=no -+@@ -10949,7 +10989,7 @@ x|xyes) -+ # to ld, don't add -lc before -lgcc. -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -+ $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -+-if test "${lt_cv_archive_cmds_need_lc+set}" = set; then : -++if ${lt_cv_archive_cmds_need_lc+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ $RM conftest* -+@@ -11587,7 +11627,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu) -+ shlibpath_overrides_runpath=no -+ -+ # Some binutils ld are patched to set DT_RUNPATH -+- if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then : -++ if ${lt_cv_shlibpath_overrides_runpath+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ lt_cv_shlibpath_overrides_runpath=no -+@@ -12007,7 +12047,7 @@ else -+ # if libdl is installed we need to link against it -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -+ $as_echo_n "checking for dlopen in -ldl... " >&6; } -+-if test "${ac_cv_lib_dl_dlopen+set}" = set; then : -++if ${ac_cv_lib_dl_dlopen+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_check_lib_save_LIBS=$LIBS -+@@ -12041,7 +12081,7 @@ LIBS=$ac_check_lib_save_LIBS -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -+ $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -+-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : -++if test "x$ac_cv_lib_dl_dlopen" = xyes; then : -+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -+ else -+ -+@@ -12055,12 +12095,12 @@ fi -+ ++++ b/sim/erc32/README.leon2 +@@ -0,0 +1,53 @@ ++ ++1. LEON2 emulation ++ ++The file 'leon2.c' contains a model of simple LEON2 sub-system. It ++contains 16 Mbyte ROM and 16 Mbyte RAM. Standard peripherals ++such as interrupt controller, UART and timer are provided. ++The model can execute leon2 binaries that do not require an ++MMU. ++ ++To start sis in Leon2 mode, add the -leon2 switch. In gdb, ++use 'target sim -leon2' . ++ ++1.1 UART ++ ++One LEON2 UART is emaulted, and is located at address 0x80000070. ++The following registers are implemeted: ++ ++- UART RX and TX register (0x80000070) ++- UART status register (0x80000074) ++ ++The UART generates interrupt 3. ++ ++1.2 Timer unit ++ ++The LEON2 timer unit is emulated and located at address 0x80000040. ++It is configured with two timers and separate interrupts (8 and 9). ++The scaler is configured to 16 bits, while the counters are 32 bits. ++ ++1.3 Interrupt controller ++ ++The interrupt controller is implemented as described in the ++LEON2 IP manual, with the exception of the interrupt level register. ++Secondary interrupts are not supported. The registers are located ++at address 0x80000090. ++ ++1.5 Memory interface ++ ++The following memory areas are valid for the Leon3 simulator: ++ ++0x00000000 - 0x01000000 ROM (16 Mbyte, loaded at start-up) ++0x40000000 - 0x41000000 RAM (16 Mbyte, loaded at start-up) ++0x80000000 - 0x81000000 APB bus, including plug&play ++0xFFFFF000 - 0xFFFFFFFF AHB plug&play area ++ ++Access to non-existing memory will result in a memory exception trap. ++ ++1.8 Power-down mode ++ ++The Leon2 power-down register (0x80000018) is supported. When power-down is ++entered, time is skipped forward until the next event in the event queue. ++However, if the simulator event queue is empty, power-down mode is not ++entered since no interrupt would be generated to exit from the mode. A ++Ctrl-C in the simulator window will exit the power-down mode. +diff --git a/sim/erc32/README.leon3 b/sim/erc32/README.leon3 +new file mode 100644 +index 0000000..00ab14a +--- /dev/null ++++ b/sim/erc32/README.leon3 +@@ -0,0 +1,53 @@ ++ ++1. LEON3 emulation ++ ++The file 'leon3.c' contains a model of simple LEON3 sub-system. It ++contains 16 Mbyte ROM and 16 Mbyte RAM. Standard peripherals ++such as interrupt controller, UART and timer are provided. ++The model can execute leon3 binaries that do not require an ++MMU. ++ ++To start sis in Leon3 mode, add the -leon3 switch. In gdb, ++use 'target sim -leon3' . ++ ++1.1 UART ++ ++The UART emulates an APBUART and is located at address 0x80000100. ++The following registers are implemeted: ++ ++- UART RX and TX register (0x80000100) ++- UART status register (0x80000104) ++ ++The UART generates interrupt 3. ++ ++1.2 Timer unit (GPTIMER) ++ ++The GPTIMER programmable counter is emulated and located at ++address 0x80000300. It is configured with two timers and separate ++interrupts (8 and 9). ++ ++1.3 Interrupt controller ++ ++The IRQMP interrupt controller is implemented as described in the ++GRLIB IP manual, with the exception of the interrupt level register. ++Extended interrupts are not supported. The registers are located ++at address 0x80000200. ++ ++1.5 Memory interface ++ ++The following memory areas are valid for the Leon3 simulator: ++ ++0x00000000 - 0x01000000 ROM (16 Mbyte, loaded at start-up) ++0x40000000 - 0x41000000 RAM (16 Mbyte, loaded at start-up) ++0x80000000 - 0x81000000 APB bus, including plug&play ++0xFFFFF000 - 0xFFFFFFFF AHB plug&play area ++ ++Access to non-existing memory will result in a memory exception trap. ++ ++1.8 Power-down mode ++ ++The Leon3 power-down feature (%asr19) is supported. When power-down is ++entered, time is skipped forward until the next event in the event queue. ++However, if the simulator event queue is empty, power-down mode is not ++entered since no interrupt would be generated to exit from the mode. A ++Ctrl-C in the simulator window will exit the power-down mode. +diff --git a/sim/erc32/README.sis b/sim/erc32/README.sis +index b119f03..59c4c64 100644 +--- a/sim/erc32/README.sis ++++ b/sim/erc32/README.sis +@@ -1,10 +1,10 @@ + +-SIS - Sparc Instruction Simulator README file (v2.0, 05-02-1996) ++SIS - Sparc Instruction Simulator README file (v2.8, 10-11-2014) + ------------------------------------------------------------------- + + 1. Introduction + +-The SIS is a SPARC V7 architecture simulator. It consist of two parts, ++The SIS is a SPARC V7/V8 architecture simulator. It consist of two parts, + the simulator core and a user defined memory module. The simulator + core executes the instructions while the memory module emulates memory + and peripherals. +@@ -13,28 +13,29 @@ and peripherals. + + The simulator is started as follows: + +-sis [-uart1 uart_device1] [-uart2 uart_device2] ++sis [-leon2] [-leon3] [-uart1 uart_device1] [-uart2 uart_device2] + [-nfp] [-freq frequency] [-c batch_file] [files] + +-The default uart devices for SIS are /dev/ptypc and /dev/ptypd. The +--uart[1,2] switch can be used to connect the uarts to other devices. +-Use 'tip /dev/ttypc' to connect a terminal emulator to the uarts. ++By default, SIS emaultes an ERC32 system. The -leon2 switch enables ++LEON2 emaultion, while the -leon3 switch enables emulation of a ++LEON3 SOC system. ++ ++The emulated console uart is connected stdin/stdout. The -uart[1,2] ++switch can be used to connect the uarts to other devices. ++ + The '-nfp' will disable the simulated FPU, so each FPU instruction will + generate a FPU disabled trap. The '-freq' switch can be used to define + which "frequency" the simulator runs at. This is used by the 'perf' + command to calculated the MIPS figure for a particular configuration. +-The give frequency must be an integer indicating the frequency in MHz. ++The frequency must be an integer indicating the frequency in MHz. + + The -c option indicates that sis commands should be read from 'batch_file' + at startup. + +-Files to be loaded must be in one of the supported formats (see INSTALLATION), +-and will be loaded into the simulated memory. The file formats are +-automatically recognised. ++Files to be loaded must be in one of the supported formats (elf, a.out, srec), ++and will be loaded into the simulated memory. + +-The script 'startsim' will start the simulator in one xterm window and +-open a terminal emulator (tip) connected to the UART A in a second +-xterm window. Below is description of commands that are recognized by ++Below is description of commands that are recognized by + the simulator. The command-line is parsed using GNU readline. A command + history of 64 commands is maintained. Use the up/down arrows to recall + previous commands. For more details, see the readline documentation. +@@ -77,8 +78,8 @@ Prints the FPU registers + go
[inst_count] + + The go command will set pc to
and npc to
+ 4, and start +-execution. No other initialisation will be done. If inst_count is given, +-execution will stop after the specified number of instructions. ++execution. If inst_count is given, execution will stop after the specified ++number of instructions. + + help + +@@ -143,136 +144,67 @@ Typing a 'Ctrl-C' will interrupt a running simulator. + Short forms of the commands are allowed, e.g 'c' 'co' or 'con' are all + interpreted as 'cont'. + ++2 Using SIS with gdb ++ ++2.1 Attaching the simulator ++ ++To attach GDB to the simulator, use: ++ ++target sim [options] ++ ++The following options are supported: ++ ++ -leon2 Emulate a LEON2 system ++ ++ -leon3 Emulate a LEON3 system ++ ++ -nfp Disable FPU. FPops will cause an FPU disabled trap. ++ ++ -freq Set the simulated "system clock" to MHz. ++ ++ -v Verbose mode. ++ ++ -nogdb Disable GDB breakpoint handling (see below) ++ ++To start debugging a program type 'load ' and debug as ++usual. ++ ++The native simulator commands can be reached using the GDB 'sim' ++command: ++ ++sim ++ ++Direct simulator commands during a GDB session must be issued ++with care not to disturb GDB's operation ... ++ ++A program can be restarted in gdb by first issuing the load command, ++followed by run. ++ ++2.2 GDB breakpoint handling ++ ++GDB inserts breakpoint in the form of the 'ta 1' instruction. The ++GDB-integrated simulator will therefore recognize the breakpoint ++instruction and return control to GDB. If the application uses ++'ta 1', the breakpoint detection can be disabled with the -nogdb ++switch. In this case however, GDB breakpoints will not work. ++ + + 3. Simulator core + +-The SIS emulates the behavior of the 90C601E and 90C602E sparc IU and +-FPU from Matra MHS. These are roughly equivalent to the Cypress C601 +-and C602. The simulator is cycle true, i.e a simulator time is ++In ERC32 mode, SIS emulates the behavior of the 90C601E and 90C602E ++sparc IU and FPU from Matra MHS. These are roughly equivalent to the ++Cypress C601 and C602. The simulator is cycle true, i.e a simulator time is + maintained and inremented according the IU and FPU instruction timing. + The parallel execution between the IU and FPU is modelled, as well as +-stalls due to operand dependencies (FPU). The core interacts with the +-user-defined memory modules through a number of functions. The memory +-module must provide the following functions: +- +-int memory_read(asi,addr,data,ws) +-int asi; +-unsigned int addr; +-unsigned int *data; +-int *ws; +- +-int memory_write(asi,addr,data,sz,ws) +-int asi; +-unsigned int addr; +-unsigned int *data; +-int sz; +-int *ws; +- +-int sis_memory_read(addr, data, length) +-unsigned int addr; +-char *data; +-unsigned int length; +- +-int sis_memory_write(addr, data, length) +-unsigned int addr; +-char *data; +-unsigned int length; +- +-int init_sim() +- +-int reset() +- +-int error_mode(pc) +-unsigned int pc; +- +-memory_read() is used by the simulator to fetch instructions and +-operands. The address space identifier (asi) and address is passed as +-parameters. The read data should be assigned to the data pointer +-(*data) and the number of waitstate to *ws. 'memory_read' should return +-0 on success and 1 on failure. A failure will cause a data or +-instruction fetch trap. memory_read() always reads one 32-bit word. +- +-sis_memory_read() is used by the simulator to display and disassemble +-memory contants. The function should copy 'length' bytes of the simulated +-memory starting at 'addr' to '*data'. +-The sis_memory_read() should return 1 on success and 0 on failure. +-Failure should only be indicated if access to unimplemented memory is attempted. +- +-memory_write() is used to write to memory. In addition to the asi +-and address parameters, the size of the written data is given by 'sz'. +-The pointer *data points to the data to be written. The 'sz' is coded +-as follows: +- +- sz access type +- 0 byte +- 1 halfword +- 2 word +- 3 double-word +- +-If a double word is written, the most significant word is in data[0] and +-the least significant in data[1]. +- +-sis_memory_write() is used by the simulator during loading of programs. +-The function should copy 'length' bytes from *data to the simulated +-memory starting at 'addr'. sis_memory_write() should return 1 on +-success and 0 on failure. Failure should only be indicated if access +-to unimplemented memory is attempted. See erc32.c for more details +-on how to define the memory emulation functions. +- +-The 'init_sim' is called once when the simulator is started. This function +-should be used to perform initialisations of user defined memory or +-peripherals that only have to be done once, such as opening files etc. +- +-The 'reset' is called every time the simulator is reset, i.e. when a +-'run' command is given. This function should be used to simulate a power +-on reset of memory and peripherals. +- +-error_mode() is called by the simulator when the IU goes into error mode, +-typically if a trap is caused when traps are disabled. The memory module +-can then take actions, such as issue a reset. +- +-sys_reset() can be called by the memory module to reset the simulator. A +-reset will empty the event queue and perform a power-on reset. +- +-4. Events and interrupts +- +-The simulator supports an event queue and the generation of processor +-interrupts. The following functions are available to the user-defined +-memory module: +- +-event(cfunc,arg,delta) +-void (*cfunc)(); +-int arg; +-unsigned int delta; +- +-set_int(level,callback,arg) +-int level; +-void (*callback)(); +-int arg; +- +-clear_int(level) +-int level; +- +-sim_stop() +- +-The 'event' functions will schedule the execution of the function 'cfunc' +-at time 'now + delta' clock cycles. The parameter 'arg' is passed as a +-parameter to 'cfunc'. +- +-The 'set_int' function set the processor interrupt 'level'. When the interrupt +-is taken, the function 'callback' is called with the argument 'arg'. This +-will also clear the interrupt. An interrupt can be cleared before it is +-taken by calling 'clear_int' with the appropriate interrupt level. +- +-The sim_stop function is called each time the simulator stops execution. +-It can be used to flush buffered devices to get a clean state during +-single stepping etc. ++stalls due to operand dependencies (FPU). + +-See 'erc32.c' for examples on how to use events and interrupts. ++In Leon2/3 mode, the core emulates the Leon2/3 SPARC V8 core from ++Gaisler Research. All SPARC V8 instructions are supported but ++emaultion is not fully cycle-true as the cache is not emulated. + + 5. Memory module + +-The supplied memory module (erc32.c) emulates the functions of memory and ++The ERC32 memory module (erc32.c) emulates the functions of memory and + the MEC asic developed for the 90C601/2. It includes the following functions: + + * UART A & B +@@ -284,28 +216,38 @@ the MEC asic developed for the 90C601/2. It includes the following functions: + * 512 Kbyte ROM + * 4 Mbyte RAM + +-See README.erc32 on how the MEC functions are emulated. For a detailed MEC +-specification, look at the ERC32 home page at URL: ++See README.erc32 on how the MEC functions are emulated. ++ ++The Leon2 memory module (leon2.c) emulates on-chip peripherals and ++external memory for a simple Leon2 system. The modules includes the ++following functions: ++ ++* AHB and APB buses ++* One UART ++* Interrupt controller ++* Timer unit with two timers ++* PROM/SRAM memory controller ++* 16 Mbyte PROM, 16 Mbyte SRAM + +-http://www.estec.esa.nl/wsmwww/erc32 ++See README.leon2 for further details on Leon3 emulation. + +-6. Compile and linking programs ++The Leon3 memory module (leon3.c) emulates on-chip peripherals and ++external memory for a simple Leon3 system. The modules includes the ++following functions: + +-The directory 'examples' contain some code fragments for SIS. +-The script gccx indicates how the native sunos gcc and linker can be used +-to produce executables for the simulator. To compile and link the provided +-'hello.c', type 'gccx hello.c'. This will build the executable 'hello'. +-Start the simulator by running 'startsim hello', and issue the command 'run. +-After the program is terminated, the IU will be force to error mode through +-a software trap and halt. ++* AHB and APB buses with plug&play ++* UART (APBUART) ++* Interrupt controller (IRQMP) ++* Timer unit with two timers (GPTIMER) ++* PROM/SRAM memory controller (SRCTRL) ++* 16 Mbyte PROM, 16 Mbyte SRAM + +-The programs are linked with a start-up file, srt0.S. This file includes +-the traptable and window underflow/overflow trap routines. ++See README.leon3 for further details on Leon3 emulation. + +-7. IU and FPU instruction timing. ++6. IU and FPU instruction timing. + +-The simulator provides cycle true simulation. The following table shows +-the emulated instruction timing for 90C601E & 90C602E: ++The simulator provides cycle true simulation for ERC32. The following table ++shows the emulated instruction timing for 90C601E & 90C602E: + + Instructions Cycles + +diff --git a/sim/erc32/config.in b/sim/erc32/config.in +index 0db6f1e..0f712af 100644 +--- a/sim/erc32/config.in ++++ b/sim/erc32/config.in +@@ -1,5 +1,8 @@ + /* config.in. Generated from configure.ac by autoheader. */ + ++/* Define if building universal (internal helper macro) */ ++#undef AC_APPLE_UNIVERSAL_BUILD ++ + /* Define to 1 if translation of program messages to the user's native + language is requested. */ + #undef ENABLE_NLS +@@ -73,6 +76,10 @@ + /* Define to 1 if you have the `__setfpucw' function. */ + #undef HAVE___SETFPUCW + ++/* Define to the sub-directory in which libtool stores uninstalled libraries. ++ */ ++#undef LT_OBJDIR ++ + /* Name of this package. */ + #undef PACKAGE + +@@ -128,6 +135,18 @@ + #endif + + ++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most ++ significant byte first (like Motorola and SPARC, unlike Intel). */ ++#if defined AC_APPLE_UNIVERSAL_BUILD ++# if defined __BIG_ENDIAN__ ++# define WORDS_BIGENDIAN 1 ++# endif ++#else ++# ifndef WORDS_BIGENDIAN ++# undef WORDS_BIGENDIAN ++# endif ++#endif ++ + /* Define to 1 if on MINIX. */ + #undef _MINIX + +diff --git a/sim/erc32/configure b/sim/erc32/configure +index b8fd852..9d1b373 100755 +--- a/sim/erc32/configure ++++ b/sim/erc32/configure +@@ -1,10 +1,10 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.64. ++# Generated by GNU Autoconf 2.69. ++# ++# ++# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. + # +-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software +-# Foundation, Inc. + # + # This configure script is free software; the Free Software Foundation + # gives unlimited permission to copy, distribute and modify it. +@@ -87,6 +87,7 @@ fi + IFS=" "" $as_nl" + + # Find who we are. Look in the path if we contain no directory separator. ++as_myself= + case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +@@ -131,6 +132,31 @@ export LANGUAGE + # CDPATH. + (unset CDPATH) >/dev/null 2>&1 && unset CDPATH + ++# Use a proper internal environment variable to ensure we don't fall ++ # into an infinite loop, continuously re-executing ourselves. ++ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then ++ _as_can_reexec=no; export _as_can_reexec; ++ # We cannot yet assume a decent shell, so we have to provide a ++# neutralization value for shells without unset; and this also ++# works around shells that cannot unset nonexistent variables. ++# Preserve -v and -x to the replacement shell. ++BASH_ENV=/dev/null ++ENV=/dev/null ++(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV ++case $- in # (((( ++ *v*x* | *x*v* ) as_opts=-vx ;; ++ *v* ) as_opts=-v ;; ++ *x* ) as_opts=-x ;; ++ * ) as_opts= ;; ++esac ++exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} ++# Admittedly, this is quite paranoid, since all the known shells bail ++# out after a failed `exec'. ++$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 ++as_fn_exit 255 ++ fi ++ # We don't want this to propagate to other subprocesses. ++ { _as_can_reexec=; unset _as_can_reexec;} + if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh +@@ -164,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + else + exitcode=1; echo positional parameters were not saved. + fi +-test x\$exitcode = x0 || exit 1" ++test x\$exitcode = x0 || exit 1 ++test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && +@@ -217,14 +244,25 @@ IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : +- # We cannot yet assume a decent shell, so we have to provide a +- # neutralization value for shells without unset; and this also +- # works around shells that cannot unset nonexistent variables. +- BASH_ENV=/dev/null +- ENV=/dev/null +- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +- export CONFIG_SHELL +- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} ++ export CONFIG_SHELL ++ # We cannot yet assume a decent shell, so we have to provide a ++# neutralization value for shells without unset; and this also ++# works around shells that cannot unset nonexistent variables. ++# Preserve -v and -x to the replacement shell. ++BASH_ENV=/dev/null ++ENV=/dev/null ++(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV ++case $- in # (((( ++ *v*x* | *x*v* ) as_opts=-vx ;; ++ *v* ) as_opts=-v ;; ++ *x* ) as_opts=-x ;; ++ * ) as_opts= ;; ++esac ++exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} ++# Admittedly, this is quite paranoid, since all the known shells bail ++# out after a failed `exec'. ++$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 ++exit 255 + fi + + if test x$as_have_required = xno; then : +@@ -322,10 +360,18 @@ $as_echo X"$as_dir" | + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" ++ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + + } # as_fn_mkdir_p ++ ++# as_fn_executable_p FILE ++# ----------------------- ++# Test if FILE is an executable regular file. ++as_fn_executable_p () ++{ ++ test -f "$1" && test -x "$1" ++} # as_fn_executable_p + # as_fn_append VAR VALUE + # ---------------------- + # Append the text in VALUE to the end of the definition contained in VAR. Take +@@ -362,19 +408,19 @@ else + fi # as_fn_arith + + +-# as_fn_error ERROR [LINENO LOG_FD] +-# --------------------------------- ++# as_fn_error STATUS ERROR [LINENO LOG_FD] ++# ---------------------------------------- + # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are + # provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-# script with status $?, using 1 if that was 0. ++# script with STATUS, using 1 if that was 0. + as_fn_error () + { +- as_status=$?; test $as_status -eq 0 && as_status=1 +- if test "$3"; then +- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 ++ as_status=$1; test $as_status -eq 0 && as_status=1 ++ if test "$4"; then ++ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi +- $as_echo "$as_me: error: $1" >&2 ++ $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status + } # as_fn_error + +@@ -447,6 +493,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + ++ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have ++ # already done that, so ensure we don't try to do so again and fall ++ # in an infinite loop. This has already happened in practice. ++ _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). +@@ -481,16 +531,16 @@ if (echo >conf$$.file) 2>/dev/null; then + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -p'. ++ # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' + fi + else +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' + fi + rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file + rmdir conf$$.dir 2>/dev/null +@@ -502,28 +552,8 @@ else + as_mkdir_p=false + fi + +-if test -x / >/dev/null 2>&1; then +- as_test_x='test -x' +-else +- if ls -dL / >/dev/null 2>&1; then +- as_ls_L_option=L +- else +- as_ls_L_option= +- fi +- as_test_x=' +- eval sh -c '\'' +- if test -d "$1"; then +- test -d "$1/."; +- else +- case $1 in #( +- -*)set "./$1";; +- esac; +- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( +- ???[sx]*):;;*)false;;esac;fi +- '\'' sh +- ' +-fi +-as_executable_p=$as_test_x ++as_test_x='test -x' ++as_executable_p=as_fn_executable_p + + # Sed expression to map a string onto a valid CPP name. + as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +@@ -534,10 +564,11 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + SHELL=${CONFIG_SHELL-/bin/sh} + + +-exec 7<&0 &1 ++test -n "$DJDIR" || exec 7<&0 &1 + + # Name of the host. +-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, ++# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, + # so uname gets run too. + ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +@@ -833,8 +864,9 @@ do + fi + + case $ac_option in +- *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; +- *) ac_optarg=yes ;; ++ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; ++ *=) ac_optarg= ;; ++ *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. +@@ -879,7 +911,7 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid feature name: $ac_useropt" ++ as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in +@@ -905,7 +937,7 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid feature name: $ac_useropt" ++ as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in +@@ -1109,7 +1141,7 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid package name: $ac_useropt" ++ as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in +@@ -1125,7 +1157,7 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid package name: $ac_useropt" ++ as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in +@@ -1155,8 +1187,8 @@ do + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + +- -*) as_fn_error "unrecognized option: \`$ac_option' +-Try \`$0 --help' for more information." ++ -*) as_fn_error $? "unrecognized option: \`$ac_option' ++Try \`$0 --help' for more information" + ;; + + *=*) +@@ -1164,7 +1196,7 @@ Try \`$0 --help' for more information." + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) +- as_fn_error "invalid variable name: \`$ac_envvar'" ;; ++ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; +@@ -1174,7 +1206,7 @@ Try \`$0 --help' for more information." + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 +- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ++ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +@@ -1182,13 +1214,13 @@ done + + if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` +- as_fn_error "missing argument to $ac_option" ++ as_fn_error $? "missing argument to $ac_option" + fi + + if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; +- fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; ++ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac + fi +@@ -1211,7 +1243,7 @@ do + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac +- as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" ++ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" + done + + # There might be people who depend on the old broken behavior: `$host' +@@ -1225,8 +1257,6 @@ target=$target_alias + if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe +- $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. +- If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +@@ -1241,9 +1271,9 @@ test "$silent" = yes && exec 6>/dev/null + ac_pwd=`pwd` && test -n "$ac_pwd" && + ac_ls_di=`ls -di .` && + ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || +- as_fn_error "working directory cannot be determined" ++ as_fn_error $? "working directory cannot be determined" + test "X$ac_ls_di" = "X$ac_pwd_ls_di" || +- as_fn_error "pwd does not report name of working directory" ++ as_fn_error $? "pwd does not report name of working directory" + + + # Find the source files, if location was not specified. +@@ -1282,11 +1312,11 @@ else + fi + if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." +- as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" ++ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" + fi + ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" + ac_abs_confdir=`( +- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" ++ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` + # When building in place, set srcdir=. + if test "$ac_abs_confdir" = "$ac_pwd"; then +@@ -1326,7 +1356,7 @@ Configuration: + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit +- -q, --quiet, --silent do not print \`checking...' messages ++ -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files +@@ -1420,7 +1450,7 @@ Some influential environment variables: + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l +- CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if ++ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +@@ -1491,9 +1521,9 @@ test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF + configure +-generated by GNU Autoconf 2.64 ++generated by GNU Autoconf 2.69 + +-Copyright (C) 2009 Free Software Foundation, Inc. ++Copyright (C) 2012 Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it. + _ACEOF +@@ -1537,8 +1567,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} +- return $ac_retval ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ as_fn_set_status $ac_retval + + } # ac_fn_c_try_compile + +@@ -1563,7 +1593,7 @@ $as_echo "$ac_try_echo"; } >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } >/dev/null && { ++ test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : +@@ -1574,8 +1604,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} +- return $ac_retval ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ as_fn_set_status $ac_retval + + } # ac_fn_c_try_cpp + +@@ -1587,10 +1617,10 @@ fi + ac_fn_c_check_header_mongrel () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++ if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + fi + eval ac_res=\$$3 +@@ -1626,7 +1656,7 @@ if ac_fn_c_try_cpp "$LINENO"; then : + else + ac_header_preproc=no + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 + $as_echo "$ac_header_preproc" >&6; } + +@@ -1653,7 +1683,7 @@ $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + else + eval "$3=\$ac_header_compiler" +@@ -1662,7 +1692,7 @@ eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_header_mongrel + +@@ -1703,8 +1733,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + ac_retval=$ac_status + fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} +- return $ac_retval ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ as_fn_set_status $ac_retval + + } # ac_fn_c_try_run + +@@ -1717,7 +1747,7 @@ ac_fn_c_check_header_compile () + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -1735,7 +1765,7 @@ fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_header_compile + +@@ -1766,7 +1796,7 @@ $as_echo "$ac_try_echo"; } >&5 + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || +- $as_test_x conftest$ac_exeext ++ test -x conftest$ac_exeext + }; then : + ac_retval=0 + else +@@ -1780,8 +1810,8 @@ fi + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} +- return $ac_retval ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ as_fn_set_status $ac_retval + + } # ac_fn_c_try_link + +@@ -1793,7 +1823,7 @@ ac_fn_c_check_func () + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -1848,7 +1878,7 @@ fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_func + cat >config.log <<_ACEOF +@@ -1856,7 +1886,7 @@ This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + + It was created by $as_me, which was +-generated by GNU Autoconf 2.64. Invocation command line was ++generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +@@ -1966,11 +1996,9 @@ trap 'exit_status=$? + { + echo + +- cat <<\_ASBOX +-## ---------------- ## ++ $as_echo "## ---------------- ## + ## Cache variables. ## +-## ---------------- ## +-_ASBOX ++## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, + ( +@@ -2004,11 +2032,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + ) + echo + +- cat <<\_ASBOX +-## ----------------- ## ++ $as_echo "## ----------------- ## + ## Output variables. ## +-## ----------------- ## +-_ASBOX ++## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do +@@ -2021,11 +2047,9 @@ _ASBOX + echo + + if test -n "$ac_subst_files"; then +- cat <<\_ASBOX +-## ------------------- ## ++ $as_echo "## ------------------- ## + ## File substitutions. ## +-## ------------------- ## +-_ASBOX ++## ------------------- ##" + echo + for ac_var in $ac_subst_files + do +@@ -2039,11 +2063,9 @@ _ASBOX + fi + + if test -s confdefs.h; then +- cat <<\_ASBOX +-## ----------- ## ++ $as_echo "## ----------- ## + ## confdefs.h. ## +-## ----------- ## +-_ASBOX ++## ----------- ##" + echo + cat confdefs.h + echo +@@ -2098,7 +2120,12 @@ _ACEOF + ac_site_file1=NONE + ac_site_file2=NONE + if test -n "$CONFIG_SITE"; then +- ac_site_file1=$CONFIG_SITE ++ # We do not want a PATH search for config.site. ++ case $CONFIG_SITE in #(( ++ -*) ac_site_file1=./$CONFIG_SITE;; ++ */*) ac_site_file1=$CONFIG_SITE;; ++ *) ac_site_file1=./$CONFIG_SITE;; ++ esac + elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +@@ -2109,18 +2136,22 @@ fi + for ac_site_file in "$ac_site_file1" "$ac_site_file2" + do + test "x$ac_site_file" = xNONE && continue +- if test -r "$ac_site_file"; then ++ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 + $as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 +- . "$ac_site_file" ++ . "$ac_site_file" \ ++ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "failed to load site script $ac_site_file ++See \`config.log' for more details" "$LINENO" 5; } + fi + done + + if test -r "$cache_file"; then +- # Some versions of bash will fail to source /dev/null (special +- # files actually), so we avoid doing that. +- if test -f "$cache_file"; then ++ # Some versions of bash will fail to source /dev/null (special files ++ # actually), so we avoid doing that. DJGPP emulates it as a regular file. ++ if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 + $as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in +@@ -2189,7 +2220,7 @@ if $ac_cache_corrupted; then + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 + $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} +- as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 ++ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + fi + ## -------------------- ## + ## Main body of script. ## +@@ -2249,21 +2280,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +-# _AC_CHECK_DECL_BODY +-# ------------------- +-# Shell function body for AC_CHECK_DECL. +-# _AC_CHECK_DECL_BODY +- +-# _AC_CHECK_DECLS(SYMBOL, ACTION-IF_FOUND, ACTION-IF-NOT-FOUND, +-# INCLUDES) +-# ------------------------------------------------------------- +-# Helper to AC_CHECK_DECLS, which generates the check for a single +-# SYMBOL with INCLUDES, performs the AC_DEFINE, then expands +-# ACTION-IF-FOUND or ACTION-IF-NOT-FOUND. +- +- +- +- + + + +@@ -4057,7 +4073,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -4069,7 +4085,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -4097,7 +4113,7 @@ if test -z "$ac_cv_prog_CC"; then + set dummy gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : ++if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then +@@ -4109,7 +4125,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -4150,7 +4166,7 @@ if test -z "$CC"; then + set dummy ${ac_tool_prefix}cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -4162,7 +4178,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -4190,7 +4206,7 @@ if test -z "$CC"; then + set dummy cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -4203,7 +4219,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue +@@ -4249,7 +4265,7 @@ if test -z "$CC"; then + set dummy $ac_tool_prefix$ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -4261,7 +4277,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -4293,7 +4309,7 @@ do + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : ++if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then +@@ -4305,7 +4321,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -4347,8 +4363,8 @@ fi + + test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "no acceptable C compiler found in \$PATH +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "no acceptable C compiler found in \$PATH ++See \`config.log' for more details" "$LINENO" 5; } + + # Provide some information about the compiler. + $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +@@ -4369,8 +4385,8 @@ $as_echo "$ac_try_echo"; } >&5 + ... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 +- rm -f conftest.er1 conftest.err + fi ++ rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + done +@@ -4387,12 +4403,12 @@ main () + } + _ACEOF + ac_clean_files_save=$ac_clean_files +-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" ++ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" + # Try to create an executable without -o first, disregard a.out. + # It will help us diagnose broken compilers, and finding out an intuition + # of exeext. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +-$as_echo_n "checking for C compiler default output file name... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 ++$as_echo_n "checking whether the C compiler works... " >&6; } + ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + + # The possible output files: +@@ -4454,62 +4470,28 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= + else + ac_file='' + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +-$as_echo "$ac_file" >&6; } + if test -z "$ac_file"; then : +- $as_echo "$as_me: failed program was:" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++$as_echo "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-{ as_fn_set_status 77 +-as_fn_error "C compiler cannot create executables +-See \`config.log' for more details." "$LINENO" 5; }; } ++as_fn_error 77 "C compiler cannot create executables ++See \`config.log' for more details" "$LINENO" 5; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } + fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 ++$as_echo_n "checking for C compiler default output file name... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 ++$as_echo "$ac_file" >&6; } + ac_exeext=$ac_cv_exeext + +-# Check that the compiler produces executables we can run. If not, either +-# the compiler is broken, or we cross compile. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +-$as_echo_n "checking whether the C compiler works... " >&6; } +-# If not cross compiling, check that we can run a simple program. +-if test "$cross_compiling" != yes; then +- if { ac_try='./$ac_file' +- { { case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_try") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then +- cross_compiling=no +- else +- if test "$cross_compiling" = maybe; then +- cross_compiling=yes +- else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "cannot run C compiled programs. +-If you meant to cross compile, use \`--host'. +-See \`config.log' for more details." "$LINENO" 5; } +- fi +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- +-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out ++rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out + ac_clean_files=$ac_clean_files_save +-# Check that the compiler produces executables we can run. If not, either +-# the compiler is broken, or we cross compile. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +-$as_echo_n "checking whether we are cross compiling... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +-$as_echo "$cross_compiling" >&6; } +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 + $as_echo_n "checking for suffix of executables... " >&6; } + if { { ac_try="$ac_link" +@@ -4539,19 +4521,78 @@ done + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "cannot compute suffix of executables: cannot compile and link +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details" "$LINENO" 5; } + fi +-rm -f conftest$ac_cv_exeext ++rm -f conftest conftest$ac_cv_exeext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 + $as_echo "$ac_cv_exeext" >&6; } + + rm -f conftest.$ac_ext + EXEEXT=$ac_cv_exeext + ac_exeext=$EXEEXT ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++FILE *f = fopen ("conftest.out", "w"); ++ return ferror (f) || fclose (f) != 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++ac_clean_files="$ac_clean_files conftest.out" ++# Check that the compiler produces executables we can run. If not, either ++# the compiler is broken, or we cross compile. ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 ++$as_echo_n "checking whether we are cross compiling... " >&6; } ++if test "$cross_compiling" != yes; then ++ { { ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" ++$as_echo "$ac_try_echo"; } >&5 ++ (eval "$ac_link") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++ if { ac_try='./conftest$ac_cv_exeext' ++ { { case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" ++$as_echo "$ac_try_echo"; } >&5 ++ (eval "$ac_try") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; }; then ++ cross_compiling=no ++ else ++ if test "$cross_compiling" = maybe; then ++ cross_compiling=yes ++ else ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run C compiled programs. ++If you meant to cross compile, use \`--host'. ++See \`config.log' for more details" "$LINENO" 5; } ++ fi ++ fi ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 ++$as_echo "$cross_compiling" >&6; } ++ ++rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ++ac_clean_files=$ac_clean_files_save + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 + $as_echo_n "checking for suffix of object files... " >&6; } +-if test "${ac_cv_objext+set}" = set; then : ++if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -4591,8 +4632,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "cannot compute suffix of object files: cannot compile +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "cannot compute suffix of object files: cannot compile ++See \`config.log' for more details" "$LINENO" 5; } + fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext + fi +@@ -4602,7 +4643,7 @@ OBJEXT=$ac_cv_objext + ac_objext=$OBJEXT + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 + $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +-if test "${ac_cv_c_compiler_gnu+set}" = set; then : ++if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -4639,7 +4680,7 @@ ac_test_CFLAGS=${CFLAGS+set} + ac_save_CFLAGS=$CFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 + $as_echo_n "checking whether $CC accepts -g... " >&6; } +-if test "${ac_cv_prog_cc_g+set}" = set; then : ++if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_save_c_werror_flag=$ac_c_werror_flag +@@ -4717,7 +4758,7 @@ else + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 + $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if test "${ac_cv_prog_cc_c89+set}" = set; then : ++if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_cv_prog_cc_c89=no +@@ -4726,8 +4767,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + #include +-#include +-#include ++struct stat; + /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ + struct buf { int x; }; + FILE * (*rcsopen) (struct buf *, struct stat *, int); +@@ -4814,16 +4854,22 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_aux_dir= + for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do +- for ac_t in install-sh install.sh shtool; do +- if test -f "$ac_dir/$ac_t"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/$ac_t -c" +- break 2 +- fi +- done ++ if test -f "$ac_dir/install-sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install-sh -c" ++ break ++ elif test -f "$ac_dir/install.sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install.sh -c" ++ break ++ elif test -f "$ac_dir/shtool"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/shtool install -c" ++ break ++ fi + done + if test -z "$ac_aux_dir"; then +- as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 ++ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + fi + + # These three variables are undocumented and unsupported, +@@ -4837,27 +4883,27 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + # Make sure we can run config.sub. + $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || +- as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 ++ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 + $as_echo_n "checking build system type... " >&6; } +-if test "${ac_cv_build+set}" = set; then : ++if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_build_alias=$build_alias + test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` + test "x$ac_build_alias" = x && +- as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 ++ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 + ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || +- as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 ++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 + $as_echo "$ac_cv_build" >&6; } + case $ac_cv_build in + *-*-*) ;; +-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; ++*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; + esac + build=$ac_cv_build + ac_save_IFS=$IFS; IFS='-' +@@ -4875,14 +4921,14 @@ case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 + $as_echo_n "checking host system type... " >&6; } +-if test "${ac_cv_host+set}" = set; then : ++if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build + else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || +- as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 ++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + fi + + fi +@@ -4890,7 +4936,7 @@ fi + $as_echo "$ac_cv_host" >&6; } + case $ac_cv_host in + *-*-*) ;; +-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; ++*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; + esac + host=$ac_cv_host + ac_save_IFS=$IFS; IFS='-' +@@ -4908,14 +4954,14 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 + $as_echo_n "checking target system type... " >&6; } +-if test "${ac_cv_target+set}" = set; then : ++if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host + else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || +- as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 ++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + fi + + fi +@@ -4923,7 +4969,7 @@ fi + $as_echo "$ac_cv_target" >&6; } + case $ac_cv_target in + *-*-*) ;; +-*) as_fn_error "invalid value of canonical target" "$LINENO" 5;; ++*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; + esac + target=$ac_cv_target + ac_save_IFS=$IFS; IFS='-' +@@ -4958,7 +5004,7 @@ if test -n "$CPP" && test -d "$CPP"; then + CPP= + fi + if test -z "$CPP"; then +- if test "${ac_cv_prog_CPP+set}" = set; then : ++ if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 + else + # Double quotes because CPP needs to be expanded +@@ -4988,7 +5034,7 @@ else + # Broken: fails on valid input. + continue + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. +@@ -5004,11 +5050,11 @@ else + ac_preproc_ok=: + break + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.i conftest.err conftest.$ac_ext + if $ac_preproc_ok; then : + break + fi +@@ -5047,7 +5093,7 @@ else + # Broken: fails on valid input. + continue + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. +@@ -5063,18 +5109,18 @@ else + ac_preproc_ok=: + break + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.i conftest.err conftest.$ac_ext + if $ac_preproc_ok; then : + + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "C preprocessor \"$CPP\" fails sanity check +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details" "$LINENO" 5; } + fi + + ac_ext=c +@@ -5086,7 +5132,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 + $as_echo_n "checking for grep that handles long lines and -e... " >&6; } +-if test "${ac_cv_path_GREP+set}" = set; then : ++if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -z "$GREP"; then +@@ -5100,7 +5146,7 @@ do + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" +- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue ++ as_fn_executable_p "$ac_path_GREP" || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP + case `"$ac_path_GREP" --version 2>&1` in +@@ -5135,7 +5181,7 @@ esac + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then +- as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_GREP=$GREP +@@ -5149,7 +5195,7 @@ $as_echo "$ac_cv_path_GREP" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 + $as_echo_n "checking for egrep... " >&6; } +-if test "${ac_cv_path_EGREP+set}" = set; then : ++if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +@@ -5166,7 +5212,7 @@ do + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" +- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue ++ as_fn_executable_p "$ac_path_EGREP" || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP + case `"$ac_path_EGREP" --version 2>&1` in +@@ -5201,7 +5247,7 @@ esac + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then +- as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_EGREP=$EGREP +@@ -5216,7 +5262,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 + $as_echo_n "checking for ANSI C header files... " >&6; } +-if test "${ac_cv_header_stdc+set}" = set; then : ++if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5333,8 +5379,7 @@ do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` + ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default + " +-eval as_val=\$$as_ac_Header +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + _ACEOF +@@ -5346,7 +5391,7 @@ done + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +-if test "x$ac_cv_header_minix_config_h" = x""yes; then : ++if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes + else + MINIX= +@@ -5368,14 +5413,14 @@ $as_echo "#define _MINIX 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 + $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +-if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : ++if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +-# define __EXTENSIONS__ 1 +- $ac_includes_default ++# define __EXTENSIONS__ 1 ++ $ac_includes_default + int + main () + { +@@ -5432,7 +5477,7 @@ program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 + $as_echo_n "checking for a BSD-compatible install... " >&6; } + if test -z "$INSTALL"; then +-if test "${ac_cv_path_install+set}" = set; then : ++if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +@@ -5452,7 +5497,7 @@ case $as_dir/ in #(( + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. +@@ -5615,7 +5660,7 @@ esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 + $as_echo_n "checking for a sed that does not truncate output... " >&6; } +-if test "${ac_cv_path_SED+set}" = set; then : ++if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ +@@ -5635,7 +5680,7 @@ do + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" +- { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue ++ as_fn_executable_p "$ac_path_SED" || continue + # Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED + case `"$ac_path_SED" --version 2>&1` in +@@ -5670,7 +5715,7 @@ esac + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then +- as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 ++ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi + else + ac_cv_path_SED=$SED +@@ -5697,7 +5742,7 @@ Xsed="$SED -e 1s/^X//" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 + $as_echo_n "checking for fgrep... " >&6; } +-if test "${ac_cv_path_FGREP+set}" = set; then : ++if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 +@@ -5714,7 +5759,7 @@ do + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" +- { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue ++ as_fn_executable_p "$ac_path_FGREP" || continue + # Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP + case `"$ac_path_FGREP" --version 2>&1` in +@@ -5749,7 +5794,7 @@ esac + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then +- as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_FGREP=$FGREP +@@ -5828,7 +5873,7 @@ else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 + $as_echo_n "checking for non-GNU ld... " >&6; } + fi +-if test "${lt_cv_path_LD+set}" = set; then : ++if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -z "$LD"; then +@@ -5865,10 +5910,10 @@ else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + fi +-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 ++test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 + $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +-if test "${lt_cv_prog_gnu_ld+set}" = set; then : ++if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 + else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +@@ -5895,7 +5940,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 + $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +-if test "${lt_cv_path_NM+set}" = set; then : ++if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$NM"; then +@@ -5958,7 +6003,7 @@ else + set dummy $ac_tool_prefix$ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_DUMPBIN+set}" = set; then : ++if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$DUMPBIN"; then +@@ -5970,7 +6015,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6002,7 +6047,7 @@ do + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : ++if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_DUMPBIN"; then +@@ -6014,7 +6059,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6074,7 +6119,7 @@ test -z "$NM" && NM=nm + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 + $as_echo_n "checking the name lister ($NM) interface... " >&6; } +-if test "${lt_cv_nm_interface+set}" = set; then : ++if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_nm_interface="BSD nm" +@@ -6109,7 +6154,7 @@ fi + # find the maximum length of command line arguments + { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 + $as_echo_n "checking the maximum length of command line arguments... " >&6; } +-if test "${lt_cv_sys_max_cmd_len+set}" = set; then : ++if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 + else + i=0 +@@ -6306,7 +6351,7 @@ esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 + $as_echo_n "checking for $LD option to reload object files... " >&6; } +-if test "${lt_cv_ld_reload_flag+set}" = set; then : ++if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_ld_reload_flag='-r' +@@ -6342,7 +6387,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}objdump; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_OBJDUMP+set}" = set; then : ++if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$OBJDUMP"; then +@@ -6354,7 +6399,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6382,7 +6427,7 @@ if test -z "$ac_cv_prog_OBJDUMP"; then + set dummy objdump; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : ++if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_OBJDUMP"; then +@@ -6394,7 +6439,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6441,7 +6486,7 @@ test -z "$OBJDUMP" && OBJDUMP=objdump + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 + $as_echo_n "checking how to recognize dependent libraries... " >&6; } +-if test "${lt_cv_deplibs_check_method+set}" = set; then : ++if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_file_magic_cmd='$MAGIC_CMD' +@@ -6662,7 +6707,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}ar; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_AR+set}" = set; then : ++if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$AR"; then +@@ -6674,7 +6719,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6702,7 +6747,7 @@ if test -z "$ac_cv_prog_AR"; then + set dummy ar; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : ++if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_AR"; then +@@ -6714,7 +6759,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6767,7 +6812,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}strip; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_STRIP+set}" = set; then : ++if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$STRIP"; then +@@ -6779,7 +6824,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6807,7 +6852,7 @@ if test -z "$ac_cv_prog_STRIP"; then + set dummy strip; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : ++if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_STRIP"; then +@@ -6819,7 +6864,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6866,7 +6911,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}ranlib; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_RANLIB+set}" = set; then : ++if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$RANLIB"; then +@@ -6878,7 +6923,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -6906,7 +6951,7 @@ if test -z "$ac_cv_prog_RANLIB"; then + set dummy ranlib; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : ++if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_RANLIB"; then +@@ -6918,7 +6963,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7010,7 +7055,7 @@ do + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_AWK+set}" = set; then : ++if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$AWK"; then +@@ -7022,7 +7067,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7077,7 +7122,7 @@ compiler=$CC + # Check for command to grab the raw symbol name followed by C symbol from nm. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 + $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : ++if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 + else + +@@ -7461,7 +7506,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 + $as_echo_n "checking whether the C compiler needs -belf... " >&6; } +-if test "${lt_cv_cc_needs_belf+set}" = set; then : ++if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_ext=c +@@ -7537,7 +7582,7 @@ need_locks="$enable_libtool_lock" + set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : ++if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$DSYMUTIL"; then +@@ -7549,7 +7594,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7577,7 +7622,7 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then + set dummy dsymutil; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : ++if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_DSYMUTIL"; then +@@ -7589,7 +7634,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7629,7 +7674,7 @@ fi + set dummy ${ac_tool_prefix}nmedit; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_NMEDIT+set}" = set; then : ++if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$NMEDIT"; then +@@ -7641,7 +7686,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7669,7 +7714,7 @@ if test -z "$ac_cv_prog_NMEDIT"; then + set dummy nmedit; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : ++if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_NMEDIT"; then +@@ -7681,7 +7726,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7721,7 +7766,7 @@ fi + set dummy ${ac_tool_prefix}lipo; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_LIPO+set}" = set; then : ++if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$LIPO"; then +@@ -7733,7 +7778,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7761,7 +7806,7 @@ if test -z "$ac_cv_prog_LIPO"; then + set dummy lipo; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : ++if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_LIPO"; then +@@ -7773,7 +7818,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7813,7 +7858,7 @@ fi + set dummy ${ac_tool_prefix}otool; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_OTOOL+set}" = set; then : ++if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$OTOOL"; then +@@ -7825,7 +7870,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7853,7 +7898,7 @@ if test -z "$ac_cv_prog_OTOOL"; then + set dummy otool; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : ++if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_OTOOL"; then +@@ -7865,7 +7910,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7905,7 +7950,7 @@ fi + set dummy ${ac_tool_prefix}otool64; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_OTOOL64+set}" = set; then : ++if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$OTOOL64"; then +@@ -7917,7 +7962,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -7945,7 +7990,7 @@ if test -z "$ac_cv_prog_OTOOL64"; then + set dummy otool64; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : ++if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_OTOOL64"; then +@@ -7957,7 +8002,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -8020,7 +8065,7 @@ fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 + $as_echo_n "checking for -single_module linker flag... " >&6; } +-if test "${lt_cv_apple_cc_single_mod+set}" = set; then : ++if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_apple_cc_single_mod=no +@@ -8049,7 +8094,7 @@ fi + $as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 + $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : ++if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_ld_exported_symbols_list=no +@@ -8081,7 +8126,7 @@ fi + $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 + $as_echo_n "checking for -force_load linker flag... " >&6; } +-if test "${lt_cv_ld_force_load+set}" = set; then : ++if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_ld_force_load=no +@@ -8148,7 +8193,7 @@ for ac_header in dlfcn.h + do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default + " +-if test "x$ac_cv_header_dlfcn_h" = x""yes; then : ++if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_DLFCN_H 1 + _ACEOF +@@ -8184,7 +8229,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}ranlib; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_RANLIB+set}" = set; then : ++if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$RANLIB"; then +@@ -8196,7 +8241,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -8224,7 +8269,7 @@ if test -z "$ac_cv_prog_RANLIB"; then + set dummy ranlib; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : ++if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_RANLIB"; then +@@ -8236,7 +8281,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -8292,7 +8337,7 @@ depcc="$CC" am_compiler_list= + am_depcomp=$ac_aux_dir/depcomp + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 + $as_echo_n "checking dependency style of $depcc... " >&6; } +-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : ++if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -f "$am_depcomp"; then +@@ -8378,7 +8423,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 + $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } + if test x${am_cv_CC_dependencies_compiler_type-none} = xnone +-then as_fn_error "no usable dependency style found" "$LINENO" 5 ++then as_fn_error $? "no usable dependency style found" "$LINENO" 5 + else CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + fi +@@ -8391,7 +8436,7 @@ do + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_MAKE+set}" = set; then : ++if ${ac_cv_prog_MAKE+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$MAKE"; then +@@ -8403,7 +8448,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MAKE="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -8521,8 +8566,7 @@ for ac_header in stdlib.h string.h strings.h unistd.h time.h + do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` + ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +-eval as_val=\$$as_ac_Header +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + _ACEOF +@@ -8535,8 +8579,7 @@ for ac_header in sys/time.h sys/resource.h + do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` + ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +-eval as_val=\$$as_ac_Header +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + _ACEOF +@@ -8549,8 +8592,7 @@ for ac_header in fcntl.h fpu_control.h + do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` + ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +-eval as_val=\$$as_ac_Header +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + _ACEOF +@@ -8563,8 +8605,7 @@ for ac_header in dlfcn.h errno.h sys/stat.h + do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` + ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +-eval as_val=\$$as_ac_Header +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + _ACEOF +@@ -8577,8 +8618,7 @@ for ac_func in getrusage time sigaction __setfpucw + do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +-eval as_val=\$$as_ac_var +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 + _ACEOF +@@ -8590,7 +8630,7 @@ done + # Check for socket libraries + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bind in -lsocket" >&5 + $as_echo_n "checking for bind in -lsocket... " >&6; } +-if test "${ac_cv_lib_socket_bind+set}" = set; then : ++if ${ac_cv_lib_socket_bind+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -8624,7 +8664,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_bind" >&5 + $as_echo "$ac_cv_lib_socket_bind" >&6; } +-if test "x$ac_cv_lib_socket_bind" = x""yes; then : ++if test "x$ac_cv_lib_socket_bind" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_LIBSOCKET 1 + _ACEOF +@@ -8635,7 +8675,7 @@ fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 + $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +-if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : ++if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -8669,7 +8709,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 + $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +-if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : ++if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_LIBNSL 1 + _ACEOF +@@ -8695,7 +8735,7 @@ fi + if test "$with_zlib" != "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing zlibVersion" >&5 + $as_echo_n "checking for library containing zlibVersion... " >&6; } +-if test "${ac_cv_search_zlibVersion+set}" = set; then : ++if ${ac_cv_search_zlibVersion+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_func_search_save_LIBS=$LIBS +@@ -8729,11 +8769,11 @@ for ac_lib in '' z; do + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext +- if test "${ac_cv_search_zlibVersion+set}" = set; then : ++ if ${ac_cv_search_zlibVersion+:} false; then : + break + fi + done +-if test "${ac_cv_search_zlibVersion+set}" = set; then : ++if ${ac_cv_search_zlibVersion+:} false; then : + + else + ac_cv_search_zlibVersion=no +@@ -8749,7 +8789,7 @@ if test "$ac_res" != no; then : + for ac_header in zlib.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +-if test "x$ac_cv_header_zlib_h" = x""yes; then : ++if test "x$ac_cv_header_zlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_ZLIB_H 1 + _ACEOF +@@ -8761,7 +8801,7 @@ done + fi + + if test "$with_zlib" = "yes" -a "$ac_cv_header_zlib_h" != "yes"; then +- as_fn_error "zlib (libz) library was explicitly requested but not found" "$LINENO" 5 ++ as_fn_error $? "zlib (libz) library was explicitly requested but not found" "$LINENO" 5 + fi + fi + +@@ -8965,7 +9005,7 @@ fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 + $as_echo_n "checking for objdir... " >&6; } +-if test "${lt_cv_objdir+set}" = set; then : ++if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 + else + rm -f .libs 2>/dev/null +@@ -9043,7 +9083,7 @@ file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 + $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : ++if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $MAGIC_CMD in +@@ -9109,7 +9149,7 @@ if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 + $as_echo_n "checking for file... " >&6; } +-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : ++if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $MAGIC_CMD in +@@ -9251,7 +9291,7 @@ if test "$GCC" = yes; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : ++if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_rtti_exceptions=no +@@ -9604,7 +9644,7 @@ $as_echo "$lt_prog_compiler_pic" >&6; } + if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 + $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : ++if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_pic_works=no +@@ -9663,7 +9703,7 @@ fi + wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 + $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +-if test "${lt_cv_prog_compiler_static_works+set}" = set; then : ++if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_static_works=no +@@ -9706,7 +9746,7 @@ fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 + $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if test "${lt_cv_prog_compiler_c_o+set}" = set; then : ++if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_c_o=no +@@ -9761,7 +9801,7 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 + $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if test "${lt_cv_prog_compiler_c_o+set}" = set; then : ++if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler_c_o=no +@@ -10577,7 +10617,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 + $as_echo_n "checking if $CC understands -b... " >&6; } +-if test "${lt_cv_prog_compiler__b+set}" = set; then : ++if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_prog_compiler__b=no +@@ -10949,7 +10989,7 @@ x|xyes) + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 + $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +-if test "${lt_cv_archive_cmds_need_lc+set}" = set; then : ++if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 + else + $RM conftest* +@@ -11587,7 +11627,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu) + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH +- if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then : ++ if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 + else + lt_cv_shlibpath_overrides_runpath=no +@@ -12007,7 +12047,7 @@ else + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 + $as_echo_n "checking for dlopen in -ldl... " >&6; } +-if test "${ac_cv_lib_dl_dlopen+set}" = set; then : ++if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -12041,7 +12081,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 + $as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : ++if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" + else + +@@ -12055,12 +12095,12 @@ fi + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +-if test "x$ac_cv_func_shl_load" = x""yes; then : ++if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 + $as_echo_n "checking for shl_load in -ldld... " >&6; } +-if test "${ac_cv_lib_dld_shl_load+set}" = set; then : ++if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -12094,16 +12134,16 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 + $as_echo "$ac_cv_lib_dld_shl_load" >&6; } +-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : ++if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" + else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +-if test "x$ac_cv_func_dlopen" = x""yes; then : ++if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 + $as_echo_n "checking for dlopen in -ldl... " >&6; } +-if test "${ac_cv_lib_dl_dlopen+set}" = set; then : ++if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -12137,12 +12177,12 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 + $as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : ++if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 + $as_echo_n "checking for dlopen in -lsvld... " >&6; } +-if test "${ac_cv_lib_svld_dlopen+set}" = set; then : ++if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -12176,12 +12216,12 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 + $as_echo "$ac_cv_lib_svld_dlopen" >&6; } +-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : ++if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 + $as_echo_n "checking for dld_link in -ldld... " >&6; } +-if test "${ac_cv_lib_dld_dld_link+set}" = set; then : ++if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -12215,7 +12255,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 + $as_echo "$ac_cv_lib_dld_dld_link" >&6; } +-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : ++if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" + fi + +@@ -12256,7 +12296,7 @@ fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 + $as_echo_n "checking whether a program can dlopen itself... " >&6; } +-if test "${lt_cv_dlopen_self+set}" = set; then : ++if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "$cross_compiling" = yes; then : +@@ -12265,7 +12305,7 @@ else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 12268 "configure" ++#line 12308 "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H +@@ -12362,7 +12402,7 @@ $as_echo "$lt_cv_dlopen_self" >&6; } + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 + $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +-if test "${lt_cv_dlopen_self_static+set}" = set; then : ++if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "$cross_compiling" = yes; then : +@@ -12371,7 +12411,7 @@ else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 12374 "configure" ++#line 12414 "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H +@@ -12644,7 +12684,7 @@ if test "${enable_sim_bswap+set}" = set; then : + enableval=$enable_sim_bswap; case "${enableval}" in + yes) sim_bswap="-DWITH_BSWAP=1 -DUSE_BSWAP=1";; + no) sim_bswap="-DWITH_BSWAP=0";; +- *) as_fn_error "\"--enable-sim-bswap does not take a value\"" "$LINENO" 5; sim_bswap="";; ++ *) as_fn_error $? "\"--enable-sim-bswap does not take a value\"" "$LINENO" 5; sim_bswap="";; + esac + if test x"$silent" != x"yes" && test x"$sim_bswap" != x""; then + echo "Setting bswap flags = $sim_bswap" 6>&1 +@@ -12659,7 +12699,7 @@ fi + if test "${enable_sim_cflags+set}" = set; then : + enableval=$enable_sim_cflags; case "${enableval}" in + yes) sim_cflags="-O2 -fomit-frame-pointer";; +- trace) as_fn_error "\"Please use --enable-sim-debug instead.\"" "$LINENO" 5; sim_cflags="";; ++ trace) as_fn_error $? "\"Please use --enable-sim-debug instead.\"" "$LINENO" 5; sim_cflags="";; + no) sim_cflags="";; + *) sim_cflags=`echo "${enableval}" | sed -e "s/,/ /g"`;; + esac +@@ -12693,7 +12733,7 @@ if test "${enable_sim_stdio+set}" = set; then : + enableval=$enable_sim_stdio; case "${enableval}" in + yes) sim_stdio="-DWITH_STDIO=DO_USE_STDIO";; + no) sim_stdio="-DWITH_STDIO=DONT_USE_STDIO";; +- *) as_fn_error "\"Unknown value $enableval passed to --enable-sim-stdio\"" "$LINENO" 5; sim_stdio="";; ++ *) as_fn_error $? "\"Unknown value $enableval passed to --enable-sim-stdio\"" "$LINENO" 5; sim_stdio="";; + esac + if test x"$silent" != x"yes" && test x"$sim_stdio" != x""; then + echo "Setting stdio flags = $sim_stdio" 6>&1 +@@ -12762,7 +12802,7 @@ fi + # Check whether --with-pkgversion was given. + if test "${with_pkgversion+set}" = set; then : + withval=$with_pkgversion; case "$withval" in +- yes) as_fn_error "package version not specified" "$LINENO" 5 ;; ++ yes) as_fn_error $? "package version not specified" "$LINENO" 5 ;; + no) PKGVERSION= ;; + *) PKGVERSION="($withval) " ;; + esac +@@ -12778,7 +12818,7 @@ fi + # Check whether --with-bugurl was given. + if test "${with_bugurl+set}" = set; then : + withval=$with_bugurl; case "$withval" in +- yes) as_fn_error "bug URL not specified" "$LINENO" 5 ;; ++ yes) as_fn_error $? "bug URL not specified" "$LINENO" 5 ;; + no) BUGURL= + ;; + *) BUGURL="$withval" +@@ -12815,7 +12855,7 @@ _ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 + $as_echo_n "checking return type of signal handlers... " >&6; } +-if test "${ac_cv_type_signal+set}" = set; then : ++if ${ac_cv_type_signal+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -12872,7 +12912,7 @@ sim_link_links="${sim_link_links} targ-vals.def" + for ac_header in stdlib.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +-if test "x$ac_cv_header_stdlib_h" = x""yes; then : ++if test "x$ac_cv_header_stdlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_STDLIB_H 1 + _ACEOF +@@ -12885,7 +12925,7 @@ done + # In the Cygwin environment, we need some additional flags. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cygwin" >&5 + $as_echo_n "checking for cygwin... " >&6; } +-if test "${sim_cv_os_cygwin+set}" = set; then : ++if ${sim_cv_os_cygwin+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -12913,7 +12953,7 @@ else + # Keep in sync with gdb's configure.ac list. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 + $as_echo_n "checking for library containing tgetent... " >&6; } +-if test "${ac_cv_search_tgetent+set}" = set; then : ++if ${ac_cv_search_tgetent+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_func_search_save_LIBS=$LIBS +@@ -12947,11 +12987,11 @@ for ac_lib in '' termcap tinfo curses ncurses; do + fi + rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext +- if test "${ac_cv_search_tgetent+set}" = set; then : ++ if ${ac_cv_search_tgetent+:} false; then : + break + fi + done +-if test "${ac_cv_search_tgetent+set}" = set; then : ++if ${ac_cv_search_tgetent+:} false; then : + + else + ac_cv_search_tgetent=no +@@ -12979,7 +13019,7 @@ if test -r ../../readline/Makefile; then + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 + $as_echo_n "checking for readline in -lreadline... " >&6; } +-if test "${ac_cv_lib_readline_readline+set}" = set; then : ++if ${ac_cv_lib_readline_readline+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -13013,14 +13053,238 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 + $as_echo "$ac_cv_lib_readline_readline" >&6; } +-if test "x$ac_cv_lib_readline_readline" = x""yes; then : ++if test "x$ac_cv_lib_readline_readline" = xyes; then : + READLINE=-lreadline + else +- as_fn_error "the required \"readline\" library is missing" "$LINENO" 5 ++ as_fn_error $? "the required \"readline\" library is missing" "$LINENO" 5 + fi + + fi + ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 ++$as_echo_n "checking whether byte ordering is bigendian... " >&6; } ++if ${ac_cv_c_bigendian+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_cv_c_bigendian=unknown ++ # See if we're dealing with a universal compiler. ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#ifndef __APPLE_CC__ ++ not a universal capable compiler ++ #endif ++ typedef int dummy; ++ ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ++ # Check for potential -arch flags. It is not universal unless ++ # there are at least two -arch flags with different values. ++ ac_arch= ++ ac_prev= ++ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do ++ if test -n "$ac_prev"; then ++ case $ac_word in ++ i?86 | x86_64 | ppc | ppc64) ++ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ++ ac_arch=$ac_word ++ else ++ ac_cv_c_bigendian=universal ++ break ++ fi ++ ;; ++ esac ++ ac_prev= ++ elif test "x$ac_word" = "x-arch"; then ++ ac_prev=arch ++ fi ++ done ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ if test $ac_cv_c_bigendian = unknown; then ++ # See if sys/param.h defines the BYTE_ORDER macro. ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++ #include ++ ++int ++main () ++{ ++#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ ++ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ ++ && LITTLE_ENDIAN) ++ bogus endian macros ++ #endif ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ # It does; now see whether it defined to BIG_ENDIAN or not. ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++ #include ++ ++int ++main () ++{ ++#if BYTE_ORDER != BIG_ENDIAN ++ not big endian ++ #endif ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_c_bigendian=yes ++else ++ ac_cv_c_bigendian=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ fi ++ if test $ac_cv_c_bigendian = unknown; then ++ # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++ ++int ++main () ++{ ++#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) ++ bogus endian macros ++ #endif ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ # It does; now see whether it defined to _BIG_ENDIAN or not. ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++ ++int ++main () ++{ ++#ifndef _BIG_ENDIAN ++ not big endian ++ #endif ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_c_bigendian=yes ++else ++ ac_cv_c_bigendian=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ fi ++ if test $ac_cv_c_bigendian = unknown; then ++ # Compile a test program. ++ if test "$cross_compiling" = yes; then : ++ # Try to guess by grepping values from an object file. ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++short int ascii_mm[] = ++ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; ++ short int ascii_ii[] = ++ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; ++ int use_ascii (int i) { ++ return ascii_mm[i] + ascii_ii[i]; ++ } ++ short int ebcdic_ii[] = ++ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; ++ short int ebcdic_mm[] = ++ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; ++ int use_ebcdic (int i) { ++ return ebcdic_mm[i] + ebcdic_ii[i]; ++ } ++ extern int foo; ++ ++int ++main () ++{ ++return use_ascii (foo) == use_ebcdic (foo); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ++ ac_cv_c_bigendian=yes ++ fi ++ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then ++ if test "$ac_cv_c_bigendian" = unknown; then ++ ac_cv_c_bigendian=no ++ else ++ # finding both strings is unlikely to happen, but who knows? ++ ac_cv_c_bigendian=unknown ++ fi ++ fi ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$ac_includes_default ++int ++main () ++{ ++ ++ /* Are we little or big endian? From Harbison&Steele. */ ++ union ++ { ++ long int l; ++ char c[sizeof (long int)]; ++ } u; ++ u.l = 1; ++ return u.c[sizeof (long int) - 1] == 1; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ ac_cv_c_bigendian=no ++else ++ ac_cv_c_bigendian=yes ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++ fi ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 ++$as_echo "$ac_cv_c_bigendian" >&6; } ++ case $ac_cv_c_bigendian in #( ++ yes) ++ $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ++;; #( ++ no) ++ ;; #( ++ universal) ++ ++$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ++ ++ ;; #( + *) -+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -+-if test "x$ac_cv_func_shl_load" = x""yes; then : -++if test "x$ac_cv_func_shl_load" = xyes; then : -+ lt_cv_dlopen="shl_load" -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -+ $as_echo_n "checking for shl_load in -ldld... " >&6; } -+-if test "${ac_cv_lib_dld_shl_load+set}" = set; then : -++if ${ac_cv_lib_dld_shl_load+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_check_lib_save_LIBS=$LIBS -+@@ -12094,16 +12134,16 @@ LIBS=$ac_check_lib_save_LIBS -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -+ $as_echo "$ac_cv_lib_dld_shl_load" >&6; } -+-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : -++if test "x$ac_cv_lib_dld_shl_load" = xyes; then : -+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -+ else -+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -+-if test "x$ac_cv_func_dlopen" = x""yes; then : -++if test "x$ac_cv_func_dlopen" = xyes; then : -+ lt_cv_dlopen="dlopen" -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -+ $as_echo_n "checking for dlopen in -ldl... " >&6; } -+-if test "${ac_cv_lib_dl_dlopen+set}" = set; then : -++if ${ac_cv_lib_dl_dlopen+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_check_lib_save_LIBS=$LIBS -+@@ -12137,12 +12177,12 @@ LIBS=$ac_check_lib_save_LIBS -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -+ $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -+-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : -++if test "x$ac_cv_lib_dl_dlopen" = xyes; then : -+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -+ $as_echo_n "checking for dlopen in -lsvld... " >&6; } -+-if test "${ac_cv_lib_svld_dlopen+set}" = set; then : -++if ${ac_cv_lib_svld_dlopen+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_check_lib_save_LIBS=$LIBS -+@@ -12176,12 +12216,12 @@ LIBS=$ac_check_lib_save_LIBS -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -+ $as_echo "$ac_cv_lib_svld_dlopen" >&6; } -+-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : -++if test "x$ac_cv_lib_svld_dlopen" = xyes; then : -+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -+ $as_echo_n "checking for dld_link in -ldld... " >&6; } -+-if test "${ac_cv_lib_dld_dld_link+set}" = set; then : -++if ${ac_cv_lib_dld_dld_link+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_check_lib_save_LIBS=$LIBS -+@@ -12215,7 +12255,7 @@ LIBS=$ac_check_lib_save_LIBS -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -+ $as_echo "$ac_cv_lib_dld_dld_link" >&6; } -+-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : -++if test "x$ac_cv_lib_dld_dld_link" = xyes; then : -+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -+ fi -+ -+@@ -12256,7 +12296,7 @@ fi -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -+ $as_echo_n "checking whether a program can dlopen itself... " >&6; } -+-if test "${lt_cv_dlopen_self+set}" = set; then : -++if ${lt_cv_dlopen_self+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test "$cross_compiling" = yes; then : -+@@ -12265,7 +12305,7 @@ else -+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 -+ lt_status=$lt_dlunknown -+ cat > conftest.$ac_ext <<_LT_EOF -+-#line 12268 "configure" -++#line 12308 "configure" -+ #include "confdefs.h" -+ -+ #if HAVE_DLFCN_H -+@@ -12362,7 +12402,7 @@ $as_echo "$lt_cv_dlopen_self" >&6; } -+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -+ $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -+-if test "${lt_cv_dlopen_self_static+set}" = set; then : -++if ${lt_cv_dlopen_self_static+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ if test "$cross_compiling" = yes; then : -+@@ -12371,7 +12411,7 @@ else -+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 -+ lt_status=$lt_dlunknown -+ cat > conftest.$ac_ext <<_LT_EOF -+-#line 12374 "configure" -++#line 12414 "configure" -+ #include "confdefs.h" -+ -+ #if HAVE_DLFCN_H -+@@ -12644,7 +12684,7 @@ if test "${enable_sim_bswap+set}" = set; then : -+ enableval=$enable_sim_bswap; case "${enableval}" in -+ yes) sim_bswap="-DWITH_BSWAP=1 -DUSE_BSWAP=1";; -+ no) sim_bswap="-DWITH_BSWAP=0";; -+- *) as_fn_error "\"--enable-sim-bswap does not take a value\"" "$LINENO" 5; sim_bswap="";; -++ *) as_fn_error $? "\"--enable-sim-bswap does not take a value\"" "$LINENO" 5; sim_bswap="";; ++ as_fn_error $? "unknown endianness ++ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac -+ if test x"$silent" != x"yes" && test x"$sim_bswap" != x""; then -+ echo "Setting bswap flags = $sim_bswap" 6>&1 -+@@ -12659,7 +12699,7 @@ fi -+ if test "${enable_sim_cflags+set}" = set; then : -+ enableval=$enable_sim_cflags; case "${enableval}" in -+ yes) sim_cflags="-O2 -fomit-frame-pointer";; -+- trace) as_fn_error "\"Please use --enable-sim-debug instead.\"" "$LINENO" 5; sim_cflags="";; -++ trace) as_fn_error $? "\"Please use --enable-sim-debug instead.\"" "$LINENO" 5; sim_cflags="";; -+ no) sim_cflags="";; -+ *) sim_cflags=`echo "${enableval}" | sed -e "s/,/ /g"`;; -+ esac -+@@ -12693,7 +12733,7 @@ if test "${enable_sim_stdio+set}" = set; then : -+ enableval=$enable_sim_stdio; case "${enableval}" in -+ yes) sim_stdio="-DWITH_STDIO=DO_USE_STDIO";; -+ no) sim_stdio="-DWITH_STDIO=DONT_USE_STDIO";; -+- *) as_fn_error "\"Unknown value $enableval passed to --enable-sim-stdio\"" "$LINENO" 5; sim_stdio="";; -++ *) as_fn_error $? "\"Unknown value $enableval passed to --enable-sim-stdio\"" "$LINENO" 5; sim_stdio="";; -+ esac -+ if test x"$silent" != x"yes" && test x"$sim_stdio" != x""; then -+ echo "Setting stdio flags = $sim_stdio" 6>&1 -+@@ -12762,7 +12802,7 @@ fi -+ # Check whether --with-pkgversion was given. -+ if test "${with_pkgversion+set}" = set; then : -+ withval=$with_pkgversion; case "$withval" in -+- yes) as_fn_error "package version not specified" "$LINENO" 5 ;; -++ yes) as_fn_error $? "package version not specified" "$LINENO" 5 ;; -+ no) PKGVERSION= ;; -+ *) PKGVERSION="($withval) " ;; -+ esac -+@@ -12778,7 +12818,7 @@ fi -+ # Check whether --with-bugurl was given. -+ if test "${with_bugurl+set}" = set; then : -+ withval=$with_bugurl; case "$withval" in -+- yes) as_fn_error "bug URL not specified" "$LINENO" 5 ;; -++ yes) as_fn_error $? "bug URL not specified" "$LINENO" 5 ;; -+ no) BUGURL= -+ ;; -+ *) BUGURL="$withval" -+@@ -12815,7 +12855,7 @@ _ACEOF -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 -+ $as_echo_n "checking return type of signal handlers... " >&6; } -+-if test "${ac_cv_type_signal+set}" = set; then : -++if ${ac_cv_type_signal+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+@@ -12872,7 +12912,7 @@ sim_link_links="${sim_link_links} targ-vals.def" -+ for ac_header in stdlib.h -+ do : -+ ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" -+-if test "x$ac_cv_header_stdlib_h" = x""yes; then : -++if test "x$ac_cv_header_stdlib_h" = xyes; then : -+ cat >>confdefs.h <<_ACEOF -+ #define HAVE_STDLIB_H 1 -+ _ACEOF -+@@ -12885,7 +12925,7 @@ done -+ # In the Cygwin environment, we need some additional flags. -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cygwin" >&5 -+ $as_echo_n "checking for cygwin... " >&6; } -+-if test "${sim_cv_os_cygwin+set}" = set; then : -++if ${sim_cv_os_cygwin+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+@@ -12913,7 +12953,7 @@ else -+ # Keep in sync with gdb's configure.ac list. -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 -+ $as_echo_n "checking for library containing tgetent... " >&6; } -+-if test "${ac_cv_search_tgetent+set}" = set; then : -++if ${ac_cv_search_tgetent+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_func_search_save_LIBS=$LIBS -+@@ -12947,11 +12987,11 @@ for ac_lib in '' termcap tinfo curses ncurses; do -+ fi -+ rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext -+- if test "${ac_cv_search_tgetent+set}" = set; then : -++ if ${ac_cv_search_tgetent+:} false; then : -+ break -+ fi -+ done -+-if test "${ac_cv_search_tgetent+set}" = set; then : -++if ${ac_cv_search_tgetent+:} false; then : -+ -+ else -+ ac_cv_search_tgetent=no -+@@ -12979,7 +13019,7 @@ if test -r ../../readline/Makefile; then -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 -+ $as_echo_n "checking for readline in -lreadline... " >&6; } -+-if test "${ac_cv_lib_readline_readline+set}" = set; then : -++if ${ac_cv_lib_readline_readline+:} false; then : -+ $as_echo_n "(cached) " >&6 -+ else -+ ac_check_lib_save_LIBS=$LIBS -+@@ -13013,14 +13053,238 @@ LIBS=$ac_check_lib_save_LIBS -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 -+ $as_echo "$ac_cv_lib_readline_readline" >&6; } -+-if test "x$ac_cv_lib_readline_readline" = x""yes; then : -++if test "x$ac_cv_lib_readline_readline" = xyes; then : -+ READLINE=-lreadline -+ else -+- as_fn_error "the required \"readline\" library is missing" "$LINENO" 5 -++ as_fn_error $? "the required \"readline\" library is missing" "$LINENO" 5 -+ fi -+ -+ fi -+ -++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -++$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -++if ${ac_cv_c_bigendian+:} false; then : -++ $as_echo_n "(cached) " >&6 -++else -++ ac_cv_c_bigendian=unknown -++ # See if we're dealing with a universal compiler. -++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -++/* end confdefs.h. */ -++#ifndef __APPLE_CC__ -++ not a universal capable compiler -++ #endif -++ typedef int dummy; -++ -++_ACEOF -++if ac_fn_c_try_compile "$LINENO"; then : -++ -++ # Check for potential -arch flags. It is not universal unless -++ # there are at least two -arch flags with different values. -++ ac_arch= -++ ac_prev= -++ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do -++ if test -n "$ac_prev"; then -++ case $ac_word in -++ i?86 | x86_64 | ppc | ppc64) -++ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then -++ ac_arch=$ac_word -++ else -++ ac_cv_c_bigendian=universal -++ break -++ fi -++ ;; -++ esac -++ ac_prev= -++ elif test "x$ac_word" = "x-arch"; then -++ ac_prev=arch -++ fi -++ done -++fi -++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -++ if test $ac_cv_c_bigendian = unknown; then -++ # See if sys/param.h defines the BYTE_ORDER macro. -++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -++/* end confdefs.h. */ -++#include -++ #include -++ -++int -++main () -++{ -++#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ -++ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ -++ && LITTLE_ENDIAN) -++ bogus endian macros -++ #endif -++ -++ ; -++ return 0; -++} -++_ACEOF -++if ac_fn_c_try_compile "$LINENO"; then : -++ # It does; now see whether it defined to BIG_ENDIAN or not. -++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -++/* end confdefs.h. */ -++#include -++ #include -++ -++int -++main () -++{ -++#if BYTE_ORDER != BIG_ENDIAN -++ not big endian -++ #endif -++ -++ ; -++ return 0; -++} -++_ACEOF -++if ac_fn_c_try_compile "$LINENO"; then : -++ ac_cv_c_bigendian=yes -++else -++ ac_cv_c_bigendian=no -++fi -++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -++fi -++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -++ fi -++ if test $ac_cv_c_bigendian = unknown; then -++ # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). -++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -++/* end confdefs.h. */ -++#include -++ -++int -++main () -++{ -++#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) -++ bogus endian macros -++ #endif -++ -++ ; -++ return 0; -++} -++_ACEOF -++if ac_fn_c_try_compile "$LINENO"; then : -++ # It does; now see whether it defined to _BIG_ENDIAN or not. -++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -++/* end confdefs.h. */ -++#include -++ -++int -++main () -++{ -++#ifndef _BIG_ENDIAN -++ not big endian -++ #endif -++ -++ ; -++ return 0; -++} -++_ACEOF -++if ac_fn_c_try_compile "$LINENO"; then : -++ ac_cv_c_bigendian=yes -++else -++ ac_cv_c_bigendian=no -++fi -++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -++fi -++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -++ fi -++ if test $ac_cv_c_bigendian = unknown; then -++ # Compile a test program. -++ if test "$cross_compiling" = yes; then : -++ # Try to guess by grepping values from an object file. -++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -++/* end confdefs.h. */ -++short int ascii_mm[] = -++ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -++ short int ascii_ii[] = -++ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; -++ int use_ascii (int i) { -++ return ascii_mm[i] + ascii_ii[i]; -++ } -++ short int ebcdic_ii[] = -++ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -++ short int ebcdic_mm[] = -++ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; -++ int use_ebcdic (int i) { -++ return ebcdic_mm[i] + ebcdic_ii[i]; -++ } -++ extern int foo; -++ -++int -++main () -++{ -++return use_ascii (foo) == use_ebcdic (foo); -++ ; -++ return 0; -++} -++_ACEOF -++if ac_fn_c_try_compile "$LINENO"; then : -++ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then -++ ac_cv_c_bigendian=yes -++ fi -++ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then -++ if test "$ac_cv_c_bigendian" = unknown; then -++ ac_cv_c_bigendian=no -++ else -++ # finding both strings is unlikely to happen, but who knows? -++ ac_cv_c_bigendian=unknown -++ fi -++ fi -++fi -++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -++else -++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -++/* end confdefs.h. */ -++$ac_includes_default -++int -++main () -++{ -++ -++ /* Are we little or big endian? From Harbison&Steele. */ -++ union -++ { -++ long int l; -++ char c[sizeof (long int)]; -++ } u; -++ u.l = 1; -++ return u.c[sizeof (long int) - 1] == 1; -++ -++ ; -++ return 0; -++} -++_ACEOF -++if ac_fn_c_try_run "$LINENO"; then : -++ ac_cv_c_bigendian=no -++else -++ ac_cv_c_bigendian=yes -++fi -++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ -++ conftest.$ac_objext conftest.beam conftest.$ac_ext -++fi -++ -++ fi -++fi -++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -++$as_echo "$ac_cv_c_bigendian" >&6; } -++ case $ac_cv_c_bigendian in #( -++ yes) -++ $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h -++;; #( -++ no) -++ ;; #( -++ universal) -++ -++$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h -++ -++ ;; #( -++ *) -++ as_fn_error $? "unknown endianness -++ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; -++ esac -++ -+ -+ ac_sources="$sim_link_files" -+ ac_dests="$sim_link_links" -+@@ -13110,10 +13374,21 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; -+ :end' >>confcache -+ if diff "$cache_file" confcache >/dev/null 2>&1; then :; else -+ if test -w "$cache_file"; then -+- test "x$cache_file" != "x/dev/null" && -++ if test "x$cache_file" != "x/dev/null"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -+ $as_echo "$as_me: updating cache $cache_file" >&6;} -+- cat confcache >$cache_file -++ if test ! -f "$cache_file" || test -h "$cache_file"; then -++ cat confcache >"$cache_file" -++ else -++ case $cache_file in #( -++ */* | ?:*) -++ mv -f confcache "$cache_file"$$ && -++ mv -f "$cache_file"$$ "$cache_file" ;; #( -++ *) -++ mv -f confcache "$cache_file" ;; -++ esac -++ fi -++ fi -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -+ $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} -+@@ -13129,6 +13404,7 @@ DEFS=-DHAVE_CONFIG_H -+ -+ ac_libobjs= -+ ac_ltlibobjs= -++U= -+ for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue -+ # 1. Remove the extension, and $U if already installed. -+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' -+@@ -13144,19 +13420,20 @@ LTLIBOBJS=$ac_ltlibobjs -+ -+ -+ if test -z "${GMAKE_TRUE}" && test -z "${GMAKE_FALSE}"; then -+- as_fn_error "conditional \"GMAKE\" was never defined. -++ as_fn_error $? "conditional \"GMAKE\" was never defined. -+ Usually this means the macro was only invoked conditionally." "$LINENO" 5 -+ fi -+ if test -z "${PLUGINS_TRUE}" && test -z "${PLUGINS_FALSE}"; then -+- as_fn_error "conditional \"PLUGINS\" was never defined. -++ as_fn_error $? "conditional \"PLUGINS\" was never defined. -+ Usually this means the macro was only invoked conditionally." "$LINENO" 5 -+ fi -+ if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then -+- as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. -++ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. -+ Usually this means the macro was only invoked conditionally." "$LINENO" 5 -+ fi -+ -+-: ${CONFIG_STATUS=./config.status} -++ -++: "${CONFIG_STATUS=./config.status}" -+ ac_write_fail=0 -+ ac_clean_files_save=$ac_clean_files -+ ac_clean_files="$ac_clean_files $CONFIG_STATUS" -+@@ -13257,6 +13534,7 @@ fi -+ IFS=" "" $as_nl" -+ -+ # Find who we are. Look in the path if we contain no directory separator. -++as_myself= -+ case $0 in #(( -+ *[\\/]* ) as_myself=$0 ;; -+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+@@ -13302,19 +13580,19 @@ export LANGUAGE -+ (unset CDPATH) >/dev/null 2>&1 && unset CDPATH -+ -+ -+-# as_fn_error ERROR [LINENO LOG_FD] -+-# --------------------------------- -++# as_fn_error STATUS ERROR [LINENO LOG_FD] -++# ---------------------------------------- -+ # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -+ # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -+-# script with status $?, using 1 if that was 0. -++# script with STATUS, using 1 if that was 0. -+ as_fn_error () -+ { -+- as_status=$?; test $as_status -eq 0 && as_status=1 -+- if test "$3"; then -+- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -+- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 -++ as_status=$1; test $as_status -eq 0 && as_status=1 -++ if test "$4"; then -++ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 -+ fi -+- $as_echo "$as_me: error: $1" >&2 -++ $as_echo "$as_me: error: $2" >&2 -+ as_fn_exit $as_status -+ } # as_fn_error -+ -+@@ -13452,16 +13730,16 @@ if (echo >conf$$.file) 2>/dev/null; then -+ # ... but there are two gotchas: -+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. -+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. -+- # In both cases, we have to default to `cp -p'. -++ # In both cases, we have to default to `cp -pR'. -+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || -+- as_ln_s='cp -p' -++ as_ln_s='cp -pR' -+ elif ln conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s=ln -+ else -+- as_ln_s='cp -p' -++ as_ln_s='cp -pR' -+ fi -+ else -+- as_ln_s='cp -p' -++ as_ln_s='cp -pR' -+ fi -+ rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -+ rmdir conf$$.dir 2>/dev/null -+@@ -13510,7 +13788,7 @@ $as_echo X"$as_dir" | -+ test -d "$as_dir" && break -+ done -+ test -z "$as_dirs" || eval "mkdir $as_dirs" -+- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" -++ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" -+ -+ -+ } # as_fn_mkdir_p -+@@ -13521,28 +13799,16 @@ else -+ as_mkdir_p=false -+ fi -+ -+-if test -x / >/dev/null 2>&1; then -+- as_test_x='test -x' -+-else -+- if ls -dL / >/dev/null 2>&1; then -+- as_ls_L_option=L -+- else -+- as_ls_L_option= -+- fi -+- as_test_x=' -+- eval sh -c '\'' -+- if test -d "$1"; then -+- test -d "$1/."; -+- else -+- case $1 in #( -+- -*)set "./$1";; -+- esac; -+- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( -+- ???[sx]*):;;*)false;;esac;fi -+- '\'' sh -+- ' -+-fi -+-as_executable_p=$as_test_x -++ -++# as_fn_executable_p FILE -++# ----------------------- -++# Test if FILE is an executable regular file. -++as_fn_executable_p () -++{ -++ test -f "$1" && test -x "$1" -++} # as_fn_executable_p -++as_test_x='test -x' -++as_executable_p=as_fn_executable_p -+ -+ # Sed expression to map a string onto a valid CPP name. -+ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" -+@@ -13564,7 +13830,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -+ # values after options handling. -+ ac_log=" -+ This file was extended by $as_me, which was -+-generated by GNU Autoconf 2.64. Invocation command line was -++generated by GNU Autoconf 2.69. Invocation command line was -+ -+ CONFIG_FILES = $CONFIG_FILES -+ CONFIG_HEADERS = $CONFIG_HEADERS -+@@ -13605,6 +13871,7 @@ Usage: $0 [OPTION]... [TAG]... -+ -+ -h, --help print this help, then exit -+ -V, --version print version number and configuration settings, then exit -++ --config print configuration, then exit -+ -q, --quiet, --silent -+ do not print progress messages -+ -d, --debug don't remove temporary files -+@@ -13630,12 +13897,13 @@ Report bugs to the package provider." -+ -+ _ACEOF -+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -++ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -+ ac_cs_version="\\ -+ config.status -+-configured by $0, generated by GNU Autoconf 2.64, -+- with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -++configured by $0, generated by GNU Autoconf 2.69, -++ with options \\"\$ac_cs_config\\" -+ -+-Copyright (C) 2009 Free Software Foundation, Inc. -++Copyright (C) 2012 Free Software Foundation, Inc. -+ This config.status script is free software; the Free Software Foundation -+ gives unlimited permission to copy, distribute and modify it." -+ -+@@ -13652,11 +13920,16 @@ ac_need_defaults=: -+ while test $# != 0 -+ do -+ case $1 in -+- --*=*) -++ --*=?*) -+ ac_option=`expr "X$1" : 'X\([^=]*\)='` -+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` -+ ac_shift=: -+ ;; -++ --*=) -++ ac_option=`expr "X$1" : 'X\([^=]*\)='` -++ ac_optarg= -++ ac_shift=: -++ ;; -+ *) -+ ac_option=$1 -+ ac_optarg=$2 -+@@ -13670,12 +13943,15 @@ do -+ ac_cs_recheck=: ;; -+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) -+ $as_echo "$ac_cs_version"; exit ;; -++ --config | --confi | --conf | --con | --co | --c ) -++ $as_echo "$ac_cs_config"; exit ;; -+ --debug | --debu | --deb | --de | --d | -d ) -+ debug=: ;; -+ --file | --fil | --fi | --f ) -+ $ac_shift -+ case $ac_optarg in -+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; -++ '') as_fn_error $? "missing file argument" ;; -+ esac -+ as_fn_append CONFIG_FILES " '$ac_optarg'" -+ ac_need_defaults=false;; -+@@ -13688,7 +13964,7 @@ do -+ ac_need_defaults=false;; -+ --he | --h) -+ # Conflict between --help and --header -+- as_fn_error "ambiguous option: \`$1' -++ as_fn_error $? "ambiguous option: \`$1' -+ Try \`$0 --help' for more information.";; -+ --help | --hel | -h ) -+ $as_echo "$ac_cs_usage"; exit ;; -+@@ -13697,7 +13973,7 @@ Try \`$0 --help' for more information.";; -+ ac_cs_silent=: ;; -+ -+ # This is an error. -+- -*) as_fn_error "unrecognized option: \`$1' -++ -*) as_fn_error $? "unrecognized option: \`$1' -+ Try \`$0 --help' for more information." ;; -+ -+ *) as_fn_append ac_config_targets " $1" -+@@ -13717,7 +13993,7 @@ fi -+ _ACEOF -+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -+ if \$ac_cs_recheck; then -+- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -++ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -+ shift -+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 -+ CONFIG_SHELL='$SHELL' -+@@ -14021,7 +14297,7 @@ do -+ "Makefile") CONFIG_COMMANDS="$CONFIG_COMMANDS Makefile" ;; -+ "stamp-h") CONFIG_COMMANDS="$CONFIG_COMMANDS stamp-h" ;; -+ -+- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; -++ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; -+ esac -+ done -+ -+@@ -14045,9 +14321,10 @@ fi -+ # after its creation but before its name has been assigned to `$tmp'. -+ $debug || -+ { -+- tmp= -++ tmp= ac_tmp= -+ trap 'exit_status=$? -+- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -++ : "${ac_tmp:=$tmp}" -++ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -+ ' 0 -+ trap 'as_fn_exit 1' 1 2 13 15 -+ } -+@@ -14055,12 +14332,13 @@ $debug || -+ -+ { -+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && -+- test -n "$tmp" && test -d "$tmp" -++ test -d "$tmp" -+ } || -+ { -+ tmp=./conf$$-$RANDOM -+ (umask 077 && mkdir "$tmp") -+-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 -++} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -++ac_tmp=$tmp -+ -+ # Set up the scripts for CONFIG_FILES section. -+ # No need to generate them if there are no CONFIG_FILES. -+@@ -14077,12 +14355,12 @@ if test "x$ac_cr" = x; then -+ fi -+ ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -+ if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then -+- ac_cs_awk_cr='\r' -++ ac_cs_awk_cr='\\r' -+ else -+ ac_cs_awk_cr=$ac_cr -+ fi -+ -+-echo 'BEGIN {' >"$tmp/subs1.awk" && -++echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -+ _ACEOF -+ -+ -+@@ -14091,18 +14369,18 @@ _ACEOF -+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && -+ echo "_ACEOF" -+ } >conf$$subs.sh || -+- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -+-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` -++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -++ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -+ ac_delim='%!_!# ' -+ for ac_last_try in false false false false false :; do -+ . ./conf$$subs.sh || -+- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -+ -+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` -+ if test $ac_delim_n = $ac_delim_num; then -+ break -+ elif $ac_last_try; then -+- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -+ else -+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! " -+ fi -+@@ -14110,7 +14388,7 @@ done -+ rm -f conf$$subs.sh -+ -+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -+-cat >>"\$tmp/subs1.awk" <<\\_ACAWK && -++cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -+ _ACEOF -+ sed -n ' -+ h -+@@ -14124,7 +14402,7 @@ s/'"$ac_delim"'$// -+ t delim -+ :nl -+ h -+-s/\(.\{148\}\).*/\1/ -++s/\(.\{148\}\)..*/\1/ -+ t more1 -+ s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -+ p -+@@ -14138,7 +14416,7 @@ s/.\{148\}// -+ t nl -+ :delim -+ h -+-s/\(.\{148\}\).*/\1/ -++s/\(.\{148\}\)..*/\1/ -+ t more2 -+ s/["\\]/\\&/g; s/^/"/; s/$/"/ -+ p -+@@ -14158,7 +14436,7 @@ t delim -+ rm -f conf$$subs.awk -+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -+ _ACAWK -+-cat >>"\$tmp/subs1.awk" <<_ACAWK && -++cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && -+ for (key in S) S_is_set[key] = 1 -+ FS = "" -+ -+@@ -14190,21 +14468,29 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then -+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -+ else -+ cat -+-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ -+- || as_fn_error "could not setup config files machinery" "$LINENO" 5 -++fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ -++ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -+ _ACEOF -+ -+-# VPATH may cause trouble with some makes, so we remove $(srcdir), -+-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -++# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -++# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -+ # trailing colons and then remove the whole line if VPATH becomes empty -+ # (actually we leave an empty line to preserve line numbers). -+ if test "x$srcdir" = x.; then -+- ac_vpsub='/^[ ]*VPATH[ ]*=/{ -+-s/:*\$(srcdir):*/:/ -+-s/:*\${srcdir}:*/:/ -+-s/:*@srcdir@:*/:/ -+-s/^\([^=]*=[ ]*\):*/\1/ -++ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -++h -++s/// -++s/^/:/ -++s/[ ]*$/:/ -++s/:\$(srcdir):/:/g -++s/:\${srcdir}:/:/g -++s/:@srcdir@:/:/g -++s/^:*// -+ s/:*$// -++x -++s/\(=[ ]*\).*/\1/ -++G -++s/\n// -+ s/^[^=]*=[ ]*$// -+ }' -+ fi -+@@ -14216,7 +14502,7 @@ fi # test -n "$CONFIG_FILES" -+ # No need to generate them if there are no CONFIG_HEADERS. -+ # This happens for instance with `./config.status Makefile'. -+ if test -n "$CONFIG_HEADERS"; then -+-cat >"$tmp/defines.awk" <<\_ACAWK || -++cat >"$ac_tmp/defines.awk" <<\_ACAWK || -+ BEGIN { -+ _ACEOF -+ -+@@ -14228,11 +14514,11 @@ _ACEOF -+ # handling of long lines. -+ ac_delim='%!_!# ' -+ for ac_last_try in false false :; do -+- ac_t=`sed -n "/$ac_delim/p" confdefs.h` -+- if test -z "$ac_t"; then -++ ac_tt=`sed -n "/$ac_delim/p" confdefs.h` -++ if test -z "$ac_tt"; then -+ break -+ elif $ac_last_try; then -+- as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 -++ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 -+ else -+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! " -+ fi -+@@ -14317,7 +14603,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -+ _ACAWK -+ _ACEOF -+ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -+- as_fn_error "could not setup config headers machinery" "$LINENO" 5 -++ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -+ fi # test -n "$CONFIG_HEADERS" -+ -+ -+@@ -14330,7 +14616,7 @@ do -+ esac -+ case $ac_mode$ac_tag in -+ :[FHL]*:*);; -+- :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; -++ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; -+ :[FH]-) ac_tag=-:-;; -+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; -+ esac -+@@ -14349,7 +14635,7 @@ do -+ for ac_f -+ do -+ case $ac_f in -+- -) ac_f="$tmp/stdin";; -++ -) ac_f="$ac_tmp/stdin";; -+ *) # Look for the file first in the build tree, then in the source tree -+ # (if the path is not absolute). The absolute path cannot be DOS-style, -+ # because $ac_f cannot contain `:'. -+@@ -14358,7 +14644,7 @@ do -+ [\\/$]*) false;; -+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; -+ esac || -+- as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; -++ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; -+ esac -+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac -+ as_fn_append ac_file_inputs " '$ac_f'" -+@@ -14384,8 +14670,8 @@ $as_echo "$as_me: creating $ac_file" >&6;} -+ esac -+ -+ case $ac_tag in -+- *:-:* | *:-) cat >"$tmp/stdin" \ -+- || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; -++ *:-:* | *:-) cat >"$ac_tmp/stdin" \ -++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; -+ esac -+ ;; -+ esac -+@@ -14515,23 +14801,24 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -+ s&@INSTALL@&$ac_INSTALL&;t t -+ $ac_datarootdir_hack -+ " -+-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ -+- || as_fn_error "could not create $ac_file" "$LINENO" 5 -++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ -++ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 -+ -+ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && -+- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && -+- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && -++ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && -++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ -++ "$ac_tmp/out"`; test -z "$ac_out"; } && -+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -+-which seems to be undefined. Please make sure it is defined." >&5 -++which seems to be undefined. Please make sure it is defined" >&5 -+ $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -+-which seems to be undefined. Please make sure it is defined." >&2;} -++which seems to be undefined. Please make sure it is defined" >&2;} -+ -+- rm -f "$tmp/stdin" -++ rm -f "$ac_tmp/stdin" -+ case $ac_file in -+- -) cat "$tmp/out" && rm -f "$tmp/out";; -+- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; -++ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; -++ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; -+ esac \ -+- || as_fn_error "could not create $ac_file" "$LINENO" 5 -++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 -+ ;; -+ :H) -+ # -+@@ -14540,21 +14827,21 @@ which seems to be undefined. Please make sure it is defined." >&2;} -+ if test x"$ac_file" != x-; then -+ { -+ $as_echo "/* $configure_input */" \ -+- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" -+- } >"$tmp/config.h" \ -+- || as_fn_error "could not create $ac_file" "$LINENO" 5 -+- if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then -++ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" -++ } >"$ac_tmp/config.h" \ -++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 -++ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -+ $as_echo "$as_me: $ac_file is unchanged" >&6;} -+ else -+ rm -f "$ac_file" -+- mv "$tmp/config.h" "$ac_file" \ -+- || as_fn_error "could not create $ac_file" "$LINENO" 5 -++ mv "$ac_tmp/config.h" "$ac_file" \ -++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 -+ fi -+ else -+ $as_echo "/* $configure_input */" \ -+- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ -+- || as_fn_error "could not create -" "$LINENO" 5 -++ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ -++ || as_fn_error $? "could not create -" "$LINENO" 5 -+ fi -+ ;; -+ :L) -+@@ -14574,19 +14861,19 @@ $as_echo "$as_me: $ac_file is unchanged" >&6;} -+ $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} -+ -+ if test ! -r "$ac_source"; then -+- as_fn_error "$ac_source: file not found" "$LINENO" 5 -++ as_fn_error $? "$ac_source: file not found" "$LINENO" 5 -+ fi -+ rm -f "$ac_file" -+ -+ # Try a relative symlink, then a hard link, then a copy. -+- case $srcdir in -++ case $ac_source in -+ [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; -+ *) ac_rel_source=$ac_top_build_prefix$ac_source ;; -+ esac -+ ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || -+ ln "$ac_source" "$ac_file" 2>/dev/null || -+ cp -p "$ac_source" "$ac_file" || -+- as_fn_error "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 -++ as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 -+ fi -+ ;; -+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -+@@ -15256,7 +15543,7 @@ _ACEOF -+ ac_clean_files=$ac_clean_files_save -+ -+ test $ac_write_fail = 0 || -+- as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 -++ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 -+ -+ -+ # configure is writing to config.log, and then calls config.status. -+@@ -15277,7 +15564,7 @@ if test "$no_create" != yes; then -+ exec 5>>config.log -+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which -+ # would make configure fail if this is the last instruction. -+- $ac_cs_success || as_fn_exit $? -++ $ac_cs_success || as_fn_exit 1 -+ fi -+ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -+diff --git a/sim/erc32/configure.ac b/sim/erc32/configure.ac -+index bc46091..1646cc5 100644 -+--- a/sim/erc32/configure.ac -++++ b/sim/erc32/configure.ac -+@@ -32,4 +32,5 @@ else -+ AC_ERROR([the required "readline" library is missing]), $TERMCAP) -+ fi -+ AC_SUBST(READLINE) -++AC_C_BIGENDIAN -+ SIM_AC_OUTPUT -+diff --git a/sim/erc32/end.c b/sim/erc32/end.c -+deleted file mode 100644 -+index 9337198..0000000 -+--- a/sim/erc32/end.c -++++ /dev/null -+@@ -1,27 +0,0 @@ -+-#include "config.h" -+-#include -+- -+-int -+-main() -+-{ -+- -+- unsigned int u1; -+- char *c; -+- double d1; -+- float *f1; -+- -+- c = (char *) &u1; -+- u1 = 0x0F; -+- if (c[0] == 0x0F) -+- puts("#define HOST_LITTLE_ENDIAN\n"); -+- else -+- puts("#define HOST_BIG_ENDIAN\n"); -+- -+- d1 = 1.0; -+- f1 = (float *) &d1; -+- if (*((int *) f1) != 0x3ff00000) -+- puts("#define HOST_LITTLE_ENDIAN_FLOAT\n"); -+- else -+- puts("#define HOST_BIG_ENDIAN_FLOAT\n"); -+- return 0; -+-} -+diff --git a/sim/erc32/erc32.c b/sim/erc32/erc32.c -+index 4d4177e..0846bab 100644 -+--- a/sim/erc32/erc32.c -++++ b/sim/erc32/erc32.c -+@@ -22,6 +22,7 @@ -+ /* The control space devices */ -+ -+ #include "config.h" -++#include -+ #include -+ #include -+ #include -+@@ -30,16 +31,9 @@ -+ #include -+ #include -+ #include "sis.h" -+-#include "end.h" -+ #include "sim-config.h" -+ -+-extern int ctrl_c; -+-extern int32 sis_verbose; -+-extern int32 sparclite, sparclite_board; -+-extern int rom8,wrp,uben; -+-extern char uart_dev1[], uart_dev2[]; -+- -+-int dumbio = 0; /* normal, smart, terminal oriented IO by default */ -++static int tty_setup = 1; /* default setup if not a tty */ -+ -+ /* MEC registers */ -+ #define MEC_START 0x01f80000 -+@@ -55,11 +49,6 @@ int dumbio = 0; /* normal, smart, terminal oriented IO by default */ -+ extern int errmec; -+ #endif -+ -+-/* The target's byte order is big-endian by default until we load a -+- little-endian program. */ -+- -+-int current_target_byte_order = BIG_ENDIAN; -+- -+ #define MEC_WS 0 /* Waitstates per MEC access (0 ws) */ -+ #define MOK 0 -+ -+@@ -297,26 +286,24 @@ static void gpt_reload_set (uint32 val); -+ static void timer_ctrl (uint32 val); -+ static unsigned char * -+ get_mem_ptr (uint32 addr, uint32 size); -++static void store_bytes (unsigned char *mem, uint32 waddr, -++ uint32 *data, int sz, int32 *ws); -+ -+-static void fetch_bytes (int asi, unsigned char *mem, -+- uint32 *data, int sz); -+- -+-static void store_bytes (unsigned char *mem, uint32 *data, int sz); -+- -+-extern int ext_irl; -++static host_callback *callback; -+ -+ -+ /* One-time init */ -+ -+-void -++static void -+ init_sim() -+ { -++ callback = sim_callback; -+ port_init(); -+ } -+ -+ /* Power-on reset init */ -+ -+-void -++static void -+ reset() -+ { -+ mec_reset(); -+@@ -396,7 +383,7 @@ mecparerror() -+ -+ /* IU error mode manager */ -+ -+-void -++static void -+ error_mode(pc) -+ uint32 pc; -+ { -+@@ -467,7 +454,7 @@ decode_mcr() -+ -+ /* Flush ports when simulator stops */ -+ -+-void -++static void -+ sim_halt() -+ { -+ #ifdef FAST_UART -+@@ -475,13 +462,6 @@ sim_halt() -+ #endif -+ } -+ -+-int -+-sim_stop(SIM_DESC sd) -+-{ -+- ctrl_c = 1; -+- return 1; -+-} -+- -+ static void -+ close_port() -+ { -+@@ -491,7 +471,7 @@ close_port() -+ fclose(f2in); -+ } -+ -+-void -++static void -+ exit_sim() -+ { -+ close_port(); -+@@ -743,6 +723,14 @@ mec_read(addr, asi, data) -+ *data = read_uart(addr); -+ break; -+ -++ case 0xF4: /* simulator RAM size in bytes */ -++ *data = 4096*1024; -++ break; -++ -++ case 0xF8: /* simulator ROM size in bytes */ -++ *data = 1024*1024; -++ break; -++ -+ default: -+ set_sfsr(MEC_ACC, addr, asi, 1); -+ return (1); -+@@ -935,32 +923,38 @@ mec_write(addr, data) -+ -+ static int ifd1 = -1, ifd2 = -1, ofd1 = -1, ofd2 = -1; -+ -+-void -++static void -+ init_stdio() -+ { -+ if (dumbio) -+ return; /* do nothing */ -+- if (!ifd1) -++ if (ifd1 == 0 && f1open) { -+ tcsetattr(0, TCSANOW, &ioc1); -+- if (!ifd2) -++ tcflush(ifd1, TCIFLUSH); -++ } -++ if (ifd2 == 0 && f1open) { -+ tcsetattr(0, TCSANOW, &ioc2); -++ tcflush(ifd2, TCIFLUSH); -++ } -+ } -+ -+-void -++static void -+ restore_stdio() -+ { -+ if (dumbio) -+ return; /* do nothing */ -+- if (!ifd1) -++ if (ifd1 == 0 && f1open && tty_setup) -+ tcsetattr(0, TCSANOW, &iocold1); -+- if (!ifd2) -++ if (ifd2 == 0 && f2open && tty_setup) -+ tcsetattr(0, TCSANOW, &iocold2); -+ } -+ -+ #define DO_STDIO_READ( _fd_, _buf_, _len_ ) \ -+- ( dumbio \ -++ ( dumbio || nouartrx \ -+ ? (0) /* no bytes read, no delay */ \ -+- : read( _fd_, _buf_, _len_ ) ) -++ : (_fd_) == 1 && callback ? \ -++ callback->read_stdin (callback, _buf_, _len_) : \ -++ read( _fd_, _buf_, _len_ ) ) -+ -+ -+ static void -+@@ -990,21 +984,26 @@ port_init() -+ } -+ if (f1in) ifd1 = fileno(f1in); -+ if (ifd1 == 0) { -++ if (callback && !callback->isatty(callback, ifd1)) { -++ tty_setup = 0; -++ } -+ if (sis_verbose) -+ printf("serial port A on stdin/stdout\n"); -+ if (!dumbio) { -+ tcgetattr(ifd1, &ioc1); -++ if (tty_setup) { -+ iocold1 = ioc1; -+ ioc1.c_lflag &= ~(ICANON | ECHO); -+ ioc1.c_cc[VMIN] = 0; -+ ioc1.c_cc[VTIME] = 0; -+ } -++ } -+ f1open = 1; -+ } -+ -+ if (f1out) { -+ ofd1 = fileno(f1out); -+- if (!dumbio && ofd1 == 1) setbuf(f1out, NULL); -++ if (!dumbio && tty_setup && ofd1 == 1) setbuf(f1out, NULL); -+ } -+ -+ if (uart_dev2[0] != 0) -+@@ -1023,17 +1022,19 @@ port_init() -+ printf("serial port B on stdin/stdout\n"); -+ if (!dumbio) { -+ tcgetattr(ifd2, &ioc2); -++ if (tty_setup) { -+ iocold2 = ioc2; -+ ioc2.c_lflag &= ~(ICANON | ECHO); -+ ioc2.c_cc[VMIN] = 0; -+ ioc2.c_cc[VTIME] = 0; -+ } -++ } -+ f2open = 1; -+ } -+ -+ if (f2out) { -+ ofd2 = fileno(f2out); -+- if (!dumbio && ofd2 == 1) setbuf(f2out, NULL); -++ if (!dumbio && tty_setup && ofd2 == 1) setbuf(f2out, NULL); -+ } -+ -+ wnuma = wnumb = 0; -+@@ -1062,6 +1063,9 @@ read_uart(addr) -+ if (f1open) { -+ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); -+ } -++ else { -++ anum = 0; -++ } -+ if (anum > 0) { -+ aind = 0; -+ if ((aind + 1) < anum) -+@@ -1094,6 +1098,9 @@ read_uart(addr) -+ if (f2open) { -+ bnum = DO_STDIO_READ(ifd2, bq, UARTBUF); -+ } -++ else { -++ bnum = 0; -++ } -+ if (bnum > 0) { -+ bind = 0; -+ if ((bind + 1) < bnum) -+@@ -1126,6 +1133,9 @@ read_uart(addr) -+ if (f1open) { -+ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); -+ } -++ else { -++ anum = 0; -++ } -+ if (anum > 0) { -+ Ucontrol |= 0x00000001; -+ aind = 0; -+@@ -1138,6 +1148,9 @@ read_uart(addr) -+ if (f2open) { -+ bnum = DO_STDIO_READ(ifd2, bq, UARTBUF); -+ } -++ else { -++ bnum = 0; -++ } -+ if (bnum > 0) { -+ Ucontrol |= 0x00010000; -+ bind = 0; -+@@ -1178,8 +1191,12 @@ write_uart(addr, data) -+ if (wnuma < UARTBUF) -+ wbufa[wnuma++] = c; -+ else { -+- while (wnuma) -++ while (wnuma) { -++ if (ofd1 == 1 && callback) -++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); -++ else -+ wnuma -= fwrite(wbufa, 1, wnuma, f1out); -++ } -+ wbufa[wnuma++] = c; -+ } -+ } -+@@ -1202,8 +1219,12 @@ write_uart(addr, data) -+ if (wnumb < UARTBUF) -+ wbufb[wnumb++] = c; -+ else { -+- while (wnumb) -++ while (wnumb) { -++ if (ofd1 == 1 && callback) -++ wnumb -= callback->write_stdout(callback, wbufb, wnumb); -++ else -+ wnumb -= fwrite(wbufb, 1, wnumb, f2out); -++ } -+ wbufb[wnumb++] = c; -+ } -+ } -+@@ -1241,19 +1262,37 @@ write_uart(addr, data) -+ static void -+ flush_uart() -+ { -+- while (wnuma && f1open) -++ while (wnuma && f1open) { -++ if (ofd1 == 1 && callback) { -++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); -++ callback->flush_stdout(callback); -++ } -++ else -+ wnuma -= fwrite(wbufa, 1, wnuma, f1out); -+- while (wnumb && f2open) -++ } -++ while (wnumb && f2open) { -++ if (ofd2 == 1 && callback) { -++ wnuma -= callback->write_stdout(callback, wbufb, wnuma); -++ callback->flush_stdout(callback); -++ } -++ else -+ wnumb -= fwrite(wbufb, 1, wnumb, f2out); -+ } -++} -+ -+ -+ -+ static void -+ uarta_tx() -+ { -+- -+- while (f1open && fwrite(&uarta_sreg, 1, 1, f1out) != 1); -++ while (f1open) { -++ if (ofd1 == 1 && callback) { -++ while (callback->write_stdout(callback, &uarta_sreg, 1) != 1); -++ } -++ else { -++ while (fwrite(&uarta_sreg, 1, 1, f1out) != 1); -++ } -++ } -+ if (uart_stat_reg & UARTA_HRE) { -+ uart_stat_reg |= UARTA_SRE; -+ } else { -+@@ -1267,7 +1306,14 @@ uarta_tx() -+ static void -+ uartb_tx() -+ { -+- while (f2open && fwrite(&uartb_sreg, 1, 1, f2out) != 1); -++ while (f2open) { -++ if (ofd2 == 1 && callback) { -++ while (callback->write_stdout(callback, &uarta_sreg, 1) != 1); -++ } -++ else { -++ while (fwrite(&uartb_sreg, 1, 1, f2out) != 1); -++ } -++ } -+ if (uart_stat_reg & UARTB_HRE) { -+ uart_stat_reg |= UARTB_SRE; -+ } else { -+@@ -1289,6 +1335,8 @@ uart_rx(arg) -+ rsize = 0; -+ if (f1open) -+ rsize = DO_STDIO_READ(ifd1, &rxd, 1); -++ else -++ rsize = 0; -+ if (rsize > 0) { -+ uarta_data = UART_DR | rxd; -+ if (uart_stat_reg & UARTA_HRE) -+@@ -1305,6 +1353,8 @@ uart_rx(arg) -+ rsize = 0; -+ if (f2open) -+ rsize = DO_STDIO_READ(ifd2, &rxd, 1); -++ else -++ rsize = 0; -+ if (rsize) { -+ uartb_data = UART_DR | rxd; -+ if (uart_stat_reg & UARTB_HRE) -+@@ -1517,143 +1567,89 @@ timer_ctrl(val) -+ gpt_start(); -+ } -+ -+- -+-/* Retrieve data from target memory. MEM points to location from which -+- to read the data; DATA points to words where retrieved data will be -+- stored in host byte order. SZ contains log(2) of the number of bytes -+- to retrieve, and can be 0 (1 byte), 1 (one half-word), 2 (one word), -+- or 3 (two words). */ -++/* Store data in host byte order. MEM points to the beginning of the -++ emulated memory; WADDR contains the index the emulated memory, -++ DATA points to words in host byte order to be stored. SZ contains log(2) -++ of the number of bytes to retrieve, and can be 0 (1 byte), 1 (one half-word), -++ 2 (one word), or 3 (two words); WS should return the number of wait-states. */ -+ -+ static void -+-fetch_bytes (asi, mem, data, sz) -+- int asi; -++store_bytes (mem, waddr, data, sz, ws) -+ unsigned char *mem; -++ uint32 waddr; -+ uint32 *data; -+- int sz; -++ int32 sz; -++ int32 *ws; -+ { -+- if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN -+- || asi == 8 || asi == 9) { -+- switch (sz) { -+- case 3: -+- data[1] = (((uint32) mem[7]) & 0xff) | -+- ((((uint32) mem[6]) & 0xff) << 8) | -+- ((((uint32) mem[5]) & 0xff) << 16) | -+- ((((uint32) mem[4]) & 0xff) << 24); -+- /* Fall through to 2 */ -+- case 2: -+- data[0] = (((uint32) mem[3]) & 0xff) | -+- ((((uint32) mem[2]) & 0xff) << 8) | -+- ((((uint32) mem[1]) & 0xff) << 16) | -+- ((((uint32) mem[0]) & 0xff) << 24); -++ switch (sz) { -++ case 0: -++#ifdef HOST_LITTLE_ENDIAN -++ waddr ^= 3; -++#endif -++ mem[waddr] = *data & 0x0ff; -++ *ws = mem_ramw_ws + 3; -+ break; -+ case 1: -+- data[0] = (((uint32) mem[1]) & 0xff) | -+- ((((uint32) mem[0]) & 0xff) << 8); -+- break; -+- case 0: -+- data[0] = mem[0] & 0xff; -++#ifdef HOST_LITTLE_ENDIAN -++ waddr ^= 2; -++#endif -++ *((unsigned short *) &(mem[waddr])) = *data & 0x0ffff; -++ *ws = mem_ramw_ws + 3; -+ break; -+- -+- } -+- } else { -+- switch (sz) { -+- case 3: -+- data[1] = ((((uint32) mem[7]) & 0xff) << 24) | -+- ((((uint32) mem[6]) & 0xff) << 16) | -+- ((((uint32) mem[5]) & 0xff) << 8) | -+- (((uint32) mem[4]) & 0xff); -+- /* Fall through to 4 */ -+ case 2: -+- data[0] = ((((uint32) mem[3]) & 0xff) << 24) | -+- ((((uint32) mem[2]) & 0xff) << 16) | -+- ((((uint32) mem[1]) & 0xff) << 8) | -+- (((uint32) mem[0]) & 0xff); -+- break; -+- case 1: -+- data[0] = ((((uint32) mem[1]) & 0xff) << 8) | -+- (((uint32) mem[0]) & 0xff); -++ *((uint32 *) &(mem[waddr])) = *data; -++ *ws = mem_ramw_ws; -+ break; -+- case 0: -+- data[0] = mem[0] & 0xff; -++ case 3: -++ *((uint32 *) &(mem[waddr])) = data[0]; -++ *((uint32 *) &(mem[waddr + 4])) = data[1]; -++ *ws = 2 * mem_ramw_ws + STD_WS; -+ break; -+- } -+ } -+ } -+ -+ -+-/* Store data in target byte order. MEM points to location to store data; -+- DATA points to words in host byte order to be stored. SZ contains log(2) -+- of the number of bytes to retrieve, and can be 0 (1 byte), 1 (one half-word), -+- 2 (one word), or 3 (two words). */ -++/* Memory emulation */ -+ -+-static void -+-store_bytes (mem, data, sz) -+- unsigned char *mem; -+- uint32 *data; -+- int sz; -++static int -++memory_iread(addr, data, ws) -++ uint32 addr; -++ uint32 *data; -++ int32 *ws; -+ { -+- if (CURRENT_TARGET_BYTE_ORDER == LITTLE_ENDIAN) { -+- switch (sz) { -+- case 3: -+- mem[7] = (data[1] >> 24) & 0xff; -+- mem[6] = (data[1] >> 16) & 0xff; -+- mem[5] = (data[1] >> 8) & 0xff; -+- mem[4] = data[1] & 0xff; -+- /* Fall through to 2 */ -+- case 2: -+- mem[3] = (data[0] >> 24) & 0xff; -+- mem[2] = (data[0] >> 16) & 0xff; -+- /* Fall through to 1 */ -+- case 1: -+- mem[1] = (data[0] >> 8) & 0xff; -+- /* Fall through to 0 */ -+- case 0: -+- mem[0] = data[0] & 0xff; -+- break; -+- } -+- } else { -+- switch (sz) { -+- case 3: -+- mem[7] = data[1] & 0xff; -+- mem[6] = (data[1] >> 8) & 0xff; -+- mem[5] = (data[1] >> 16) & 0xff; -+- mem[4] = (data[1] >> 24) & 0xff; -+- /* Fall through to 2 */ -+- case 2: -+- mem[3] = data[0] & 0xff; -+- mem[2] = (data[0] >> 8) & 0xff; -+- mem[1] = (data[0] >> 16) & 0xff; -+- mem[0] = (data[0] >> 24) & 0xff; -+- break; -+- case 1: -+- mem[1] = data[0] & 0xff; -+- mem[0] = (data[0] >> 8) & 0xff; -+- break; -+- case 0: -+- mem[0] = data[0] & 0xff; -+- break; -+- -+- } -++ uint32 asi; -++ if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) { -++ *data = *((uint32 *) & (ramb[addr & mem_rammask & ~3])); -++ *ws = mem_ramr_ws; -++ return (0); -++ } else if (addr < mem_romsz) { -++ *data = *((uint32 *) & (romb[addr & ~3])); -++ *ws = mem_romr_ws; -++ return (0); -+ } -+-} -+- -+ -+-/* Memory emulation */ -++ printf("Memory exception at %x (illegal address)\n", addr); -++ if (sregs.psr & 0x080) asi = 9; else asi = 8; -++ set_sfsr(UIMP_ACC, addr, asi, 1); -++ *ws = MEM_EX_WS; -++ return (1); -++} -+ -+-int -+-memory_read(asi, addr, data, sz, ws) -+- int32 asi; -++static int -++memory_read(addr, data, sz, ws) -+ uint32 addr; -+ uint32 *data; -+ int32 sz; -+ int32 *ws; -+ { -+ int32 mexc; -++ int32 asi; -+ -+ #ifdef ERRINJ -+ if (errmec) { -+ if (sis_verbose) -+ printf("Inserted MEC error %d\n",errmec); -++ if (sregs.psr & 0x080) asi = 11; else asi = 10; -+ set_sfsr(errmec, addr, asi, 1); -+ if (errmec == 5) mecparerror(); -+ if (errmec == 6) iucomperr(); -+@@ -1663,10 +1659,11 @@ memory_read(asi, addr, data, sz, ws) -+ #endif -+ -+ if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) { -+- fetch_bytes (asi, &ramb[addr & mem_rammask], data, sz); -++ *data = *((uint32 *) & (ramb[addr & mem_rammask & ~3])); -+ *ws = mem_ramr_ws; -+ return (0); -+ } else if ((addr >= MEC_START) && (addr < MEC_END)) { -++ if (sregs.psr & 0x080) asi = 11; else asi = 10; -+ mexc = mec_read(addr, asi, data); -+ if (mexc) { -+ set_sfsr(MEC_ACC, addr, asi, 1); -+@@ -1681,7 +1678,7 @@ memory_read(asi, addr, data, sz, ws) -+ } else if (era) { -+ if ((addr < 0x100000) || -+ ((addr>= 0x80000000) && (addr < 0x80100000))) { -+- fetch_bytes (asi, &romb[addr & ROM_MASK], data, sz); -++ *data = *((uint32 *) & (romb[addr & ROM_MASK & ~3])); -+ *ws = 4; -+ return (0); -+ } else if ((addr >= 0x10000000) && -+@@ -1692,13 +1689,13 @@ memory_read(asi, addr, data, sz, ws) -+ } -+ -+ } else if (addr < mem_romsz) { -+- fetch_bytes (asi, &romb[addr], data, sz); -++ *data = *((uint32 *) & (romb[addr & ~3])); -+ *ws = mem_romr_ws; -+ return (0); -+ -+ #else -+ } else if (addr < mem_romsz) { -+- fetch_bytes (asi, &romb[addr], data, sz); -++ *data = *((uint32 *) & (romb[addr & ~3])); -+ *ws = mem_romr_ws; -+ return (0); -+ #endif -+@@ -1706,19 +1703,30 @@ memory_read(asi, addr, data, sz, ws) -+ } -+ -+ printf("Memory exception at %x (illegal address)\n", addr); -++ if (sregs.psr & 0x080) asi = 11; else asi = 10; -+ set_sfsr(UIMP_ACC, addr, asi, 1); -+ *ws = MEM_EX_WS; -+ return (1); -+ } -+ -+-int -+-memory_write(asi, addr, data, sz, ws) -++static int -++memory_read_asi(asi, addr, data, sz, ws) -+ int32 asi; -+ uint32 addr; -+ uint32 *data; -+ int32 sz; -+ int32 *ws; -+ { -++ return(memory_read(addr, data, sz, ws)); -++} -++ -++static int -++memory_write(addr, data, sz, ws) -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -+ uint32 byte_addr; -+ uint32 byte_mask; -+ uint32 waddr; -+@@ -1726,11 +1734,13 @@ memory_write(asi, addr, data, sz, ws) -+ int32 mexc; -+ int i; -+ int wphit[2]; -++ int32 asi; -+ -+ #ifdef ERRINJ -+ if (errmec) { -+ if (sis_verbose) -+ printf("Inserted MEC error %d\n",errmec); -++ if (sregs.psr & 0x080) asi = 11; else asi = 10; -+ set_sfsr(errmec, addr, asi, 0); -+ if (errmec == 5) mecparerror(); -+ if (errmec == 6) iucomperr(); -+@@ -1743,6 +1753,7 @@ memory_write(asi, addr, data, sz, ws) -+ if (mem_accprot) { -+ -+ waddr = (addr & 0x7fffff) >> 2; -++ if (sregs.psr & 0x080) asi = 11; else asi = 10; -+ for (i = 0; i < 2; i++) -+ wphit[i] = -+ (((asi == 0xa) && (mec_wpr[i] & 1)) || -+@@ -1761,22 +1772,12 @@ memory_write(asi, addr, data, sz, ws) -+ } -+ } -+ -+- store_bytes (&ramb[addr & mem_rammask], data, sz); -+- -+- switch (sz) { -+- case 0: -+- case 1: -+- *ws = mem_ramw_ws + 3; -+- break; -+- case 2: -+- *ws = mem_ramw_ws; -+- break; -+- case 3: -+- *ws = 2 * mem_ramw_ws + STD_WS; -+- break; -+- } -++ waddr = addr & mem_rammask; -++ store_bytes (ramb, waddr, data, sz, ws); -+ return (0); -++ -+ } else if ((addr >= MEC_START) && (addr < MEC_END)) { -++ if (sregs.psr & 0x080) asi = 11; else asi = 10; -+ if ((sz != 2) || (asi != 0xb)) { -+ set_sfsr(MEC_ACC, addr, asi, 0); -+ *ws = MEM_EX_WS; -+@@ -1798,7 +1799,7 @@ memory_write(asi, addr, data, sz, ws) -+ ((addr < 0x100000) || ((addr >= 0x80000000) && (addr < 0x80100000)))) { -+ addr &= ROM_MASK; -+ *ws = sz == 3 ? 8 : 4; -+- store_bytes (&romb[addr], data, sz); -++ store_bytes (romb, addr, data, sz, ws); -+ return (0); -+ } else if ((addr >= 0x10000000) && -+ (addr < (0x10000000 + (512 << (mec_iocr & 0x0f)))) && -+@@ -1814,7 +1815,7 @@ memory_write(asi, addr, data, sz, ws) -+ *ws = mem_romw_ws + 1; -+ if (sz == 3) -+ *ws += mem_romw_ws + STD_WS; -+- store_bytes (&romb[addr], data, sz); -++ store_bytes (romb, addr, data, sz, ws); -+ return (0); -+ -+ #else -+@@ -1825,7 +1826,7 @@ memory_write(asi, addr, data, sz, ws) -+ *ws = mem_romw_ws + 1; -+ if (sz == 3) -+ *ws += mem_romw_ws + STD_WS; -+- store_bytes (&romb[addr], data, sz); -++ store_bytes (romb, addr, data, sz, ws); -+ return (0); -+ -+ #endif -+@@ -1833,10 +1834,22 @@ memory_write(asi, addr, data, sz, ws) -+ } -+ -+ *ws = MEM_EX_WS; -++ if (sregs.psr & 0x080) asi = 11; else asi = 10; -+ set_sfsr(UIMP_ACC, addr, asi, 0); -+ return (1); -+ } -+ -++static int -++memory_write_asi(asi, addr, data, sz, ws) -++ int32 asi; -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ return(memory_write(addr, data, sz, ws)); -++} -++ -+ static unsigned char * -+ get_mem_ptr(addr, size) -+ uint32 addr; -+@@ -1858,7 +1871,7 @@ get_mem_ptr(addr, size) -+ return ((char *) -1); -+ } -+ -+-int -++static int -+ sis_memory_write(addr, data, length) -+ uint32 addr; -+ const unsigned char *data; -+@@ -1873,13 +1886,19 @@ sis_memory_write(addr, data, length) -+ return (length); -+ } -+ -+-int -++static int -+ sis_memory_read(addr, data, length) -+ uint32 addr; -+ char *data; -+ uint32 length; -+ { -+ char *mem; -++ int ws; -++ -++ if (length == 4) { -++ memory_read(addr, data, length, &ws); -++ return(4); -++ } -+ -+ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) -+ return (0); -+@@ -1887,3 +1906,35 @@ sis_memory_read(addr, data, length) -+ memcpy(data, mem, length); -+ return (length); -+ } -++ -++static void -++boot_init () -++{ -++ mec_write(MEC_WCR, 0); /* zero waitstates */ -++ mec_write(MEC_TRAPD, 0); /* turn off watch-dog */ -++ mec_write(MEC_RTC_SCALER, sregs.freq-1); /* generate 1 MHz RTC tick */ -++ mec_write(MEC_MEMCFG, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */ -++ sregs.wim = 2; -++ sregs.psr = 0x110010e0; -++ sregs.r[30] = RAM_END; -++ sregs.r[14] = sregs.r[30] - 96*4; -++ mec_mcr |= 1; /* power-down enabled */ -++} -++ -++struct memsys erc32sys = { -++ init_sim, -++ reset, -++ error_mode, -++ sim_halt, -++ exit_sim, -++ init_stdio, -++ restore_stdio, -++ memory_iread, -++ memory_read, -++ memory_read_asi, -++ memory_write, -++ memory_write_asi, -++ sis_memory_write, -++ sis_memory_read, -++ boot_init -++}; -+diff --git a/sim/erc32/exec.c b/sim/erc32/exec.c -+index dc86ba3..f812ad9 100644 -+--- a/sim/erc32/exec.c -++++ b/sim/erc32/exec.c -+@@ -21,11 +21,9 @@ -+ -+ #include "config.h" -+ #include "sis.h" -+-#include "end.h" -+ #include -+ #include -+ -+-extern int32 sis_verbose, sparclite; -+ int ext_irl = 0; -+ -+ /* Load/store interlock delay */ -+@@ -229,10 +227,6 @@ static int fpexec (uint32 op3, uint32 rd, uint32 rs1, uint32 rs2, -+ struct pstate *sregs); -+ static int chk_asi (struct pstate *sregs, uint32 *asi, uint32 op3); -+ -+- -+-extern struct estate ebase; -+-extern int32 nfp,ift; -+- -+ #ifdef ERRINJ -+ extern uint32 errtt, errftt; -+ #endif -+@@ -371,6 +365,36 @@ div64 (uint32 n1_hi, uint32 n1_low, uint32 n2, uint32 *result, int msigned) -+ } -+ -+ -++static int -++extract_short(uint32 data, uint32 address) -++{ -++ return((data>>((2 - (address & 2))*8)) & 0xffff); -++} -++ -++static int -++extract_short_signed(uint32 data, uint32 address) -++{ -++ uint32 tmp; -++ tmp = ((data>>((2 - (address & 2))*8)) & 0xffff); -++ if (tmp & 0x8000) tmp |= 0xffff0000; -++ return(tmp); -++} -++ -++static int -++extract_byte(uint32 data, uint32 address) -++{ -++ return((data>>((3 - (address & 3))*8)) & 0xff); -++} -++ -++static int -++extract_byte_signed(uint32 data, uint32 address) -++{ -++ uint32 tmp; -++ tmp = ((data>>((3 - (address & 3))*8)) & 0xff); -++ if (tmp & 0x80) tmp |= 0xffffff00; -++ return(tmp); -++} -++ -+ int -+ dispatch_instruction(sregs) -+ struct pstate *sregs; -+@@ -1041,17 +1065,17 @@ dispatch_instruction(sregs) -+ *rdd = sregs->psr; -+ break; -+ case RDY: -+- if (!sparclite) -++ if ((!sparclite) && (cputype != CPU_LEON3)) -+ *rdd = sregs->y; -+ else { -+ int rs1_is_asr = (sregs->inst >> 14) & 0x1f; -+ if ( 0 == rs1_is_asr ) -+ *rdd = sregs->y; -+- else if ( 17 == rs1_is_asr ) -++ else if ( 17 == rs1_is_asr ) { -+ *rdd = sregs->asr17; -++ } -+ else { -+ sregs->trap = TRAP_UNIMP; -+- break; -+ } -+ } -+ break; -+@@ -1078,7 +1102,8 @@ dispatch_instruction(sregs) -+ sregs->trap = TRAP_PRIVI; -+ break; -+ } -+- sregs->psr = (rs1 ^ operand2) & 0x00f03fff; -++ sregs->psr = (sregs->psr & 0xff000000) | -++ (rs1 ^ operand2) & 0x00f03fff; -+ break; -+ case WRWIM: -+ if (!(sregs->psr & PSR_S)) { -+@@ -1096,13 +1121,19 @@ dispatch_instruction(sregs) -+ ((rs1 ^ operand2) & 0xfffff000); -+ break; -+ case WRY: -+- if (!sparclite) -++ if ((!sparclite) && (cputype != CPU_LEON3)) -+ sregs->y = (rs1 ^ operand2); -+ else { -+ if ( 0 == rd ) -+ sregs->y = (rs1 ^ operand2); -+- else if ( 17 == rd ) -+- sregs->asr17 = (rs1 ^ operand2); -++ else if ( 17 == rd ) { -++ if (sparclite) -++ sregs->asr17 = (rs1 ^ operand2); -++ } -++ else if ( 19 == rd ) { -++ if (cputype == CPU_LEON3) -++ wait_for_irq(); -++ } -+ else { -+ sregs->trap = TRAP_UNIMP; -+ break; -+@@ -1202,6 +1233,32 @@ dispatch_instruction(sregs) -+ switch (op3) { -+ case LDDA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ if (address & 0x7) { -++ sregs->trap = TRAP_UNALI; -++ break; -++ } -++ if (rd & 1) { -++ rd &= 0x1e; -++ if (rd > 7) -++ rdd = &(sregs->r[(cwp + rd) & 0x7f]); -++ else -++ rdd = &(sregs->g[rd]); -++ } -++ mexc = ms->memory_read_asi(asi, address, ddata, 2, &ws); -++ sregs->hold += ws; -++ mexc |= ms->memory_read_asi(asi, address+4, &ddata[1], 2, &ws); -++ sregs->hold += ws; -++ sregs->icnt = T_LDD; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ } else { -++ rdd[0] = ddata[0]; -++ rdd[1] = ddata[1]; -++#ifdef STAT -++ sregs->nload++; /* Double load counts twice */ -++#endif -++ } -++ break; -+ case LDD: -+ if (address & 0x7) { -+ sregs->trap = TRAP_UNALI; -+@@ -1214,8 +1271,10 @@ dispatch_instruction(sregs) -+ else -+ rdd = &(sregs->g[rd]); -+ } -+- mexc = memory_read(asi, address, ddata, 3, &ws); -+- sregs->hold += ws * 2; -++ mexc = ms->memory_read(address, ddata, 2, &ws); -++ sregs->hold += ws; -++ mexc |= ms->memory_read(address+4, &ddata[1], 2, &ws); -++ sregs->hold += ws; -+ sregs->icnt = T_LDD; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1230,12 +1289,24 @@ dispatch_instruction(sregs) -+ -+ case LDA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ if (address & 0x3) { -++ sregs->trap = TRAP_UNALI; -++ break; -++ } -++ mexc = ms->memory_read_asi(asi, address, &data, 2, &ws); -++ sregs->hold += ws; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ } else { -++ *rdd = data; -++ } -++ break; -+ case LD: -+ if (address & 0x3) { -+ sregs->trap = TRAP_UNALI; -+ break; -+ } -+- mexc = memory_read(asi, address, &data, 2, &ws); -++ mexc = ms->memory_read(address, &data, 2, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1245,17 +1316,37 @@ dispatch_instruction(sregs) -+ break; -+ case LDSTUBA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ mexc = ms->memory_read_asi(asi, address, &data, 0, &ws); -++ sregs->hold += ws; -++ sregs->icnt = T_LDST; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ break; -++ } -++ data = extract_byte(data, address); -++ *rdd = data; -++ data = 0x0ff; -++ mexc = ms->memory_write_asi(asi, address, &data, 0, &ws); -++ sregs->hold += ws; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ } -++#ifdef STAT -++ sregs->nload++; -++#endif -++ break; -+ case LDSTUB: -+- mexc = memory_read(asi, address, &data, 0, &ws); -++ mexc = ms->memory_read(address, &data, 0, &ws); -+ sregs->hold += ws; -+ sregs->icnt = T_LDST; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+ break; -+ } -++ data = extract_byte(data, address); -+ *rdd = data; -+ data = 0x0ff; -+- mexc = memory_write(asi, address, &data, 0, &ws); -++ mexc = ms->memory_write(address, &data, 0, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1267,35 +1358,67 @@ dispatch_instruction(sregs) -+ case LDSBA: -+ case LDUBA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ mexc = ms->memory_read_asi(asi, address, &data, 0, &ws); -++ sregs->hold += ws; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ break; -++ } -++ if (op3 == LDSB) -++ data = extract_byte_signed(data, address); -++ else -++ data = extract_byte(data, address); -++ *rdd = data; -++ break; -+ case LDSB: -+ case LDUB: -+- mexc = memory_read(asi, address, &data, 0, &ws); -++ mexc = ms->memory_read(address, &data, 0, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+ break; -+ } -+- if ((op3 == LDSB) && (data & 0x80)) -+- data |= 0xffffff00; -++ if (op3 == LDSB) -++ data = extract_byte_signed(data, address); -++ else -++ data = extract_byte(data, address); -+ *rdd = data; -+ break; -+ case LDSHA: -+ case LDUHA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ if (address & 0x1) { -++ sregs->trap = TRAP_UNALI; -++ break; -++ } -++ mexc = ms->memory_read_asi(asi, address, &data, 1, &ws); -++ sregs->hold += ws; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ break; -++ } -++ if (op3 == LDSH) -++ data = extract_short_signed(data, address); -++ else -++ data = extract_short(data, address); -++ *rdd = data; -++ break; -+ case LDSH: -+ case LDUH: -+ if (address & 0x1) { -+ sregs->trap = TRAP_UNALI; -+ break; -+ } -+- mexc = memory_read(asi, address, &data, 1, &ws); -++ mexc = ms->memory_read(address, &data, 1, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+ break; -+ } -+- if ((op3 == LDSH) && (data & 0x8000)) -+- data |= 0xffff0000; -++ if (op3 == LDSH) -++ data = extract_short_signed(data, address); -++ else -++ data = extract_short(data, address); -+ *rdd = data; -+ break; -+ case LDF: -+@@ -1312,7 +1435,7 @@ dispatch_instruction(sregs) -+ (sregs->frs2 == rd)) -+ sregs->fhold += (sregs->ftime - ebase.simtime); -+ } -+- mexc = memory_read(asi, address, &data, 2, &ws); -++ mexc = ms->memory_read(address, &data, 2, &ws); -+ sregs->hold += ws; -+ sregs->flrd = rd; -+ sregs->ltime = ebase.simtime + sregs->icnt + FLSTHOLD + -+@@ -1338,8 +1461,10 @@ dispatch_instruction(sregs) -+ ((sregs->frs2 >> 1) == (rd >> 1))) -+ sregs->fhold += (sregs->ftime - ebase.simtime); -+ } -+- mexc = memory_read(asi, address, ddata, 3, &ws); -+- sregs->hold += ws * 2; -++ mexc = ms->memory_read(address, ddata, 2, &ws); -++ sregs->hold += ws; -++ mexc |= ms->memory_read(address+4, &ddata[1], 2, &ws); -++ sregs->hold += ws; -+ sregs->icnt = T_LDD; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1367,7 +1492,7 @@ dispatch_instruction(sregs) -+ sregs->trap = TRAP_UNALI; -+ break; -+ } -+- mexc = memory_read(asi, address, &data, 2, &ws); -++ mexc = ms->memory_read(address, &data, 2, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1389,7 +1514,7 @@ dispatch_instruction(sregs) -+ if (ebase.simtime < sregs->ftime) { -+ sregs->fhold += (sregs->ftime - ebase.simtime); -+ } -+- mexc = memory_write(asi, address, &sregs->fsr, 2, &ws); -++ mexc = ms->memory_write(address, &sregs->fsr, 2, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1398,12 +1523,22 @@ dispatch_instruction(sregs) -+ -+ case STA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ if (address & 0x3) { -++ sregs->trap = TRAP_UNALI; -++ break; -++ } -++ mexc = ms->memory_write_asi(asi, address, rdd, 2, &ws); -++ sregs->hold += ws; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ } -++ break; -+ case ST: -+ if (address & 0x3) { -+ sregs->trap = TRAP_UNALI; -+ break; -+ } -+- mexc = memory_write(asi, address, rdd, 2, &ws); -++ mexc = ms->memory_write(address, rdd, 2, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1411,8 +1546,14 @@ dispatch_instruction(sregs) -+ break; -+ case STBA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ mexc = ms->memory_write_asi(asi, address, rdd, 0, &ws); -++ sregs->hold += ws; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ } -++ break; -+ case STB: -+- mexc = memory_write(asi, address, rdd, 0, &ws); -++ mexc = ms->memory_write(address, rdd, 0, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1420,6 +1561,28 @@ dispatch_instruction(sregs) -+ break; -+ case STDA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ if (address & 0x7) { -++ sregs->trap = TRAP_UNALI; -++ break; -++ } -++ if (rd & 1) { -++ rd &= 0x1e; -++ if (rd > 7) -++ rdd = &(sregs->r[(cwp + rd) & 0x7f]); -++ else -++ rdd = &(sregs->g[rd]); -++ } -++ mexc = ms->memory_write_asi(asi, address, rdd, 3, &ws); -++ sregs->hold += ws; -++ sregs->icnt = T_STD; -++#ifdef STAT -++ sregs->nstore++; /* Double store counts twice */ -++#endif -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ break; -++ } -++ break; -+ case STD: -+ if (address & 0x7) { -+ sregs->trap = TRAP_UNALI; -+@@ -1432,7 +1595,7 @@ dispatch_instruction(sregs) -+ else -+ rdd = &(sregs->g[rd]); -+ } -+- mexc = memory_write(asi, address, rdd, 3, &ws); -++ mexc = ms->memory_write(address, rdd, 3, &ws); -+ sregs->hold += ws; -+ sregs->icnt = T_STD; -+ #ifdef STAT -+@@ -1461,7 +1624,7 @@ dispatch_instruction(sregs) -+ break; -+ } -+ rdd = &(sregs->fpq[0]); -+- mexc = memory_write(asi, address, rdd, 3, &ws); -++ mexc = ms->memory_write(address, rdd, 3, &ws); -+ sregs->hold += ws; -+ sregs->icnt = T_STD; -+ #ifdef STAT -+@@ -1477,12 +1640,22 @@ dispatch_instruction(sregs) -+ break; -+ case STHA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ if (address & 0x1) { -++ sregs->trap = TRAP_UNALI; -++ break; -++ } -++ mexc = ms->memory_write_asi(asi, address, rdd, 1, &ws); -++ sregs->hold += ws; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ } -++ break; -+ case STH: -+ if (address & 0x1) { -+ sregs->trap = TRAP_UNALI; -+ break; -+ } -+- mexc = memory_write(asi, address, rdd, 1, &ws); -++ mexc = ms->memory_write(address, rdd, 1, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1501,7 +1674,7 @@ dispatch_instruction(sregs) -+ if (sregs->frd == rd) -+ sregs->fhold += (sregs->ftime - ebase.simtime); -+ } -+- mexc = memory_write(asi, address, &sregs->fsi[rd], 2, &ws); -++ mexc = ms->memory_write(address, &sregs->fsi[rd], 2, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+@@ -1521,7 +1694,7 @@ dispatch_instruction(sregs) -+ if ((sregs->frd == rd) || (sregs->frd + 1 == rd)) -+ sregs->fhold += (sregs->ftime - ebase.simtime); -+ } -+- mexc = memory_write(asi, address, &sregs->fsi[rd], 3, &ws); -++ mexc = ms->memory_write(address, &sregs->fsi[rd], 3, &ws); -+ sregs->hold += ws; -+ sregs->icnt = T_STD; -+ #ifdef STAT -+@@ -1533,18 +1706,40 @@ dispatch_instruction(sregs) -+ break; -+ case SWAPA: -+ if (!chk_asi(sregs, &asi, op3)) break; -++ if (address & 0x3) { -++ sregs->trap = TRAP_UNALI; -++ break; -++ } -++ mexc = ms->memory_read_asi(asi, address, &data, 2, &ws); -++ sregs->hold += ws; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ break; -++ } -++ mexc = ms->memory_write_asi(asi, address, rdd, 2, &ws); -++ sregs->hold += ws; -++ sregs->icnt = T_LDST; -++ if (mexc) { -++ sregs->trap = TRAP_DEXC; -++ break; -++ } else -++ *rdd = data; -++#ifdef STAT -++ sregs->nload++; -++#endif -++ break; -+ case SWAP: -+ if (address & 0x3) { -+ sregs->trap = TRAP_UNALI; -+ break; -+ } -+- mexc = memory_read(asi, address, &data, 2, &ws); -++ mexc = ms->memory_read(address, &data, 2, &ws); -+ sregs->hold += ws; -+ if (mexc) { -+ sregs->trap = TRAP_DEXC; -+ break; -+ } -+- mexc = memory_write(asi, address, rdd, 2, &ws); -++ mexc = ms->memory_write(address, rdd, 2, &ws); -+ sregs->hold += ws; -+ sregs->icnt = T_LDST; -+ if (mexc) { -+@@ -1696,7 +1891,7 @@ fpexec(op3, rd, rs1, rs2, sregs) -+ but what about machines where float values are different endianness -+ from integer values? */ -+ -+-#ifdef HOST_LITTLE_ENDIAN_FLOAT -++#ifdef HOST_LITTLE_ENDIAN -+ rs1 &= 0x1f; -+ switch (opf) { -+ case FADDd: -+@@ -1780,7 +1975,7 @@ fpexec(op3, rd, rs1, rs2, sregs) -+ sregs->ftime += T_FDIVd; -+ break; -+ case FMOVs: -+- sregs->fs[rd] = sregs->fs[rs2]; -++ sregs->fsi[rd] = sregs->fsi[rs2]; -+ sregs->ftime += T_FMOVs; -+ sregs->frs1 = 32; /* rs1 ignored */ -+ break; -+@@ -1874,7 +2069,7 @@ fpexec(op3, rd, rs1, rs2, sregs) -+ -+ accex = get_accex(); -+ -+-#ifdef HOST_LITTLE_ENDIAN_FLOAT -++#ifdef HOST_LITTLE_ENDIAN -+ switch (opf) { -+ case FADDd: -+ case FDIVd: -+@@ -1962,7 +2157,7 @@ execute_trap(sregs) -+ sregs->pc = sregs->tbr; -+ sregs->npc = sregs->tbr + 4; -+ -+- if ( 0 != (1 & sregs->asr17) ) { -++ if ( 0 != (1 & (sregs->asr17 >> 13)) ) { -+ /* single vector trapping! */ -+ sregs->pc = sregs->tbr & 0xfffff000; -+ sregs->npc = sregs->pc + 4; -+@@ -1978,8 +2173,6 @@ execute_trap(sregs) -+ -+ } -+ -+-extern struct irqcell irqarr[16]; -+- -+ int -+ check_interrupts(sregs) -+ struct pstate *sregs; -+@@ -2011,7 +2204,13 @@ init_regs(sregs) -+ sregs->npc = 4; -+ sregs->trap = 0; -+ sregs->psr &= 0x00f03fdf; -+- sregs->psr |= 0x080; /* Set supervisor bit */ -++ if (cputype == CPU_LEON3) -++ sregs->psr |= 0xF3000080; /* Set supervisor bit */ -++ else -++ if (cputype == CPU_LEON2) -++ sregs->psr |= 0x00000080; /* Set supervisor bit */ -++ else -++ sregs->psr |= 0x11000080; /* Set supervisor bit */ -+ sregs->breakpoint = 0; -+ sregs->annul = 0; -+ sregs->fpstate = FP_EXE_MODE; -+@@ -2021,7 +2220,7 @@ init_regs(sregs) -+ sregs->err_mode = 0; -+ ext_irl = 0; -+ sregs->g[0] = 0; -+-#ifdef HOST_LITTLE_ENDIAN_FLOAT -++#ifdef HOST_LITTLE_ENDIAN -+ sregs->fdp = (float32 *) sregs->fd; -+ sregs->fsi = (int32 *) sregs->fs; -+ #else -+@@ -2040,4 +2239,8 @@ init_regs(sregs) -+ -+ sregs->rett_err = 0; -+ sregs->jmpltime = 0; -++ if (cputype == CPU_LEON3) { -++ sregs->asr17 = 0x107; -++ if (!nfp) sregs->asr17 |= (3 << 10); /* Meiko FPU */ -++ } -+ } -+diff --git a/sim/erc32/float.c b/sim/erc32/float.c -+index 598b7cc..ce92a39 100644 -+--- a/sim/erc32/float.c -++++ b/sim/erc32/float.c -+@@ -38,7 +38,6 @@ -+ -+ extern uint32 _get_sw (void); -+ extern uint32 _get_cw (void); -+-static void __setfpucw (unsigned short fpu_control); -+ -+ /* This host dependent routine should return the accrued exceptions */ -+ int -+@@ -46,7 +45,7 @@ get_accex() -+ { -+ #ifdef sparc -+ return ((_get_fsr_raw() >> 5) & 0x1F); -+-#elif i386 -++#elif defined(i386) || defined(__x86_64__) -+ uint32 accx; -+ -+ accx = _get_sw() & 0x3f; -+@@ -66,7 +65,7 @@ clear_accex() -+ { -+ #ifdef sparc -+ set_fsr((_get_fsr_raw() & ~0x3e0)); -+-#elif i386 -++#elif defined(i386) || defined(__x86_64__) -+ asm("\n" -+ ".text\n" -+ " fnclex\n" -+@@ -84,9 +83,8 @@ uint32 fsr; -+ { -+ #ifdef sparc -+ _set_fsr_raw(fsr & ~0x0f800000); -+-#elif i386 -+- void __setfpucw(unsigned short fpu_control); -+- uint32 rawfsr; -++#elif defined(i386) || defined(__x86_64__) -++ unsigned short rawfsr; -+ -+ fsr >>= 30; -+ switch (fsr) { -+@@ -102,9 +100,8 @@ uint32 fsr; -+ fsr = 1; -+ break; ++ + + ac_sources="$sim_link_files" + ac_dests="$sim_link_links" +@@ -13110,10 +13374,21 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + :end' >>confcache + if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then +- test "x$cache_file" != "x/dev/null" && ++ if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 + $as_echo "$as_me: updating cache $cache_file" >&6;} +- cat confcache >$cache_file ++ if test ! -f "$cache_file" || test -h "$cache_file"; then ++ cat confcache >"$cache_file" ++ else ++ case $cache_file in #( ++ */* | ?:*) ++ mv -f confcache "$cache_file"$$ && ++ mv -f "$cache_file"$$ "$cache_file" ;; #( ++ *) ++ mv -f confcache "$cache_file" ;; ++ esac ++ fi ++ fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 + $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} +@@ -13129,6 +13404,7 @@ DEFS=-DHAVE_CONFIG_H + + ac_libobjs= + ac_ltlibobjs= ++U= + for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' +@@ -13144,19 +13420,20 @@ LTLIBOBJS=$ac_ltlibobjs + + + if test -z "${GMAKE_TRUE}" && test -z "${GMAKE_FALSE}"; then +- as_fn_error "conditional \"GMAKE\" was never defined. ++ as_fn_error $? "conditional \"GMAKE\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${PLUGINS_TRUE}" && test -z "${PLUGINS_FALSE}"; then +- as_fn_error "conditional \"PLUGINS\" was never defined. ++ as_fn_error $? "conditional \"PLUGINS\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then +- as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. ++ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi + +-: ${CONFIG_STATUS=./config.status} ++ ++: "${CONFIG_STATUS=./config.status}" + ac_write_fail=0 + ac_clean_files_save=$ac_clean_files + ac_clean_files="$ac_clean_files $CONFIG_STATUS" +@@ -13257,6 +13534,7 @@ fi + IFS=" "" $as_nl" + + # Find who we are. Look in the path if we contain no directory separator. ++as_myself= + case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +@@ -13302,19 +13580,19 @@ export LANGUAGE + (unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +-# as_fn_error ERROR [LINENO LOG_FD] +-# --------------------------------- ++# as_fn_error STATUS ERROR [LINENO LOG_FD] ++# ---------------------------------------- + # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are + # provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-# script with status $?, using 1 if that was 0. ++# script with STATUS, using 1 if that was 0. + as_fn_error () + { +- as_status=$?; test $as_status -eq 0 && as_status=1 +- if test "$3"; then +- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 ++ as_status=$1; test $as_status -eq 0 && as_status=1 ++ if test "$4"; then ++ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi +- $as_echo "$as_me: error: $1" >&2 ++ $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status + } # as_fn_error + +@@ -13452,16 +13730,16 @@ if (echo >conf$$.file) 2>/dev/null; then + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -p'. ++ # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' + fi + else +- as_ln_s='cp -p' ++ as_ln_s='cp -pR' + fi + rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file + rmdir conf$$.dir 2>/dev/null +@@ -13510,7 +13788,7 @@ $as_echo X"$as_dir" | + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" ++ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + + } # as_fn_mkdir_p +@@ -13521,28 +13799,16 @@ else + as_mkdir_p=false + fi + +-if test -x / >/dev/null 2>&1; then +- as_test_x='test -x' +-else +- if ls -dL / >/dev/null 2>&1; then +- as_ls_L_option=L +- else +- as_ls_L_option= +- fi +- as_test_x=' +- eval sh -c '\'' +- if test -d "$1"; then +- test -d "$1/."; +- else +- case $1 in #( +- -*)set "./$1";; +- esac; +- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( +- ???[sx]*):;;*)false;;esac;fi +- '\'' sh +- ' +-fi +-as_executable_p=$as_test_x ++ ++# as_fn_executable_p FILE ++# ----------------------- ++# Test if FILE is an executable regular file. ++as_fn_executable_p () ++{ ++ test -f "$1" && test -x "$1" ++} # as_fn_executable_p ++as_test_x='test -x' ++as_executable_p=as_fn_executable_p + + # Sed expression to map a string onto a valid CPP name. + as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +@@ -13564,7 +13830,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + # values after options handling. + ac_log=" + This file was extended by $as_me, which was +-generated by GNU Autoconf 2.64. Invocation command line was ++generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS +@@ -13605,6 +13871,7 @@ Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit ++ --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files +@@ -13630,12 +13897,13 @@ Report bugs to the package provider." + + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ++ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ + config.status +-configured by $0, generated by GNU Autoconf 2.64, +- with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" ++configured by $0, generated by GNU Autoconf 2.69, ++ with options \\"\$ac_cs_config\\" + +-Copyright (C) 2009 Free Software Foundation, Inc. ++Copyright (C) 2012 Free Software Foundation, Inc. + This config.status script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it." + +@@ -13652,11 +13920,16 @@ ac_need_defaults=: + while test $# != 0 + do + case $1 in +- --*=*) ++ --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; ++ --*=) ++ ac_option=`expr "X$1" : 'X\([^=]*\)='` ++ ac_optarg= ++ ac_shift=: ++ ;; + *) + ac_option=$1 + ac_optarg=$2 +@@ -13670,12 +13943,15 @@ do + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; ++ --config | --confi | --conf | --con | --co | --c ) ++ $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; +@@ -13688,7 +13964,7 @@ do + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header +- as_fn_error "ambiguous option: \`$1' ++ as_fn_error $? "ambiguous option: \`$1' + Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; +@@ -13697,7 +13973,7 @@ Try \`$0 --help' for more information.";; + ac_cs_silent=: ;; + + # This is an error. +- -*) as_fn_error "unrecognized option: \`$1' ++ -*) as_fn_error $? "unrecognized option: \`$1' + Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" +@@ -13717,7 +13993,7 @@ fi + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + if \$ac_cs_recheck; then +- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion ++ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' +@@ -14021,7 +14297,7 @@ do + "Makefile") CONFIG_COMMANDS="$CONFIG_COMMANDS Makefile" ;; + "stamp-h") CONFIG_COMMANDS="$CONFIG_COMMANDS stamp-h" ;; + +- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; ++ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac + done + +@@ -14045,9 +14321,10 @@ fi + # after its creation but before its name has been assigned to `$tmp'. + $debug || + { +- tmp= ++ tmp= ac_tmp= + trap 'exit_status=$? +- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ++ : "${ac_tmp:=$tmp}" ++ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status + ' 0 + trap 'as_fn_exit 1' 1 2 13 15 + } +@@ -14055,12 +14332,13 @@ $debug || + + { + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && +- test -n "$tmp" && test -d "$tmp" ++ test -d "$tmp" + } || + { + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 ++} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ++ac_tmp=$tmp + + # Set up the scripts for CONFIG_FILES section. + # No need to generate them if there are no CONFIG_FILES. +@@ -14077,12 +14355,12 @@ if test "x$ac_cr" = x; then + fi + ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` + if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then +- ac_cs_awk_cr='\r' ++ ac_cs_awk_cr='\\r' + else + ac_cs_awk_cr=$ac_cr + fi + +-echo 'BEGIN {' >"$tmp/subs1.awk" && ++echo 'BEGIN {' >"$ac_tmp/subs1.awk" && + _ACEOF + + +@@ -14091,18 +14369,18 @@ _ACEOF + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" + } >conf$$subs.sh || +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ++ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` + ac_delim='%!_!# ' + for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +@@ -14110,7 +14388,7 @@ done + rm -f conf$$subs.sh + + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-cat >>"\$tmp/subs1.awk" <<\\_ACAWK && ++cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && + _ACEOF + sed -n ' + h +@@ -14124,7 +14402,7 @@ s/'"$ac_delim"'$// + t delim + :nl + h +-s/\(.\{148\}\).*/\1/ ++s/\(.\{148\}\)..*/\1/ + t more1 + s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ + p +@@ -14138,7 +14416,7 @@ s/.\{148\}// + t nl + :delim + h +-s/\(.\{148\}\).*/\1/ ++s/\(.\{148\}\)..*/\1/ + t more2 + s/["\\]/\\&/g; s/^/"/; s/$/"/ + p +@@ -14158,7 +14436,7 @@ t delim + rm -f conf$$subs.awk + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + _ACAWK +-cat >>"\$tmp/subs1.awk" <<_ACAWK && ++cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +@@ -14190,21 +14468,29 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" + else + cat +-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ +- || as_fn_error "could not setup config files machinery" "$LINENO" 5 ++fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ ++ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 + _ACEOF + +-# VPATH may cause trouble with some makes, so we remove $(srcdir), +-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and ++# VPATH may cause trouble with some makes, so we remove sole $(srcdir), ++# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and + # trailing colons and then remove the whole line if VPATH becomes empty + # (actually we leave an empty line to preserve line numbers). + if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=/{ +-s/:*\$(srcdir):*/:/ +-s/:*\${srcdir}:*/:/ +-s/:*@srcdir@:*/:/ +-s/^\([^=]*=[ ]*\):*/\1/ ++ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ ++h ++s/// ++s/^/:/ ++s/[ ]*$/:/ ++s/:\$(srcdir):/:/g ++s/:\${srcdir}:/:/g ++s/:@srcdir@:/:/g ++s/^:*// + s/:*$// ++x ++s/\(=[ ]*\).*/\1/ ++G ++s/\n// + s/^[^=]*=[ ]*$// + }' + fi +@@ -14216,7 +14502,7 @@ fi # test -n "$CONFIG_FILES" + # No need to generate them if there are no CONFIG_HEADERS. + # This happens for instance with `./config.status Makefile'. + if test -n "$CONFIG_HEADERS"; then +-cat >"$tmp/defines.awk" <<\_ACAWK || ++cat >"$ac_tmp/defines.awk" <<\_ACAWK || + BEGIN { + _ACEOF + +@@ -14228,11 +14514,11 @@ _ACEOF + # handling of long lines. + ac_delim='%!_!# ' + for ac_last_try in false false :; do +- ac_t=`sed -n "/$ac_delim/p" confdefs.h` +- if test -z "$ac_t"; then ++ ac_tt=`sed -n "/$ac_delim/p" confdefs.h` ++ if test -z "$ac_tt"; then + break + elif $ac_last_try; then +- as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +@@ -14317,7 +14603,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + _ACAWK + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +- as_fn_error "could not setup config headers machinery" "$LINENO" 5 ++ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 + fi # test -n "$CONFIG_HEADERS" + + +@@ -14330,7 +14616,7 @@ do + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; +- :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; ++ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac +@@ -14349,7 +14635,7 @@ do + for ac_f + do + case $ac_f in +- -) ac_f="$tmp/stdin";; ++ -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. +@@ -14358,7 +14644,7 @@ do + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || +- as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; ++ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" +@@ -14384,8 +14670,8 @@ $as_echo "$as_me: creating $ac_file" >&6;} + esac + + case $ac_tag in +- *:-:* | *:-) cat >"$tmp/stdin" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; ++ *:-:* | *:-) cat >"$ac_tmp/stdin" \ ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac +@@ -14515,23 +14801,24 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t + s&@INSTALL@&$ac_INSTALL&;t t + $ac_datarootdir_hack + " +-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ ++ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + + test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && +- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && +- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && ++ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && ++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ ++ "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined." >&5 ++which seems to be undefined. Please make sure it is defined" >&5 + $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined." >&2;} ++which seems to be undefined. Please make sure it is defined" >&2;} + +- rm -f "$tmp/stdin" ++ rm -f "$ac_tmp/stdin" + case $ac_file in +- -) cat "$tmp/out" && rm -f "$tmp/out";; +- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; ++ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; ++ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # +@@ -14540,21 +14827,21 @@ which seems to be undefined. Please make sure it is defined." >&2;} + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" +- } >"$tmp/config.h" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 +- if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then ++ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" ++ } >"$ac_tmp/config.h" \ ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ++ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + $as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" +- mv "$tmp/config.h" "$ac_file" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ mv "$ac_tmp/config.h" "$ac_file" \ ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ +- || as_fn_error "could not create -" "$LINENO" 5 ++ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ ++ || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + :L) +@@ -14574,19 +14861,19 @@ $as_echo "$as_me: $ac_file is unchanged" >&6;} + $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} + + if test ! -r "$ac_source"; then +- as_fn_error "$ac_source: file not found" "$LINENO" 5 ++ as_fn_error $? "$ac_source: file not found" "$LINENO" 5 + fi + rm -f "$ac_file" + + # Try a relative symlink, then a hard link, then a copy. +- case $srcdir in ++ case $ac_source in + [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; + *) ac_rel_source=$ac_top_build_prefix$ac_source ;; + esac + ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || + ln "$ac_source" "$ac_file" 2>/dev/null || + cp -p "$ac_source" "$ac_file" || +- as_fn_error "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 ++ as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 + fi + ;; + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +@@ -15256,7 +15543,7 @@ _ACEOF + ac_clean_files=$ac_clean_files_save + + test $ac_write_fail = 0 || +- as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + + # configure is writing to config.log, and then calls config.status. +@@ -15277,7 +15564,7 @@ if test "$no_create" != yes; then + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. +- $ac_cs_success || as_fn_exit $? ++ $ac_cs_success || as_fn_exit 1 + fi + if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +diff --git a/sim/erc32/configure.ac b/sim/erc32/configure.ac +index bc46091..1646cc5 100644 +--- a/sim/erc32/configure.ac ++++ b/sim/erc32/configure.ac +@@ -32,4 +32,5 @@ else + AC_ERROR([the required "readline" library is missing]), $TERMCAP) + fi + AC_SUBST(READLINE) ++AC_C_BIGENDIAN + SIM_AC_OUTPUT +diff --git a/sim/erc32/end.c b/sim/erc32/end.c +deleted file mode 100644 +index 9337198..0000000 +--- a/sim/erc32/end.c ++++ /dev/null +@@ -1,27 +0,0 @@ +-#include "config.h" +-#include +- +-int +-main() +-{ +- +- unsigned int u1; +- char *c; +- double d1; +- float *f1; +- +- c = (char *) &u1; +- u1 = 0x0F; +- if (c[0] == 0x0F) +- puts("#define HOST_LITTLE_ENDIAN\n"); +- else +- puts("#define HOST_BIG_ENDIAN\n"); +- +- d1 = 1.0; +- f1 = (float *) &d1; +- if (*((int *) f1) != 0x3ff00000) +- puts("#define HOST_LITTLE_ENDIAN_FLOAT\n"); +- else +- puts("#define HOST_BIG_ENDIAN_FLOAT\n"); +- return 0; +-} +diff --git a/sim/erc32/erc32.c b/sim/erc32/erc32.c +index 4d4177e..0846bab 100644 +--- a/sim/erc32/erc32.c ++++ b/sim/erc32/erc32.c +@@ -22,6 +22,7 @@ + /* The control space devices */ + + #include "config.h" ++#include + #include + #include + #include +@@ -30,16 +31,9 @@ + #include + #include + #include "sis.h" +-#include "end.h" + #include "sim-config.h" + +-extern int ctrl_c; +-extern int32 sis_verbose; +-extern int32 sparclite, sparclite_board; +-extern int rom8,wrp,uben; +-extern char uart_dev1[], uart_dev2[]; +- +-int dumbio = 0; /* normal, smart, terminal oriented IO by default */ ++static int tty_setup = 1; /* default setup if not a tty */ + + /* MEC registers */ + #define MEC_START 0x01f80000 +@@ -55,11 +49,6 @@ int dumbio = 0; /* normal, smart, terminal oriented IO by default */ + extern int errmec; + #endif + +-/* The target's byte order is big-endian by default until we load a +- little-endian program. */ +- +-int current_target_byte_order = BIG_ENDIAN; +- + #define MEC_WS 0 /* Waitstates per MEC access (0 ws) */ + #define MOK 0 + +@@ -297,26 +286,24 @@ static void gpt_reload_set (uint32 val); + static void timer_ctrl (uint32 val); + static unsigned char * + get_mem_ptr (uint32 addr, uint32 size); ++static void store_bytes (unsigned char *mem, uint32 waddr, ++ uint32 *data, int sz, int32 *ws); + +-static void fetch_bytes (int asi, unsigned char *mem, +- uint32 *data, int sz); +- +-static void store_bytes (unsigned char *mem, uint32 *data, int sz); +- +-extern int ext_irl; ++static host_callback *callback; + + + /* One-time init */ + +-void ++static void + init_sim() + { ++ callback = sim_callback; + port_init(); + } + + /* Power-on reset init */ + +-void ++static void + reset() + { + mec_reset(); +@@ -396,7 +383,7 @@ mecparerror() + + /* IU error mode manager */ + +-void ++static void + error_mode(pc) + uint32 pc; + { +@@ -467,7 +454,7 @@ decode_mcr() + + /* Flush ports when simulator stops */ + +-void ++static void + sim_halt() + { + #ifdef FAST_UART +@@ -475,13 +462,6 @@ sim_halt() + #endif + } + +-int +-sim_stop(SIM_DESC sd) +-{ +- ctrl_c = 1; +- return 1; +-} +- + static void + close_port() + { +@@ -491,7 +471,7 @@ close_port() + fclose(f2in); + } + +-void ++static void + exit_sim() + { + close_port(); +@@ -743,6 +723,14 @@ mec_read(addr, asi, data) + *data = read_uart(addr); + break; + ++ case 0xF4: /* simulator RAM size in bytes */ ++ *data = 4096*1024; ++ break; ++ ++ case 0xF8: /* simulator ROM size in bytes */ ++ *data = 1024*1024; ++ break; ++ + default: + set_sfsr(MEC_ACC, addr, asi, 1); + return (1); +@@ -935,32 +923,38 @@ mec_write(addr, data) + + static int ifd1 = -1, ifd2 = -1, ofd1 = -1, ofd2 = -1; + +-void ++static void + init_stdio() + { + if (dumbio) + return; /* do nothing */ +- if (!ifd1) ++ if (ifd1 == 0 && f1open) { + tcsetattr(0, TCSANOW, &ioc1); +- if (!ifd2) ++ tcflush(ifd1, TCIFLUSH); ++ } ++ if (ifd2 == 0 && f1open) { + tcsetattr(0, TCSANOW, &ioc2); ++ tcflush(ifd2, TCIFLUSH); ++ } + } + +-void ++static void + restore_stdio() + { + if (dumbio) + return; /* do nothing */ +- if (!ifd1) ++ if (ifd1 == 0 && f1open && tty_setup) + tcsetattr(0, TCSANOW, &iocold1); +- if (!ifd2) ++ if (ifd2 == 0 && f2open && tty_setup) + tcsetattr(0, TCSANOW, &iocold2); + } + + #define DO_STDIO_READ( _fd_, _buf_, _len_ ) \ +- ( dumbio \ ++ ( dumbio || nouartrx \ + ? (0) /* no bytes read, no delay */ \ +- : read( _fd_, _buf_, _len_ ) ) ++ : (_fd_) == 1 && callback ? \ ++ callback->read_stdin (callback, _buf_, _len_) : \ ++ read( _fd_, _buf_, _len_ ) ) + + + static void +@@ -990,21 +984,26 @@ port_init() + } + if (f1in) ifd1 = fileno(f1in); + if (ifd1 == 0) { ++ if (callback && !callback->isatty(callback, ifd1)) { ++ tty_setup = 0; ++ } + if (sis_verbose) + printf("serial port A on stdin/stdout\n"); + if (!dumbio) { + tcgetattr(ifd1, &ioc1); ++ if (tty_setup) { + iocold1 = ioc1; + ioc1.c_lflag &= ~(ICANON | ECHO); + ioc1.c_cc[VMIN] = 0; + ioc1.c_cc[VTIME] = 0; + } ++ } + f1open = 1; + } + + if (f1out) { + ofd1 = fileno(f1out); +- if (!dumbio && ofd1 == 1) setbuf(f1out, NULL); ++ if (!dumbio && tty_setup && ofd1 == 1) setbuf(f1out, NULL); + } + + if (uart_dev2[0] != 0) +@@ -1023,17 +1022,19 @@ port_init() + printf("serial port B on stdin/stdout\n"); + if (!dumbio) { + tcgetattr(ifd2, &ioc2); ++ if (tty_setup) { + iocold2 = ioc2; + ioc2.c_lflag &= ~(ICANON | ECHO); + ioc2.c_cc[VMIN] = 0; + ioc2.c_cc[VTIME] = 0; + } ++ } + f2open = 1; + } + + if (f2out) { + ofd2 = fileno(f2out); +- if (!dumbio && ofd2 == 1) setbuf(f2out, NULL); ++ if (!dumbio && tty_setup && ofd2 == 1) setbuf(f2out, NULL); + } + + wnuma = wnumb = 0; +@@ -1062,6 +1063,9 @@ read_uart(addr) + if (f1open) { + anum = DO_STDIO_READ(ifd1, aq, UARTBUF); + } ++ else { ++ anum = 0; ++ } + if (anum > 0) { + aind = 0; + if ((aind + 1) < anum) +@@ -1094,6 +1098,9 @@ read_uart(addr) + if (f2open) { + bnum = DO_STDIO_READ(ifd2, bq, UARTBUF); + } ++ else { ++ bnum = 0; ++ } + if (bnum > 0) { + bind = 0; + if ((bind + 1) < bnum) +@@ -1126,6 +1133,9 @@ read_uart(addr) + if (f1open) { + anum = DO_STDIO_READ(ifd1, aq, UARTBUF); + } ++ else { ++ anum = 0; ++ } + if (anum > 0) { + Ucontrol |= 0x00000001; + aind = 0; +@@ -1138,6 +1148,9 @@ read_uart(addr) + if (f2open) { + bnum = DO_STDIO_READ(ifd2, bq, UARTBUF); + } ++ else { ++ bnum = 0; ++ } + if (bnum > 0) { + Ucontrol |= 0x00010000; + bind = 0; +@@ -1178,8 +1191,12 @@ write_uart(addr, data) + if (wnuma < UARTBUF) + wbufa[wnuma++] = c; + else { +- while (wnuma) ++ while (wnuma) { ++ if (ofd1 == 1 && callback) ++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); ++ else + wnuma -= fwrite(wbufa, 1, wnuma, f1out); ++ } + wbufa[wnuma++] = c; + } + } +@@ -1202,8 +1219,12 @@ write_uart(addr, data) + if (wnumb < UARTBUF) + wbufb[wnumb++] = c; + else { +- while (wnumb) ++ while (wnumb) { ++ if (ofd1 == 1 && callback) ++ wnumb -= callback->write_stdout(callback, wbufb, wnumb); ++ else + wnumb -= fwrite(wbufb, 1, wnumb, f2out); ++ } + wbufb[wnumb++] = c; + } + } +@@ -1241,19 +1262,37 @@ write_uart(addr, data) + static void + flush_uart() + { +- while (wnuma && f1open) ++ while (wnuma && f1open) { ++ if (ofd1 == 1 && callback) { ++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); ++ callback->flush_stdout(callback); ++ } ++ else + wnuma -= fwrite(wbufa, 1, wnuma, f1out); +- while (wnumb && f2open) ++ } ++ while (wnumb && f2open) { ++ if (ofd2 == 1 && callback) { ++ wnuma -= callback->write_stdout(callback, wbufb, wnuma); ++ callback->flush_stdout(callback); ++ } ++ else + wnumb -= fwrite(wbufb, 1, wnumb, f2out); + } ++} + + + + static void + uarta_tx() + { +- +- while (f1open && fwrite(&uarta_sreg, 1, 1, f1out) != 1); ++ while (f1open) { ++ if (ofd1 == 1 && callback) { ++ while (callback->write_stdout(callback, &uarta_sreg, 1) != 1); ++ } ++ else { ++ while (fwrite(&uarta_sreg, 1, 1, f1out) != 1); ++ } ++ } + if (uart_stat_reg & UARTA_HRE) { + uart_stat_reg |= UARTA_SRE; + } else { +@@ -1267,7 +1306,14 @@ uarta_tx() + static void + uartb_tx() + { +- while (f2open && fwrite(&uartb_sreg, 1, 1, f2out) != 1); ++ while (f2open) { ++ if (ofd2 == 1 && callback) { ++ while (callback->write_stdout(callback, &uarta_sreg, 1) != 1); ++ } ++ else { ++ while (fwrite(&uartb_sreg, 1, 1, f2out) != 1); ++ } ++ } + if (uart_stat_reg & UARTB_HRE) { + uart_stat_reg |= UARTB_SRE; + } else { +@@ -1289,6 +1335,8 @@ uart_rx(arg) + rsize = 0; + if (f1open) + rsize = DO_STDIO_READ(ifd1, &rxd, 1); ++ else ++ rsize = 0; + if (rsize > 0) { + uarta_data = UART_DR | rxd; + if (uart_stat_reg & UARTA_HRE) +@@ -1305,6 +1353,8 @@ uart_rx(arg) + rsize = 0; + if (f2open) + rsize = DO_STDIO_READ(ifd2, &rxd, 1); ++ else ++ rsize = 0; + if (rsize) { + uartb_data = UART_DR | rxd; + if (uart_stat_reg & UARTB_HRE) +@@ -1517,143 +1567,89 @@ timer_ctrl(val) + gpt_start(); + } + +- +-/* Retrieve data from target memory. MEM points to location from which +- to read the data; DATA points to words where retrieved data will be +- stored in host byte order. SZ contains log(2) of the number of bytes +- to retrieve, and can be 0 (1 byte), 1 (one half-word), 2 (one word), +- or 3 (two words). */ ++/* Store data in host byte order. MEM points to the beginning of the ++ emulated memory; WADDR contains the index the emulated memory, ++ DATA points to words in host byte order to be stored. SZ contains log(2) ++ of the number of bytes to retrieve, and can be 0 (1 byte), 1 (one half-word), ++ 2 (one word), or 3 (two words); WS should return the number of wait-states. */ + + static void +-fetch_bytes (asi, mem, data, sz) +- int asi; ++store_bytes (mem, waddr, data, sz, ws) + unsigned char *mem; ++ uint32 waddr; + uint32 *data; +- int sz; ++ int32 sz; ++ int32 *ws; + { +- if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN +- || asi == 8 || asi == 9) { +- switch (sz) { +- case 3: +- data[1] = (((uint32) mem[7]) & 0xff) | +- ((((uint32) mem[6]) & 0xff) << 8) | +- ((((uint32) mem[5]) & 0xff) << 16) | +- ((((uint32) mem[4]) & 0xff) << 24); +- /* Fall through to 2 */ +- case 2: +- data[0] = (((uint32) mem[3]) & 0xff) | +- ((((uint32) mem[2]) & 0xff) << 8) | +- ((((uint32) mem[1]) & 0xff) << 16) | +- ((((uint32) mem[0]) & 0xff) << 24); ++ switch (sz) { ++ case 0: ++#ifdef HOST_LITTLE_ENDIAN ++ waddr ^= 3; ++#endif ++ mem[waddr] = *data & 0x0ff; ++ *ws = mem_ramw_ws + 3; + break; + case 1: +- data[0] = (((uint32) mem[1]) & 0xff) | +- ((((uint32) mem[0]) & 0xff) << 8); +- break; +- case 0: +- data[0] = mem[0] & 0xff; ++#ifdef HOST_LITTLE_ENDIAN ++ waddr ^= 2; ++#endif ++ *((unsigned short *) &(mem[waddr])) = *data & 0x0ffff; ++ *ws = mem_ramw_ws + 3; + break; +- +- } +- } else { +- switch (sz) { +- case 3: +- data[1] = ((((uint32) mem[7]) & 0xff) << 24) | +- ((((uint32) mem[6]) & 0xff) << 16) | +- ((((uint32) mem[5]) & 0xff) << 8) | +- (((uint32) mem[4]) & 0xff); +- /* Fall through to 4 */ + case 2: +- data[0] = ((((uint32) mem[3]) & 0xff) << 24) | +- ((((uint32) mem[2]) & 0xff) << 16) | +- ((((uint32) mem[1]) & 0xff) << 8) | +- (((uint32) mem[0]) & 0xff); +- break; +- case 1: +- data[0] = ((((uint32) mem[1]) & 0xff) << 8) | +- (((uint32) mem[0]) & 0xff); ++ *((uint32 *) &(mem[waddr])) = *data; ++ *ws = mem_ramw_ws; + break; +- case 0: +- data[0] = mem[0] & 0xff; ++ case 3: ++ *((uint32 *) &(mem[waddr])) = data[0]; ++ *((uint32 *) &(mem[waddr + 4])) = data[1]; ++ *ws = 2 * mem_ramw_ws + STD_WS; + break; +- } + } + } + + +-/* Store data in target byte order. MEM points to location to store data; +- DATA points to words in host byte order to be stored. SZ contains log(2) +- of the number of bytes to retrieve, and can be 0 (1 byte), 1 (one half-word), +- 2 (one word), or 3 (two words). */ ++/* Memory emulation */ + +-static void +-store_bytes (mem, data, sz) +- unsigned char *mem; +- uint32 *data; +- int sz; ++static int ++memory_iread(addr, data, ws) ++ uint32 addr; ++ uint32 *data; ++ int32 *ws; + { +- if (CURRENT_TARGET_BYTE_ORDER == LITTLE_ENDIAN) { +- switch (sz) { +- case 3: +- mem[7] = (data[1] >> 24) & 0xff; +- mem[6] = (data[1] >> 16) & 0xff; +- mem[5] = (data[1] >> 8) & 0xff; +- mem[4] = data[1] & 0xff; +- /* Fall through to 2 */ +- case 2: +- mem[3] = (data[0] >> 24) & 0xff; +- mem[2] = (data[0] >> 16) & 0xff; +- /* Fall through to 1 */ +- case 1: +- mem[1] = (data[0] >> 8) & 0xff; +- /* Fall through to 0 */ +- case 0: +- mem[0] = data[0] & 0xff; +- break; +- } +- } else { +- switch (sz) { +- case 3: +- mem[7] = data[1] & 0xff; +- mem[6] = (data[1] >> 8) & 0xff; +- mem[5] = (data[1] >> 16) & 0xff; +- mem[4] = (data[1] >> 24) & 0xff; +- /* Fall through to 2 */ +- case 2: +- mem[3] = data[0] & 0xff; +- mem[2] = (data[0] >> 8) & 0xff; +- mem[1] = (data[0] >> 16) & 0xff; +- mem[0] = (data[0] >> 24) & 0xff; +- break; +- case 1: +- mem[1] = data[0] & 0xff; +- mem[0] = (data[0] >> 8) & 0xff; +- break; +- case 0: +- mem[0] = data[0] & 0xff; +- break; +- +- } ++ uint32 asi; ++ if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) { ++ *data = *((uint32 *) & (ramb[addr & mem_rammask & ~3])); ++ *ws = mem_ramr_ws; ++ return (0); ++ } else if (addr < mem_romsz) { ++ *data = *((uint32 *) & (romb[addr & ~3])); ++ *ws = mem_romr_ws; ++ return (0); + } +-} +- + +-/* Memory emulation */ ++ printf("Memory exception at %x (illegal address)\n", addr); ++ if (sregs.psr & 0x080) asi = 9; else asi = 8; ++ set_sfsr(UIMP_ACC, addr, asi, 1); ++ *ws = MEM_EX_WS; ++ return (1); ++} + +-int +-memory_read(asi, addr, data, sz, ws) +- int32 asi; ++static int ++memory_read(addr, data, sz, ws) + uint32 addr; + uint32 *data; + int32 sz; + int32 *ws; + { + int32 mexc; ++ int32 asi; + + #ifdef ERRINJ + if (errmec) { + if (sis_verbose) + printf("Inserted MEC error %d\n",errmec); ++ if (sregs.psr & 0x080) asi = 11; else asi = 10; + set_sfsr(errmec, addr, asi, 1); + if (errmec == 5) mecparerror(); + if (errmec == 6) iucomperr(); +@@ -1663,10 +1659,11 @@ memory_read(asi, addr, data, sz, ws) + #endif + + if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) { +- fetch_bytes (asi, &ramb[addr & mem_rammask], data, sz); ++ *data = *((uint32 *) & (ramb[addr & mem_rammask & ~3])); + *ws = mem_ramr_ws; + return (0); + } else if ((addr >= MEC_START) && (addr < MEC_END)) { ++ if (sregs.psr & 0x080) asi = 11; else asi = 10; + mexc = mec_read(addr, asi, data); + if (mexc) { + set_sfsr(MEC_ACC, addr, asi, 1); +@@ -1681,7 +1678,7 @@ memory_read(asi, addr, data, sz, ws) + } else if (era) { + if ((addr < 0x100000) || + ((addr>= 0x80000000) && (addr < 0x80100000))) { +- fetch_bytes (asi, &romb[addr & ROM_MASK], data, sz); ++ *data = *((uint32 *) & (romb[addr & ROM_MASK & ~3])); + *ws = 4; + return (0); + } else if ((addr >= 0x10000000) && +@@ -1692,13 +1689,13 @@ memory_read(asi, addr, data, sz, ws) + } + + } else if (addr < mem_romsz) { +- fetch_bytes (asi, &romb[addr], data, sz); ++ *data = *((uint32 *) & (romb[addr & ~3])); + *ws = mem_romr_ws; + return (0); + + #else + } else if (addr < mem_romsz) { +- fetch_bytes (asi, &romb[addr], data, sz); ++ *data = *((uint32 *) & (romb[addr & ~3])); + *ws = mem_romr_ws; + return (0); + #endif +@@ -1706,19 +1703,30 @@ memory_read(asi, addr, data, sz, ws) + } + + printf("Memory exception at %x (illegal address)\n", addr); ++ if (sregs.psr & 0x080) asi = 11; else asi = 10; + set_sfsr(UIMP_ACC, addr, asi, 1); + *ws = MEM_EX_WS; + return (1); + } + +-int +-memory_write(asi, addr, data, sz, ws) ++static int ++memory_read_asi(asi, addr, data, sz, ws) + int32 asi; + uint32 addr; + uint32 *data; + int32 sz; + int32 *ws; + { ++ return(memory_read(addr, data, sz, ws)); ++} ++ ++static int ++memory_write(addr, data, sz, ws) ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ + uint32 byte_addr; + uint32 byte_mask; + uint32 waddr; +@@ -1726,11 +1734,13 @@ memory_write(asi, addr, data, sz, ws) + int32 mexc; + int i; + int wphit[2]; ++ int32 asi; + + #ifdef ERRINJ + if (errmec) { + if (sis_verbose) + printf("Inserted MEC error %d\n",errmec); ++ if (sregs.psr & 0x080) asi = 11; else asi = 10; + set_sfsr(errmec, addr, asi, 0); + if (errmec == 5) mecparerror(); + if (errmec == 6) iucomperr(); +@@ -1743,6 +1753,7 @@ memory_write(asi, addr, data, sz, ws) + if (mem_accprot) { + + waddr = (addr & 0x7fffff) >> 2; ++ if (sregs.psr & 0x080) asi = 11; else asi = 10; + for (i = 0; i < 2; i++) + wphit[i] = + (((asi == 0xa) && (mec_wpr[i] & 1)) || +@@ -1761,22 +1772,12 @@ memory_write(asi, addr, data, sz, ws) + } + } + +- store_bytes (&ramb[addr & mem_rammask], data, sz); +- +- switch (sz) { +- case 0: +- case 1: +- *ws = mem_ramw_ws + 3; +- break; +- case 2: +- *ws = mem_ramw_ws; +- break; +- case 3: +- *ws = 2 * mem_ramw_ws + STD_WS; +- break; +- } ++ waddr = addr & mem_rammask; ++ store_bytes (ramb, waddr, data, sz, ws); + return (0); ++ + } else if ((addr >= MEC_START) && (addr < MEC_END)) { ++ if (sregs.psr & 0x080) asi = 11; else asi = 10; + if ((sz != 2) || (asi != 0xb)) { + set_sfsr(MEC_ACC, addr, asi, 0); + *ws = MEM_EX_WS; +@@ -1798,7 +1799,7 @@ memory_write(asi, addr, data, sz, ws) + ((addr < 0x100000) || ((addr >= 0x80000000) && (addr < 0x80100000)))) { + addr &= ROM_MASK; + *ws = sz == 3 ? 8 : 4; +- store_bytes (&romb[addr], data, sz); ++ store_bytes (romb, addr, data, sz, ws); + return (0); + } else if ((addr >= 0x10000000) && + (addr < (0x10000000 + (512 << (mec_iocr & 0x0f)))) && +@@ -1814,7 +1815,7 @@ memory_write(asi, addr, data, sz, ws) + *ws = mem_romw_ws + 1; + if (sz == 3) + *ws += mem_romw_ws + STD_WS; +- store_bytes (&romb[addr], data, sz); ++ store_bytes (romb, addr, data, sz, ws); + return (0); + + #else +@@ -1825,7 +1826,7 @@ memory_write(asi, addr, data, sz, ws) + *ws = mem_romw_ws + 1; + if (sz == 3) + *ws += mem_romw_ws + STD_WS; +- store_bytes (&romb[addr], data, sz); ++ store_bytes (romb, addr, data, sz, ws); + return (0); + + #endif +@@ -1833,10 +1834,22 @@ memory_write(asi, addr, data, sz, ws) + } + + *ws = MEM_EX_WS; ++ if (sregs.psr & 0x080) asi = 11; else asi = 10; + set_sfsr(UIMP_ACC, addr, asi, 0); + return (1); + } + ++static int ++memory_write_asi(asi, addr, data, sz, ws) ++ int32 asi; ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ return(memory_write(addr, data, sz, ws)); ++} ++ + static unsigned char * + get_mem_ptr(addr, size) + uint32 addr; +@@ -1858,7 +1871,7 @@ get_mem_ptr(addr, size) + return ((char *) -1); + } + +-int ++static int + sis_memory_write(addr, data, length) + uint32 addr; + const unsigned char *data; +@@ -1873,13 +1886,19 @@ sis_memory_write(addr, data, length) + return (length); + } + +-int ++static int + sis_memory_read(addr, data, length) + uint32 addr; + char *data; + uint32 length; + { + char *mem; ++ int ws; ++ ++ if (length == 4) { ++ memory_read(addr, data, length, &ws); ++ return(4); ++ } + + if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) + return (0); +@@ -1887,3 +1906,35 @@ sis_memory_read(addr, data, length) + memcpy(data, mem, length); + return (length); + } ++ ++static void ++boot_init () ++{ ++ mec_write(MEC_WCR, 0); /* zero waitstates */ ++ mec_write(MEC_TRAPD, 0); /* turn off watch-dog */ ++ mec_write(MEC_RTC_SCALER, sregs.freq-1); /* generate 1 MHz RTC tick */ ++ mec_write(MEC_MEMCFG, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */ ++ sregs.wim = 2; ++ sregs.psr = 0x110010e0; ++ sregs.r[30] = RAM_END; ++ sregs.r[14] = sregs.r[30] - 96*4; ++ mec_mcr |= 1; /* power-down enabled */ ++} ++ ++struct memsys erc32sys = { ++ init_sim, ++ reset, ++ error_mode, ++ sim_halt, ++ exit_sim, ++ init_stdio, ++ restore_stdio, ++ memory_iread, ++ memory_read, ++ memory_read_asi, ++ memory_write, ++ memory_write_asi, ++ sis_memory_write, ++ sis_memory_read, ++ boot_init ++}; +diff --git a/sim/erc32/exec.c b/sim/erc32/exec.c +index dc86ba3..f812ad9 100644 +--- a/sim/erc32/exec.c ++++ b/sim/erc32/exec.c +@@ -21,11 +21,9 @@ + + #include "config.h" + #include "sis.h" +-#include "end.h" + #include + #include + +-extern int32 sis_verbose, sparclite; + int ext_irl = 0; + + /* Load/store interlock delay */ +@@ -229,10 +227,6 @@ static int fpexec (uint32 op3, uint32 rd, uint32 rs1, uint32 rs2, + struct pstate *sregs); + static int chk_asi (struct pstate *sregs, uint32 *asi, uint32 op3); + +- +-extern struct estate ebase; +-extern int32 nfp,ift; +- + #ifdef ERRINJ + extern uint32 errtt, errftt; + #endif +@@ -371,6 +365,36 @@ div64 (uint32 n1_hi, uint32 n1_low, uint32 n2, uint32 *result, int msigned) + } + + ++static int ++extract_short(uint32 data, uint32 address) ++{ ++ return((data>>((2 - (address & 2))*8)) & 0xffff); ++} ++ ++static int ++extract_short_signed(uint32 data, uint32 address) ++{ ++ uint32 tmp; ++ tmp = ((data>>((2 - (address & 2))*8)) & 0xffff); ++ if (tmp & 0x8000) tmp |= 0xffff0000; ++ return(tmp); ++} ++ ++static int ++extract_byte(uint32 data, uint32 address) ++{ ++ return((data>>((3 - (address & 3))*8)) & 0xff); ++} ++ ++static int ++extract_byte_signed(uint32 data, uint32 address) ++{ ++ uint32 tmp; ++ tmp = ((data>>((3 - (address & 3))*8)) & 0xff); ++ if (tmp & 0x80) tmp |= 0xffffff00; ++ return(tmp); ++} ++ + int + dispatch_instruction(sregs) + struct pstate *sregs; +@@ -1041,17 +1065,17 @@ dispatch_instruction(sregs) + *rdd = sregs->psr; + break; + case RDY: +- if (!sparclite) ++ if ((!sparclite) && (cputype != CPU_LEON3)) + *rdd = sregs->y; + else { + int rs1_is_asr = (sregs->inst >> 14) & 0x1f; + if ( 0 == rs1_is_asr ) + *rdd = sregs->y; +- else if ( 17 == rs1_is_asr ) ++ else if ( 17 == rs1_is_asr ) { + *rdd = sregs->asr17; ++ } + else { + sregs->trap = TRAP_UNIMP; +- break; + } + } + break; +@@ -1078,7 +1102,8 @@ dispatch_instruction(sregs) + sregs->trap = TRAP_PRIVI; + break; + } +- sregs->psr = (rs1 ^ operand2) & 0x00f03fff; ++ sregs->psr = (sregs->psr & 0xff000000) | ++ (rs1 ^ operand2) & 0x00f03fff; + break; + case WRWIM: + if (!(sregs->psr & PSR_S)) { +@@ -1096,13 +1121,19 @@ dispatch_instruction(sregs) + ((rs1 ^ operand2) & 0xfffff000); + break; + case WRY: +- if (!sparclite) ++ if ((!sparclite) && (cputype != CPU_LEON3)) + sregs->y = (rs1 ^ operand2); + else { + if ( 0 == rd ) + sregs->y = (rs1 ^ operand2); +- else if ( 17 == rd ) +- sregs->asr17 = (rs1 ^ operand2); ++ else if ( 17 == rd ) { ++ if (sparclite) ++ sregs->asr17 = (rs1 ^ operand2); ++ } ++ else if ( 19 == rd ) { ++ if (cputype == CPU_LEON3) ++ wait_for_irq(); ++ } + else { + sregs->trap = TRAP_UNIMP; + break; +@@ -1202,6 +1233,32 @@ dispatch_instruction(sregs) + switch (op3) { + case LDDA: + if (!chk_asi(sregs, &asi, op3)) break; ++ if (address & 0x7) { ++ sregs->trap = TRAP_UNALI; ++ break; ++ } ++ if (rd & 1) { ++ rd &= 0x1e; ++ if (rd > 7) ++ rdd = &(sregs->r[(cwp + rd) & 0x7f]); ++ else ++ rdd = &(sregs->g[rd]); ++ } ++ mexc = ms->memory_read_asi(asi, address, ddata, 2, &ws); ++ sregs->hold += ws; ++ mexc |= ms->memory_read_asi(asi, address+4, &ddata[1], 2, &ws); ++ sregs->hold += ws; ++ sregs->icnt = T_LDD; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ } else { ++ rdd[0] = ddata[0]; ++ rdd[1] = ddata[1]; ++#ifdef STAT ++ sregs->nload++; /* Double load counts twice */ ++#endif ++ } ++ break; + case LDD: + if (address & 0x7) { + sregs->trap = TRAP_UNALI; +@@ -1214,8 +1271,10 @@ dispatch_instruction(sregs) + else + rdd = &(sregs->g[rd]); + } +- mexc = memory_read(asi, address, ddata, 3, &ws); +- sregs->hold += ws * 2; ++ mexc = ms->memory_read(address, ddata, 2, &ws); ++ sregs->hold += ws; ++ mexc |= ms->memory_read(address+4, &ddata[1], 2, &ws); ++ sregs->hold += ws; + sregs->icnt = T_LDD; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1230,12 +1289,24 @@ dispatch_instruction(sregs) + + case LDA: + if (!chk_asi(sregs, &asi, op3)) break; ++ if (address & 0x3) { ++ sregs->trap = TRAP_UNALI; ++ break; ++ } ++ mexc = ms->memory_read_asi(asi, address, &data, 2, &ws); ++ sregs->hold += ws; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ } else { ++ *rdd = data; ++ } ++ break; + case LD: + if (address & 0x3) { + sregs->trap = TRAP_UNALI; + break; + } +- mexc = memory_read(asi, address, &data, 2, &ws); ++ mexc = ms->memory_read(address, &data, 2, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1245,17 +1316,37 @@ dispatch_instruction(sregs) + break; + case LDSTUBA: + if (!chk_asi(sregs, &asi, op3)) break; ++ mexc = ms->memory_read_asi(asi, address, &data, 0, &ws); ++ sregs->hold += ws; ++ sregs->icnt = T_LDST; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ break; ++ } ++ data = extract_byte(data, address); ++ *rdd = data; ++ data = 0x0ff; ++ mexc = ms->memory_write_asi(asi, address, &data, 0, &ws); ++ sregs->hold += ws; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ } ++#ifdef STAT ++ sregs->nload++; ++#endif ++ break; + case LDSTUB: +- mexc = memory_read(asi, address, &data, 0, &ws); ++ mexc = ms->memory_read(address, &data, 0, &ws); + sregs->hold += ws; + sregs->icnt = T_LDST; + if (mexc) { + sregs->trap = TRAP_DEXC; + break; + } ++ data = extract_byte(data, address); + *rdd = data; + data = 0x0ff; +- mexc = memory_write(asi, address, &data, 0, &ws); ++ mexc = ms->memory_write(address, &data, 0, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1267,35 +1358,67 @@ dispatch_instruction(sregs) + case LDSBA: + case LDUBA: + if (!chk_asi(sregs, &asi, op3)) break; ++ mexc = ms->memory_read_asi(asi, address, &data, 0, &ws); ++ sregs->hold += ws; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ break; ++ } ++ if (op3 == LDSB) ++ data = extract_byte_signed(data, address); ++ else ++ data = extract_byte(data, address); ++ *rdd = data; ++ break; + case LDSB: + case LDUB: +- mexc = memory_read(asi, address, &data, 0, &ws); ++ mexc = ms->memory_read(address, &data, 0, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; + break; + } +- if ((op3 == LDSB) && (data & 0x80)) +- data |= 0xffffff00; ++ if (op3 == LDSB) ++ data = extract_byte_signed(data, address); ++ else ++ data = extract_byte(data, address); + *rdd = data; + break; + case LDSHA: + case LDUHA: + if (!chk_asi(sregs, &asi, op3)) break; ++ if (address & 0x1) { ++ sregs->trap = TRAP_UNALI; ++ break; ++ } ++ mexc = ms->memory_read_asi(asi, address, &data, 1, &ws); ++ sregs->hold += ws; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ break; ++ } ++ if (op3 == LDSH) ++ data = extract_short_signed(data, address); ++ else ++ data = extract_short(data, address); ++ *rdd = data; ++ break; + case LDSH: + case LDUH: + if (address & 0x1) { + sregs->trap = TRAP_UNALI; + break; + } +- mexc = memory_read(asi, address, &data, 1, &ws); ++ mexc = ms->memory_read(address, &data, 1, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; + break; + } +- if ((op3 == LDSH) && (data & 0x8000)) +- data |= 0xffff0000; ++ if (op3 == LDSH) ++ data = extract_short_signed(data, address); ++ else ++ data = extract_short(data, address); + *rdd = data; + break; + case LDF: +@@ -1312,7 +1435,7 @@ dispatch_instruction(sregs) + (sregs->frs2 == rd)) + sregs->fhold += (sregs->ftime - ebase.simtime); + } +- mexc = memory_read(asi, address, &data, 2, &ws); ++ mexc = ms->memory_read(address, &data, 2, &ws); + sregs->hold += ws; + sregs->flrd = rd; + sregs->ltime = ebase.simtime + sregs->icnt + FLSTHOLD + +@@ -1338,8 +1461,10 @@ dispatch_instruction(sregs) + ((sregs->frs2 >> 1) == (rd >> 1))) + sregs->fhold += (sregs->ftime - ebase.simtime); + } +- mexc = memory_read(asi, address, ddata, 3, &ws); +- sregs->hold += ws * 2; ++ mexc = ms->memory_read(address, ddata, 2, &ws); ++ sregs->hold += ws; ++ mexc |= ms->memory_read(address+4, &ddata[1], 2, &ws); ++ sregs->hold += ws; + sregs->icnt = T_LDD; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1367,7 +1492,7 @@ dispatch_instruction(sregs) + sregs->trap = TRAP_UNALI; + break; + } +- mexc = memory_read(asi, address, &data, 2, &ws); ++ mexc = ms->memory_read(address, &data, 2, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1389,7 +1514,7 @@ dispatch_instruction(sregs) + if (ebase.simtime < sregs->ftime) { + sregs->fhold += (sregs->ftime - ebase.simtime); + } +- mexc = memory_write(asi, address, &sregs->fsr, 2, &ws); ++ mexc = ms->memory_write(address, &sregs->fsr, 2, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1398,12 +1523,22 @@ dispatch_instruction(sregs) + + case STA: + if (!chk_asi(sregs, &asi, op3)) break; ++ if (address & 0x3) { ++ sregs->trap = TRAP_UNALI; ++ break; ++ } ++ mexc = ms->memory_write_asi(asi, address, rdd, 2, &ws); ++ sregs->hold += ws; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ } ++ break; + case ST: + if (address & 0x3) { + sregs->trap = TRAP_UNALI; + break; + } +- mexc = memory_write(asi, address, rdd, 2, &ws); ++ mexc = ms->memory_write(address, rdd, 2, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1411,8 +1546,14 @@ dispatch_instruction(sregs) + break; + case STBA: + if (!chk_asi(sregs, &asi, op3)) break; ++ mexc = ms->memory_write_asi(asi, address, rdd, 0, &ws); ++ sregs->hold += ws; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ } ++ break; + case STB: +- mexc = memory_write(asi, address, rdd, 0, &ws); ++ mexc = ms->memory_write(address, rdd, 0, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1420,6 +1561,28 @@ dispatch_instruction(sregs) + break; + case STDA: + if (!chk_asi(sregs, &asi, op3)) break; ++ if (address & 0x7) { ++ sregs->trap = TRAP_UNALI; ++ break; ++ } ++ if (rd & 1) { ++ rd &= 0x1e; ++ if (rd > 7) ++ rdd = &(sregs->r[(cwp + rd) & 0x7f]); ++ else ++ rdd = &(sregs->g[rd]); ++ } ++ mexc = ms->memory_write_asi(asi, address, rdd, 3, &ws); ++ sregs->hold += ws; ++ sregs->icnt = T_STD; ++#ifdef STAT ++ sregs->nstore++; /* Double store counts twice */ ++#endif ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ break; ++ } ++ break; + case STD: + if (address & 0x7) { + sregs->trap = TRAP_UNALI; +@@ -1432,7 +1595,7 @@ dispatch_instruction(sregs) + else + rdd = &(sregs->g[rd]); + } +- mexc = memory_write(asi, address, rdd, 3, &ws); ++ mexc = ms->memory_write(address, rdd, 3, &ws); + sregs->hold += ws; + sregs->icnt = T_STD; + #ifdef STAT +@@ -1461,7 +1624,7 @@ dispatch_instruction(sregs) + break; + } + rdd = &(sregs->fpq[0]); +- mexc = memory_write(asi, address, rdd, 3, &ws); ++ mexc = ms->memory_write(address, rdd, 3, &ws); + sregs->hold += ws; + sregs->icnt = T_STD; + #ifdef STAT +@@ -1477,12 +1640,22 @@ dispatch_instruction(sregs) + break; + case STHA: + if (!chk_asi(sregs, &asi, op3)) break; ++ if (address & 0x1) { ++ sregs->trap = TRAP_UNALI; ++ break; ++ } ++ mexc = ms->memory_write_asi(asi, address, rdd, 1, &ws); ++ sregs->hold += ws; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ } ++ break; + case STH: + if (address & 0x1) { + sregs->trap = TRAP_UNALI; + break; + } +- mexc = memory_write(asi, address, rdd, 1, &ws); ++ mexc = ms->memory_write(address, rdd, 1, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1501,7 +1674,7 @@ dispatch_instruction(sregs) + if (sregs->frd == rd) + sregs->fhold += (sregs->ftime - ebase.simtime); + } +- mexc = memory_write(asi, address, &sregs->fsi[rd], 2, &ws); ++ mexc = ms->memory_write(address, &sregs->fsi[rd], 2, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; +@@ -1521,7 +1694,7 @@ dispatch_instruction(sregs) + if ((sregs->frd == rd) || (sregs->frd + 1 == rd)) + sregs->fhold += (sregs->ftime - ebase.simtime); + } +- mexc = memory_write(asi, address, &sregs->fsi[rd], 3, &ws); ++ mexc = ms->memory_write(address, &sregs->fsi[rd], 3, &ws); + sregs->hold += ws; + sregs->icnt = T_STD; + #ifdef STAT +@@ -1533,18 +1706,40 @@ dispatch_instruction(sregs) + break; + case SWAPA: + if (!chk_asi(sregs, &asi, op3)) break; ++ if (address & 0x3) { ++ sregs->trap = TRAP_UNALI; ++ break; ++ } ++ mexc = ms->memory_read_asi(asi, address, &data, 2, &ws); ++ sregs->hold += ws; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ break; ++ } ++ mexc = ms->memory_write_asi(asi, address, rdd, 2, &ws); ++ sregs->hold += ws; ++ sregs->icnt = T_LDST; ++ if (mexc) { ++ sregs->trap = TRAP_DEXC; ++ break; ++ } else ++ *rdd = data; ++#ifdef STAT ++ sregs->nload++; ++#endif ++ break; + case SWAP: + if (address & 0x3) { + sregs->trap = TRAP_UNALI; + break; + } +- mexc = memory_read(asi, address, &data, 2, &ws); ++ mexc = ms->memory_read(address, &data, 2, &ws); + sregs->hold += ws; + if (mexc) { + sregs->trap = TRAP_DEXC; + break; + } +- mexc = memory_write(asi, address, rdd, 2, &ws); ++ mexc = ms->memory_write(address, rdd, 2, &ws); + sregs->hold += ws; + sregs->icnt = T_LDST; + if (mexc) { +@@ -1696,7 +1891,7 @@ fpexec(op3, rd, rs1, rs2, sregs) + but what about machines where float values are different endianness + from integer values? */ + +-#ifdef HOST_LITTLE_ENDIAN_FLOAT ++#ifdef HOST_LITTLE_ENDIAN + rs1 &= 0x1f; + switch (opf) { + case FADDd: +@@ -1780,7 +1975,7 @@ fpexec(op3, rd, rs1, rs2, sregs) + sregs->ftime += T_FDIVd; + break; + case FMOVs: +- sregs->fs[rd] = sregs->fs[rs2]; ++ sregs->fsi[rd] = sregs->fsi[rs2]; + sregs->ftime += T_FMOVs; + sregs->frs1 = 32; /* rs1 ignored */ + break; +@@ -1874,7 +2069,7 @@ fpexec(op3, rd, rs1, rs2, sregs) + + accex = get_accex(); + +-#ifdef HOST_LITTLE_ENDIAN_FLOAT ++#ifdef HOST_LITTLE_ENDIAN + switch (opf) { + case FADDd: + case FDIVd: +@@ -1962,7 +2157,7 @@ execute_trap(sregs) + sregs->pc = sregs->tbr; + sregs->npc = sregs->tbr + 4; + +- if ( 0 != (1 & sregs->asr17) ) { ++ if ( 0 != (1 & (sregs->asr17 >> 13)) ) { + /* single vector trapping! */ + sregs->pc = sregs->tbr & 0xfffff000; + sregs->npc = sregs->pc + 4; +@@ -1978,8 +2173,6 @@ execute_trap(sregs) + + } + +-extern struct irqcell irqarr[16]; +- + int + check_interrupts(sregs) + struct pstate *sregs; +@@ -2011,7 +2204,13 @@ init_regs(sregs) + sregs->npc = 4; + sregs->trap = 0; + sregs->psr &= 0x00f03fdf; +- sregs->psr |= 0x080; /* Set supervisor bit */ ++ if (cputype == CPU_LEON3) ++ sregs->psr |= 0xF3000080; /* Set supervisor bit */ ++ else ++ if (cputype == CPU_LEON2) ++ sregs->psr |= 0x00000080; /* Set supervisor bit */ ++ else ++ sregs->psr |= 0x11000080; /* Set supervisor bit */ + sregs->breakpoint = 0; + sregs->annul = 0; + sregs->fpstate = FP_EXE_MODE; +@@ -2021,7 +2220,7 @@ init_regs(sregs) + sregs->err_mode = 0; + ext_irl = 0; + sregs->g[0] = 0; +-#ifdef HOST_LITTLE_ENDIAN_FLOAT ++#ifdef HOST_LITTLE_ENDIAN + sregs->fdp = (float32 *) sregs->fd; + sregs->fsi = (int32 *) sregs->fs; + #else +@@ -2040,4 +2239,8 @@ init_regs(sregs) + + sregs->rett_err = 0; + sregs->jmpltime = 0; ++ if (cputype == CPU_LEON3) { ++ sregs->asr17 = 0x107; ++ if (!nfp) sregs->asr17 |= (3 << 10); /* Meiko FPU */ ++ } + } +diff --git a/sim/erc32/float.c b/sim/erc32/float.c +index 598b7cc..ce92a39 100644 +--- a/sim/erc32/float.c ++++ b/sim/erc32/float.c +@@ -38,7 +38,6 @@ + + extern uint32 _get_sw (void); + extern uint32 _get_cw (void); +-static void __setfpucw (unsigned short fpu_control); + + /* This host dependent routine should return the accrued exceptions */ + int +@@ -46,7 +45,7 @@ get_accex() + { + #ifdef sparc + return ((_get_fsr_raw() >> 5) & 0x1F); +-#elif i386 ++#elif defined(i386) || defined(__x86_64__) + uint32 accx; + + accx = _get_sw() & 0x3f; +@@ -66,7 +65,7 @@ clear_accex() + { + #ifdef sparc + set_fsr((_get_fsr_raw() & ~0x3e0)); +-#elif i386 ++#elif defined(i386) || defined(__x86_64__) + asm("\n" + ".text\n" + " fnclex\n" +@@ -84,9 +83,8 @@ uint32 fsr; + { + #ifdef sparc + _set_fsr_raw(fsr & ~0x0f800000); +-#elif i386 +- void __setfpucw(unsigned short fpu_control); +- uint32 rawfsr; ++#elif defined(i386) || defined(__x86_64__) ++ unsigned short rawfsr; + + fsr >>= 30; + switch (fsr) { +@@ -102,9 +100,8 @@ uint32 fsr; + fsr = 1; + break; + } +- rawfsr = _get_cw(); +- rawfsr |= (fsr << 10) | 0x3ff; +- __setfpucw(rawfsr); ++ rawfsr = (fsr << 10) | 0x2FF; /* double precision, all traps masked */ ++ __asm__ volatile ("fldcw %0" :: "m" (rawfsr)); + #else + #warning no fpu trap support for this target + #endif +@@ -175,45 +172,36 @@ uint32 fsr; + "\n" + " "); + ++#elif defined(__x86_64__) ++ asm ("\n" ++"\n" ++".text\n" ++".align 8\n" ++".globl _get_sw, __get_sw\n" ++"__get_sw:\n" ++"_get_sw:\n" ++" pushq %rbp\n" ++" movq %rsp, %rbp\n" ++" movl $0, %eax\n" ++" fnstsw %ax\n" ++" movq %rbp, %rsp\n" ++" popq %rbp\n" ++" ret\n" ++".align 8\n" ++".globl _get_cw, __get_cw\n" ++"__get_cw:\n" ++"_get_cw:\n" ++" pushq %rbp\n" ++" movq %rsp, %rbp\n" ++" subq $2, %rsp\n" ++" fnstcw -2(%rbp)\n" ++" movw -2(%rbp), %ax\n" ++" movq %rbp, %rsp\n" ++" popq %rbp\n" ++" ret\n" ++" "); + + #else + #warning no fpu trap support for this target + #endif + +-#if i386 +-/* #if defined _WIN32 || defined __GO32__ */ +-/* This is so floating exception handling works on NT +- These definitions are from the linux fpu_control.h, which +- doesn't exist on NT. +- +- default to: +- - extended precision +- - rounding to nearest +- - exceptions on overflow, zero divide and NaN +-*/ +-#define _FPU_DEFAULT 0x1372 +-#define _FPU_RESERVED 0xF0C0 /* Reserved bits in cw */ +- +-static void +-__setfpucw(unsigned short fpu_control) +-{ +- volatile unsigned short cw; +- +- /* If user supplied _fpu_control, use it ! */ +- if (!fpu_control) +- { +- /* use defaults */ +- fpu_control = _FPU_DEFAULT; +- } +- /* Get Control Word */ +- __asm__ volatile ("fnstcw %0" : "=m" (cw) : ); +- +- /* mask in */ +- cw &= _FPU_RESERVED; +- cw = cw | (fpu_control & ~_FPU_RESERVED); +- +- /* set cw */ +- __asm__ volatile ("fldcw %0" :: "m" (cw)); +-} +-/* #endif */ +-#endif +diff --git a/sim/erc32/func.c b/sim/erc32/func.c +index d001c58..6f985a1 100644 +--- a/sim/erc32/func.c ++++ b/sim/erc32/func.c +@@ -26,20 +26,26 @@ + #include + #include + #include "sis.h" +-#include "end.h" + #include + #include "sim-config.h" + + + #define VAL(x) strtoul(x,(char **)NULL,0) + +-extern int current_target_byte_order; ++/* The target's byte order is big-endian by default until we load a ++ little-endian program. */ ++int current_target_byte_order = BIG_ENDIAN; ++ ++int dumbio = 0; /* normal, smart, terminal oriented IO by default */ + struct disassemble_info dinfo; + struct pstate sregs; +-extern struct estate ebase; ++struct estate ebase; ++struct evcell evbuf[EVENT_MAX]; ++struct irqcell irqarr[16]; ++ + int ctrl_c = 0; + int sis_verbose = 0; +-char *sis_version = "2.7.5"; ++char *sis_version = "2.8"; + int nfp = 0; + int ift = 0; + int wrp = 0; +@@ -50,8 +56,11 @@ int sparclite = 0; /* emulating SPARClite instructions? */ + int sparclite_board = 0; /* emulating SPARClite board RAM? */ + char uart_dev1[128] = ""; + char uart_dev2[128] = ""; +-extern int ext_irl; + uint32 last_load_addr = 0; ++int nouartrx = 0; ++host_callback *sim_callback; ++struct memsys *ms = &erc32sys; ++int cputype = 0; /* 0 = erc32, 3 = leon3 */ + + #ifdef ERRINJ + uint32 errcnt = 0; +@@ -81,6 +90,7 @@ batch(sregs, fname) + { + FILE *fp; + char lbuf[1024]; ++ char *tmp; + + if ((fp = fopen(fname, "r")) == NULL) { + fprintf(stderr, "couldn't open batch file %s\n", fname); +@@ -88,7 +98,7 @@ batch(sregs, fname) + } + while (!feof(fp)) { + lbuf[0] = 0; +- fgets(lbuf, 1023, fp); ++ tmp = fgets(lbuf, 1023, fp); + if ((strlen(lbuf) > 0) && (lbuf[strlen(lbuf) - 1] == '\n')) + lbuf[strlen(lbuf) - 1] = 0; + printf("sis> %s\n", lbuf); +@@ -382,7 +392,7 @@ exec_cmd(sregs, cmd) + { + char *cmd1, *cmd2; + int32 stat; +- uint32 len, i, clen, j; ++ uint32 len, i, clen, j, tmp; + static uint32 daddr = 0; + char *cmdsave; + +@@ -426,7 +436,7 @@ exec_cmd(sregs, cmd) + stat = run_sim(sregs, VAL(cmd1), 0); + } + daddr = sregs->pc; +- sim_halt(); ++ ms->sim_halt(); + } else if (strncmp(cmd1, "debug", clen) == 0) { + if ((cmd1 = strtok(NULL, " \t\n\r")) != NULL) { + sis_verbose = VAL(cmd1); +@@ -468,6 +478,7 @@ exec_cmd(sregs, cmd) + } + sregs->pc = len & ~3; + sregs->npc = sregs->pc + 4; ++ if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init(); + printf("resuming at 0x%08x\n",sregs->pc); + if ((cmd2 = strtok(NULL, " \t\n\r")) != NULL) { + stat = run_sim(sregs, VAL(cmd2), 0); +@@ -475,7 +486,7 @@ exec_cmd(sregs, cmd) + stat = run_sim(sregs, UINT64_MAX, 0); + } + daddr = sregs->pc; +- sim_halt(); ++ ms->sim_halt(); + } else if (strncmp(cmd1, "help", clen) == 0) { + gen_help(); + } else if (strncmp(cmd1, "history", clen) == 0) { +@@ -543,26 +554,31 @@ exec_cmd(sregs, cmd) + ebase.simtime = 0; + reset_all(); + reset_stat(sregs); ++ if (last_load_addr != 0) { ++ sregs->pc = last_load_addr & ~3; ++ sregs->npc = sregs->pc + 4; ++ } ++ if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init(); + if ((cmd1 = strtok(NULL, " \t\n\r")) == NULL) { + stat = run_sim(sregs, UINT64_MAX, 0); + } else { + stat = run_sim(sregs, VAL(cmd1), 0); + } + daddr = sregs->pc; +- sim_halt(); ++ ms->sim_halt(); + } else if (strncmp(cmd1, "shell", clen) == 0) { + if ((cmd1 = strtok(NULL, " \t\n\r")) != NULL) { +- system(&cmdsave[clen]); ++ tmp = system(&cmdsave[clen]); + } + } else if (strncmp(cmd1, "step", clen) == 0) { + stat = run_sim(sregs, 1, 1); + daddr = sregs->pc; +- sim_halt(); ++ ms->sim_halt(); + } else if (strncmp(cmd1, "tcont", clen) == 0) { + sregs->tlimit = limcalc(sregs->freq); + stat = run_sim(sregs, UINT64_MAX, 0); + daddr = sregs->pc; +- sim_halt(); ++ ms->sim_halt(); + } else if (strncmp(cmd1, "tgo", clen) == 0) { + if ((cmd1 = strtok(NULL, " \t\n\r")) == NULL) { + len = last_load_addr; +@@ -575,7 +591,7 @@ exec_cmd(sregs, cmd) + printf("resuming at 0x%08x\n",sregs->pc); + stat = run_sim(sregs, UINT64_MAX, 0); + daddr = sregs->pc; +- sim_halt(); ++ ms->sim_halt(); + } else if (strncmp(cmd1, "tlimit", clen) == 0) { + sregs->tlimit = limcalc(sregs->freq); + if (sregs->tlimit != (uint32) -1) +@@ -589,15 +605,20 @@ exec_cmd(sregs, cmd) + } + printf("\n"); + daddr = sregs->pc; +- sim_halt(); ++ ms->sim_halt(); + } else if (strncmp(cmd1, "trun", clen) == 0) { + ebase.simtime = 0; + reset_all(); + reset_stat(sregs); ++ if (last_load_addr != 0) { ++ sregs->pc = last_load_addr & ~3; ++ sregs->npc = sregs->pc + 4; ++ } ++ if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init(); + sregs->tlimit = limcalc(sregs->freq); + stat = run_sim(sregs, UINT64_MAX, 0); + daddr = sregs->pc; +- sim_halt(); ++ ms->sim_halt(); + } else + printf("syntax error\n"); + } +@@ -611,7 +632,7 @@ void + reset_stat(sregs) + struct pstate *sregs; + { +- sregs->tottime = 0; ++ sregs->tottime = 0.0; + sregs->pwdtime = 0; + sregs->ninst = 0; + sregs->fholdt = 0; +@@ -629,10 +650,10 @@ void + show_stat(sregs) + struct pstate *sregs; + { +- uint32 iinst; +- uint32 stime, tottime; ++ uint64 iinst; ++ uint64 stime; + +- if (sregs->tottime == 0) tottime = 1; else tottime = sregs->tottime; ++ if (sregs->tottime == 0.0) sregs->tottime +=1E-6; + stime = ebase.simtime - sregs->simstart; /* Total simulated time */ + #ifdef STAT + +@@ -640,39 +661,39 @@ show_stat(sregs) + sregs->nbranch; + #endif + +- printf("\n Cycles : %9d\n\r", ebase.simtime - sregs->simstart); +- printf(" Instructions : %9d\n", sregs->ninst); ++ printf("\n Cycles : %9llu\n\r", ebase.simtime - sregs->simstart); ++ printf(" Instructions : %9llu\n", sregs->ninst); + + #ifdef STAT +- printf(" integer : %9.2f %%\n", 100.0 * (float) iinst / (float) sregs->ninst); ++ printf(" integer : %9.2f %%\n", 100.0 * (double) iinst / (double) sregs->ninst); + printf(" load : %9.2f %%\n", +- 100.0 * (float) sregs->nload / (float) sregs->ninst); ++ 100.0 * (double) sregs->nload / (double) sregs->ninst); + printf(" store : %9.2f %%\n", +- 100.0 * (float) sregs->nstore / (float) sregs->ninst); ++ 100.0 * (double) sregs->nstore / (double) sregs->ninst); + printf(" branch : %9.2f %%\n", +- 100.0 * (float) sregs->nbranch / (float) sregs->ninst); ++ 100.0 * (double) sregs->nbranch / (double) sregs->ninst); + printf(" float : %9.2f %%\n", +- 100.0 * (float) sregs->finst / (float) sregs->ninst); ++ 100.0 * (double) sregs->finst / (double) sregs->ninst); + printf(" Integer CPI : %9.2f\n", +- ((float) (stime - sregs->pwdtime - sregs->fholdt - sregs->finst)) ++ ((double) (stime - sregs->pwdtime - sregs->fholdt - sregs->finst)) + / +- (float) (sregs->ninst - sregs->finst)); ++ (double) (sregs->ninst - sregs->finst)); + printf(" Float CPI : %9.2f\n", +- ((float) sregs->fholdt / (float) sregs->finst) + 1.0); ++ ((double) sregs->fholdt / (double) sregs->finst) + 1.0); + #endif + printf(" Overall CPI : %9.2f\n", +- (float) (stime - sregs->pwdtime) / (float) sregs->ninst); +- printf("\n ERC32 performance (%4.1f MHz): %5.2f MOPS (%5.2f MIPS, %5.2f MFLOPS)\n", +- sregs->freq, sregs->freq * (float) sregs->ninst / (float) (stime - sregs->pwdtime), +- sregs->freq * (float) (sregs->ninst - sregs->finst) / +- (float) (stime - sregs->pwdtime), +- sregs->freq * (float) sregs->finst / (float) (stime - sregs->pwdtime)); +- printf(" Simulated ERC32 time : %5.2f ms\n", (float) (ebase.simtime - sregs->simstart) / 1000.0 / sregs->freq); +- printf(" Processor utilisation : %5.2f %%\n", 100.0 * (1.0 - ((float) sregs->pwdtime / (float) stime))); +- printf(" Real-time / simulator-time : 1/%.2f \n", +- ((float) sregs->tottime) / ((float) (stime) / (sregs->freq * 1.0E6))); +- printf(" Simulator performance : %d KIPS\n",sregs->ninst/tottime/1000); +- printf(" Used time (sys + user) : %3d s\n\n", sregs->tottime); ++ (double) (stime - sregs->pwdtime) / (double) sregs->ninst); ++ printf("\n CPU performance (%4.1f MHz) : %5.2f MOPS (%5.2f MIPS, %5.2f MFLOPS)\n", ++ sregs->freq, sregs->freq * (double) sregs->ninst / (double) (stime - sregs->pwdtime), ++ sregs->freq * (double) (sregs->ninst - sregs->finst) / ++ (double) (stime - sregs->pwdtime), ++ sregs->freq * (double) sregs->finst / (double) (stime - sregs->pwdtime)); ++ printf(" Simulated CPU time : %.2f s\n", (double) (ebase.simtime - sregs->simstart) / 1000000.0 / sregs->freq); ++ printf(" Processor utilisation : %.2f %%\n", 100.0 * (1.0 - ((double) sregs->pwdtime / (double) stime))); ++ printf(" Real-time performance : %.2f %%\n", 100.0/ ++ ((sregs->tottime) / ((double) (stime) / (sregs->freq * 1.0E6)))); ++ printf(" Simulator performance : %.2f MIPS\n",(double)(sregs->ninst)/sregs->tottime/1E6); ++ printf(" Used time (sys + user) : %.2f s\n\n", sregs->tottime); + } + + +@@ -708,12 +729,6 @@ init_signals() + } + + +-extern struct disassemble_info dinfo; +- +-struct estate ebase; +-struct evcell evbuf[EVENT_MAX]; +-struct irqcell irqarr[16]; +- + static int + disp_fpu(sregs) + struct pstate *sregs; +@@ -724,7 +739,7 @@ disp_fpu(sregs) + + printf("\n fsr: %08X\n\n", sregs->fsr); + +-#ifdef HOST_LITTLE_ENDIAN_FLOAT ++#ifdef HOST_LITTLE_ENDIAN + for (i = 0; i < 32; i++) + sregs->fdp[i ^ 1] = sregs->fs[i]; + #endif +@@ -759,21 +774,32 @@ disp_regs(sregs,cwp) + } + } + ++static void print_insn_sparc_sis(uint32 addr, struct disassemble_info *info) ++{ ++ unsigned char i[4]; ++ ++ ms->sis_memory_read(addr, i, 4); ++ dinfo.buffer_vma = addr; ++ dinfo.buffer_length = 4; ++ dinfo.buffer = i; ++ print_insn_sparc(addr, info); ++} ++ + static void + disp_ctrl(sregs) + struct pstate *sregs; + { + +- unsigned char i[4]; ++ uint32 i; + + printf("\n psr: %08X wim: %08X tbr: %08X y: %08X\n", + sregs->psr, sregs->wim, sregs->tbr, sregs->y); +- sis_memory_read(sregs->pc, i, 4); +- printf("\n pc: %08X = %02X%02X%02X%02X ", sregs->pc,i[0],i[1],i[2],i[3]); +- print_insn_sparc(sregs->pc, &dinfo); +- sis_memory_read(sregs->npc, i, 4); +- printf("\n npc: %08X = %02X%02X%02X%02X ",sregs->npc,i[0],i[1],i[2],i[3]); +- print_insn_sparc(sregs->npc, &dinfo); ++ ms->sis_memory_read(sregs->pc, (char *) &i, 4); ++ printf("\n pc: %08X = %08X ", sregs->pc, i); ++ print_insn_sparc_sis(sregs->pc, &dinfo); ++ ms->sis_memory_read(sregs->npc, (char *) &i, 4); ++ printf("\n npc: %08X = %08X ", sregs->npc, i); ++ print_insn_sparc_sis(sregs->npc, &dinfo); + if (sregs->err_mode) + printf("\n IU in error mode"); + printf("\n\n"); +@@ -787,21 +813,28 @@ disp_mem(addr, len) + + uint32 i; + unsigned char data[4]; ++ uint32 *wdata = (uint32 *) data; + uint32 mem[4], j; + char *p; ++ int end; + ++#ifdef HOST_LITTLE_ENDIAN ++ end = 3; ++#else ++ end = 0; ++#endif + for (i = addr & ~3; i < ((addr + len) & ~3); i += 16) { + printf("\n %8X ", i); + for (j = 0; j < 4; j++) { +- sis_memory_read((i + (j * 4)), data, 4); +- printf("%02x%02x%02x%02x ", data[0],data[1],data[2],data[3]); ++ ms->sis_memory_read((i + (j * 4)), data, 4); ++ printf("%08x ", *wdata); + mem[j] = *((int *) &data); + } + printf(" "); + p = (char *) mem; + for (j = 0; j < 16; j++) { +- if (isprint(p[j])) +- putchar(p[j]); ++ if (isprint(p[j^end])) ++ putchar(p[j^end]); + else + putchar('.'); + } +@@ -817,11 +850,12 @@ dis_mem(addr, len, info) + { + uint32 i; + unsigned char data[4]; ++ uint32 *wdata = (uint32 *) data; + + for (i = addr & -3; i < ((addr & -3) + (len << 2)); i += 4) { +- sis_memory_read(i, data, 4); +- printf(" %08x %02x%02x%02x%02x ", i, data[0],data[1],data[2],data[3]); +- print_insn_sparc(i, info); ++ ms->sis_memory_read(i, data, 4); ++ printf(" %08x %08x ", i, *wdata); ++ print_insn_sparc_sis(i, info); + if (i >= 0xfffffffc) break; + printf("\n"); + } +@@ -983,7 +1017,7 @@ reset_all() + { + init_event(); /* Clear event queue */ + init_regs(&sregs); +- reset(); ++ ms->reset(); + #ifdef ERRINJ + errinjstart(); + #endif +@@ -1019,6 +1053,7 @@ bfd_load(fname) + asection *section; + bfd *pbfd; + const bfd_arch_info_type *arch; ++ int i; + + pbfd = bfd_openr(fname, 0); + +@@ -1092,14 +1127,18 @@ bfd_load(fname) + fptr = 0; + + while (section_size > 0) { +- char buffer[1024]; + int count; ++ char buffer[1024]; ++ uint32 *wbuffer = (uint32 *) buffer; + + count = min(section_size, 1024); + + bfd_get_section_contents(pbfd, section, buffer, fptr, count); + +- sis_memory_write(section_address, buffer, count); ++#ifdef HOST_LITTLE_ENDIAN ++ for (i=0;isis_memory_write(section_address, buffer, count); + + section_address += count; + fptr += count; +@@ -1115,3 +1154,16 @@ bfd_load(fname) + + return(bfd_get_start_address (pbfd)); + } ++ ++ ++double get_time (void) ++{ ++ double usec; ++ ++ struct timeval tm; ++ ++ gettimeofday (&tm, NULL); ++ usec = ((double) tm.tv_sec) * 1E6 + ((double) tm.tv_usec); ++ return (usec / 1E6); ++ ++} +diff --git a/sim/erc32/grlib.c b/sim/erc32/grlib.c +new file mode 100644 +index 0000000..42a3ed0 +--- /dev/null ++++ b/sim/erc32/grlib.c +@@ -0,0 +1,98 @@ ++/* ++ * This file is part of SIS. ++ * ++ * SIS, SPARC instruction simulator. Copyright (C) 2014 Jiri Gaisler ++ * ++ * 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 3 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, see . ++ * ++ */ ++ ++ ++#include "sis.h" ++#include "grlib.h" ++ ++ ++/* APB PNP */ ++ ++static uint32 apbppmem[32*2]; /* 32-entry APB PP AREA */ ++static int apbppindex; ++ ++int grlib_apbpp_add(uint32 id, uint32 addr) ++{ ++ apbppmem[apbppindex++] = id; ++ apbppmem[apbppindex++] = addr; ++ if(apbppindex >= (32*2)) apbppindex = 0; /* prevent overflow of area */ ++ return(apbppindex); ++} ++ ++uint32 grlib_apbpnp_read(uint32 addr) ++{ ++ uint32 read_data; ++ addr &= 0xff; ++ read_data = apbppmem[addr>>2]; ++ ++ return read_data; ++} ++ ++/* AHB PNP */ ++ ++static uint32 ahbppmem[128*8]; /* 128-entry AHB PP AREA */ ++static int ahbmppindex; ++static int ahbsppindex = 64*8; ++ ++int grlib_ahbmpp_add(uint32 id) ++{ ++ ahbppmem[ahbmppindex] = id; ++ ahbmppindex += 8; ++ if(ahbmppindex >= (64*8)) ahbmppindex = 0; /* prevent overflow of area */ ++ return(ahbmppindex); ++} ++ ++int grlib_ahbspp_add(uint32 id, uint32 addr1, uint32 addr2, ++ uint32 addr3, uint32 addr4) ++{ ++ ahbppmem[ahbsppindex] = id; ++ ahbsppindex += 4; ++ ahbppmem[ahbsppindex++] = addr1; ++ ahbppmem[ahbsppindex++] = addr2; ++ ahbppmem[ahbsppindex++] = addr3; ++ ahbppmem[ahbsppindex++] = addr4; ++ if(ahbsppindex >= (128*8)) ahbsppindex = 64*8; /* prevent overflow of area */ ++ return(ahbsppindex); ++} ++ ++uint32 grlib_ahbpnp_read(uint32 addr) ++{ ++ uint32 read_data; ++ ++ addr &= 0xfff; ++ read_data = ahbppmem[addr>>2]; ++ return read_data; ++ ++} ++ ++void grlib_init() ++{ ++ /* Add PP records for Leon3, APB bridge and interrupt controller ++ as this is not done elsewhere */ ++ ++ grlib_ahbmpp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_LEON3, 0, 0)); ++ grlib_ahbspp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_APBMST, 0, 0), ++ GRLIB_PP_AHBADDR(0x80000000, 0xFFF, 0, 0, 2), ++ 0, 0, 0); ++ ++ grlib_apbpp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_IRQMP, 2, 0), ++ GRLIB_PP_APBADDR(0x80000200, 0xFFF)); ++ ++} +diff --git a/sim/erc32/grlib.h b/sim/erc32/grlib.h +new file mode 100644 +index 0000000..4d52211 +--- /dev/null ++++ b/sim/erc32/grlib.h +@@ -0,0 +1,57 @@ ++/* ++ * This file is part of SIS. ++ * ++ * SIS, SPARC instruction simulator. Copyright (C) 2014 Jiri Gaisler ++ * ++ * 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 3 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, see . ++ * ++ */ ++ ++ ++/* Definitions for AMBA PNP in Gaisler Research GRLIB SOC */ ++ ++/* Vendors */ ++#define VENDOR_GAISLER 1 ++#define VENDOR_PENDER 2 ++#define VENDOR_ESA 4 ++#define VENDOR_DLR 10 ++ ++/* Devices */ ++#define GAISLER_LEON3 0x003 ++#define GAISLER_APBMST 0x006 ++#define GAISLER_SRCTRL 0x008 ++#define GAISLER_APBUART 0x00C ++#define GAISLER_IRQMP 0x00D ++#define GAISLER_GPTIMER 0x011 ++#define ESA_MCTRL 0x00F ++ ++/* How to build entries in the plug&play area */ ++#define GRLIB_PP_ID(v, d, x, i) ((v & 0xff) << 24) | ((d & 0x3ff) << 12) |\ ++ ((x & 0x1f) << 5) | (i & 0x1f) ++#define GRLIB_PP_AHBADDR(a, m, p, c, t) (a & 0xfff00000) | ((m & 0xfff) << 4) |\ ++ ((p & 1) << 17) | ((c & 1) << 16) | (t & 0x3) ++#define GRLIB_PP_APBADDR(a, m) ((a & 0xfff00)<< 12) | ((m & 0xfff) << 4) | 1 ++ ++#define AHBPP_START 0xFFFFF000 ++#define AHBPP_END 0xFFFFFFFF ++#define APBPP_START 0x800FF000 ++#define APBPP_END 0x800FFFFF ++ ++int grlib_apbpp_add(uint32 id, uint32 addr); ++int grlib_ahbmpp_add(uint32 id); ++int grlib_ahbspp_add(uint32 id, uint32 addr1, uint32 addr2, ++ uint32 addr3, uint32 addr4); ++uint32 grlib_ahbpnp_read(uint32 addr); ++uint32 grlib_apbpnp_read(uint32 addr); ++void grlib_init(); +diff --git a/sim/erc32/help.c b/sim/erc32/help.c +index 21c2a77..6d74e79 100644 +--- a/sim/erc32/help.c ++++ b/sim/erc32/help.c +@@ -7,8 +7,8 @@ usage() + { + + printf("usage: sis [-uart1 uart_device1] [-uart2 uart_device2]\n"); ++ printf("[-sparclite] [-dumbio] [-v] [-vv]\n"); + printf("[-nfp] [-freq frequency] [-c batch_file] [files]\n"); +- printf("[-sparclite] [-dumbio]\n"); + } + + void +diff --git a/sim/erc32/interf.c b/sim/erc32/interf.c +index e2db44e..259c8f3 100644 +--- a/sim/erc32/interf.c ++++ b/sim/erc32/interf.c +@@ -24,7 +24,6 @@ + #include + #include + #include +-#include + #include + #include "sis.h" + #include "libiberty.h" +@@ -36,34 +35,10 @@ + #include "gdb/signals.h" + + #define PSR_CWP 0x7 +- +-extern struct disassemble_info dinfo; +-extern struct pstate sregs; +-extern struct estate ebase; +- +-extern int current_target_byte_order; +-extern int ctrl_c; +-extern int nfp; +-extern int ift; +-extern int rom8; +-extern int wrp; +-extern int uben; +-extern int sis_verbose; +-extern char *sis_version; +-extern struct estate ebase; +-extern struct evcell evbuf[]; +-extern struct irqcell irqarr[]; +-extern int irqpend, ext_irl; +-extern int sparclite; +-extern int dumbio; +-extern int sparclite_board; +-extern int termsave; +-extern char uart_dev1[], uart_dev2[]; ++#define SOFT_BREAK 0x91d02001 + + int sis_gdb_break = 1; + +-host_callback *sim_callback; +- + int + run_sim(sregs, icount, dis) + struct pstate *sregs; +@@ -75,9 +50,10 @@ run_sim(sregs, icount, dis) + if (sis_verbose) + (*sim_callback->printf_filtered) (sim_callback, "resuming at %x\n", + sregs->pc); +- init_stdio(); +- sregs->starttime = time(NULL); ++ ms->init_stdio(); ++ sregs->starttime = get_time(); + irq = 0; ++ if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init(); + while (!sregs->err_mode & (icount > 0)) { + + sregs->fhold = 0; +@@ -94,9 +70,8 @@ run_sim(sregs, icount, dis) + if (sregs->pc == 0 || sregs->npc == 0) + printf ("bogus pc or npc\n"); + #endif +- mexc = memory_read(sregs->asi, sregs->pc, &sregs->inst, +- 2, &sregs->hold); +-#if 1 /* DELETE ME! for debugging purposes only */ ++ mexc = ms->memory_iread(sregs->pc, &sregs->inst, &sregs->hold); ++#if 0 /* DELETE ME! for debugging purposes only */ + if (sis_verbose > 2) + printf("pc %x, np %x, sp %x, fp %x, wm %x, cw %x, i %08x\n", + sregs->pc, sregs->npc, +@@ -117,12 +92,12 @@ run_sim(sregs, icount, dis) + if (mexc) { + sregs->trap = I_ACC_EXC; + } else { +- if ((sis_gdb_break) && (sregs->inst == 0x91d02001)) { ++ if ((sis_gdb_break) && (sregs->inst == SOFT_BREAK)) { + if (sis_verbose) + (*sim_callback->printf_filtered) (sim_callback, + "SW BP hit at %x\n", sregs->pc); +- sim_halt(); +- restore_stdio(); ++ ms->sim_halt(); ++ ms->restore_stdio(); + clearerr(stdin); + return (BPT_HIT); + } else +@@ -140,12 +115,12 @@ run_sim(sregs, icount, dis) + icount = 0; + } + } +- sim_halt(); +- sregs->tottime += time(NULL) - sregs->starttime; +- restore_stdio(); ++ ms->sim_halt(); ++ sregs->tottime += get_time() - sregs->starttime; ++ ms->restore_stdio(); + clearerr(stdin); + if (sregs->err_mode) +- error_mode(sregs->pc); ++ ms->error_mode(sregs->pc); + if (sregs->err_mode) + return (ERROR); + if (sregs->bphit) { +@@ -210,6 +185,17 @@ sim_open (kind, callback, abfd, argv) + if (strcmp(argv[stat], "-dumbio") == 0) { + dumbio = 1; + } else ++ if (strcmp(argv[stat], "-nouartrx") == 0) { ++ nouartrx = 1; ++ } else ++ if (strcmp(argv[stat], "-leon2") == 0) { ++ ms = &leon2; ++ cputype = CPU_LEON2; ++ } else ++ if (strcmp(argv[stat], "-leon3") == 0) { ++ ms = &leon3; ++ cputype = CPU_LEON3; ++ } else + if (strcmp(argv[stat], "-wrp") == 0) { + wrp = 1; + } else +@@ -247,9 +233,24 @@ sim_open (kind, callback, abfd, argv) + stat++; + } + ++ if ((cputype == CPU_LEON3) || (cputype == CPU_LEON2)) ++ sregs.freq = freq ? freq : 50; ++ else ++ sregs.freq = freq ? freq : 14; ++ + if (sis_verbose) { + (*sim_callback->printf_filtered) (sim_callback, "\n SIS - SPARC instruction simulator %s\n", sis_version); +- (*sim_callback->printf_filtered) (sim_callback, " Bug-reports to Jiri Gaisler ESA/ESTEC (jgais@wd.estec.esa.nl)\n"); ++ (*sim_callback->printf_filtered) (sim_callback, " Bug-reports to Jiri Gaisler (jiri@gaisler.se)\n\n"); ++ switch (cputype) { ++ case CPU_LEON2: ++ (*sim_callback->printf_filtered) (sim_callback, "LEON2 emulation enabled\n"); ++ break; ++ case CPU_LEON3: ++ (*sim_callback->printf_filtered) (sim_callback, "LEON3 emulation enabled\n"); ++ break; ++ default: ++ (*sim_callback->printf_filtered) (sim_callback, "ERC32 emulation enabled\n"); ++ } + if (nfp) + (*sim_callback->printf_filtered) (sim_callback, "no FPU\n"); + if (sparclite) +@@ -258,17 +259,19 @@ sim_open (kind, callback, abfd, argv) + (*sim_callback->printf_filtered) (sim_callback, "dumb IO (no input, dumb output)\n"); + if (sis_gdb_break == 0) + (*sim_callback->printf_filtered) (sim_callback, "disabling GDB trap handling for breakpoints\n"); +- if (freq) +- (*sim_callback->printf_filtered) (sim_callback, " ERC32 freq %d Mhz\n", freq); ++ (*sim_callback->printf_filtered) (sim_callback, "CPU freq %3.1f MHz\n", sregs.freq); + } + +- sregs.freq = freq ? freq : 15; + termsave = fcntl(0, F_GETFL, 0); + INIT_DISASSEMBLE_INFO(dinfo, stdout,(fprintf_ftype)fprintf); ++#ifdef HOST_LITTLE_ENDIAN ++ dinfo.endian = BFD_ENDIAN_LITTLE; ++#else + dinfo.endian = BFD_ENDIAN_BIG; ++#endif + reset_all(); + ebase.simtime = 0; +- init_sim(); ++ ms->init_sim(); + init_bpt(&sregs); + reset_stat(&sregs); + +@@ -282,7 +285,7 @@ sim_close(sd, quitting) + int quitting; + { + +- exit_sim(); ++ ms->exit_sim(); + fcntl(0, F_SETFL, termsave); + + }; +@@ -355,7 +358,19 @@ sim_write(sd, mem, buf, length) + const unsigned char *buf; + int length; + { +- return (sis_memory_write(mem, buf, length)); ++#ifdef HOST_LITTLE_ENDIAN ++ int *ibufp = (int *) buf; ++ int ibuf[8192]; ++ int i, len; ++ ++ if (length >= 4) ++ for (i=0; isis_memory_write(mem, (char *) ibuf, length)); ++#else ++ return (ms->sis_memory_write(mem, buf, length)); ++#endif + } + + int +@@ -365,7 +380,20 @@ sim_read(sd, mem, buf, length) + unsigned char *buf; + int length; + { +- return (sis_memory_read(mem, buf, length)); ++#ifdef HOST_LITTLE_ENDIAN ++ int *ibuf = (int *) buf; ++ int i, len; ++ ++ len = ms->sis_memory_read(mem, buf, length); ++ if (length >= 4) ++ for (i=0; isis_memory_read(mem, buf, length)); ++#endif + } + + void +@@ -451,7 +479,7 @@ flush_windows () + #endif + + for (i = 0; i < 16; i++) +- memory_write (11, sp + 4 * i, &sregs.r[(win * 16 + 16 + i) & 0x7f], 2, ++ ms->memory_write (sp + 4 * i, &sregs.r[(win * 16 + 16 + i) & 0x7f], 2, + &ws); + + if (win == cwp) +@@ -481,7 +509,7 @@ sim_do_command(sd, cmd) + SIM_DESC sd; + char *cmd; + { +- exec_cmd(&sregs, cmd); ++ exec_cmd(&sregs, (char *) cmd); + } + + char ** +@@ -490,6 +518,13 @@ sim_complete_command (SIM_DESC sd, const char *text, const char *word) + return NULL; + } + ++int ++sim_stop(SIM_DESC sd) ++{ ++ ctrl_c = 1; ++ return 1; ++} ++ + #if 0 /* FIXME: These shouldn't exist. */ + + int +diff --git a/sim/erc32/leon2.c b/sim/erc32/leon2.c +new file mode 100644 +index 0000000..5ab3f79 +--- /dev/null ++++ b/sim/erc32/leon2.c +@@ -0,0 +1,1041 @@ ++/* ++ * This file is part of SIS. ++ * ++ * SIS, SPARC instruction simulator V2.5 Copyright (C) 1995 Jiri Gaisler, ++ * European Space Agency ++ * ++ * 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 3 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, see . ++ * ++ * Leon2 emulation, based on leon3.c . ++ */ ++ ++/* The control space devices */ ++ ++#include "config.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "sis.h" ++#include "sim-config.h" ++ ++static int tty_setup = 1; /* default setup if not a tty */ ++ ++/* APB registers */ ++#define APBSTART 0x80000000 ++#define APBEND 0x80000100 ++ ++/* Memory exception waitstates */ ++#define MEM_EX_WS 1 ++ ++#define MOK 0 ++ ++/* LEON2 APB register addresses */ ++ ++#define IRQCTRL_IPR 0x094 ++#define IRQCTRL_IMR 0x090 ++#define IRQCTRL_ICR 0x09C ++#define IRQCTRL_IFR 0x098 ++#define TIMER_SCALER 0x060 ++#define TIMER_SCLOAD 0x064 ++#define LEON2_CONFIG 0x024 ++#define TIMER_TIMER1 0x040 ++#define TIMER_RELOAD1 0x044 ++#define TIMER_CTRL1 0x048 ++#define TIMER_TIMER2 0x050 ++#define TIMER_RELOAD2 0x054 ++#define TIMER_CTRL2 0x058 ++#define CACHE_CTRL 0x014 ++#define POWER_DOWN 0x018 ++ ++#define APBUART_RXTX 0x070 ++#define APBUART_STATUS 0x074 ++ ++/* Size of UART buffers (bytes) */ ++#define UARTBUF 1024 ++ ++/* Number of simulator ticks between flushing the UARTS. */ ++/* For good performance, keep above 1000 */ ++#define UART_FLUSH_TIME 3000 ++ ++ ++/* New uart defines */ ++#define UART_TX_TIME 1000 ++#define UART_RX_TIME 1000 ++#define UARTA_DR 0x1 ++#define UARTA_SRE 0x2 ++#define UARTA_HRE 0x4 ++#define UARTA_OR 0x10 ++ ++/* IRQCTRL registers */ ++ ++static uint32 irqctrl_ipr; ++static uint32 irqctrl_imr; ++static uint32 irqctrl_ifr; ++ ++/* TIMER registers */ ++ ++#define NTIMERS 2 ++#define TIMER_IRQ 8 ++ ++static uint32 gpt_scaler; ++static uint32 gpt_scaler_start; ++static uint32 gpt_counter[NTIMERS]; ++static uint32 gpt_reload[NTIMERS]; ++static uint32 gpt_ctrl[NTIMERS]; ++ ++/* ROM size 16 Mbyte */ ++#define ROM_START 0x00000000 ++#define ROM_MASK 0x00ffffff ++#define ROM_END (ROM_START + ROM_MASK + 1) ++ ++/* RAM size 16 Mbyte */ ++#define RAM_START 0x40000000 ++#define RAM_MASK 0x00ffffff ++#define RAM_END (RAM_START + RAM_MASK + 1) ++ ++/* Memory */ ++ ++static unsigned char romb[ROM_END - ROM_START]; ++static unsigned char ramb[RAM_END - RAM_START]; ++static uint32 cache_ctrl; ++ ++ ++/* UART support variables */ ++ ++static int32 fd1, fd2; /* file descriptor for input file */ ++static int32 Ucontrol; /* UART status register */ ++static unsigned char aq[UARTBUF], bq[UARTBUF]; ++static int32 anum, aind = 0; ++static int32 bnum, bind = 0; ++static char wbufa[UARTBUF], wbufb[UARTBUF]; ++static unsigned wnuma; ++static unsigned wnumb; ++static FILE *f1in, *f1out; ++static struct termios ioc1, ioc2, iocold1, iocold2; ++static int f1open = 0; ++ ++static char uarta_sreg, uarta_hreg; ++static uint32 uart_stat_reg; ++static uint32 uarta_data; ++ ++/* Forward declarations */ ++ ++static void mem_init (void); ++static void close_port (void); ++static void leon2_reset (void); ++static void irqctrl_intack (int32 level); ++static void chk_irq (void); ++static void set_irq (int32 level); ++static int32 apb_read (uint32 addr, uint32 *data); ++static int apb_write (uint32 addr, uint32 data); ++static void port_init (void); ++static uint32 grlib_read_uart (uint32 addr); ++static void grlib_write_uart (uint32 addr, uint32 data); ++static void flush_uart (void); ++static void uarta_tx (void); ++static void uart_rx (caddr_t arg); ++static void uart_intr (caddr_t arg); ++static void uart_irq_start (void); ++static void gpt_intr (caddr_t arg); ++static void gpt_init (void); ++static void gpt_reset (void); ++static void gpt_scaler_set (uint32 val); ++static void timer_ctrl (uint32 val, int i); ++static unsigned char * ++ get_mem_ptr (uint32 addr, uint32 size); ++static void store_bytes (unsigned char *mem, uint32 waddr, ++ uint32 *data, int sz, int32 *ws); ++ ++static host_callback *callback; ++ ++ ++/* One-time init */ ++ ++static void ++init_sim() ++{ ++ callback = sim_callback; ++ grlib_init(); ++ mem_init(); ++ port_init(); ++ gpt_init(); ++} ++ ++/* Power-on reset init */ ++ ++static void ++reset() ++{ ++ leon2_reset(); ++ uart_irq_start(); ++ gpt_reset(); ++} ++ ++/* IU error mode manager */ ++ ++static void ++error_mode(pc) ++ uint32 pc; ++{ ++ ++} ++ ++ ++/* Memory init */ ++ ++static void ++mem_init() ++{ ++ ++ if (sis_verbose) ++ printf("RAM start: 0x%x, RAM size: %d K, ROM size: %d K\n", ++ RAM_START, (RAM_MASK+1)/1024, (ROM_MASK+1)/1024); ++} ++ ++/* Flush ports when simulator stops */ ++ ++static void ++sim_halt() ++{ ++#ifdef FAST_UART ++ flush_uart(); ++#endif ++} ++ ++static void ++close_port() ++{ ++ if (f1open && f1in != stdin) ++ fclose(f1in); ++} ++ ++static void ++exit_sim() ++{ ++ close_port(); ++} ++ ++static void ++leon2_reset() ++{ ++ int i; ++ ++ irqctrl_ipr = 0; ++ irqctrl_imr = 0; ++ irqctrl_ifr = 0; ++ ++ wnuma = wnumb = 0; ++ anum = aind = bnum = bind = 0; ++ ++ uart_stat_reg = UARTA_SRE | UARTA_HRE; ++ ++ gpt_counter[0] = 0xffffffff; ++ gpt_reload[0] = 0xffffffff; ++ gpt_scaler = 0xffff; ++ gpt_ctrl[0] = 0; ++ gpt_ctrl[1] = 0; ++ ++} ++ ++ ++ ++static void ++irqctrl_intack(level) ++ int32 level; ++{ ++ int irq_test; ++ ++ if (sis_verbose > 2) ++ printf("interrupt %d acknowledged\n", level); ++ if (irqctrl_ifr & (1 << level)) ++ irqctrl_ifr &= ~(1 << level); ++ else ++ irqctrl_ipr &= ~(1 << level); ++ chk_irq(); ++} ++ ++static void ++chk_irq() ++{ ++ int32 i; ++ uint32 itmp; ++ int old_irl; ++ ++ old_irl = ext_irl; ++ itmp = ((irqctrl_ipr | irqctrl_ifr) & irqctrl_imr) & 0x0fffe; ++ ext_irl = 0; ++ if (itmp != 0) { ++ for (i = 15; i > 0; i--) { ++ if (((itmp >> i) & 1) != 0) { ++ if ((sis_verbose > 2) && (i > old_irl)) ++ printf("IU irl: %d\n", i); ++ ext_irl = i; ++ set_int(i, irqctrl_intack, i); ++ break; ++ } ++ } ++ } ++} ++ ++static void ++set_irq(level) ++ int32 level; ++{ ++ irqctrl_ipr |= (1 << level); ++ chk_irq(); ++} ++ ++static int32 ++apb_read(addr, data) ++ uint32 addr; ++ uint32 *data; ++{ ++ ++ switch (addr & 0xfff) { ++ ++ case APBUART_RXTX: /* 0x100 */ ++ case APBUART_STATUS: /* 0x104 */ ++ *data = grlib_read_uart(addr); ++ break; ++ ++ case IRQCTRL_IPR: /* 0x204 */ ++ *data = irqctrl_ipr; ++ break; ++ ++ case IRQCTRL_IFR: /* 0x208 */ ++ *data = irqctrl_ifr; ++ break; ++ ++ case IRQCTRL_IMR: /* 0x240 */ ++ *data = irqctrl_imr; ++ break; ++ ++ case TIMER_SCALER: /* 0x300 */ ++ *data = gpt_scaler - (now() - gpt_scaler_start); ++ break; ++ ++ case TIMER_SCLOAD: /* 0x304 */ ++ *data = gpt_scaler; ++ break; ++ ++ case LEON2_CONFIG: /* 0x308 */ ++ *data = 0x700310; ++ break; ++ ++ case TIMER_TIMER1: /* 0x310 */ ++ *data = gpt_counter[0]; ++ break; ++ ++ case TIMER_RELOAD1: /* 0x314 */ ++ *data = gpt_reload[0]; ++ break; ++ ++ case TIMER_CTRL1: /* 0x318 */ ++ *data = gpt_ctrl[0]; ++ break; ++ ++ case TIMER_TIMER2: /* 0x320 */ ++ *data = gpt_counter[1]; ++ break; ++ ++ case TIMER_RELOAD2: /* 0x324 */ ++ *data = gpt_reload[1]; ++ break; ++ ++ case TIMER_CTRL2: /* 0x328 */ ++ *data = gpt_ctrl[1]; ++ break; ++ ++ case CACHE_CTRL: /* 0x328 */ ++ *data = cache_ctrl; ++ break; ++ ++ default: ++ *data = 0; ++ break; ++ } ++ ++ if (sis_verbose > 1) ++ printf("APB read a: %08x, d: %08x\n", addr, *data); ++ ++ return (MOK); ++} ++ ++static int ++apb_write(addr, data) ++ uint32 addr; ++ uint32 data; ++{ ++ if (sis_verbose > 1) ++ printf("APB write a: %08x, d: %08x\n",addr,data); ++ switch (addr & 0xff) { ++ ++ case APBUART_RXTX: /* 0x100 */ ++ case APBUART_STATUS: /* 0x104 */ ++ grlib_write_uart(addr, data); ++ break; ++ ++ case IRQCTRL_IFR: /* 0x208 */ ++ irqctrl_ifr = data & 0xfffe; ++ chk_irq(); ++ break; ++ ++ case IRQCTRL_ICR: /* 0x20C */ ++ irqctrl_ipr &= ~data & 0x0fffe; ++ chk_irq(); ++ break; ++ ++ case IRQCTRL_IMR: /* 0x240 */ ++ irqctrl_imr = data & 0x7ffe; ++ chk_irq(); ++ break; ++ ++ case TIMER_SCLOAD: /* 0x304 */ ++ gpt_scaler_set(data); ++ break; ++ ++ case TIMER_TIMER1: /* 0x310 */ ++ gpt_counter[0] = data; ++ break; ++ ++ case TIMER_RELOAD1: /* 0x314 */ ++ gpt_reload[0] = data; ++ break; ++ ++ case TIMER_CTRL1: /* 0x318 */ ++ timer_ctrl(data, 0); ++ break; ++ ++ case TIMER_TIMER2: /* 0x320 */ ++ gpt_counter[1] = data; ++ break; ++ ++ case TIMER_RELOAD2: /* 0x324 */ ++ gpt_reload[1] = data; ++ break; ++ ++ case TIMER_CTRL2: /* 0x328 */ ++ timer_ctrl(data, 1); ++ break; ++ ++ case POWER_DOWN: /* 0x328 */ ++ wait_for_irq(); ++ break; ++ ++ case CACHE_CTRL: /* 0x328 */ ++ cache_ctrl = data & 0x1000f; ++ break; ++ ++ default: ++ break; ++ } ++ return (MOK); ++} ++ ++ ++/* APBUART */ ++ ++static int ifd1 = -1, ofd1 = -1; ++ ++static void ++init_stdio() ++{ ++ if (dumbio) ++ return; /* do nothing */ ++ if (ifd1 == 0 && f1open) { ++ tcsetattr(0, TCSANOW, &ioc1); ++ tcflush(ifd1, TCIFLUSH); ++ } ++} ++ ++static void ++restore_stdio() ++{ ++ if (dumbio) ++ return; /* do nothing */ ++ if (ifd1 == 0 && f1open && tty_setup) ++ tcsetattr(0, TCSANOW, &iocold1); ++} ++ ++#define DO_STDIO_READ( _fd_, _buf_, _len_ ) \ ++ ( dumbio || nouartrx \ ++ ? (0) /* no bytes read, no delay */ \ ++ : (_fd_) == 1 && callback ? \ ++ callback->read_stdin (callback, _buf_, _len_) : \ ++ read( _fd_, _buf_, _len_ ) ) ++ ++ ++static void ++port_init() ++{ ++ ++ f1in = stdin; ++ f1out = stdout; ++ if (uart_dev1[0] != 0) ++ if ((fd1 = open(uart_dev1, O_RDWR | O_NONBLOCK)) < 0) { ++ printf("Warning, couldn't open output device %s\n", uart_dev1); ++ } else { ++ if (sis_verbose) ++ printf("serial port A on %s\n", uart_dev1); ++ f1in = f1out = fdopen(fd1, "r+"); ++ setbuf(f1out, NULL); ++ f1open = 1; ++ } ++ if (f1in) ifd1 = fileno(f1in); ++ if (ifd1 == 0) { ++ if (callback && !callback->isatty(callback, ifd1)) { ++ tty_setup = 0; ++ } ++ if (sis_verbose) ++ printf("serial port A on stdin/stdout\n"); ++ if (!dumbio) { ++ tcgetattr(ifd1, &ioc1); ++ if (tty_setup) { ++ iocold1 = ioc1; ++ ioc1.c_lflag &= ~(ICANON | ECHO); ++ ioc1.c_cc[VMIN] = 0; ++ ioc1.c_cc[VTIME] = 0; ++ } ++ } ++ f1open = 1; ++ } ++ ++ if (f1out) { ++ ofd1 = fileno(f1out); ++ if (!dumbio && tty_setup && ofd1 == 1) setbuf(f1out, NULL); ++ } ++ ++ wnuma = 0; ++ ++} ++ ++static uint32 ++grlib_read_uart(addr) ++ uint32 addr; ++{ ++ ++ unsigned tmp; ++ ++ tmp = 0; ++ switch (addr & 0xfff) { ++ ++ case 0x070: /* UART 1 RX/TX */ ++#ifndef _WIN32 ++#ifdef FAST_UART ++ ++ if (aind < anum) { ++ if ((aind + 1) < anum) ++ set_irq(3); ++ return ((uint32) aq[aind++]); ++ } else { ++ if (f1open) { ++ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); ++ } ++ else { ++ anum = 0; ++ } ++ if (anum > 0) { ++ aind = 0; ++ if ((aind + 1) < anum) ++ set_irq(3); ++ return ((uint32) aq[aind++]); ++ } else { ++ return ((uint32) aq[aind]); ++ } ++ ++ } ++#else ++ tmp = uarta_data; ++ uarta_data &= ~UART_DR; ++ uart_stat_reg &= ~UARTA_DR; ++ return tmp; ++#endif ++#else ++ return(0); ++#endif ++ break; ++ ++ case 0x074: /* UART status register */ ++#ifndef _WIN32 ++#ifdef FAST_UART ++ ++ Ucontrol = 0; ++ if (aind < anum) { ++ Ucontrol |= 0x00000001; ++ } else { ++ if (f1open) { ++ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); ++ } ++ else { ++ anum = 0; ++ } ++ if (anum > 0) { ++ Ucontrol |= 0x00000001; ++ aind = 0; ++ set_irq(3); ++ } ++ } ++ Ucontrol |= 0x00000006; ++ return (Ucontrol); ++#else ++ return (uart_stat_reg); ++#endif ++#else ++ return(0x00060006); ++#endif ++ break; ++ default: ++ if (sis_verbose) ++ printf("Read from unimplemented LEON2 register (%x)\n", addr); ++ ++ } ++ return (0); ++} ++ ++static void ++grlib_write_uart(addr, data) ++ uint32 addr; ++ uint32 data; ++{ ++ unsigned char c; ++ ++ c = (unsigned char) data; ++ switch (addr & 0xfff) { ++ ++ case 0x070: /* UART A */ ++#ifdef FAST_UART ++ if (f1open) { ++ if (wnuma < UARTBUF) ++ wbufa[wnuma++] = c; ++ else { ++ while (wnuma) { ++ if (ofd1 == 1 && callback) ++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); ++ else ++ wnuma -= fwrite(wbufa, 1, wnuma, f1out); ++ } ++ wbufa[wnuma++] = c; ++ } ++ } ++ set_irq(3); ++#else ++ if (uart_stat_reg & UARTA_SRE) { ++ uarta_sreg = c; ++ uart_stat_reg &= ~UARTA_SRE; ++ event(uarta_tx, 0, UART_TX_TIME); ++ } else { ++ uarta_hreg = c; ++ uart_stat_reg &= ~UARTA_HRE; ++ } ++#endif ++ break; ++ ++ case 0x074: /* UART status register */ ++#ifndef FAST_UART ++ uart_stat_reg &= 1; ++#endif ++ break; ++ default: ++ if (sis_verbose) ++ printf("Write to unimplemented APB register (%x)\n", addr); ++ ++ } ++} ++ ++static void ++flush_uart() ++{ ++ while (wnuma && f1open) { ++ if (ofd1 == 1 && callback) { ++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); ++ callback->flush_stdout(callback); ++ } ++ else ++ wnuma -= fwrite(wbufa, 1, wnuma, f1out); ++ } ++} ++ ++ ++ ++static void ++uarta_tx() ++{ ++ while (f1open) { ++ if (ofd1 == 1 && callback) { ++ while (callback->write_stdout(callback, &uarta_sreg, 1) != 1); ++ } ++ else { ++ while (fwrite(&uarta_sreg, 1, 1, f1out) != 1); ++ } ++ } ++ if (uart_stat_reg & UARTA_HRE) { ++ uart_stat_reg |= UARTA_SRE; ++ } else { ++ uarta_sreg = uarta_hreg; ++ uart_stat_reg |= UARTA_HRE; ++ event(uarta_tx, 0, UART_TX_TIME); ++ } ++ set_irq(3); ++} ++ ++static void ++uart_rx(arg) ++ caddr_t arg; ++{ ++ int32 rsize; ++ char rxd; ++ ++ ++ rsize = 0; ++ if (f1open) ++ rsize = DO_STDIO_READ(ifd1, &rxd, 1); ++ else ++ rsize = 0; ++ if (rsize > 0) { ++ uarta_data = rxd; ++ if (uart_stat_reg & UARTA_DR) { ++ uart_stat_reg |= UARTA_OR; ++ } ++ uart_stat_reg |= UARTA_DR; ++ set_irq(3); ++ } ++ event(uart_rx, 0, UART_RX_TIME); ++} ++ ++static void ++uart_intr(arg) ++ caddr_t arg; ++{ ++ grlib_read_uart(APBUART_STATUS); /* Check for UART interrupts every 1000 clk */ ++ flush_uart(); /* Flush UART ports */ ++ event(uart_intr, 0, UART_FLUSH_TIME); ++} ++ ++ ++static void ++uart_irq_start() ++{ ++#ifdef FAST_UART ++ event(uart_intr, 0, UART_FLUSH_TIME); ++#else ++#ifndef _WIN32 ++ event(uart_rx, 0, UART_RX_TIME); ++#endif ++#endif ++} ++ ++/* TIMER */ ++ ++static void ++gpt_intr(arg) ++ caddr_t arg; ++{ ++ int i; ++ ++ for (i=0; i= RAM_START) && (addr < RAM_END)) { ++ *data = *((uint32 *) & (ramb[addr & RAM_MASK])); ++ *ws = 0; ++ return (0); ++ } else if (addr < ROM_END) { ++ *data = *((uint32 *) & (romb[addr])); ++ *ws = 0; ++ return (0); ++ } ++ ++ printf("Memory exception at %x (illegal address)\n", addr); ++ *ws = MEM_EX_WS; ++ return (1); ++} ++ ++static int ++memory_read(addr, data, sz, ws) ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ int32 mexc; ++ ++ if ((addr >= RAM_START) && (addr < RAM_END)) { ++ *data = *((uint32 *) & (ramb[addr & RAM_MASK & ~3])); ++ *ws = 0; ++ return (0); ++ } else if ((addr >= APBSTART) && (addr < APBEND)) { ++ mexc = apb_read(addr, data); ++ if (mexc) { ++ *ws = MEM_EX_WS; ++ } else { ++ *ws = 0; ++ } ++ return (mexc); ++ } else if (addr < ROM_END) { ++ *data = *((uint32 *) & (romb[addr & ~3])); ++ *ws = 0; ++ return (0); ++ } ++ ++ printf("Memory exception at %x (illegal address)\n", addr); ++ *ws = MEM_EX_WS; ++ return (1); ++} ++ ++static int ++memory_read_asi(asi, addr, data, sz, ws) ++ int32 asi; ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ return(memory_read(addr, data, sz, ws)); ++} ++ ++static int ++memory_write(addr, data, sz, ws) ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ uint32 byte_addr; ++ uint32 byte_mask; ++ uint32 waddr; ++ uint32 *ram; ++ int32 mexc; ++ int i; ++ int wphit[2]; ++ ++ if ((addr >= RAM_START) && (addr < RAM_END)) { ++ waddr = addr & RAM_MASK; ++ store_bytes (ramb, waddr, data, sz, ws); ++ return (0); ++ ++ } else if ((addr >= APBSTART) && (addr < APBEND)) { ++ if (sz != 2) { ++ *ws = MEM_EX_WS; ++ return (1); ++ } ++ apb_write(addr, *data); ++ *ws = 0; ++ return (0); ++ ++ } else if (addr < ROM_END) { ++// return (1); ++ *ws = 0; ++ store_bytes (romb, addr, data, sz, ws); ++ return (0); ++ } ++ ++ *ws = MEM_EX_WS; ++ return (1); ++} ++ ++static int ++memory_write_asi(asi, addr, data, sz, ws) ++ int32 asi; ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ return(memory_write(addr, data, sz, ws)); ++} ++ ++static unsigned char * ++get_mem_ptr(addr, size) ++ uint32 addr; ++ uint32 size; ++{ ++ if ((addr + size) < ROM_END) { ++ return (&romb[addr]); ++ } else if ((addr >= RAM_START) && ((addr + size) < RAM_END)) { ++ return (&ramb[addr & RAM_MASK]); ++ } ++ ++ return ((char *) -1); ++} ++ ++static int ++sis_memory_write(addr, data, length) ++ uint32 addr; ++ const unsigned char *data; ++ uint32 length; ++{ ++ char *mem; ++ ++ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) ++ return (0); ++ ++ memcpy(mem, data, length); ++ return (length); ++} ++ ++static int ++sis_memory_read(addr, data, length) ++ uint32 addr; ++ char *data; ++ uint32 length; ++{ ++ char *mem; ++ int ws; ++ ++ if (length == 4) { ++ memory_read(addr, data, length, &ws); ++ return(4); ++ } ++ ++ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) ++ return (0); ++ ++ memcpy(data, mem, length); ++ return (length); ++} ++ ++static void ++boot_init () ++{ ++// mec_write(MEC_WCR, 0); /* zero waitstates */ ++// mec_write(MEC_TRAPD, 0); /* turn off watch-dog */ ++ apb_write(TIMER_SCALER, sregs.freq-1); /* generate 1 MHz RTC tick */ ++ apb_write(TIMER_SCLOAD, sregs.freq-1); ++ apb_write(TIMER_TIMER1, -1); ++ apb_write(TIMER_RELOAD1, -1); ++ apb_write(TIMER_CTRL1, 0x7); ++// mec_write(MEC_MEMCFG, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */ ++ sregs.wim = 2; ++ sregs.psr = 0x000010e0; ++ sregs.r[30] = RAM_END; ++ sregs.r[14] = sregs.r[30] - 96*4; ++ cache_ctrl = 0x01000f; ++ ++} ++ ++struct memsys leon2 = { ++ init_sim, ++ reset, ++ error_mode, ++ sim_halt, ++ exit_sim, ++ init_stdio, ++ restore_stdio, ++ memory_iread, ++ memory_read, ++ memory_read_asi, ++ memory_write, ++ memory_write_asi, ++ sis_memory_write, ++ sis_memory_read, ++ boot_init ++}; +diff --git a/sim/erc32/leon3.c b/sim/erc32/leon3.c +new file mode 100644 +index 0000000..e79169e +--- /dev/null ++++ b/sim/erc32/leon3.c +@@ -0,0 +1,1066 @@ ++/* ++ * This file is part of SIS. ++ * ++ * SIS, SPARC instruction simulator V2.5 Copyright (C) 1995 Jiri Gaisler, ++ * European Space Agency ++ * ++ * 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 3 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, see . ++ * ++ * Leon3 emulation, loosely based on erc32.c . ++ */ ++ ++/* The control space devices */ ++ ++#include "config.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "sis.h" ++#include "grlib.h" ++#include "sim-config.h" ++ ++static int tty_setup = 1; /* default setup if not a tty */ ++ ++/* APB registers */ ++#define APBSTART 0x80000000 ++#define APBEND 0x80100000 ++ ++/* Memory exception waitstates */ ++#define MEM_EX_WS 1 ++ ++#define MOK 0 ++ ++/* LEON3 APB register addresses */ ++ ++#define IRQMP_IPR 0x204 ++#define IRQMP_IMR 0x240 ++#define IRQMP_ICR 0x20C ++#define IRQMP_IFR 0x208 ++#define GPTIMER_SCALER 0x300 ++#define GPTIMER_SCLOAD 0x304 ++#define GPTIMER_CONFIG 0x308 ++#define GPTIMER_TIMER1 0x310 ++#define GPTIMER_RELOAD1 0x314 ++#define GPTIMER_CTRL1 0x318 ++#define GPTIMER_TIMER2 0x320 ++#define GPTIMER_RELOAD2 0x324 ++#define GPTIMER_CTRL2 0x328 ++ ++#define APBUART_RXTX 0x100 ++#define APBUART_STATUS 0x104 ++ ++/* Size of UART buffers (bytes) */ ++#define UARTBUF 1024 ++ ++/* Number of simulator ticks between flushing the UARTS. */ ++/* For good performance, keep above 1000 */ ++#define UART_FLUSH_TIME 3000 ++ ++ ++/* New uart defines */ ++#define UART_TX_TIME 1000 ++#define UART_RX_TIME 1000 ++#define UARTA_DR 0x1 ++#define UARTA_SRE 0x2 ++#define UARTA_HRE 0x4 ++#define UARTA_OR 0x10 ++ ++/* IRQMP registers */ ++ ++static uint32 irqmp_ipr; ++static uint32 irqmp_imr; ++static uint32 irqmp_ifr; ++ ++/* GPTIMER registers */ ++ ++#define NGPTIMERS 2 ++#define GPTIMER_IRQ 8 ++ ++static uint32 gpt_scaler; ++static uint32 gpt_scaler_start; ++static uint32 gpt_counter[NGPTIMERS]; ++static uint32 gpt_reload[NGPTIMERS]; ++static uint32 gpt_ctrl[NGPTIMERS]; ++ ++/* ROM size 16 Mbyte */ ++#define ROM_START 0x00000000 ++#define ROM_MASK 0x00ffffff ++#define ROM_END (ROM_START + ROM_MASK + 1) ++ ++/* RAM size 16 Mbyte */ ++#define RAM_START 0x40000000 ++#define RAM_MASK 0x00ffffff ++#define RAM_END (RAM_START + RAM_MASK + 1) ++ ++/* Memory */ ++ ++static unsigned char romb[ROM_END - ROM_START]; ++static unsigned char ramb[RAM_END - RAM_START]; ++static uint32 cache_ctrl; ++ ++ ++/* UART support variables */ ++ ++static int32 fd1, fd2; /* file descriptor for input file */ ++static int32 Ucontrol; /* UART status register */ ++static unsigned char aq[UARTBUF], bq[UARTBUF]; ++static int32 anum, aind = 0; ++static int32 bnum, bind = 0; ++static char wbufa[UARTBUF], wbufb[UARTBUF]; ++static unsigned wnuma; ++static unsigned wnumb; ++static FILE *f1in, *f1out; ++static struct termios ioc1, ioc2, iocold1, iocold2; ++static int f1open = 0; ++ ++static char uarta_sreg, uarta_hreg; ++static uint32 uart_stat_reg; ++static uint32 uarta_data; ++ ++/* Forward declarations */ ++ ++static void mem_init (void); ++static void close_port (void); ++static void leon3_reset (void); ++static void irqmp_intack (int32 level); ++static void chk_irq (void); ++static void set_irq (int32 level); ++static int32 apb_read (uint32 addr, uint32 *data); ++static int apb_write (uint32 addr, uint32 data); ++static void port_init (void); ++static uint32 grlib_read_uart (uint32 addr); ++static void grlib_write_uart (uint32 addr, uint32 data); ++static void flush_uart (void); ++static void uarta_tx (void); ++static void uart_rx (caddr_t arg); ++static void uart_intr (caddr_t arg); ++static void uart_irq_start (void); ++static void gpt_intr (caddr_t arg); ++static void gpt_init (void); ++static void gpt_reset (void); ++static void gpt_scaler_set (uint32 val); ++static void timer_ctrl (uint32 val, int i); ++static unsigned char * ++ get_mem_ptr (uint32 addr, uint32 size); ++static void store_bytes (unsigned char *mem, uint32 waddr, ++ uint32 *data, int sz, int32 *ws); ++ ++static host_callback *callback; ++ ++ ++/* One-time init */ ++ ++static void ++init_sim() ++{ ++ callback = sim_callback; ++ grlib_init(); ++ mem_init(); ++ port_init(); ++ gpt_init(); ++} ++ ++/* Power-on reset init */ ++ ++static void ++reset() ++{ ++ leon3_reset(); ++ uart_irq_start(); ++ gpt_reset(); ++} ++ ++/* IU error mode manager */ ++ ++static void ++error_mode(pc) ++ uint32 pc; ++{ ++ ++} ++ ++ ++/* Memory init */ ++ ++static void ++mem_init() ++{ ++ ++/* Add AMBA P&P record for SRCTRL memory controller */ ++ ++ grlib_ahbspp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_SRCTRL, 0, 0), ++ GRLIB_PP_AHBADDR(0x00000000, 0xE00, 1, 1, 2), ++ GRLIB_PP_AHBADDR(0x40000000, 0xC00, 1, 1, 2), ++ GRLIB_PP_AHBADDR(0x20000000, 0xE00, 0, 0, 2), ++ 0); ++ if (sis_verbose) ++ printf("RAM start: 0x%x, RAM size: %d K, ROM size: %d K\n", ++ RAM_START, (RAM_MASK+1)/1024, (ROM_MASK+1)/1024); ++} ++ ++/* Flush ports when simulator stops */ ++ ++static void ++sim_halt() ++{ ++#ifdef FAST_UART ++ flush_uart(); ++#endif ++} ++ ++static void ++close_port() ++{ ++ if (f1open && f1in != stdin) ++ fclose(f1in); ++} ++ ++static void ++exit_sim() ++{ ++ close_port(); ++} ++ ++static void ++leon3_reset() ++{ ++ int i; ++ ++ irqmp_ipr = 0; ++ irqmp_imr = 0; ++ irqmp_ifr = 0; ++ ++ wnuma = wnumb = 0; ++ anum = aind = bnum = bind = 0; ++ ++ uart_stat_reg = UARTA_SRE | UARTA_HRE; ++ ++ gpt_counter[0] = 0xffffffff; ++ gpt_reload[0] = 0xffffffff; ++ gpt_scaler = 0xffff; ++ gpt_ctrl[0] = 0; ++ gpt_ctrl[1] = 0; ++ ++} ++ ++ ++ ++static void ++irqmp_intack(level) ++ int32 level; ++{ ++ int irq_test; ++ ++ if (sis_verbose > 2) ++ printf("interrupt %d acknowledged\n", level); ++ if (irqmp_ifr & (1 << level)) ++ irqmp_ifr &= ~(1 << level); ++ else ++ irqmp_ipr &= ~(1 << level); ++ chk_irq(); ++} ++ ++static void ++chk_irq() ++{ ++ int32 i; ++ uint32 itmp; ++ int old_irl; ++ ++ old_irl = ext_irl; ++ itmp = ((irqmp_ipr | irqmp_ifr) & irqmp_imr) & 0x0fffe; ++ ext_irl = 0; ++ if (itmp != 0) { ++ for (i = 15; i > 0; i--) { ++ if (((itmp >> i) & 1) != 0) { ++ if ((sis_verbose > 2) && (i > old_irl)) ++ printf("IU irl: %d\n", i); ++ ext_irl = i; ++ set_int(i, irqmp_intack, i); ++ break; ++ } ++ } ++ } ++} ++ ++static void ++set_irq(level) ++ int32 level; ++{ ++ irqmp_ipr |= (1 << level); ++ chk_irq(); ++} ++ ++static int32 ++apb_read(addr, data) ++ uint32 addr; ++ uint32 *data; ++{ ++ ++ switch (addr & 0xfff) { ++ ++ case APBUART_RXTX: /* 0x100 */ ++ case APBUART_STATUS: /* 0x104 */ ++ *data = grlib_read_uart(addr); ++ break; ++ ++ case IRQMP_IPR: /* 0x204 */ ++ *data = irqmp_ipr; ++ break; ++ ++ case IRQMP_IFR: /* 0x208 */ ++ *data = irqmp_ifr; ++ break; ++ ++ case IRQMP_IMR: /* 0x240 */ ++ *data = irqmp_imr; ++ break; ++ ++ case GPTIMER_SCALER: /* 0x300 */ ++ *data = gpt_scaler - (now() - gpt_scaler_start); ++ break; ++ ++ case GPTIMER_SCLOAD: /* 0x304 */ ++ *data = gpt_scaler; ++ break; ++ ++ case GPTIMER_CONFIG: /* 0x308 */ ++ *data = 0x100 | (GPTIMER_IRQ << 3) | NGPTIMERS; ++ break; ++ ++ case GPTIMER_TIMER1: /* 0x310 */ ++ *data = gpt_counter[0]; ++ break; ++ ++ case GPTIMER_RELOAD1: /* 0x314 */ ++ *data = gpt_reload[0]; ++ break; ++ ++ case GPTIMER_CTRL1: /* 0x318 */ ++ *data = gpt_ctrl[0]; ++ break; ++ ++ case GPTIMER_TIMER2: /* 0x320 */ ++ *data = gpt_counter[1]; ++ break; ++ ++ case GPTIMER_RELOAD2: /* 0x324 */ ++ *data = gpt_reload[1]; ++ break; ++ ++ case GPTIMER_CTRL2: /* 0x328 */ ++ *data = gpt_ctrl[1]; ++ break; ++ ++ default: ++ *data = 0; ++ break; ++ } ++ ++ if (sis_verbose > 1) ++ printf("APB read a: %08x, d: %08x\n", addr, *data); ++ ++ return (MOK); ++} ++ ++static int ++apb_write(addr, data) ++ uint32 addr; ++ uint32 data; ++{ ++ if (sis_verbose > 1) ++ printf("APB write a: %08x, d: %08x\n",addr,data); ++ switch (addr & 0xfff) { ++ ++ case APBUART_RXTX: /* 0x100 */ ++ case APBUART_STATUS: /* 0x104 */ ++ grlib_write_uart(addr, data); ++ break; ++ ++ case IRQMP_IFR: /* 0x208 */ ++ irqmp_ifr = data & 0xfffe; ++ chk_irq(); ++ break; ++ ++ case IRQMP_ICR: /* 0x20C */ ++ irqmp_ipr &= ~data & 0x0fffe; ++ chk_irq(); ++ break; ++ ++ case IRQMP_IMR: /* 0x240 */ ++ irqmp_imr = data & 0x7ffe; ++ chk_irq(); ++ break; ++ ++ case GPTIMER_SCLOAD: /* 0x304 */ ++ gpt_scaler_set(data); ++ break; ++ ++ case GPTIMER_TIMER1: /* 0x310 */ ++ gpt_counter[0] = data; ++ break; ++ ++ case GPTIMER_RELOAD1: /* 0x314 */ ++ gpt_reload[0] = data; ++ break; ++ ++ case GPTIMER_CTRL1: /* 0x318 */ ++ timer_ctrl(data, 0); ++ break; ++ ++ case GPTIMER_TIMER2: /* 0x320 */ ++ gpt_counter[1] = data; ++ break; ++ ++ case GPTIMER_RELOAD2: /* 0x324 */ ++ gpt_reload[1] = data; ++ break; ++ ++ case GPTIMER_CTRL2: /* 0x328 */ ++ timer_ctrl(data, 1); ++ break; ++ ++ default: ++ break; ++ } ++ return (MOK); ++} ++ ++ ++/* APBUART */ ++ ++static int ifd1 = -1, ofd1 = -1; ++ ++static void ++init_stdio() ++{ ++ if (dumbio) ++ return; /* do nothing */ ++ if (ifd1 == 0 && f1open) { ++ tcsetattr(0, TCSANOW, &ioc1); ++ tcflush(ifd1, TCIFLUSH); ++ } ++} ++ ++static void ++restore_stdio() ++{ ++ if (dumbio) ++ return; /* do nothing */ ++ if (ifd1 == 0 && f1open && tty_setup) ++ tcsetattr(0, TCSANOW, &iocold1); ++} ++ ++#define DO_STDIO_READ( _fd_, _buf_, _len_ ) \ ++ ( dumbio || nouartrx \ ++ ? (0) /* no bytes read, no delay */ \ ++ : (_fd_) == 1 && callback ? \ ++ callback->read_stdin (callback, _buf_, _len_) : \ ++ read( _fd_, _buf_, _len_ ) ) ++ ++ ++static void ++port_init() ++{ ++ ++ f1in = stdin; ++ f1out = stdout; ++ if (uart_dev1[0] != 0) ++ if ((fd1 = open(uart_dev1, O_RDWR | O_NONBLOCK)) < 0) { ++ printf("Warning, couldn't open output device %s\n", uart_dev1); ++ } else { ++ if (sis_verbose) ++ printf("serial port A on %s\n", uart_dev1); ++ f1in = f1out = fdopen(fd1, "r+"); ++ setbuf(f1out, NULL); ++ f1open = 1; ++ } ++ if (f1in) ifd1 = fileno(f1in); ++ if (ifd1 == 0) { ++ if (callback && !callback->isatty(callback, ifd1)) { ++ tty_setup = 0; ++ } ++ if (sis_verbose) ++ printf("serial port A on stdin/stdout\n"); ++ if (!dumbio) { ++ tcgetattr(ifd1, &ioc1); ++ if (tty_setup) { ++ iocold1 = ioc1; ++ ioc1.c_lflag &= ~(ICANON | ECHO); ++ ioc1.c_cc[VMIN] = 0; ++ ioc1.c_cc[VTIME] = 0; ++ } ++ } ++ f1open = 1; ++ } ++ ++ if (f1out) { ++ ofd1 = fileno(f1out); ++ if (!dumbio && tty_setup && ofd1 == 1) setbuf(f1out, NULL); ++ } ++ ++ wnuma = 0; ++ ++ ++ grlib_apbpp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_APBUART, 1, 3), ++ GRLIB_PP_APBADDR(0x80000100, 0xFFF)); ++} ++ ++static uint32 ++grlib_read_uart(addr) ++ uint32 addr; ++{ ++ ++ unsigned tmp; ++ ++ tmp = 0; ++ switch (addr & 0xff) { ++ ++ case 0x00: /* UART 1 RX/TX */ ++#ifndef _WIN32 ++#ifdef FAST_UART ++ ++ if (aind < anum) { ++ if ((aind + 1) < anum) ++ set_irq(3); ++ return ((uint32) aq[aind++]); ++ } else { ++ if (f1open) { ++ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); ++ } ++ else { ++ anum = 0; + } -+- rawfsr = _get_cw(); -+- rawfsr |= (fsr << 10) | 0x3ff; -+- __setfpucw(rawfsr); -++ rawfsr = (fsr << 10) | 0x2FF; /* double precision, all traps masked */ -++ __asm__ volatile ("fldcw %0" :: "m" (rawfsr)); -+ #else -+ #warning no fpu trap support for this target -+ #endif -+@@ -175,45 +172,36 @@ uint32 fsr; -+ "\n" -+ " "); -+ -++#elif defined(__x86_64__) -++ asm ("\n" -++"\n" -++".text\n" -++".align 8\n" -++".globl _get_sw, __get_sw\n" -++"__get_sw:\n" -++"_get_sw:\n" -++" pushq %rbp\n" -++" movq %rsp, %rbp\n" -++" movl $0, %eax\n" -++" fnstsw %ax\n" -++" movq %rbp, %rsp\n" -++" popq %rbp\n" -++" ret\n" -++".align 8\n" -++".globl _get_cw, __get_cw\n" -++"__get_cw:\n" -++"_get_cw:\n" -++" pushq %rbp\n" -++" movq %rsp, %rbp\n" -++" subq $2, %rsp\n" -++" fnstcw -2(%rbp)\n" -++" movw -2(%rbp), %ax\n" -++" movq %rbp, %rsp\n" -++" popq %rbp\n" -++" ret\n" -++" "); -+ -+ #else -+ #warning no fpu trap support for this target -+ #endif -+ -+-#if i386 -+-/* #if defined _WIN32 || defined __GO32__ */ -+-/* This is so floating exception handling works on NT -+- These definitions are from the linux fpu_control.h, which -+- doesn't exist on NT. -+- -+- default to: -+- - extended precision -+- - rounding to nearest -+- - exceptions on overflow, zero divide and NaN -+-*/ -+-#define _FPU_DEFAULT 0x1372 -+-#define _FPU_RESERVED 0xF0C0 /* Reserved bits in cw */ -+- -+-static void -+-__setfpucw(unsigned short fpu_control) -+-{ -+- volatile unsigned short cw; -+- -+- /* If user supplied _fpu_control, use it ! */ -+- if (!fpu_control) -+- { -+- /* use defaults */ -+- fpu_control = _FPU_DEFAULT; -+- } -+- /* Get Control Word */ -+- __asm__ volatile ("fnstcw %0" : "=m" (cw) : ); -+- -+- /* mask in */ -+- cw &= _FPU_RESERVED; -+- cw = cw | (fpu_control & ~_FPU_RESERVED); -+- -+- /* set cw */ -+- __asm__ volatile ("fldcw %0" :: "m" (cw)); -+-} -+-/* #endif */ -+-#endif -+diff --git a/sim/erc32/func.c b/sim/erc32/func.c -+index d001c58..6f985a1 100644 -+--- a/sim/erc32/func.c -++++ b/sim/erc32/func.c -+@@ -26,20 +26,26 @@ -+ #include -+ #include -+ #include "sis.h" -+-#include "end.h" -+ #include -+ #include "sim-config.h" -+ -+ -+ #define VAL(x) strtoul(x,(char **)NULL,0) -+ -+-extern int current_target_byte_order; -++/* The target's byte order is big-endian by default until we load a -++ little-endian program. */ -++int current_target_byte_order = BIG_ENDIAN; -++ -++int dumbio = 0; /* normal, smart, terminal oriented IO by default */ -+ struct disassemble_info dinfo; -+ struct pstate sregs; -+-extern struct estate ebase; -++struct estate ebase; -++struct evcell evbuf[EVENT_MAX]; -++struct irqcell irqarr[16]; -++ -+ int ctrl_c = 0; -+ int sis_verbose = 0; -+-char *sis_version = "2.7.5"; -++char *sis_version = "2.8"; -+ int nfp = 0; -+ int ift = 0; -+ int wrp = 0; -+@@ -50,8 +56,11 @@ int sparclite = 0; /* emulating SPARClite instructions? */ -+ int sparclite_board = 0; /* emulating SPARClite board RAM? */ -+ char uart_dev1[128] = ""; -+ char uart_dev2[128] = ""; -+-extern int ext_irl; -+ uint32 last_load_addr = 0; -++int nouartrx = 0; -++host_callback *sim_callback; -++struct memsys *ms = &erc32sys; -++int cputype = 0; /* 0 = erc32, 3 = leon3 */ -+ -+ #ifdef ERRINJ -+ uint32 errcnt = 0; -+@@ -81,6 +90,7 @@ batch(sregs, fname) -+ { -+ FILE *fp; -+ char lbuf[1024]; -++ char *tmp; -+ -+ if ((fp = fopen(fname, "r")) == NULL) { -+ fprintf(stderr, "couldn't open batch file %s\n", fname); -+@@ -88,7 +98,7 @@ batch(sregs, fname) -+ } -+ while (!feof(fp)) { -+ lbuf[0] = 0; -+- fgets(lbuf, 1023, fp); -++ tmp = fgets(lbuf, 1023, fp); -+ if ((strlen(lbuf) > 0) && (lbuf[strlen(lbuf) - 1] == '\n')) -+ lbuf[strlen(lbuf) - 1] = 0; -+ printf("sis> %s\n", lbuf); -+@@ -382,7 +392,7 @@ exec_cmd(sregs, cmd) -+ { -+ char *cmd1, *cmd2; -+ int32 stat; -+- uint32 len, i, clen, j; -++ uint32 len, i, clen, j, tmp; -+ static uint32 daddr = 0; -+ char *cmdsave; -+ -+@@ -426,7 +436,7 @@ exec_cmd(sregs, cmd) -+ stat = run_sim(sregs, VAL(cmd1), 0); -+ } -+ daddr = sregs->pc; -+- sim_halt(); -++ ms->sim_halt(); -+ } else if (strncmp(cmd1, "debug", clen) == 0) { -+ if ((cmd1 = strtok(NULL, " \t\n\r")) != NULL) { -+ sis_verbose = VAL(cmd1); -+@@ -468,6 +478,7 @@ exec_cmd(sregs, cmd) -+ } -+ sregs->pc = len & ~3; -+ sregs->npc = sregs->pc + 4; -++ if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init(); -+ printf("resuming at 0x%08x\n",sregs->pc); -+ if ((cmd2 = strtok(NULL, " \t\n\r")) != NULL) { -+ stat = run_sim(sregs, VAL(cmd2), 0); -+@@ -475,7 +486,7 @@ exec_cmd(sregs, cmd) -+ stat = run_sim(sregs, UINT64_MAX, 0); -+ } -+ daddr = sregs->pc; -+- sim_halt(); -++ ms->sim_halt(); -+ } else if (strncmp(cmd1, "help", clen) == 0) { -+ gen_help(); -+ } else if (strncmp(cmd1, "history", clen) == 0) { -+@@ -543,26 +554,31 @@ exec_cmd(sregs, cmd) -+ ebase.simtime = 0; -+ reset_all(); -+ reset_stat(sregs); -++ if (last_load_addr != 0) { -++ sregs->pc = last_load_addr & ~3; -++ sregs->npc = sregs->pc + 4; -++ } -++ if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init(); -+ if ((cmd1 = strtok(NULL, " \t\n\r")) == NULL) { -+ stat = run_sim(sregs, UINT64_MAX, 0); -+ } else { -+ stat = run_sim(sregs, VAL(cmd1), 0); -+ } -+ daddr = sregs->pc; -+- sim_halt(); -++ ms->sim_halt(); -+ } else if (strncmp(cmd1, "shell", clen) == 0) { -+ if ((cmd1 = strtok(NULL, " \t\n\r")) != NULL) { -+- system(&cmdsave[clen]); -++ tmp = system(&cmdsave[clen]); -+ } -+ } else if (strncmp(cmd1, "step", clen) == 0) { -+ stat = run_sim(sregs, 1, 1); -+ daddr = sregs->pc; -+- sim_halt(); -++ ms->sim_halt(); -+ } else if (strncmp(cmd1, "tcont", clen) == 0) { -+ sregs->tlimit = limcalc(sregs->freq); -+ stat = run_sim(sregs, UINT64_MAX, 0); -+ daddr = sregs->pc; -+- sim_halt(); -++ ms->sim_halt(); -+ } else if (strncmp(cmd1, "tgo", clen) == 0) { -+ if ((cmd1 = strtok(NULL, " \t\n\r")) == NULL) { -+ len = last_load_addr; -+@@ -575,7 +591,7 @@ exec_cmd(sregs, cmd) -+ printf("resuming at 0x%08x\n",sregs->pc); -+ stat = run_sim(sregs, UINT64_MAX, 0); -+ daddr = sregs->pc; -+- sim_halt(); -++ ms->sim_halt(); -+ } else if (strncmp(cmd1, "tlimit", clen) == 0) { -+ sregs->tlimit = limcalc(sregs->freq); -+ if (sregs->tlimit != (uint32) -1) -+@@ -589,15 +605,20 @@ exec_cmd(sregs, cmd) -+ } -+ printf("\n"); -+ daddr = sregs->pc; -+- sim_halt(); -++ ms->sim_halt(); -+ } else if (strncmp(cmd1, "trun", clen) == 0) { -+ ebase.simtime = 0; -+ reset_all(); -+ reset_stat(sregs); -++ if (last_load_addr != 0) { -++ sregs->pc = last_load_addr & ~3; -++ sregs->npc = sregs->pc + 4; -++ } -++ if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init(); -+ sregs->tlimit = limcalc(sregs->freq); -+ stat = run_sim(sregs, UINT64_MAX, 0); -+ daddr = sregs->pc; -+- sim_halt(); -++ ms->sim_halt(); -+ } else -+ printf("syntax error\n"); -+ } -+@@ -611,7 +632,7 @@ void -+ reset_stat(sregs) -+ struct pstate *sregs; -+ { -+- sregs->tottime = 0; -++ sregs->tottime = 0.0; -+ sregs->pwdtime = 0; -+ sregs->ninst = 0; -+ sregs->fholdt = 0; -+@@ -629,10 +650,10 @@ void -+ show_stat(sregs) -+ struct pstate *sregs; -+ { -+- uint32 iinst; -+- uint32 stime, tottime; -++ uint64 iinst; -++ uint64 stime; -+ -+- if (sregs->tottime == 0) tottime = 1; else tottime = sregs->tottime; -++ if (sregs->tottime == 0.0) sregs->tottime +=1E-6; -+ stime = ebase.simtime - sregs->simstart; /* Total simulated time */ -+ #ifdef STAT -+ -+@@ -640,39 +661,39 @@ show_stat(sregs) -+ sregs->nbranch; -+ #endif -+ -+- printf("\n Cycles : %9d\n\r", ebase.simtime - sregs->simstart); -+- printf(" Instructions : %9d\n", sregs->ninst); -++ printf("\n Cycles : %9llu\n\r", ebase.simtime - sregs->simstart); -++ printf(" Instructions : %9llu\n", sregs->ninst); -+ -+ #ifdef STAT -+- printf(" integer : %9.2f %%\n", 100.0 * (float) iinst / (float) sregs->ninst); -++ printf(" integer : %9.2f %%\n", 100.0 * (double) iinst / (double) sregs->ninst); -+ printf(" load : %9.2f %%\n", -+- 100.0 * (float) sregs->nload / (float) sregs->ninst); -++ 100.0 * (double) sregs->nload / (double) sregs->ninst); -+ printf(" store : %9.2f %%\n", -+- 100.0 * (float) sregs->nstore / (float) sregs->ninst); -++ 100.0 * (double) sregs->nstore / (double) sregs->ninst); -+ printf(" branch : %9.2f %%\n", -+- 100.0 * (float) sregs->nbranch / (float) sregs->ninst); -++ 100.0 * (double) sregs->nbranch / (double) sregs->ninst); -+ printf(" float : %9.2f %%\n", -+- 100.0 * (float) sregs->finst / (float) sregs->ninst); -++ 100.0 * (double) sregs->finst / (double) sregs->ninst); -+ printf(" Integer CPI : %9.2f\n", -+- ((float) (stime - sregs->pwdtime - sregs->fholdt - sregs->finst)) -++ ((double) (stime - sregs->pwdtime - sregs->fholdt - sregs->finst)) -+ / -+- (float) (sregs->ninst - sregs->finst)); -++ (double) (sregs->ninst - sregs->finst)); -+ printf(" Float CPI : %9.2f\n", -+- ((float) sregs->fholdt / (float) sregs->finst) + 1.0); -++ ((double) sregs->fholdt / (double) sregs->finst) + 1.0); -+ #endif -+ printf(" Overall CPI : %9.2f\n", -+- (float) (stime - sregs->pwdtime) / (float) sregs->ninst); -+- printf("\n ERC32 performance (%4.1f MHz): %5.2f MOPS (%5.2f MIPS, %5.2f MFLOPS)\n", -+- sregs->freq, sregs->freq * (float) sregs->ninst / (float) (stime - sregs->pwdtime), -+- sregs->freq * (float) (sregs->ninst - sregs->finst) / -+- (float) (stime - sregs->pwdtime), -+- sregs->freq * (float) sregs->finst / (float) (stime - sregs->pwdtime)); -+- printf(" Simulated ERC32 time : %5.2f ms\n", (float) (ebase.simtime - sregs->simstart) / 1000.0 / sregs->freq); -+- printf(" Processor utilisation : %5.2f %%\n", 100.0 * (1.0 - ((float) sregs->pwdtime / (float) stime))); -+- printf(" Real-time / simulator-time : 1/%.2f \n", -+- ((float) sregs->tottime) / ((float) (stime) / (sregs->freq * 1.0E6))); -+- printf(" Simulator performance : %d KIPS\n",sregs->ninst/tottime/1000); -+- printf(" Used time (sys + user) : %3d s\n\n", sregs->tottime); -++ (double) (stime - sregs->pwdtime) / (double) sregs->ninst); -++ printf("\n CPU performance (%4.1f MHz) : %5.2f MOPS (%5.2f MIPS, %5.2f MFLOPS)\n", -++ sregs->freq, sregs->freq * (double) sregs->ninst / (double) (stime - sregs->pwdtime), -++ sregs->freq * (double) (sregs->ninst - sregs->finst) / -++ (double) (stime - sregs->pwdtime), -++ sregs->freq * (double) sregs->finst / (double) (stime - sregs->pwdtime)); -++ printf(" Simulated CPU time : %.2f s\n", (double) (ebase.simtime - sregs->simstart) / 1000000.0 / sregs->freq); -++ printf(" Processor utilisation : %.2f %%\n", 100.0 * (1.0 - ((double) sregs->pwdtime / (double) stime))); -++ printf(" Real-time performance : %.2f %%\n", 100.0/ -++ ((sregs->tottime) / ((double) (stime) / (sregs->freq * 1.0E6)))); -++ printf(" Simulator performance : %.2f MIPS\n",(double)(sregs->ninst)/sregs->tottime/1E6); -++ printf(" Used time (sys + user) : %.2f s\n\n", sregs->tottime); -+ } -+ -+ -+@@ -708,12 +729,6 @@ init_signals() -+ } -+ -+ -+-extern struct disassemble_info dinfo; -+- -+-struct estate ebase; -+-struct evcell evbuf[EVENT_MAX]; -+-struct irqcell irqarr[16]; -+- -+ static int -+ disp_fpu(sregs) -+ struct pstate *sregs; -+@@ -724,7 +739,7 @@ disp_fpu(sregs) -+ -+ printf("\n fsr: %08X\n\n", sregs->fsr); -+ -+-#ifdef HOST_LITTLE_ENDIAN_FLOAT -++#ifdef HOST_LITTLE_ENDIAN -+ for (i = 0; i < 32; i++) -+ sregs->fdp[i ^ 1] = sregs->fs[i]; -+ #endif -+@@ -759,21 +774,32 @@ disp_regs(sregs,cwp) -+ } -+ } -+ -++static void print_insn_sparc_sis(uint32 addr, struct disassemble_info *info) -++{ -++ unsigned char i[4]; -++ -++ ms->sis_memory_read(addr, i, 4); -++ dinfo.buffer_vma = addr; -++ dinfo.buffer_length = 4; -++ dinfo.buffer = i; -++ print_insn_sparc(addr, info); -++} -++ -+ static void -+ disp_ctrl(sregs) -+ struct pstate *sregs; -+ { -+ -+- unsigned char i[4]; -++ uint32 i; -+ -+ printf("\n psr: %08X wim: %08X tbr: %08X y: %08X\n", -+ sregs->psr, sregs->wim, sregs->tbr, sregs->y); -+- sis_memory_read(sregs->pc, i, 4); -+- printf("\n pc: %08X = %02X%02X%02X%02X ", sregs->pc,i[0],i[1],i[2],i[3]); -+- print_insn_sparc(sregs->pc, &dinfo); -+- sis_memory_read(sregs->npc, i, 4); -+- printf("\n npc: %08X = %02X%02X%02X%02X ",sregs->npc,i[0],i[1],i[2],i[3]); -+- print_insn_sparc(sregs->npc, &dinfo); -++ ms->sis_memory_read(sregs->pc, (char *) &i, 4); -++ printf("\n pc: %08X = %08X ", sregs->pc, i); -++ print_insn_sparc_sis(sregs->pc, &dinfo); -++ ms->sis_memory_read(sregs->npc, (char *) &i, 4); -++ printf("\n npc: %08X = %08X ", sregs->npc, i); -++ print_insn_sparc_sis(sregs->npc, &dinfo); -+ if (sregs->err_mode) -+ printf("\n IU in error mode"); -+ printf("\n\n"); -+@@ -787,21 +813,28 @@ disp_mem(addr, len) -+ -+ uint32 i; -+ unsigned char data[4]; -++ uint32 *wdata = (uint32 *) data; -+ uint32 mem[4], j; -+ char *p; -++ int end; -+ -++#ifdef HOST_LITTLE_ENDIAN -++ end = 3; -++#else -++ end = 0; -++#endif -+ for (i = addr & ~3; i < ((addr + len) & ~3); i += 16) { -+ printf("\n %8X ", i); -+ for (j = 0; j < 4; j++) { -+- sis_memory_read((i + (j * 4)), data, 4); -+- printf("%02x%02x%02x%02x ", data[0],data[1],data[2],data[3]); -++ ms->sis_memory_read((i + (j * 4)), data, 4); -++ printf("%08x ", *wdata); -+ mem[j] = *((int *) &data); -+ } -+ printf(" "); -+ p = (char *) mem; -+ for (j = 0; j < 16; j++) { -+- if (isprint(p[j])) -+- putchar(p[j]); -++ if (isprint(p[j^end])) -++ putchar(p[j^end]); -+ else -+ putchar('.'); -+ } -+@@ -817,11 +850,12 @@ dis_mem(addr, len, info) -+ { -+ uint32 i; -+ unsigned char data[4]; -++ uint32 *wdata = (uint32 *) data; -+ -+ for (i = addr & -3; i < ((addr & -3) + (len << 2)); i += 4) { -+- sis_memory_read(i, data, 4); -+- printf(" %08x %02x%02x%02x%02x ", i, data[0],data[1],data[2],data[3]); -+- print_insn_sparc(i, info); -++ ms->sis_memory_read(i, data, 4); -++ printf(" %08x %08x ", i, *wdata); -++ print_insn_sparc_sis(i, info); -+ if (i >= 0xfffffffc) break; -+ printf("\n"); -+ } -+@@ -983,7 +1017,7 @@ reset_all() -+ { -+ init_event(); /* Clear event queue */ -+ init_regs(&sregs); -+- reset(); -++ ms->reset(); -+ #ifdef ERRINJ -+ errinjstart(); -+ #endif -+@@ -1019,6 +1053,7 @@ bfd_load(fname) -+ asection *section; -+ bfd *pbfd; -+ const bfd_arch_info_type *arch; -++ int i; -+ -+ pbfd = bfd_openr(fname, 0); -+ -+@@ -1092,14 +1127,18 @@ bfd_load(fname) -+ fptr = 0; -+ -+ while (section_size > 0) { -+- char buffer[1024]; -+ int count; -++ char buffer[1024]; -++ uint32 *wbuffer = (uint32 *) buffer; -+ -+ count = min(section_size, 1024); -+ -+ bfd_get_section_contents(pbfd, section, buffer, fptr, count); -+ -+- sis_memory_write(section_address, buffer, count); -++#ifdef HOST_LITTLE_ENDIAN -++ for (i=0;isis_memory_write(section_address, buffer, count); -+ -+ section_address += count; -+ fptr += count; -+@@ -1115,3 +1154,16 @@ bfd_load(fname) -+ -+ return(bfd_get_start_address (pbfd)); -+ } -++ -++ -++double get_time (void) -++{ -++ double usec; -++ -++ struct timeval tm; -++ -++ gettimeofday (&tm, NULL); -++ usec = ((double) tm.tv_sec) * 1E6 + ((double) tm.tv_usec); -++ return (usec / 1E6); -++ -++} -+diff --git a/sim/erc32/grlib.c b/sim/erc32/grlib.c -+new file mode 100644 -+index 0000000..42a3ed0 -+--- /dev/null -++++ b/sim/erc32/grlib.c -+@@ -0,0 +1,98 @@ -++/* -++ * This file is part of SIS. -++ * -++ * SIS, SPARC instruction simulator. Copyright (C) 2014 Jiri Gaisler -++ * -++ * 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 3 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, see . -++ * -++ */ -++ -++ -++#include "sis.h" -++#include "grlib.h" -++ -++ -++/* APB PNP */ -++ -++static uint32 apbppmem[32*2]; /* 32-entry APB PP AREA */ -++static int apbppindex; -++ -++int grlib_apbpp_add(uint32 id, uint32 addr) -++{ -++ apbppmem[apbppindex++] = id; -++ apbppmem[apbppindex++] = addr; -++ if(apbppindex >= (32*2)) apbppindex = 0; /* prevent overflow of area */ -++ return(apbppindex); -++} -++ -++uint32 grlib_apbpnp_read(uint32 addr) -++{ -++ uint32 read_data; -++ addr &= 0xff; -++ read_data = apbppmem[addr>>2]; -++ -++ return read_data; -++} -++ -++/* AHB PNP */ -++ -++static uint32 ahbppmem[128*8]; /* 128-entry AHB PP AREA */ -++static int ahbmppindex; -++static int ahbsppindex = 64*8; -++ -++int grlib_ahbmpp_add(uint32 id) -++{ -++ ahbppmem[ahbmppindex] = id; -++ ahbmppindex += 8; -++ if(ahbmppindex >= (64*8)) ahbmppindex = 0; /* prevent overflow of area */ -++ return(ahbmppindex); -++} -++ -++int grlib_ahbspp_add(uint32 id, uint32 addr1, uint32 addr2, -++ uint32 addr3, uint32 addr4) -++{ -++ ahbppmem[ahbsppindex] = id; -++ ahbsppindex += 4; -++ ahbppmem[ahbsppindex++] = addr1; -++ ahbppmem[ahbsppindex++] = addr2; -++ ahbppmem[ahbsppindex++] = addr3; -++ ahbppmem[ahbsppindex++] = addr4; -++ if(ahbsppindex >= (128*8)) ahbsppindex = 64*8; /* prevent overflow of area */ -++ return(ahbsppindex); -++} -++ -++uint32 grlib_ahbpnp_read(uint32 addr) -++{ -++ uint32 read_data; -++ -++ addr &= 0xfff; -++ read_data = ahbppmem[addr>>2]; -++ return read_data; -++ -++} -++ -++void grlib_init() -++{ -++ /* Add PP records for Leon3, APB bridge and interrupt controller -++ as this is not done elsewhere */ -++ -++ grlib_ahbmpp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_LEON3, 0, 0)); -++ grlib_ahbspp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_APBMST, 0, 0), -++ GRLIB_PP_AHBADDR(0x80000000, 0xFFF, 0, 0, 2), -++ 0, 0, 0); -++ -++ grlib_apbpp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_IRQMP, 2, 0), -++ GRLIB_PP_APBADDR(0x80000200, 0xFFF)); -++ -++} -+diff --git a/sim/erc32/grlib.h b/sim/erc32/grlib.h -+new file mode 100644 -+index 0000000..4d52211 -+--- /dev/null -++++ b/sim/erc32/grlib.h -+@@ -0,0 +1,57 @@ -++/* -++ * This file is part of SIS. -++ * -++ * SIS, SPARC instruction simulator. Copyright (C) 2014 Jiri Gaisler -++ * -++ * 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 3 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, see . -++ * -++ */ -++ -++ -++/* Definitions for AMBA PNP in Gaisler Research GRLIB SOC */ -++ -++/* Vendors */ -++#define VENDOR_GAISLER 1 -++#define VENDOR_PENDER 2 -++#define VENDOR_ESA 4 -++#define VENDOR_DLR 10 -++ -++/* Devices */ -++#define GAISLER_LEON3 0x003 -++#define GAISLER_APBMST 0x006 -++#define GAISLER_SRCTRL 0x008 -++#define GAISLER_APBUART 0x00C -++#define GAISLER_IRQMP 0x00D -++#define GAISLER_GPTIMER 0x011 -++#define ESA_MCTRL 0x00F -++ -++/* How to build entries in the plug&play area */ -++#define GRLIB_PP_ID(v, d, x, i) ((v & 0xff) << 24) | ((d & 0x3ff) << 12) |\ -++ ((x & 0x1f) << 5) | (i & 0x1f) -++#define GRLIB_PP_AHBADDR(a, m, p, c, t) (a & 0xfff00000) | ((m & 0xfff) << 4) |\ -++ ((p & 1) << 17) | ((c & 1) << 16) | (t & 0x3) -++#define GRLIB_PP_APBADDR(a, m) ((a & 0xfff00)<< 12) | ((m & 0xfff) << 4) | 1 -++ -++#define AHBPP_START 0xFFFFF000 -++#define AHBPP_END 0xFFFFFFFF -++#define APBPP_START 0x800FF000 -++#define APBPP_END 0x800FFFFF -++ -++int grlib_apbpp_add(uint32 id, uint32 addr); -++int grlib_ahbmpp_add(uint32 id); -++int grlib_ahbspp_add(uint32 id, uint32 addr1, uint32 addr2, -++ uint32 addr3, uint32 addr4); -++uint32 grlib_ahbpnp_read(uint32 addr); -++uint32 grlib_apbpnp_read(uint32 addr); -++void grlib_init(); -+diff --git a/sim/erc32/help.c b/sim/erc32/help.c -+index 21c2a77..6d74e79 100644 -+--- a/sim/erc32/help.c -++++ b/sim/erc32/help.c -+@@ -7,8 +7,8 @@ usage() -+ { -+ -+ printf("usage: sis [-uart1 uart_device1] [-uart2 uart_device2]\n"); -++ printf("[-sparclite] [-dumbio] [-v] [-vv]\n"); -+ printf("[-nfp] [-freq frequency] [-c batch_file] [files]\n"); -+- printf("[-sparclite] [-dumbio]\n"); -+ } -+ -+ void -+diff --git a/sim/erc32/interf.c b/sim/erc32/interf.c -+index e2db44e..259c8f3 100644 -+--- a/sim/erc32/interf.c -++++ b/sim/erc32/interf.c -+@@ -24,7 +24,6 @@ -+ #include -+ #include -+ #include -+-#include -+ #include -+ #include "sis.h" -+ #include "libiberty.h" -+@@ -36,34 +35,10 @@ -+ #include "gdb/signals.h" -+ -+ #define PSR_CWP 0x7 -+- -+-extern struct disassemble_info dinfo; -+-extern struct pstate sregs; -+-extern struct estate ebase; -+- -+-extern int current_target_byte_order; -+-extern int ctrl_c; -+-extern int nfp; -+-extern int ift; -+-extern int rom8; -+-extern int wrp; -+-extern int uben; -+-extern int sis_verbose; -+-extern char *sis_version; -+-extern struct estate ebase; -+-extern struct evcell evbuf[]; -+-extern struct irqcell irqarr[]; -+-extern int irqpend, ext_irl; -+-extern int sparclite; -+-extern int dumbio; -+-extern int sparclite_board; -+-extern int termsave; -+-extern char uart_dev1[], uart_dev2[]; -++#define SOFT_BREAK 0x91d02001 -+ -+ int sis_gdb_break = 1; -+ -+-host_callback *sim_callback; -+- -+ int -+ run_sim(sregs, icount, dis) -+ struct pstate *sregs; -+@@ -75,9 +50,10 @@ run_sim(sregs, icount, dis) -+ if (sis_verbose) -+ (*sim_callback->printf_filtered) (sim_callback, "resuming at %x\n", -+ sregs->pc); -+- init_stdio(); -+- sregs->starttime = time(NULL); -++ ms->init_stdio(); -++ sregs->starttime = get_time(); -+ irq = 0; -++ if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init(); -+ while (!sregs->err_mode & (icount > 0)) { -+ -+ sregs->fhold = 0; -+@@ -94,9 +70,8 @@ run_sim(sregs, icount, dis) -+ if (sregs->pc == 0 || sregs->npc == 0) -+ printf ("bogus pc or npc\n"); -+ #endif -+- mexc = memory_read(sregs->asi, sregs->pc, &sregs->inst, -+- 2, &sregs->hold); -+-#if 1 /* DELETE ME! for debugging purposes only */ -++ mexc = ms->memory_iread(sregs->pc, &sregs->inst, &sregs->hold); -++#if 0 /* DELETE ME! for debugging purposes only */ -+ if (sis_verbose > 2) -+ printf("pc %x, np %x, sp %x, fp %x, wm %x, cw %x, i %08x\n", -+ sregs->pc, sregs->npc, -+@@ -117,12 +92,12 @@ run_sim(sregs, icount, dis) -+ if (mexc) { -+ sregs->trap = I_ACC_EXC; -+ } else { -+- if ((sis_gdb_break) && (sregs->inst == 0x91d02001)) { -++ if ((sis_gdb_break) && (sregs->inst == SOFT_BREAK)) { -+ if (sis_verbose) -+ (*sim_callback->printf_filtered) (sim_callback, -+ "SW BP hit at %x\n", sregs->pc); -+- sim_halt(); -+- restore_stdio(); -++ ms->sim_halt(); -++ ms->restore_stdio(); -+ clearerr(stdin); -+ return (BPT_HIT); -+ } else -+@@ -140,12 +115,12 @@ run_sim(sregs, icount, dis) -+ icount = 0; -+ } -+ } -+- sim_halt(); -+- sregs->tottime += time(NULL) - sregs->starttime; -+- restore_stdio(); -++ ms->sim_halt(); -++ sregs->tottime += get_time() - sregs->starttime; -++ ms->restore_stdio(); -+ clearerr(stdin); -+ if (sregs->err_mode) -+- error_mode(sregs->pc); -++ ms->error_mode(sregs->pc); -+ if (sregs->err_mode) -+ return (ERROR); -+ if (sregs->bphit) { -+@@ -210,6 +185,17 @@ sim_open (kind, callback, abfd, argv) -+ if (strcmp(argv[stat], "-dumbio") == 0) { -+ dumbio = 1; -+ } else -++ if (strcmp(argv[stat], "-nouartrx") == 0) { -++ nouartrx = 1; -++ } else -++ if (strcmp(argv[stat], "-leon2") == 0) { -++ ms = &leon2; -++ cputype = CPU_LEON2; -++ } else -++ if (strcmp(argv[stat], "-leon3") == 0) { -++ ms = &leon3; -++ cputype = CPU_LEON3; -++ } else -+ if (strcmp(argv[stat], "-wrp") == 0) { -+ wrp = 1; -+ } else -+@@ -247,9 +233,24 @@ sim_open (kind, callback, abfd, argv) -+ stat++; -+ } -+ -++ if ((cputype == CPU_LEON3) || (cputype == CPU_LEON2)) -++ sregs.freq = freq ? freq : 50; -++ else -++ sregs.freq = freq ? freq : 14; -++ -+ if (sis_verbose) { -+ (*sim_callback->printf_filtered) (sim_callback, "\n SIS - SPARC instruction simulator %s\n", sis_version); -+- (*sim_callback->printf_filtered) (sim_callback, " Bug-reports to Jiri Gaisler ESA/ESTEC (jgais@wd.estec.esa.nl)\n"); -++ (*sim_callback->printf_filtered) (sim_callback, " Bug-reports to Jiri Gaisler (jiri@gaisler.se)\n\n"); -++ switch (cputype) { -++ case CPU_LEON2: -++ (*sim_callback->printf_filtered) (sim_callback, "LEON2 emulation enabled\n"); -++ break; -++ case CPU_LEON3: -++ (*sim_callback->printf_filtered) (sim_callback, "LEON3 emulation enabled\n"); -++ break; -++ default: -++ (*sim_callback->printf_filtered) (sim_callback, "ERC32 emulation enabled\n"); -++ } -+ if (nfp) -+ (*sim_callback->printf_filtered) (sim_callback, "no FPU\n"); -+ if (sparclite) -+@@ -258,17 +259,19 @@ sim_open (kind, callback, abfd, argv) -+ (*sim_callback->printf_filtered) (sim_callback, "dumb IO (no input, dumb output)\n"); -+ if (sis_gdb_break == 0) -+ (*sim_callback->printf_filtered) (sim_callback, "disabling GDB trap handling for breakpoints\n"); -+- if (freq) -+- (*sim_callback->printf_filtered) (sim_callback, " ERC32 freq %d Mhz\n", freq); -++ (*sim_callback->printf_filtered) (sim_callback, "CPU freq %3.1f MHz\n", sregs.freq); -+ } -+ -+- sregs.freq = freq ? freq : 15; -+ termsave = fcntl(0, F_GETFL, 0); -+ INIT_DISASSEMBLE_INFO(dinfo, stdout,(fprintf_ftype)fprintf); -++#ifdef HOST_LITTLE_ENDIAN -++ dinfo.endian = BFD_ENDIAN_LITTLE; -++#else -+ dinfo.endian = BFD_ENDIAN_BIG; -++#endif -+ reset_all(); -+ ebase.simtime = 0; -+- init_sim(); -++ ms->init_sim(); -+ init_bpt(&sregs); -+ reset_stat(&sregs); -+ -+@@ -282,7 +285,7 @@ sim_close(sd, quitting) -+ int quitting; -+ { -+ -+- exit_sim(); -++ ms->exit_sim(); -+ fcntl(0, F_SETFL, termsave); -+ -+ }; -+@@ -355,7 +358,19 @@ sim_write(sd, mem, buf, length) -+ const unsigned char *buf; -+ int length; -+ { -+- return (sis_memory_write(mem, buf, length)); -++#ifdef HOST_LITTLE_ENDIAN -++ int *ibufp = (int *) buf; -++ int ibuf[8192]; -++ int i, len; -++ -++ if (length >= 4) -++ for (i=0; isis_memory_write(mem, (char *) ibuf, length)); -++#else -++ return (ms->sis_memory_write(mem, buf, length)); -++#endif -+ } -+ -+ int -+@@ -365,7 +380,20 @@ sim_read(sd, mem, buf, length) -+ unsigned char *buf; -+ int length; -+ { -+- return (sis_memory_read(mem, buf, length)); -++#ifdef HOST_LITTLE_ENDIAN -++ int *ibuf = (int *) buf; -++ int i, len; -++ -++ len = ms->sis_memory_read(mem, buf, length); -++ if (length >= 4) -++ for (i=0; isis_memory_read(mem, buf, length)); -++#endif -+ } -+ -+ void -+@@ -451,7 +479,7 @@ flush_windows () -+ #endif -+ -+ for (i = 0; i < 16; i++) -+- memory_write (11, sp + 4 * i, &sregs.r[(win * 16 + 16 + i) & 0x7f], 2, -++ ms->memory_write (sp + 4 * i, &sregs.r[(win * 16 + 16 + i) & 0x7f], 2, -+ &ws); -+ -+ if (win == cwp) -+@@ -481,7 +509,7 @@ sim_do_command(sd, cmd) -+ SIM_DESC sd; -+ char *cmd; -+ { -+- exec_cmd(&sregs, cmd); -++ exec_cmd(&sregs, (char *) cmd); -+ } -+ -+ char ** -+@@ -490,6 +518,13 @@ sim_complete_command (SIM_DESC sd, const char *text, const char *word) -+ return NULL; -+ } -+ -++int -++sim_stop(SIM_DESC sd) -++{ -++ ctrl_c = 1; -++ return 1; -++} -++ -+ #if 0 /* FIXME: These shouldn't exist. */ -+ -+ int -+diff --git a/sim/erc32/leon2.c b/sim/erc32/leon2.c -+new file mode 100644 -+index 0000000..5ab3f79 -+--- /dev/null -++++ b/sim/erc32/leon2.c -+@@ -0,0 +1,1041 @@ -++/* -++ * This file is part of SIS. -++ * -++ * SIS, SPARC instruction simulator V2.5 Copyright (C) 1995 Jiri Gaisler, -++ * European Space Agency -++ * -++ * 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 3 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, see . -++ * -++ * Leon2 emulation, based on leon3.c . -++ */ -++ -++/* The control space devices */ -++ -++#include "config.h" -++#include -++#include -++#include -++#include -++#include -++#include -++#include -++#include -++#include "sis.h" -++#include "sim-config.h" -++ -++static int tty_setup = 1; /* default setup if not a tty */ -++ -++/* APB registers */ -++#define APBSTART 0x80000000 -++#define APBEND 0x80000100 -++ -++/* Memory exception waitstates */ -++#define MEM_EX_WS 1 -++ -++#define MOK 0 -++ -++/* LEON2 APB register addresses */ -++ -++#define IRQCTRL_IPR 0x094 -++#define IRQCTRL_IMR 0x090 -++#define IRQCTRL_ICR 0x09C -++#define IRQCTRL_IFR 0x098 -++#define TIMER_SCALER 0x060 -++#define TIMER_SCLOAD 0x064 -++#define LEON2_CONFIG 0x024 -++#define TIMER_TIMER1 0x040 -++#define TIMER_RELOAD1 0x044 -++#define TIMER_CTRL1 0x048 -++#define TIMER_TIMER2 0x050 -++#define TIMER_RELOAD2 0x054 -++#define TIMER_CTRL2 0x058 -++#define CACHE_CTRL 0x014 -++#define POWER_DOWN 0x018 -++ -++#define APBUART_RXTX 0x070 -++#define APBUART_STATUS 0x074 -++ -++/* Size of UART buffers (bytes) */ -++#define UARTBUF 1024 -++ -++/* Number of simulator ticks between flushing the UARTS. */ -++/* For good performance, keep above 1000 */ -++#define UART_FLUSH_TIME 3000 -++ -++ -++/* New uart defines */ -++#define UART_TX_TIME 1000 -++#define UART_RX_TIME 1000 -++#define UARTA_DR 0x1 -++#define UARTA_SRE 0x2 -++#define UARTA_HRE 0x4 -++#define UARTA_OR 0x10 -++ -++/* IRQCTRL registers */ -++ -++static uint32 irqctrl_ipr; -++static uint32 irqctrl_imr; -++static uint32 irqctrl_ifr; -++ -++/* TIMER registers */ -++ -++#define NTIMERS 2 -++#define TIMER_IRQ 8 -++ -++static uint32 gpt_scaler; -++static uint32 gpt_scaler_start; -++static uint32 gpt_counter[NTIMERS]; -++static uint32 gpt_reload[NTIMERS]; -++static uint32 gpt_ctrl[NTIMERS]; -++ -++/* ROM size 16 Mbyte */ -++#define ROM_START 0x00000000 -++#define ROM_MASK 0x00ffffff -++#define ROM_END (ROM_START + ROM_MASK + 1) -++ -++/* RAM size 16 Mbyte */ -++#define RAM_START 0x40000000 -++#define RAM_MASK 0x00ffffff -++#define RAM_END (RAM_START + RAM_MASK + 1) -++ -++/* Memory */ -++ -++static unsigned char romb[ROM_END - ROM_START]; -++static unsigned char ramb[RAM_END - RAM_START]; -++static uint32 cache_ctrl; -++ -++ -++/* UART support variables */ -++ -++static int32 fd1, fd2; /* file descriptor for input file */ -++static int32 Ucontrol; /* UART status register */ -++static unsigned char aq[UARTBUF], bq[UARTBUF]; -++static int32 anum, aind = 0; -++static int32 bnum, bind = 0; -++static char wbufa[UARTBUF], wbufb[UARTBUF]; -++static unsigned wnuma; -++static unsigned wnumb; -++static FILE *f1in, *f1out; -++static struct termios ioc1, ioc2, iocold1, iocold2; -++static int f1open = 0; -++ -++static char uarta_sreg, uarta_hreg; -++static uint32 uart_stat_reg; -++static uint32 uarta_data; -++ -++/* Forward declarations */ -++ -++static void mem_init (void); -++static void close_port (void); -++static void leon2_reset (void); -++static void irqctrl_intack (int32 level); -++static void chk_irq (void); -++static void set_irq (int32 level); -++static int32 apb_read (uint32 addr, uint32 *data); -++static int apb_write (uint32 addr, uint32 data); -++static void port_init (void); -++static uint32 grlib_read_uart (uint32 addr); -++static void grlib_write_uart (uint32 addr, uint32 data); -++static void flush_uart (void); -++static void uarta_tx (void); -++static void uart_rx (caddr_t arg); -++static void uart_intr (caddr_t arg); -++static void uart_irq_start (void); -++static void gpt_intr (caddr_t arg); -++static void gpt_init (void); -++static void gpt_reset (void); -++static void gpt_scaler_set (uint32 val); -++static void timer_ctrl (uint32 val, int i); -++static unsigned char * -++ get_mem_ptr (uint32 addr, uint32 size); -++static void store_bytes (unsigned char *mem, uint32 waddr, -++ uint32 *data, int sz, int32 *ws); -++ -++static host_callback *callback; -++ -++ -++/* One-time init */ -++ -++static void -++init_sim() -++{ -++ callback = sim_callback; -++ grlib_init(); -++ mem_init(); -++ port_init(); -++ gpt_init(); -++} -++ -++/* Power-on reset init */ -++ -++static void -++reset() -++{ -++ leon2_reset(); -++ uart_irq_start(); -++ gpt_reset(); -++} -++ -++/* IU error mode manager */ -++ -++static void -++error_mode(pc) -++ uint32 pc; -++{ -++ -++} -++ -++ -++/* Memory init */ -++ -++static void -++mem_init() -++{ -++ -++ if (sis_verbose) -++ printf("RAM start: 0x%x, RAM size: %d K, ROM size: %d K\n", -++ RAM_START, (RAM_MASK+1)/1024, (ROM_MASK+1)/1024); -++} -++ -++/* Flush ports when simulator stops */ -++ -++static void -++sim_halt() -++{ -++#ifdef FAST_UART -++ flush_uart(); -++#endif -++} -++ -++static void -++close_port() -++{ -++ if (f1open && f1in != stdin) -++ fclose(f1in); -++} -++ -++static void -++exit_sim() -++{ -++ close_port(); -++} -++ -++static void -++leon2_reset() -++{ -++ int i; -++ -++ irqctrl_ipr = 0; -++ irqctrl_imr = 0; -++ irqctrl_ifr = 0; -++ -++ wnuma = wnumb = 0; -++ anum = aind = bnum = bind = 0; -++ -++ uart_stat_reg = UARTA_SRE | UARTA_HRE; -++ -++ gpt_counter[0] = 0xffffffff; -++ gpt_reload[0] = 0xffffffff; -++ gpt_scaler = 0xffff; -++ gpt_ctrl[0] = 0; -++ gpt_ctrl[1] = 0; -++ -++} -++ -++ -++ -++static void -++irqctrl_intack(level) -++ int32 level; -++{ -++ int irq_test; -++ -++ if (sis_verbose > 2) -++ printf("interrupt %d acknowledged\n", level); -++ if (irqctrl_ifr & (1 << level)) -++ irqctrl_ifr &= ~(1 << level); -++ else -++ irqctrl_ipr &= ~(1 << level); -++ chk_irq(); -++} -++ -++static void -++chk_irq() -++{ -++ int32 i; -++ uint32 itmp; -++ int old_irl; -++ -++ old_irl = ext_irl; -++ itmp = ((irqctrl_ipr | irqctrl_ifr) & irqctrl_imr) & 0x0fffe; -++ ext_irl = 0; -++ if (itmp != 0) { -++ for (i = 15; i > 0; i--) { -++ if (((itmp >> i) & 1) != 0) { -++ if ((sis_verbose > 2) && (i > old_irl)) -++ printf("IU irl: %d\n", i); -++ ext_irl = i; -++ set_int(i, irqctrl_intack, i); -++ break; -++ } -++ } -++ } -++} -++ -++static void -++set_irq(level) -++ int32 level; -++{ -++ irqctrl_ipr |= (1 << level); -++ chk_irq(); -++} -++ -++static int32 -++apb_read(addr, data) -++ uint32 addr; -++ uint32 *data; -++{ -++ -++ switch (addr & 0xfff) { -++ -++ case APBUART_RXTX: /* 0x100 */ -++ case APBUART_STATUS: /* 0x104 */ -++ *data = grlib_read_uart(addr); -++ break; -++ -++ case IRQCTRL_IPR: /* 0x204 */ -++ *data = irqctrl_ipr; -++ break; -++ -++ case IRQCTRL_IFR: /* 0x208 */ -++ *data = irqctrl_ifr; -++ break; -++ -++ case IRQCTRL_IMR: /* 0x240 */ -++ *data = irqctrl_imr; -++ break; -++ -++ case TIMER_SCALER: /* 0x300 */ -++ *data = gpt_scaler - (now() - gpt_scaler_start); -++ break; -++ -++ case TIMER_SCLOAD: /* 0x304 */ -++ *data = gpt_scaler; -++ break; -++ -++ case LEON2_CONFIG: /* 0x308 */ -++ *data = 0x700310; -++ break; -++ -++ case TIMER_TIMER1: /* 0x310 */ -++ *data = gpt_counter[0]; -++ break; -++ -++ case TIMER_RELOAD1: /* 0x314 */ -++ *data = gpt_reload[0]; -++ break; -++ -++ case TIMER_CTRL1: /* 0x318 */ -++ *data = gpt_ctrl[0]; -++ break; -++ -++ case TIMER_TIMER2: /* 0x320 */ -++ *data = gpt_counter[1]; -++ break; -++ -++ case TIMER_RELOAD2: /* 0x324 */ -++ *data = gpt_reload[1]; -++ break; -++ -++ case TIMER_CTRL2: /* 0x328 */ -++ *data = gpt_ctrl[1]; -++ break; -++ -++ case CACHE_CTRL: /* 0x328 */ -++ *data = cache_ctrl; -++ break; -++ -++ default: -++ *data = 0; -++ break; -++ } -++ -++ if (sis_verbose > 1) -++ printf("APB read a: %08x, d: %08x\n", addr, *data); -++ -++ return (MOK); -++} -++ -++static int -++apb_write(addr, data) -++ uint32 addr; -++ uint32 data; -++{ -++ if (sis_verbose > 1) -++ printf("APB write a: %08x, d: %08x\n",addr,data); -++ switch (addr & 0xff) { -++ -++ case APBUART_RXTX: /* 0x100 */ -++ case APBUART_STATUS: /* 0x104 */ -++ grlib_write_uart(addr, data); -++ break; -++ -++ case IRQCTRL_IFR: /* 0x208 */ -++ irqctrl_ifr = data & 0xfffe; -++ chk_irq(); -++ break; -++ -++ case IRQCTRL_ICR: /* 0x20C */ -++ irqctrl_ipr &= ~data & 0x0fffe; -++ chk_irq(); -++ break; -++ -++ case IRQCTRL_IMR: /* 0x240 */ -++ irqctrl_imr = data & 0x7ffe; -++ chk_irq(); -++ break; -++ -++ case TIMER_SCLOAD: /* 0x304 */ -++ gpt_scaler_set(data); -++ break; -++ -++ case TIMER_TIMER1: /* 0x310 */ -++ gpt_counter[0] = data; -++ break; -++ -++ case TIMER_RELOAD1: /* 0x314 */ -++ gpt_reload[0] = data; -++ break; -++ -++ case TIMER_CTRL1: /* 0x318 */ -++ timer_ctrl(data, 0); -++ break; -++ -++ case TIMER_TIMER2: /* 0x320 */ -++ gpt_counter[1] = data; -++ break; -++ -++ case TIMER_RELOAD2: /* 0x324 */ -++ gpt_reload[1] = data; -++ break; -++ -++ case TIMER_CTRL2: /* 0x328 */ -++ timer_ctrl(data, 1); -++ break; -++ -++ case POWER_DOWN: /* 0x328 */ -++ wait_for_irq(); -++ break; -++ -++ case CACHE_CTRL: /* 0x328 */ -++ cache_ctrl = data & 0x1000f; -++ break; -++ -++ default: -++ break; -++ } -++ return (MOK); -++} -++ -++ -++/* APBUART */ -++ -++static int ifd1 = -1, ofd1 = -1; -++ -++static void -++init_stdio() -++{ -++ if (dumbio) -++ return; /* do nothing */ -++ if (ifd1 == 0 && f1open) { -++ tcsetattr(0, TCSANOW, &ioc1); -++ tcflush(ifd1, TCIFLUSH); -++ } -++} -++ -++static void -++restore_stdio() -++{ -++ if (dumbio) -++ return; /* do nothing */ -++ if (ifd1 == 0 && f1open && tty_setup) -++ tcsetattr(0, TCSANOW, &iocold1); -++} -++ -++#define DO_STDIO_READ( _fd_, _buf_, _len_ ) \ -++ ( dumbio || nouartrx \ -++ ? (0) /* no bytes read, no delay */ \ -++ : (_fd_) == 1 && callback ? \ -++ callback->read_stdin (callback, _buf_, _len_) : \ -++ read( _fd_, _buf_, _len_ ) ) -++ -++ -++static void -++port_init() -++{ -++ -++ f1in = stdin; -++ f1out = stdout; -++ if (uart_dev1[0] != 0) -++ if ((fd1 = open(uart_dev1, O_RDWR | O_NONBLOCK)) < 0) { -++ printf("Warning, couldn't open output device %s\n", uart_dev1); -++ } else { -++ if (sis_verbose) -++ printf("serial port A on %s\n", uart_dev1); -++ f1in = f1out = fdopen(fd1, "r+"); -++ setbuf(f1out, NULL); -++ f1open = 1; -++ } -++ if (f1in) ifd1 = fileno(f1in); -++ if (ifd1 == 0) { -++ if (callback && !callback->isatty(callback, ifd1)) { -++ tty_setup = 0; -++ } -++ if (sis_verbose) -++ printf("serial port A on stdin/stdout\n"); -++ if (!dumbio) { -++ tcgetattr(ifd1, &ioc1); -++ if (tty_setup) { -++ iocold1 = ioc1; -++ ioc1.c_lflag &= ~(ICANON | ECHO); -++ ioc1.c_cc[VMIN] = 0; -++ ioc1.c_cc[VTIME] = 0; -++ } -++ } -++ f1open = 1; -++ } -++ -++ if (f1out) { -++ ofd1 = fileno(f1out); -++ if (!dumbio && tty_setup && ofd1 == 1) setbuf(f1out, NULL); -++ } -++ -++ wnuma = 0; -++ -++} -++ -++static uint32 -++grlib_read_uart(addr) -++ uint32 addr; -++{ -++ -++ unsigned tmp; -++ -++ tmp = 0; -++ switch (addr & 0xfff) { -++ -++ case 0x070: /* UART 1 RX/TX */ -++#ifndef _WIN32 -++#ifdef FAST_UART -++ -++ if (aind < anum) { -++ if ((aind + 1) < anum) -++ set_irq(3); -++ return ((uint32) aq[aind++]); -++ } else { -++ if (f1open) { -++ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); -++ } -++ else { -++ anum = 0; -++ } -++ if (anum > 0) { -++ aind = 0; -++ if ((aind + 1) < anum) -++ set_irq(3); -++ return ((uint32) aq[aind++]); -++ } else { -++ return ((uint32) aq[aind]); -++ } -++ -++ } -++#else -++ tmp = uarta_data; -++ uarta_data &= ~UART_DR; -++ uart_stat_reg &= ~UARTA_DR; -++ return tmp; -++#endif -++#else -++ return(0); -++#endif -++ break; -++ -++ case 0x074: /* UART status register */ -++#ifndef _WIN32 -++#ifdef FAST_UART -++ -++ Ucontrol = 0; -++ if (aind < anum) { -++ Ucontrol |= 0x00000001; -++ } else { -++ if (f1open) { -++ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); -++ } -++ else { -++ anum = 0; -++ } -++ if (anum > 0) { -++ Ucontrol |= 0x00000001; -++ aind = 0; -++ set_irq(3); -++ } -++ } -++ Ucontrol |= 0x00000006; -++ return (Ucontrol); -++#else -++ return (uart_stat_reg); -++#endif -++#else -++ return(0x00060006); -++#endif -++ break; -++ default: -++ if (sis_verbose) -++ printf("Read from unimplemented LEON2 register (%x)\n", addr); -++ -++ } -++ return (0); -++} -++ -++static void -++grlib_write_uart(addr, data) -++ uint32 addr; -++ uint32 data; -++{ -++ unsigned char c; -++ -++ c = (unsigned char) data; -++ switch (addr & 0xfff) { -++ -++ case 0x070: /* UART A */ -++#ifdef FAST_UART -++ if (f1open) { -++ if (wnuma < UARTBUF) -++ wbufa[wnuma++] = c; -++ else { -++ while (wnuma) { -++ if (ofd1 == 1 && callback) -++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); -++ else -++ wnuma -= fwrite(wbufa, 1, wnuma, f1out); -++ } -++ wbufa[wnuma++] = c; -++ } -++ } -++ set_irq(3); -++#else -++ if (uart_stat_reg & UARTA_SRE) { -++ uarta_sreg = c; -++ uart_stat_reg &= ~UARTA_SRE; -++ event(uarta_tx, 0, UART_TX_TIME); -++ } else { -++ uarta_hreg = c; -++ uart_stat_reg &= ~UARTA_HRE; -++ } -++#endif -++ break; -++ -++ case 0x074: /* UART status register */ -++#ifndef FAST_UART -++ uart_stat_reg &= 1; -++#endif -++ break; -++ default: -++ if (sis_verbose) -++ printf("Write to unimplemented APB register (%x)\n", addr); -++ -++ } -++} -++ -++static void -++flush_uart() -++{ -++ while (wnuma && f1open) { -++ if (ofd1 == 1 && callback) { -++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); -++ callback->flush_stdout(callback); -++ } -++ else -++ wnuma -= fwrite(wbufa, 1, wnuma, f1out); -++ } -++} -++ -++ -++ -++static void -++uarta_tx() -++{ -++ while (f1open) { -++ if (ofd1 == 1 && callback) { -++ while (callback->write_stdout(callback, &uarta_sreg, 1) != 1); -++ } -++ else { -++ while (fwrite(&uarta_sreg, 1, 1, f1out) != 1); -++ } -++ } -++ if (uart_stat_reg & UARTA_HRE) { -++ uart_stat_reg |= UARTA_SRE; -++ } else { -++ uarta_sreg = uarta_hreg; -++ uart_stat_reg |= UARTA_HRE; -++ event(uarta_tx, 0, UART_TX_TIME); -++ } -++ set_irq(3); -++} -++ -++static void -++uart_rx(arg) -++ caddr_t arg; -++{ -++ int32 rsize; -++ char rxd; -++ -++ -++ rsize = 0; -++ if (f1open) -++ rsize = DO_STDIO_READ(ifd1, &rxd, 1); -++ else -++ rsize = 0; -++ if (rsize > 0) { -++ uarta_data = rxd; -++ if (uart_stat_reg & UARTA_DR) { -++ uart_stat_reg |= UARTA_OR; -++ } -++ uart_stat_reg |= UARTA_DR; -++ set_irq(3); -++ } -++ event(uart_rx, 0, UART_RX_TIME); -++} -++ -++static void -++uart_intr(arg) -++ caddr_t arg; -++{ -++ grlib_read_uart(APBUART_STATUS); /* Check for UART interrupts every 1000 clk */ -++ flush_uart(); /* Flush UART ports */ -++ event(uart_intr, 0, UART_FLUSH_TIME); -++} -++ -++ -++static void -++uart_irq_start() -++{ -++#ifdef FAST_UART -++ event(uart_intr, 0, UART_FLUSH_TIME); -++#else -++#ifndef _WIN32 -++ event(uart_rx, 0, UART_RX_TIME); -++#endif -++#endif -++} -++ -++/* TIMER */ -++ -++static void -++gpt_intr(arg) -++ caddr_t arg; -++{ -++ int i; -++ -++ for (i=0; i= RAM_START) && (addr < RAM_END)) { -++ *data = *((uint32 *) & (ramb[addr & RAM_MASK])); -++ *ws = 0; -++ return (0); -++ } else if (addr < ROM_END) { -++ *data = *((uint32 *) & (romb[addr])); -++ *ws = 0; -++ return (0); -++ } -++ -++ printf("Memory exception at %x (illegal address)\n", addr); -++ *ws = MEM_EX_WS; -++ return (1); -++} -++ -++static int -++memory_read(addr, data, sz, ws) -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ int32 mexc; -++ -++ if ((addr >= RAM_START) && (addr < RAM_END)) { -++ *data = *((uint32 *) & (ramb[addr & RAM_MASK & ~3])); -++ *ws = 0; -++ return (0); -++ } else if ((addr >= APBSTART) && (addr < APBEND)) { -++ mexc = apb_read(addr, data); -++ if (mexc) { -++ *ws = MEM_EX_WS; -++ } else { -++ *ws = 0; -++ } -++ return (mexc); -++ } else if (addr < ROM_END) { -++ *data = *((uint32 *) & (romb[addr & ~3])); -++ *ws = 0; -++ return (0); -++ } -++ -++ printf("Memory exception at %x (illegal address)\n", addr); -++ *ws = MEM_EX_WS; -++ return (1); -++} -++ -++static int -++memory_read_asi(asi, addr, data, sz, ws) -++ int32 asi; -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ return(memory_read(addr, data, sz, ws)); -++} -++ -++static int -++memory_write(addr, data, sz, ws) -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ uint32 byte_addr; -++ uint32 byte_mask; -++ uint32 waddr; -++ uint32 *ram; -++ int32 mexc; -++ int i; -++ int wphit[2]; -++ -++ if ((addr >= RAM_START) && (addr < RAM_END)) { -++ waddr = addr & RAM_MASK; -++ store_bytes (ramb, waddr, data, sz, ws); -++ return (0); -++ -++ } else if ((addr >= APBSTART) && (addr < APBEND)) { -++ if (sz != 2) { -++ *ws = MEM_EX_WS; -++ return (1); -++ } -++ apb_write(addr, *data); -++ *ws = 0; -++ return (0); -++ -++ } else if (addr < ROM_END) { -++// return (1); -++ *ws = 0; -++ store_bytes (romb, addr, data, sz, ws); -++ return (0); -++ } -++ -++ *ws = MEM_EX_WS; -++ return (1); -++} -++ -++static int -++memory_write_asi(asi, addr, data, sz, ws) -++ int32 asi; -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ return(memory_write(addr, data, sz, ws)); -++} -++ -++static unsigned char * -++get_mem_ptr(addr, size) -++ uint32 addr; -++ uint32 size; -++{ -++ if ((addr + size) < ROM_END) { -++ return (&romb[addr]); -++ } else if ((addr >= RAM_START) && ((addr + size) < RAM_END)) { -++ return (&ramb[addr & RAM_MASK]); -++ } -++ -++ return ((char *) -1); -++} -++ -++static int -++sis_memory_write(addr, data, length) -++ uint32 addr; -++ const unsigned char *data; -++ uint32 length; -++{ -++ char *mem; -++ -++ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) -++ return (0); -++ -++ memcpy(mem, data, length); -++ return (length); -++} -++ -++static int -++sis_memory_read(addr, data, length) -++ uint32 addr; -++ char *data; -++ uint32 length; -++{ -++ char *mem; -++ int ws; -++ -++ if (length == 4) { -++ memory_read(addr, data, length, &ws); -++ return(4); -++ } -++ -++ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) -++ return (0); -++ -++ memcpy(data, mem, length); -++ return (length); -++} -++ -++static void -++boot_init () -++{ -++// mec_write(MEC_WCR, 0); /* zero waitstates */ -++// mec_write(MEC_TRAPD, 0); /* turn off watch-dog */ -++ apb_write(TIMER_SCALER, sregs.freq-1); /* generate 1 MHz RTC tick */ -++ apb_write(TIMER_SCLOAD, sregs.freq-1); -++ apb_write(TIMER_TIMER1, -1); -++ apb_write(TIMER_RELOAD1, -1); -++ apb_write(TIMER_CTRL1, 0x7); -++// mec_write(MEC_MEMCFG, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */ -++ sregs.wim = 2; -++ sregs.psr = 0x000010e0; -++ sregs.r[30] = RAM_END; -++ sregs.r[14] = sregs.r[30] - 96*4; -++ cache_ctrl = 0x01000f; -++ -++} -++ -++struct memsys leon2 = { -++ init_sim, -++ reset, -++ error_mode, -++ sim_halt, -++ exit_sim, -++ init_stdio, -++ restore_stdio, -++ memory_iread, -++ memory_read, -++ memory_read_asi, -++ memory_write, -++ memory_write_asi, -++ sis_memory_write, -++ sis_memory_read, -++ boot_init -++}; -+diff --git a/sim/erc32/leon3.c b/sim/erc32/leon3.c -+new file mode 100644 -+index 0000000..e79169e -+--- /dev/null -++++ b/sim/erc32/leon3.c -+@@ -0,0 +1,1066 @@ -++/* -++ * This file is part of SIS. -++ * -++ * SIS, SPARC instruction simulator V2.5 Copyright (C) 1995 Jiri Gaisler, -++ * European Space Agency -++ * -++ * 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 3 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, see . -++ * -++ * Leon3 emulation, loosely based on erc32.c . -++ */ -++ -++/* The control space devices */ -++ -++#include "config.h" -++#include -++#include -++#include -++#include -++#include -++#include -++#include -++#include -++#include "sis.h" -++#include "grlib.h" -++#include "sim-config.h" -++ -++static int tty_setup = 1; /* default setup if not a tty */ -++ -++/* APB registers */ -++#define APBSTART 0x80000000 -++#define APBEND 0x80100000 -++ -++/* Memory exception waitstates */ -++#define MEM_EX_WS 1 -++ -++#define MOK 0 -++ -++/* LEON3 APB register addresses */ -++ -++#define IRQMP_IPR 0x204 -++#define IRQMP_IMR 0x240 -++#define IRQMP_ICR 0x20C -++#define IRQMP_IFR 0x208 -++#define GPTIMER_SCALER 0x300 -++#define GPTIMER_SCLOAD 0x304 -++#define GPTIMER_CONFIG 0x308 -++#define GPTIMER_TIMER1 0x310 -++#define GPTIMER_RELOAD1 0x314 -++#define GPTIMER_CTRL1 0x318 -++#define GPTIMER_TIMER2 0x320 -++#define GPTIMER_RELOAD2 0x324 -++#define GPTIMER_CTRL2 0x328 -++ -++#define APBUART_RXTX 0x100 -++#define APBUART_STATUS 0x104 -++ -++/* Size of UART buffers (bytes) */ -++#define UARTBUF 1024 -++ -++/* Number of simulator ticks between flushing the UARTS. */ -++/* For good performance, keep above 1000 */ -++#define UART_FLUSH_TIME 3000 -++ -++ -++/* New uart defines */ -++#define UART_TX_TIME 1000 -++#define UART_RX_TIME 1000 -++#define UARTA_DR 0x1 -++#define UARTA_SRE 0x2 -++#define UARTA_HRE 0x4 -++#define UARTA_OR 0x10 -++ -++/* IRQMP registers */ -++ -++static uint32 irqmp_ipr; -++static uint32 irqmp_imr; -++static uint32 irqmp_ifr; -++ -++/* GPTIMER registers */ -++ -++#define NGPTIMERS 2 -++#define GPTIMER_IRQ 8 -++ -++static uint32 gpt_scaler; -++static uint32 gpt_scaler_start; -++static uint32 gpt_counter[NGPTIMERS]; -++static uint32 gpt_reload[NGPTIMERS]; -++static uint32 gpt_ctrl[NGPTIMERS]; -++ -++/* ROM size 16 Mbyte */ -++#define ROM_START 0x00000000 -++#define ROM_MASK 0x00ffffff -++#define ROM_END (ROM_START + ROM_MASK + 1) -++ -++/* RAM size 16 Mbyte */ -++#define RAM_START 0x40000000 -++#define RAM_MASK 0x00ffffff -++#define RAM_END (RAM_START + RAM_MASK + 1) -++ -++/* Memory */ -++ -++static unsigned char romb[ROM_END - ROM_START]; -++static unsigned char ramb[RAM_END - RAM_START]; -++static uint32 cache_ctrl; -++ -++ -++/* UART support variables */ -++ -++static int32 fd1, fd2; /* file descriptor for input file */ -++static int32 Ucontrol; /* UART status register */ -++static unsigned char aq[UARTBUF], bq[UARTBUF]; -++static int32 anum, aind = 0; -++static int32 bnum, bind = 0; -++static char wbufa[UARTBUF], wbufb[UARTBUF]; -++static unsigned wnuma; -++static unsigned wnumb; -++static FILE *f1in, *f1out; -++static struct termios ioc1, ioc2, iocold1, iocold2; -++static int f1open = 0; -++ -++static char uarta_sreg, uarta_hreg; -++static uint32 uart_stat_reg; -++static uint32 uarta_data; -++ -++/* Forward declarations */ -++ -++static void mem_init (void); -++static void close_port (void); -++static void leon3_reset (void); -++static void irqmp_intack (int32 level); -++static void chk_irq (void); -++static void set_irq (int32 level); -++static int32 apb_read (uint32 addr, uint32 *data); -++static int apb_write (uint32 addr, uint32 data); -++static void port_init (void); -++static uint32 grlib_read_uart (uint32 addr); -++static void grlib_write_uart (uint32 addr, uint32 data); -++static void flush_uart (void); -++static void uarta_tx (void); -++static void uart_rx (caddr_t arg); -++static void uart_intr (caddr_t arg); -++static void uart_irq_start (void); -++static void gpt_intr (caddr_t arg); -++static void gpt_init (void); -++static void gpt_reset (void); -++static void gpt_scaler_set (uint32 val); -++static void timer_ctrl (uint32 val, int i); -++static unsigned char * -++ get_mem_ptr (uint32 addr, uint32 size); -++static void store_bytes (unsigned char *mem, uint32 waddr, -++ uint32 *data, int sz, int32 *ws); -++ -++static host_callback *callback; -++ -++ -++/* One-time init */ -++ -++static void -++init_sim() -++{ -++ callback = sim_callback; -++ grlib_init(); -++ mem_init(); -++ port_init(); -++ gpt_init(); -++} -++ -++/* Power-on reset init */ -++ -++static void -++reset() -++{ -++ leon3_reset(); -++ uart_irq_start(); -++ gpt_reset(); -++} -++ -++/* IU error mode manager */ -++ -++static void -++error_mode(pc) -++ uint32 pc; -++{ -++ -++} -++ -++ -++/* Memory init */ -++ -++static void -++mem_init() -++{ -++ -++/* Add AMBA P&P record for SRCTRL memory controller */ -++ -++ grlib_ahbspp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_SRCTRL, 0, 0), -++ GRLIB_PP_AHBADDR(0x00000000, 0xE00, 1, 1, 2), -++ GRLIB_PP_AHBADDR(0x40000000, 0xC00, 1, 1, 2), -++ GRLIB_PP_AHBADDR(0x20000000, 0xE00, 0, 0, 2), -++ 0); -++ if (sis_verbose) -++ printf("RAM start: 0x%x, RAM size: %d K, ROM size: %d K\n", -++ RAM_START, (RAM_MASK+1)/1024, (ROM_MASK+1)/1024); -++} -++ -++/* Flush ports when simulator stops */ -++ -++static void -++sim_halt() -++{ -++#ifdef FAST_UART -++ flush_uart(); -++#endif -++} -++ -++static void -++close_port() -++{ -++ if (f1open && f1in != stdin) -++ fclose(f1in); -++} -++ -++static void -++exit_sim() -++{ -++ close_port(); -++} -++ -++static void -++leon3_reset() -++{ -++ int i; -++ -++ irqmp_ipr = 0; -++ irqmp_imr = 0; -++ irqmp_ifr = 0; -++ -++ wnuma = wnumb = 0; -++ anum = aind = bnum = bind = 0; -++ -++ uart_stat_reg = UARTA_SRE | UARTA_HRE; -++ -++ gpt_counter[0] = 0xffffffff; -++ gpt_reload[0] = 0xffffffff; -++ gpt_scaler = 0xffff; -++ gpt_ctrl[0] = 0; -++ gpt_ctrl[1] = 0; -++ -++} -++ -++ -++ -++static void -++irqmp_intack(level) -++ int32 level; -++{ -++ int irq_test; -++ -++ if (sis_verbose > 2) -++ printf("interrupt %d acknowledged\n", level); -++ if (irqmp_ifr & (1 << level)) -++ irqmp_ifr &= ~(1 << level); -++ else -++ irqmp_ipr &= ~(1 << level); -++ chk_irq(); -++} -++ -++static void -++chk_irq() -++{ -++ int32 i; -++ uint32 itmp; -++ int old_irl; -++ -++ old_irl = ext_irl; -++ itmp = ((irqmp_ipr | irqmp_ifr) & irqmp_imr) & 0x0fffe; -++ ext_irl = 0; -++ if (itmp != 0) { -++ for (i = 15; i > 0; i--) { -++ if (((itmp >> i) & 1) != 0) { -++ if ((sis_verbose > 2) && (i > old_irl)) -++ printf("IU irl: %d\n", i); -++ ext_irl = i; -++ set_int(i, irqmp_intack, i); -++ break; -++ } -++ } -++ } -++} -++ -++static void -++set_irq(level) -++ int32 level; -++{ -++ irqmp_ipr |= (1 << level); -++ chk_irq(); -++} -++ -++static int32 -++apb_read(addr, data) -++ uint32 addr; -++ uint32 *data; -++{ -++ -++ switch (addr & 0xfff) { -++ -++ case APBUART_RXTX: /* 0x100 */ -++ case APBUART_STATUS: /* 0x104 */ -++ *data = grlib_read_uart(addr); -++ break; -++ -++ case IRQMP_IPR: /* 0x204 */ -++ *data = irqmp_ipr; -++ break; -++ -++ case IRQMP_IFR: /* 0x208 */ -++ *data = irqmp_ifr; -++ break; -++ -++ case IRQMP_IMR: /* 0x240 */ -++ *data = irqmp_imr; -++ break; -++ -++ case GPTIMER_SCALER: /* 0x300 */ -++ *data = gpt_scaler - (now() - gpt_scaler_start); -++ break; -++ -++ case GPTIMER_SCLOAD: /* 0x304 */ -++ *data = gpt_scaler; -++ break; -++ -++ case GPTIMER_CONFIG: /* 0x308 */ -++ *data = 0x100 | (GPTIMER_IRQ << 3) | NGPTIMERS; -++ break; -++ -++ case GPTIMER_TIMER1: /* 0x310 */ -++ *data = gpt_counter[0]; -++ break; -++ -++ case GPTIMER_RELOAD1: /* 0x314 */ -++ *data = gpt_reload[0]; -++ break; -++ -++ case GPTIMER_CTRL1: /* 0x318 */ -++ *data = gpt_ctrl[0]; -++ break; -++ -++ case GPTIMER_TIMER2: /* 0x320 */ -++ *data = gpt_counter[1]; -++ break; -++ -++ case GPTIMER_RELOAD2: /* 0x324 */ -++ *data = gpt_reload[1]; -++ break; -++ -++ case GPTIMER_CTRL2: /* 0x328 */ -++ *data = gpt_ctrl[1]; -++ break; -++ -++ default: -++ *data = 0; -++ break; -++ } -++ -++ if (sis_verbose > 1) -++ printf("APB read a: %08x, d: %08x\n", addr, *data); -++ -++ return (MOK); -++} -++ -++static int -++apb_write(addr, data) -++ uint32 addr; -++ uint32 data; -++{ -++ if (sis_verbose > 1) -++ printf("APB write a: %08x, d: %08x\n",addr,data); -++ switch (addr & 0xfff) { -++ -++ case APBUART_RXTX: /* 0x100 */ -++ case APBUART_STATUS: /* 0x104 */ -++ grlib_write_uart(addr, data); -++ break; -++ -++ case IRQMP_IFR: /* 0x208 */ -++ irqmp_ifr = data & 0xfffe; -++ chk_irq(); -++ break; -++ -++ case IRQMP_ICR: /* 0x20C */ -++ irqmp_ipr &= ~data & 0x0fffe; -++ chk_irq(); -++ break; -++ -++ case IRQMP_IMR: /* 0x240 */ -++ irqmp_imr = data & 0x7ffe; -++ chk_irq(); -++ break; -++ -++ case GPTIMER_SCLOAD: /* 0x304 */ -++ gpt_scaler_set(data); -++ break; -++ -++ case GPTIMER_TIMER1: /* 0x310 */ -++ gpt_counter[0] = data; -++ break; -++ -++ case GPTIMER_RELOAD1: /* 0x314 */ -++ gpt_reload[0] = data; -++ break; -++ -++ case GPTIMER_CTRL1: /* 0x318 */ -++ timer_ctrl(data, 0); -++ break; -++ -++ case GPTIMER_TIMER2: /* 0x320 */ -++ gpt_counter[1] = data; -++ break; -++ -++ case GPTIMER_RELOAD2: /* 0x324 */ -++ gpt_reload[1] = data; -++ break; -++ -++ case GPTIMER_CTRL2: /* 0x328 */ -++ timer_ctrl(data, 1); -++ break; -++ -++ default: -++ break; -++ } -++ return (MOK); -++} -++ -++ -++/* APBUART */ -++ -++static int ifd1 = -1, ofd1 = -1; -++ -++static void -++init_stdio() -++{ -++ if (dumbio) -++ return; /* do nothing */ -++ if (ifd1 == 0 && f1open) { -++ tcsetattr(0, TCSANOW, &ioc1); -++ tcflush(ifd1, TCIFLUSH); -++ } -++} -++ -++static void -++restore_stdio() -++{ -++ if (dumbio) -++ return; /* do nothing */ -++ if (ifd1 == 0 && f1open && tty_setup) -++ tcsetattr(0, TCSANOW, &iocold1); -++} -++ -++#define DO_STDIO_READ( _fd_, _buf_, _len_ ) \ -++ ( dumbio || nouartrx \ -++ ? (0) /* no bytes read, no delay */ \ -++ : (_fd_) == 1 && callback ? \ -++ callback->read_stdin (callback, _buf_, _len_) : \ -++ read( _fd_, _buf_, _len_ ) ) -++ -++ -++static void -++port_init() -++{ -++ -++ f1in = stdin; -++ f1out = stdout; -++ if (uart_dev1[0] != 0) -++ if ((fd1 = open(uart_dev1, O_RDWR | O_NONBLOCK)) < 0) { -++ printf("Warning, couldn't open output device %s\n", uart_dev1); -++ } else { -++ if (sis_verbose) -++ printf("serial port A on %s\n", uart_dev1); -++ f1in = f1out = fdopen(fd1, "r+"); -++ setbuf(f1out, NULL); -++ f1open = 1; -++ } -++ if (f1in) ifd1 = fileno(f1in); -++ if (ifd1 == 0) { -++ if (callback && !callback->isatty(callback, ifd1)) { -++ tty_setup = 0; -++ } -++ if (sis_verbose) -++ printf("serial port A on stdin/stdout\n"); -++ if (!dumbio) { -++ tcgetattr(ifd1, &ioc1); -++ if (tty_setup) { -++ iocold1 = ioc1; -++ ioc1.c_lflag &= ~(ICANON | ECHO); -++ ioc1.c_cc[VMIN] = 0; -++ ioc1.c_cc[VTIME] = 0; -++ } -++ } -++ f1open = 1; -++ } -++ -++ if (f1out) { -++ ofd1 = fileno(f1out); -++ if (!dumbio && tty_setup && ofd1 == 1) setbuf(f1out, NULL); -++ } -++ -++ wnuma = 0; -++ -++ -++ grlib_apbpp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_APBUART, 1, 3), -++ GRLIB_PP_APBADDR(0x80000100, 0xFFF)); -++} -++ -++static uint32 -++grlib_read_uart(addr) -++ uint32 addr; -++{ -++ -++ unsigned tmp; -++ -++ tmp = 0; -++ switch (addr & 0xff) { -++ -++ case 0x00: /* UART 1 RX/TX */ -++#ifndef _WIN32 -++#ifdef FAST_UART -++ -++ if (aind < anum) { -++ if ((aind + 1) < anum) -++ set_irq(3); -++ return ((uint32) aq[aind++]); -++ } else { -++ if (f1open) { -++ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); -++ } -++ else { -++ anum = 0; -++ } -++ if (anum > 0) { -++ aind = 0; -++ if ((aind + 1) < anum) -++ set_irq(3); -++ return ((uint32) aq[aind++]); -++ } else { -++ return ((uint32) aq[aind]); -++ } -++ -++ } -++#else -++ tmp = uarta_data; -++ uarta_data &= ~UART_DR; -++ uart_stat_reg &= ~UARTA_DR; -++ return tmp; -++#endif -++#else -++ return(0); -++#endif -++ break; -++ -++ case 0x04: /* UART status register */ -++#ifndef _WIN32 -++#ifdef FAST_UART -++ -++ Ucontrol = 0; -++ if (aind < anum) { -++ Ucontrol |= 0x00000001; -++ } else { -++ if (f1open) { -++ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); -++ } -++ else { -++ anum = 0; -++ } -++ if (anum > 0) { -++ Ucontrol |= 0x00000001; -++ aind = 0; -++ set_irq(3); -++ } -++ } -++ Ucontrol |= 0x00000006; -++ return (Ucontrol); -++#else -++ return (uart_stat_reg); -++#endif -++#else -++ return(0x00060006); -++#endif -++ break; -++ default: -++ if (sis_verbose) -++ printf("Read from unimplemented MEC register (%x)\n", addr); -++ -++ } -++ return (0); -++} -++ -++static void -++grlib_write_uart(addr, data) -++ uint32 addr; -++ uint32 data; -++{ -++ unsigned char c; -++ -++ c = (unsigned char) data; -++ switch (addr & 0xff) { -++ -++ case 0x00: /* UART A */ -++#ifdef FAST_UART -++ if (f1open) { -++ if (wnuma < UARTBUF) -++ wbufa[wnuma++] = c; -++ else { -++ while (wnuma) { -++ if (ofd1 == 1 && callback) -++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); -++ else -++ wnuma -= fwrite(wbufa, 1, wnuma, f1out); -++ } -++ wbufa[wnuma++] = c; -++ } -++ } -++ set_irq(3); -++#else -++ if (uart_stat_reg & UARTA_SRE) { -++ uarta_sreg = c; -++ uart_stat_reg &= ~UARTA_SRE; -++ event(uarta_tx, 0, UART_TX_TIME); -++ } else { -++ uarta_hreg = c; -++ uart_stat_reg &= ~UARTA_HRE; -++ } -++#endif -++ break; -++ -++ case 0x04: /* UART status register */ -++#ifndef FAST_UART -++ uart_stat_reg &= 1; -++#endif -++ break; -++ default: -++ if (sis_verbose) -++ printf("Write to unimplemented APB register (%x)\n", addr); -++ -++ } -++} -++ -++static void -++flush_uart() -++{ -++ while (wnuma && f1open) { -++ if (ofd1 == 1 && callback) { -++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); -++ callback->flush_stdout(callback); -++ } -++ else -++ wnuma -= fwrite(wbufa, 1, wnuma, f1out); -++ } -++} -++ -++ -++ -++static void -++uarta_tx() -++{ -++ while (f1open) { -++ if (ofd1 == 1 && callback) { -++ while (callback->write_stdout(callback, &uarta_sreg, 1) != 1); -++ } -++ else { -++ while (fwrite(&uarta_sreg, 1, 1, f1out) != 1); -++ } -++ } -++ if (uart_stat_reg & UARTA_HRE) { -++ uart_stat_reg |= UARTA_SRE; -++ } else { -++ uarta_sreg = uarta_hreg; -++ uart_stat_reg |= UARTA_HRE; -++ event(uarta_tx, 0, UART_TX_TIME); -++ } -++ set_irq(3); -++} -++ -++static void -++uart_rx(arg) -++ caddr_t arg; -++{ -++ int32 rsize; -++ char rxd; -++ -++ -++ rsize = 0; -++ if (f1open) -++ rsize = DO_STDIO_READ(ifd1, &rxd, 1); -++ else -++ rsize = 0; -++ if (rsize > 0) { -++ uarta_data = rxd; -++ if (uart_stat_reg & UARTA_DR) { -++ uart_stat_reg |= UARTA_OR; -++ } -++ uart_stat_reg |= UARTA_DR; -++ set_irq(3); -++ } -++ event(uart_rx, 0, UART_RX_TIME); -++} -++ -++static void -++uart_intr(arg) -++ caddr_t arg; -++{ -++ grlib_read_uart(APBUART_STATUS); /* Check for UART interrupts every 1000 clk */ -++ flush_uart(); /* Flush UART ports */ -++ event(uart_intr, 0, UART_FLUSH_TIME); -++} -++ -++ -++static void -++uart_irq_start() -++{ -++#ifdef FAST_UART -++ event(uart_intr, 0, UART_FLUSH_TIME); -++#else -++#ifndef _WIN32 -++ event(uart_rx, 0, UART_RX_TIME); -++#endif -++#endif -++} -++ -++/* GPTIMER */ -++ -++static void -++gpt_intr(arg) -++ caddr_t arg; -++{ -++ int i; -++ -++ for (i=0; i= RAM_START) && (addr < RAM_END)) { -++ *data = *((uint32 *) & (ramb[addr & RAM_MASK])); -++ *ws = 0; -++ return (0); -++ } else if (addr < ROM_END) { -++ *data = *((uint32 *) & (romb[addr])); -++ *ws = 0; -++ return (0); -++ } -++ -++ printf("Memory exception at %x (illegal address)\n", addr); -++ *ws = MEM_EX_WS; -++ return (1); -++} -++ -++static int -++memory_read(addr, data, sz, ws) -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ int32 mexc; -++ -++ if ((addr >= RAM_START) && (addr < RAM_END)) { -++ *data = *((uint32 *) & (ramb[addr & RAM_MASK & ~3])); -++ *ws = 0; -++ return (0); -++ } else if ((addr >= APBPP_START) && (addr <= APBPP_END)) { -++ *data = grlib_apbpnp_read(addr); -++ if (sis_verbose > 1) -++ printf("APB PP read a: %08x, d: %08x\n",addr, *data); -++ *ws = 4; -++ return (0); -++ } else if ((addr >= APBSTART) && (addr < APBEND)) { -++ mexc = apb_read(addr, data); -++ if (mexc) { -++ *ws = MEM_EX_WS; -++ } else { -++ *ws = 0; -++ } -++ return (mexc); -++ } else if ((addr >= AHBPP_START) && (addr <= AHBPP_END)) { -++ if (sis_verbose > 1) -++ printf("AHB PP read a: %08x, d: %08x\n",addr, *data); -++ *data = grlib_ahbpnp_read(addr); -++ *ws = 4; -++ return (0); -++ } else if (addr < ROM_END) { -++ *data = *((uint32 *) & (romb[addr & ~3])); -++ *ws = 0; -++ return (0); -++ } -++ -++ printf("Memory exception at %x (illegal address)\n", addr); -++ *ws = MEM_EX_WS; -++ return (1); -++} -++ -++static int -++memory_read_asi(asi, addr, data, sz, ws) -++ int32 asi; -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ if (asi == 2) { -++ if (addr == 0) -++ *data = cache_ctrl; -++ else -++ *data = 0; -++ return MOK; -++ } else -++ return(memory_read(addr, data, sz, ws)); -++} -++ -++static int -++memory_write(addr, data, sz, ws) -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ uint32 byte_addr; -++ uint32 byte_mask; -++ uint32 waddr; -++ uint32 *ram; -++ int32 mexc; -++ int i; -++ int wphit[2]; -++ -++ if ((addr >= RAM_START) && (addr < RAM_END)) { -++ waddr = addr & RAM_MASK; -++ store_bytes (ramb, waddr, data, sz, ws); -++ return (0); -++ -++ } else if ((addr >= APBSTART) && (addr < APBEND)) { -++ if (sz != 2) { -++ *ws = MEM_EX_WS; -++ return (1); -++ } -++ apb_write(addr, *data); -++ *ws = 0; -++ return (0); -++ -++ } else if (addr < ROM_END) { -++// return (1); -++ *ws = 0; -++ store_bytes (romb, addr, data, sz, ws); -++ return (0); -++ } -++ -++ *ws = MEM_EX_WS; -++ return (1); -++} -++ -++static int -++memory_write_asi(asi, addr, data, sz, ws) -++ int32 asi; -++ uint32 addr; -++ uint32 *data; -++ int32 sz; -++ int32 *ws; -++{ -++ if (asi == 2) { -++ cache_ctrl = *data & 0x81000f; -++ if (sis_verbose) -++ printf("cache ctrl reg : 0x%08x\n", cache_ctrl); -++ return MOK; -++ } else -++ return(memory_write(addr, data, sz, ws)); -++} -++ -++static unsigned char * -++get_mem_ptr(addr, size) -++ uint32 addr; -++ uint32 size; -++{ -++ if ((addr + size) < ROM_END) { -++ return (&romb[addr]); -++ } else if ((addr >= RAM_START) && ((addr + size) < RAM_END)) { -++ return (&ramb[addr & RAM_MASK]); -++ } -++ -++ return ((char *) -1); -++} -++ -++static int -++sis_memory_write(addr, data, length) -++ uint32 addr; -++ const unsigned char *data; -++ uint32 length; -++{ -++ char *mem; -++ -++ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) -++ return (0); -++ -++ memcpy(mem, data, length); -++ return (length); -++} -++ -++static int -++sis_memory_read(addr, data, length) -++ uint32 addr; -++ char *data; -++ uint32 length; -++{ -++ char *mem; -++ int ws; -++ -++ if (length == 4) { -++ memory_read(addr, data, length, &ws); -++ return(4); -++ } -++ -++ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) -++ return (0); -++ -++ memcpy(data, mem, length); -++ return (length); -++} -++ -++static void -++boot_init () -++{ -++// mec_write(MEC_WCR, 0); /* zero waitstates */ -++// mec_write(MEC_TRAPD, 0); /* turn off watch-dog */ -++ apb_write(GPTIMER_SCALER, sregs.freq-1); /* generate 1 MHz RTC tick */ -++ apb_write(GPTIMER_SCLOAD, sregs.freq-1); -++ apb_write(GPTIMER_TIMER1, -1); -++ apb_write(GPTIMER_RELOAD1, -1); -++ apb_write(GPTIMER_CTRL1, 0x7); -++// mec_write(MEC_MEMCFG, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */ -++ sregs.wim = 2; -++ sregs.psr = 0xF30010e0; -++ sregs.r[30] = RAM_END; -++ sregs.r[14] = sregs.r[30] - 96*4; -++ cache_ctrl = 0x81000f; -++} -++ -++struct memsys leon3 = { -++ init_sim, -++ reset, -++ error_mode, -++ sim_halt, -++ exit_sim, -++ init_stdio, -++ restore_stdio, -++ memory_iread, -++ memory_read, -++ memory_read_asi, -++ memory_write, -++ memory_write_asi, -++ sis_memory_write, -++ sis_memory_read, -++ boot_init -++}; -+diff --git a/sim/erc32/sis.c b/sim/erc32/sis.c -+index 89e6f02..f21ddde 100644 -+--- a/sim/erc32/sis.c -++++ b/sim/erc32/sis.c -+@@ -26,7 +26,6 @@ -+ #include -+ #endif -+ #include -+-#include -+ #include -+ #include "sis.h" -+ #include -+@@ -36,44 +35,12 @@ -+ -+ /* Structures and functions from readline library */ -+ -+-typedef struct { -+- char *line; -+- char *data; -+-} HIST_ENTRY; -+- -+-extern char * readline (char *prompt); -+-extern void using_history (void); -+-extern void add_history (char *string); -+-extern HIST_ENTRY *remove_history (int which); -+- -+- -++#include "readline/readline.h" -++#include "readline/history.h" -+ -+ /* Command history buffer length - MUST be binary */ -+ #define HIST_LEN 64 -+ -+-extern struct disassemble_info dinfo; -+-extern struct pstate sregs; -+-extern struct estate ebase; -+- -+-extern int ctrl_c; -+-extern int nfp; -+-extern int ift; -+-extern int wrp; -+-extern int rom8; -+-extern int uben; -+-extern int sis_verbose; -+-extern char *sis_version; -+-extern struct estate ebase; -+-extern struct evcell evbuf[]; -+-extern struct irqcell irqarr[]; -+-extern int irqpend, ext_irl; -+-extern int termsave; -+-extern int sparclite; -+-extern int dumbio; -+-extern char uart_dev1[]; -+-extern char uart_dev2[]; -+-extern uint32 last_load_addr; -+- -+ #ifdef ERA -+ extern int era; -+ #endif -+@@ -84,20 +51,16 @@ run_sim(sregs, icount, dis) -+ uint64 icount; -+ int dis; -+ { -+- int irq, mexc, deb, asi; -++ int irq, mexc, deb; -+ -+- sregs->starttime = time(NULL); -+- init_stdio(); -++ sregs->starttime = get_time(); -++ ms->init_stdio(); -+ if (sregs->err_mode) icount = 0; -+ deb = dis || sregs->histlen || sregs->bptnum; -+ irq = 0; -+ while (icount > 0) { -+ -+- if (sregs->psr & 0x080) -+- asi = 9; -+- else -+- asi = 8; -+- mexc = memory_read(asi, sregs->pc, &sregs->inst, 2, &sregs->hold); -++ mexc = ms->memory_iread(sregs->pc, &sregs->inst, &sregs->hold); -+ sregs->icnt = 1; -+ if (sregs->annul) { -+ sregs->annul = 0; -+@@ -112,7 +75,7 @@ run_sim(sregs, icount, dis) -+ } else { -+ if (deb) { -+ if ((sregs->bphit = check_bpt(sregs)) != 0) { -+- restore_stdio(); -++ ms->restore_stdio(); -+ return (BPT_HIT); -+ } -+ if (sregs->histlen) { -+@@ -123,7 +86,7 @@ run_sim(sregs, icount, dis) -+ sregs->histind = 0; -+ } -+ if (dis) { -+- printf(" %8u ", ebase.simtime); -++ printf(" %8llu ", ebase.simtime); -+ dis_mem(sregs->pc, 1, &dinfo); -+ } -+ } -+@@ -135,7 +98,7 @@ run_sim(sregs, icount, dis) -+ irq = 0; -+ sregs->err_mode = execute_trap(sregs); -+ if (sregs->err_mode) { -+- error_mode(sregs->pc); -++ ms->error_mode(sregs->pc); -+ icount = 0; -+ } -+ } -+@@ -146,8 +109,8 @@ run_sim(sregs, icount, dis) -+ if (sregs->tlimit <= ebase.simtime) sregs->tlimit = -1; -+ } -+ } -+- sregs->tottime += time(NULL) - sregs->starttime; -+- restore_stdio(); -++ sregs->tottime += get_time() - sregs->starttime; -++ ms->restore_stdio(); -+ if (sregs->err_mode) -+ return (ERROR); -+ if (ctrl_c) { -+@@ -172,12 +135,13 @@ main(argc, argv) -+ char *cmdq[HIST_LEN]; -+ int cmdi = 0; -+ int i; -++ int lfile = 0; -+ -+ cfile = 0; -+ for (i = 0; i < 64; i++) -+ cmdq[i] = 0; -+ printf("\n SIS - SPARC instruction simulator %s, copyright Jiri Gaisler 1995\n", sis_version); -+- printf(" Bug-reports to jgais@wd.estec.esa.nl\n\n"); -++ printf(" Bug-reports to jiri@gaisler.se\n\n"); -+ while (stat < argc) { -+ if (argv[stat][0] == '-') { -+ if (strcmp(argv[stat], "-v") == 0) { -+@@ -214,26 +178,53 @@ main(argc, argv) -+ #endif -+ } else if (strcmp(argv[stat], "-dumbio") == 0) { -+ dumbio = 1; -++ } else if (strcmp(argv[stat], "-nouartrx") == 0) { -++ nouartrx = 1; -++ } else if (strcmp(argv[stat], "-leon2") == 0) { -++ ms = &leon2; -++ if (freq == 14) freq = 50; -++ cputype = CPU_LEON2; -++ } else if (strcmp(argv[stat], "-leon3") == 0) { -++ ms = &leon3; -++ if (freq == 14) freq = 50; -++ cputype = CPU_LEON3; -++ } else if (strcmp(argv[stat], "-v") == 0) { -++ sis_verbose = 1; -++ } else if (strcmp(argv[stat], "-vv") == 0) { -++ sis_verbose = 2; -+ } else { -+ printf("unknown option %s\n", argv[stat]); -+ usage(); -+ exit(1); -+ } -+ } else { -+- last_load_addr = bfd_load(argv[stat]); -++ lfile = stat; -+ } -+ stat++; -+ } -++ -++ switch (cputype) { -++ case CPU_LEON2: -++ printf(" LEON2 emulation enabled\n"); -++ break; -++ case CPU_LEON3: -++ printf(" LEON3 emulation enabled\n"); -++ break; -++ default: -++ printf(" ERC32 emulation enabled\n"); -++ } -++ -+ if (nfp) -+- printf("FPU disabled\n"); -+-#ifdef ERA -+- if (era) -+- printf("ERA ECC emulation enabled\n"); -+-#endif -++ printf(" FPU disabled\n"); -+ sregs.freq = freq; -++ printf("\n"); -+ -+ INIT_DISASSEMBLE_INFO(dinfo, stdout, (fprintf_ftype) fprintf); -++#ifdef HOST_LITTLE_ENDIAN -++ dinfo.endian = BFD_ENDIAN_LITTLE; -++#else -+ dinfo.endian = BFD_ENDIAN_BIG; -++#endif -+ -+ termsave = fcntl(0, F_GETFL, 0); -+ using_history(); -+@@ -241,7 +232,8 @@ main(argc, argv) -+ ebase.simtime = 0; -+ reset_all(); -+ init_bpt(&sregs); -+- init_sim(); -++ ms->init_sim(); -++ if (lfile) last_load_addr = bfd_load(argv[lfile]); -+ #ifdef STAT -+ reset_stat(&sregs); -+ #endif -+@@ -278,7 +270,7 @@ main(argc, argv) -+ case CTRL_C: -+ printf("\b\bInterrupt!\n"); -+ case TIME_OUT: -+- printf(" Stopped at time %d (%.3f ms)\n", ebase.simtime, -++ printf(" Stopped at time %llu (%.3f ms)\n", ebase.simtime, -+ ((double) ebase.simtime / (double) sregs.freq) / 1000.0); -+ break; -+ case BPT_HIT: -+@@ -288,7 +280,7 @@ main(argc, argv) -+ case ERROR: -+ printf("IU in error mode (%d)\n", sregs.trap); -+ stat = 0; -+- printf(" %8d ", ebase.simtime); -++ printf(" %8llu ", ebase.simtime); -+ dis_mem(sregs.pc, 1, &dinfo); -+ break; -+ default: -+diff --git a/sim/erc32/sis.h b/sim/erc32/sis.h -+index f49d45d..637549a 100644 -+--- a/sim/erc32/sis.h -++++ b/sim/erc32/sis.h -+@@ -24,7 +24,11 @@ -+ #include "gdb/callback.h" -+ #include "gdb/remote-sim.h" -+ -+-#include "end.h" -++#ifdef WORDS_BIGENDIAN -++#define HOST_BIG_ENDIAN -++#else -++#define HOST_LITTLE_ENDIAN -++#endif -+ -+ #define I_ACC_EXC 1 -+ -+@@ -60,7 +64,7 @@ typedef long long int64; /* 64-bit signed int */ -+ struct pstate { -+ -+ float64 fd[16]; /* FPU registers */ -+-#ifdef HOST_LITTLE_ENDIAN_FLOAT -++#ifdef HOST_LITTLE_ENDIAN -+ float32 fs[32]; -+ float32 *fdp; -+ #else -+@@ -110,14 +114,14 @@ struct pstate { -+ float32 freq; /* Simulated processor frequency */ -+ -+ -+- uint64 tottime; -++ double tottime; -+ uint64 ninst; -+ uint64 fholdt; -+ uint64 holdt; -+ uint64 icntt; -+ uint64 finst; -+ uint64 simstart; -+- uint64 starttime; -++ double starttime; -+ uint64 tlimit; /* Simulation time limit */ -+ uint64 pwdtime; /* Cycles in power-down mode */ -+ uint64 nstore; /* Number of load instructions */ -+@@ -149,6 +153,30 @@ struct irqcell { -+ int32 arg; -+ }; -+ -++struct memsys { -++ void (*init_sim) (); -++ void (*reset) (void); -++ void (*error_mode) (uint32 pc); -++ void (*sim_halt) (void); -++ void (*exit_sim) (void); -++ void (*init_stdio) (void); -++ void (*restore_stdio) (void); -++ int (*memory_iread) (uint32 addr, uint32 *data, int32 *ws); -++ int (*memory_read) (uint32 addr, uint32 *data, -++ int32 sz, int32 *ws); -++ int (*memory_read_asi) (int32 asi, uint32 addr, uint32 *data, -++ int32 sz, int32 *ws); -++ int (*memory_write) (uint32 addr, uint32 *data, -++ int32 sz, int32 *ws); -++ int (*memory_write_asi) (int32 asi, uint32 addr, uint32 *data, -++ int32 sz, int32 *ws); -++ int (*sis_memory_write) (uint32 addr, -++ const unsigned char *data, uint32 length); -++ int (*sis_memory_read) (uint32 addr, char *data, -++ uint32 length); -++ void (*boot_init) (void); -++}; -++ -+ -+ #define OK 0 -+ #define TIME_OUT 1 -+@@ -156,26 +184,37 @@ struct irqcell { -+ #define ERROR 3 -+ #define CTRL_C 4 -+ -++#define CPU_LEON2 2 -++#define CPU_LEON3 3 -++ -+ /* Prototypes */ -+ -+ /* erc32.c */ -+-extern void init_sim (void); -+-extern void reset (void); -+-extern void error_mode (uint32 pc); -+-extern void sim_halt (void); -+-extern void exit_sim (void); -+-extern void init_stdio (void); -+-extern void restore_stdio (void); -+-extern int memory_read (int32 asi, uint32 addr, uint32 *data, -+- int32 sz, int32 *ws); -+-extern int memory_write (int32 asi, uint32 addr, uint32 *data, -+- int32 sz, int32 *ws); -+-extern int sis_memory_write (uint32 addr, -+- const unsigned char *data, uint32 length); -+-extern int sis_memory_read (uint32 addr, char *data, -+- uint32 length); -++extern struct memsys erc32sys; -+ -+ /* func.c */ -++extern struct pstate sregs; -++extern struct estate ebase; -++extern struct evcell evbuf[]; -++extern struct irqcell irqarr[]; -++extern int nfp; -++extern int ift; -++extern int ctrl_c; -++extern int sis_verbose; -++extern char *sis_version; -++extern int sparclite; -++extern int sparclite_board; -++extern uint32 last_load_addr; -++extern int wrp; -++extern int rom8; -++extern int uben; -++extern int irqpend; -++extern int ext_irl; -++extern int termsave; -++extern int dumbio; -++extern char uart_dev1[]; -++extern char uart_dev2[]; -++ -+ extern void set_regi (struct pstate *sregs, int32 reg, -+ uint32 rval); -+ extern void get_regi (struct pstate *sregs, int32 reg, char *buf); -+@@ -186,6 +225,7 @@ extern void init_bpt (struct pstate *sregs); -+ extern void init_signals (void); -+ -+ struct disassemble_info; -++extern struct disassemble_info dinfo; -+ extern void dis_mem (uint32 addr, uint32 len, -+ struct disassemble_info *info); -+ extern void event (void (*cfunc) (), int32 arg, uint64 delta); -+@@ -197,7 +237,12 @@ extern int check_bpt (struct pstate *sregs); -+ extern void reset_all (void); -+ extern void sys_reset (void); -+ extern void sys_halt (void); -+-extern int bfd_load (char *fname); -++extern double get_time (void); -++extern int nouartrx; -++extern host_callback *sim_callback; -++extern int current_target_byte_order; -++extern int dumbio; -++extern int cputype; -+ -+ /* exec.c */ -+ extern int dispatch_instruction (struct pstate *sregs); -+@@ -217,3 +262,11 @@ extern void set_fsr (uint32 fsr); -+ /* help.c */ -+ extern void usage (void); -+ extern void gen_help (void); -++ -++extern struct memsys *ms; -++ -++/* leon2.c */ -++extern struct memsys leon2; -++ -++/* leon3.c */ -++extern struct memsys leon3; -+diff --git a/sim/erc32/startsim b/sim/erc32/startsim -+deleted file mode 100644 -+index 1b9b41c..0000000 -+--- a/sim/erc32/startsim -++++ /dev/null -+@@ -1,4 +0,0 @@ -+-# -+-xterm -e sis $* & -+-xterm -e tip /dev/ttypc & -+- --- -1.9.1 - ++ if (anum > 0) { ++ aind = 0; ++ if ((aind + 1) < anum) ++ set_irq(3); ++ return ((uint32) aq[aind++]); ++ } else { ++ return ((uint32) aq[aind]); ++ } ++ ++ } ++#else ++ tmp = uarta_data; ++ uarta_data &= ~UART_DR; ++ uart_stat_reg &= ~UARTA_DR; ++ return tmp; ++#endif ++#else ++ return(0); ++#endif ++ break; ++ ++ case 0x04: /* UART status register */ ++#ifndef _WIN32 ++#ifdef FAST_UART ++ ++ Ucontrol = 0; ++ if (aind < anum) { ++ Ucontrol |= 0x00000001; ++ } else { ++ if (f1open) { ++ anum = DO_STDIO_READ(ifd1, aq, UARTBUF); ++ } ++ else { ++ anum = 0; ++ } ++ if (anum > 0) { ++ Ucontrol |= 0x00000001; ++ aind = 0; ++ set_irq(3); ++ } ++ } ++ Ucontrol |= 0x00000006; ++ return (Ucontrol); ++#else ++ return (uart_stat_reg); ++#endif ++#else ++ return(0x00060006); ++#endif ++ break; ++ default: ++ if (sis_verbose) ++ printf("Read from unimplemented MEC register (%x)\n", addr); ++ ++ } ++ return (0); ++} ++ ++static void ++grlib_write_uart(addr, data) ++ uint32 addr; ++ uint32 data; ++{ ++ unsigned char c; ++ ++ c = (unsigned char) data; ++ switch (addr & 0xff) { ++ ++ case 0x00: /* UART A */ ++#ifdef FAST_UART ++ if (f1open) { ++ if (wnuma < UARTBUF) ++ wbufa[wnuma++] = c; ++ else { ++ while (wnuma) { ++ if (ofd1 == 1 && callback) ++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); ++ else ++ wnuma -= fwrite(wbufa, 1, wnuma, f1out); ++ } ++ wbufa[wnuma++] = c; ++ } ++ } ++ set_irq(3); ++#else ++ if (uart_stat_reg & UARTA_SRE) { ++ uarta_sreg = c; ++ uart_stat_reg &= ~UARTA_SRE; ++ event(uarta_tx, 0, UART_TX_TIME); ++ } else { ++ uarta_hreg = c; ++ uart_stat_reg &= ~UARTA_HRE; ++ } ++#endif ++ break; ++ ++ case 0x04: /* UART status register */ ++#ifndef FAST_UART ++ uart_stat_reg &= 1; ++#endif ++ break; ++ default: ++ if (sis_verbose) ++ printf("Write to unimplemented APB register (%x)\n", addr); ++ ++ } ++} ++ ++static void ++flush_uart() ++{ ++ while (wnuma && f1open) { ++ if (ofd1 == 1 && callback) { ++ wnuma -= callback->write_stdout(callback, wbufa, wnuma); ++ callback->flush_stdout(callback); ++ } ++ else ++ wnuma -= fwrite(wbufa, 1, wnuma, f1out); ++ } ++} ++ ++ ++ ++static void ++uarta_tx() ++{ ++ while (f1open) { ++ if (ofd1 == 1 && callback) { ++ while (callback->write_stdout(callback, &uarta_sreg, 1) != 1); ++ } ++ else { ++ while (fwrite(&uarta_sreg, 1, 1, f1out) != 1); ++ } ++ } ++ if (uart_stat_reg & UARTA_HRE) { ++ uart_stat_reg |= UARTA_SRE; ++ } else { ++ uarta_sreg = uarta_hreg; ++ uart_stat_reg |= UARTA_HRE; ++ event(uarta_tx, 0, UART_TX_TIME); ++ } ++ set_irq(3); ++} ++ ++static void ++uart_rx(arg) ++ caddr_t arg; ++{ ++ int32 rsize; ++ char rxd; ++ ++ ++ rsize = 0; ++ if (f1open) ++ rsize = DO_STDIO_READ(ifd1, &rxd, 1); ++ else ++ rsize = 0; ++ if (rsize > 0) { ++ uarta_data = rxd; ++ if (uart_stat_reg & UARTA_DR) { ++ uart_stat_reg |= UARTA_OR; ++ } ++ uart_stat_reg |= UARTA_DR; ++ set_irq(3); ++ } ++ event(uart_rx, 0, UART_RX_TIME); ++} ++ ++static void ++uart_intr(arg) ++ caddr_t arg; ++{ ++ grlib_read_uart(APBUART_STATUS); /* Check for UART interrupts every 1000 clk */ ++ flush_uart(); /* Flush UART ports */ ++ event(uart_intr, 0, UART_FLUSH_TIME); ++} ++ ++ ++static void ++uart_irq_start() ++{ ++#ifdef FAST_UART ++ event(uart_intr, 0, UART_FLUSH_TIME); ++#else ++#ifndef _WIN32 ++ event(uart_rx, 0, UART_RX_TIME); ++#endif ++#endif ++} ++ ++/* GPTIMER */ ++ ++static void ++gpt_intr(arg) ++ caddr_t arg; ++{ ++ int i; ++ ++ for (i=0; i= RAM_START) && (addr < RAM_END)) { ++ *data = *((uint32 *) & (ramb[addr & RAM_MASK])); ++ *ws = 0; ++ return (0); ++ } else if (addr < ROM_END) { ++ *data = *((uint32 *) & (romb[addr])); ++ *ws = 0; ++ return (0); ++ } ++ ++ printf("Memory exception at %x (illegal address)\n", addr); ++ *ws = MEM_EX_WS; ++ return (1); ++} ++ ++static int ++memory_read(addr, data, sz, ws) ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ int32 mexc; ++ ++ if ((addr >= RAM_START) && (addr < RAM_END)) { ++ *data = *((uint32 *) & (ramb[addr & RAM_MASK & ~3])); ++ *ws = 0; ++ return (0); ++ } else if ((addr >= APBPP_START) && (addr <= APBPP_END)) { ++ *data = grlib_apbpnp_read(addr); ++ if (sis_verbose > 1) ++ printf("APB PP read a: %08x, d: %08x\n",addr, *data); ++ *ws = 4; ++ return (0); ++ } else if ((addr >= APBSTART) && (addr < APBEND)) { ++ mexc = apb_read(addr, data); ++ if (mexc) { ++ *ws = MEM_EX_WS; ++ } else { ++ *ws = 0; ++ } ++ return (mexc); ++ } else if ((addr >= AHBPP_START) && (addr <= AHBPP_END)) { ++ if (sis_verbose > 1) ++ printf("AHB PP read a: %08x, d: %08x\n",addr, *data); ++ *data = grlib_ahbpnp_read(addr); ++ *ws = 4; ++ return (0); ++ } else if (addr < ROM_END) { ++ *data = *((uint32 *) & (romb[addr & ~3])); ++ *ws = 0; ++ return (0); ++ } ++ ++ printf("Memory exception at %x (illegal address)\n", addr); ++ *ws = MEM_EX_WS; ++ return (1); ++} ++ ++static int ++memory_read_asi(asi, addr, data, sz, ws) ++ int32 asi; ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ if (asi == 2) { ++ if (addr == 0) ++ *data = cache_ctrl; ++ else ++ *data = 0; ++ return MOK; ++ } else ++ return(memory_read(addr, data, sz, ws)); ++} ++ ++static int ++memory_write(addr, data, sz, ws) ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ uint32 byte_addr; ++ uint32 byte_mask; ++ uint32 waddr; ++ uint32 *ram; ++ int32 mexc; ++ int i; ++ int wphit[2]; ++ ++ if ((addr >= RAM_START) && (addr < RAM_END)) { ++ waddr = addr & RAM_MASK; ++ store_bytes (ramb, waddr, data, sz, ws); ++ return (0); ++ ++ } else if ((addr >= APBSTART) && (addr < APBEND)) { ++ if (sz != 2) { ++ *ws = MEM_EX_WS; ++ return (1); ++ } ++ apb_write(addr, *data); ++ *ws = 0; ++ return (0); ++ ++ } else if (addr < ROM_END) { ++// return (1); ++ *ws = 0; ++ store_bytes (romb, addr, data, sz, ws); ++ return (0); ++ } ++ ++ *ws = MEM_EX_WS; ++ return (1); ++} ++ ++static int ++memory_write_asi(asi, addr, data, sz, ws) ++ int32 asi; ++ uint32 addr; ++ uint32 *data; ++ int32 sz; ++ int32 *ws; ++{ ++ if (asi == 2) { ++ cache_ctrl = *data & 0x81000f; ++ if (sis_verbose) ++ printf("cache ctrl reg : 0x%08x\n", cache_ctrl); ++ return MOK; ++ } else ++ return(memory_write(addr, data, sz, ws)); ++} ++ ++static unsigned char * ++get_mem_ptr(addr, size) ++ uint32 addr; ++ uint32 size; ++{ ++ if ((addr + size) < ROM_END) { ++ return (&romb[addr]); ++ } else if ((addr >= RAM_START) && ((addr + size) < RAM_END)) { ++ return (&ramb[addr & RAM_MASK]); ++ } ++ ++ return ((char *) -1); ++} ++ ++static int ++sis_memory_write(addr, data, length) ++ uint32 addr; ++ const unsigned char *data; ++ uint32 length; ++{ ++ char *mem; ++ ++ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) ++ return (0); ++ ++ memcpy(mem, data, length); ++ return (length); ++} ++ ++static int ++sis_memory_read(addr, data, length) ++ uint32 addr; ++ char *data; ++ uint32 length; ++{ ++ char *mem; ++ int ws; ++ ++ if (length == 4) { ++ memory_read(addr, data, length, &ws); ++ return(4); ++ } ++ ++ if ((mem = get_mem_ptr(addr, length)) == ((char *) -1)) ++ return (0); ++ ++ memcpy(data, mem, length); ++ return (length); ++} ++ ++static void ++boot_init () ++{ ++// mec_write(MEC_WCR, 0); /* zero waitstates */ ++// mec_write(MEC_TRAPD, 0); /* turn off watch-dog */ ++ apb_write(GPTIMER_SCALER, sregs.freq-1); /* generate 1 MHz RTC tick */ ++ apb_write(GPTIMER_SCLOAD, sregs.freq-1); ++ apb_write(GPTIMER_TIMER1, -1); ++ apb_write(GPTIMER_RELOAD1, -1); ++ apb_write(GPTIMER_CTRL1, 0x7); ++// mec_write(MEC_MEMCFG, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */ ++ sregs.wim = 2; ++ sregs.psr = 0xF30010e0; ++ sregs.r[30] = RAM_END; ++ sregs.r[14] = sregs.r[30] - 96*4; ++ cache_ctrl = 0x81000f; ++} ++ ++struct memsys leon3 = { ++ init_sim, ++ reset, ++ error_mode, ++ sim_halt, ++ exit_sim, ++ init_stdio, ++ restore_stdio, ++ memory_iread, ++ memory_read, ++ memory_read_asi, ++ memory_write, ++ memory_write_asi, ++ sis_memory_write, ++ sis_memory_read, ++ boot_init ++}; +diff --git a/sim/erc32/sis.c b/sim/erc32/sis.c +index 89e6f02..f21ddde 100644 +--- a/sim/erc32/sis.c ++++ b/sim/erc32/sis.c +@@ -26,7 +26,6 @@ + #include + #endif + #include +-#include + #include + #include "sis.h" + #include +@@ -36,44 +35,12 @@ + + /* Structures and functions from readline library */ + +-typedef struct { +- char *line; +- char *data; +-} HIST_ENTRY; +- +-extern char * readline (char *prompt); +-extern void using_history (void); +-extern void add_history (char *string); +-extern HIST_ENTRY *remove_history (int which); +- +- ++#include "readline/readline.h" ++#include "readline/history.h" + + /* Command history buffer length - MUST be binary */ + #define HIST_LEN 64 + +-extern struct disassemble_info dinfo; +-extern struct pstate sregs; +-extern struct estate ebase; +- +-extern int ctrl_c; +-extern int nfp; +-extern int ift; +-extern int wrp; +-extern int rom8; +-extern int uben; +-extern int sis_verbose; +-extern char *sis_version; +-extern struct estate ebase; +-extern struct evcell evbuf[]; +-extern struct irqcell irqarr[]; +-extern int irqpend, ext_irl; +-extern int termsave; +-extern int sparclite; +-extern int dumbio; +-extern char uart_dev1[]; +-extern char uart_dev2[]; +-extern uint32 last_load_addr; +- + #ifdef ERA + extern int era; + #endif +@@ -84,20 +51,16 @@ run_sim(sregs, icount, dis) + uint64 icount; + int dis; + { +- int irq, mexc, deb, asi; ++ int irq, mexc, deb; + +- sregs->starttime = time(NULL); +- init_stdio(); ++ sregs->starttime = get_time(); ++ ms->init_stdio(); + if (sregs->err_mode) icount = 0; + deb = dis || sregs->histlen || sregs->bptnum; + irq = 0; + while (icount > 0) { + +- if (sregs->psr & 0x080) +- asi = 9; +- else +- asi = 8; +- mexc = memory_read(asi, sregs->pc, &sregs->inst, 2, &sregs->hold); ++ mexc = ms->memory_iread(sregs->pc, &sregs->inst, &sregs->hold); + sregs->icnt = 1; + if (sregs->annul) { + sregs->annul = 0; +@@ -112,7 +75,7 @@ run_sim(sregs, icount, dis) + } else { + if (deb) { + if ((sregs->bphit = check_bpt(sregs)) != 0) { +- restore_stdio(); ++ ms->restore_stdio(); + return (BPT_HIT); + } + if (sregs->histlen) { +@@ -123,7 +86,7 @@ run_sim(sregs, icount, dis) + sregs->histind = 0; + } + if (dis) { +- printf(" %8u ", ebase.simtime); ++ printf(" %8llu ", ebase.simtime); + dis_mem(sregs->pc, 1, &dinfo); + } + } +@@ -135,7 +98,7 @@ run_sim(sregs, icount, dis) + irq = 0; + sregs->err_mode = execute_trap(sregs); + if (sregs->err_mode) { +- error_mode(sregs->pc); ++ ms->error_mode(sregs->pc); + icount = 0; + } + } +@@ -146,8 +109,8 @@ run_sim(sregs, icount, dis) + if (sregs->tlimit <= ebase.simtime) sregs->tlimit = -1; + } + } +- sregs->tottime += time(NULL) - sregs->starttime; +- restore_stdio(); ++ sregs->tottime += get_time() - sregs->starttime; ++ ms->restore_stdio(); + if (sregs->err_mode) + return (ERROR); + if (ctrl_c) { +@@ -172,12 +135,13 @@ main(argc, argv) + char *cmdq[HIST_LEN]; + int cmdi = 0; + int i; ++ int lfile = 0; + + cfile = 0; + for (i = 0; i < 64; i++) + cmdq[i] = 0; + printf("\n SIS - SPARC instruction simulator %s, copyright Jiri Gaisler 1995\n", sis_version); +- printf(" Bug-reports to jgais@wd.estec.esa.nl\n\n"); ++ printf(" Bug-reports to jiri@gaisler.se\n\n"); + while (stat < argc) { + if (argv[stat][0] == '-') { + if (strcmp(argv[stat], "-v") == 0) { +@@ -214,26 +178,53 @@ main(argc, argv) + #endif + } else if (strcmp(argv[stat], "-dumbio") == 0) { + dumbio = 1; ++ } else if (strcmp(argv[stat], "-nouartrx") == 0) { ++ nouartrx = 1; ++ } else if (strcmp(argv[stat], "-leon2") == 0) { ++ ms = &leon2; ++ if (freq == 14) freq = 50; ++ cputype = CPU_LEON2; ++ } else if (strcmp(argv[stat], "-leon3") == 0) { ++ ms = &leon3; ++ if (freq == 14) freq = 50; ++ cputype = CPU_LEON3; ++ } else if (strcmp(argv[stat], "-v") == 0) { ++ sis_verbose = 1; ++ } else if (strcmp(argv[stat], "-vv") == 0) { ++ sis_verbose = 2; + } else { + printf("unknown option %s\n", argv[stat]); + usage(); + exit(1); + } + } else { +- last_load_addr = bfd_load(argv[stat]); ++ lfile = stat; + } + stat++; + } ++ ++ switch (cputype) { ++ case CPU_LEON2: ++ printf(" LEON2 emulation enabled\n"); ++ break; ++ case CPU_LEON3: ++ printf(" LEON3 emulation enabled\n"); ++ break; ++ default: ++ printf(" ERC32 emulation enabled\n"); ++ } ++ + if (nfp) +- printf("FPU disabled\n"); +-#ifdef ERA +- if (era) +- printf("ERA ECC emulation enabled\n"); +-#endif ++ printf(" FPU disabled\n"); + sregs.freq = freq; ++ printf("\n"); + + INIT_DISASSEMBLE_INFO(dinfo, stdout, (fprintf_ftype) fprintf); ++#ifdef HOST_LITTLE_ENDIAN ++ dinfo.endian = BFD_ENDIAN_LITTLE; ++#else + dinfo.endian = BFD_ENDIAN_BIG; ++#endif + + termsave = fcntl(0, F_GETFL, 0); + using_history(); +@@ -241,7 +232,8 @@ main(argc, argv) + ebase.simtime = 0; + reset_all(); + init_bpt(&sregs); +- init_sim(); ++ ms->init_sim(); ++ if (lfile) last_load_addr = bfd_load(argv[lfile]); + #ifdef STAT + reset_stat(&sregs); + #endif +@@ -278,7 +270,7 @@ main(argc, argv) + case CTRL_C: + printf("\b\bInterrupt!\n"); + case TIME_OUT: +- printf(" Stopped at time %d (%.3f ms)\n", ebase.simtime, ++ printf(" Stopped at time %llu (%.3f ms)\n", ebase.simtime, + ((double) ebase.simtime / (double) sregs.freq) / 1000.0); + break; + case BPT_HIT: +@@ -288,7 +280,7 @@ main(argc, argv) + case ERROR: + printf("IU in error mode (%d)\n", sregs.trap); + stat = 0; +- printf(" %8d ", ebase.simtime); ++ printf(" %8llu ", ebase.simtime); + dis_mem(sregs.pc, 1, &dinfo); + break; + default: +diff --git a/sim/erc32/sis.h b/sim/erc32/sis.h +index f49d45d..637549a 100644 +--- a/sim/erc32/sis.h ++++ b/sim/erc32/sis.h +@@ -24,7 +24,11 @@ + #include "gdb/callback.h" + #include "gdb/remote-sim.h" + +-#include "end.h" ++#ifdef WORDS_BIGENDIAN ++#define HOST_BIG_ENDIAN ++#else ++#define HOST_LITTLE_ENDIAN ++#endif + + #define I_ACC_EXC 1 + +@@ -60,7 +64,7 @@ typedef long long int64; /* 64-bit signed int */ + struct pstate { + + float64 fd[16]; /* FPU registers */ +-#ifdef HOST_LITTLE_ENDIAN_FLOAT ++#ifdef HOST_LITTLE_ENDIAN + float32 fs[32]; + float32 *fdp; + #else +@@ -110,14 +114,14 @@ struct pstate { + float32 freq; /* Simulated processor frequency */ + + +- uint64 tottime; ++ double tottime; + uint64 ninst; + uint64 fholdt; + uint64 holdt; + uint64 icntt; + uint64 finst; + uint64 simstart; +- uint64 starttime; ++ double starttime; + uint64 tlimit; /* Simulation time limit */ + uint64 pwdtime; /* Cycles in power-down mode */ + uint64 nstore; /* Number of load instructions */ +@@ -149,6 +153,30 @@ struct irqcell { + int32 arg; + }; + ++struct memsys { ++ void (*init_sim) (); ++ void (*reset) (void); ++ void (*error_mode) (uint32 pc); ++ void (*sim_halt) (void); ++ void (*exit_sim) (void); ++ void (*init_stdio) (void); ++ void (*restore_stdio) (void); ++ int (*memory_iread) (uint32 addr, uint32 *data, int32 *ws); ++ int (*memory_read) (uint32 addr, uint32 *data, ++ int32 sz, int32 *ws); ++ int (*memory_read_asi) (int32 asi, uint32 addr, uint32 *data, ++ int32 sz, int32 *ws); ++ int (*memory_write) (uint32 addr, uint32 *data, ++ int32 sz, int32 *ws); ++ int (*memory_write_asi) (int32 asi, uint32 addr, uint32 *data, ++ int32 sz, int32 *ws); ++ int (*sis_memory_write) (uint32 addr, ++ const unsigned char *data, uint32 length); ++ int (*sis_memory_read) (uint32 addr, char *data, ++ uint32 length); ++ void (*boot_init) (void); ++}; ++ + + #define OK 0 + #define TIME_OUT 1 +@@ -156,26 +184,37 @@ struct irqcell { + #define ERROR 3 + #define CTRL_C 4 + ++#define CPU_LEON2 2 ++#define CPU_LEON3 3 ++ + /* Prototypes */ + + /* erc32.c */ +-extern void init_sim (void); +-extern void reset (void); +-extern void error_mode (uint32 pc); +-extern void sim_halt (void); +-extern void exit_sim (void); +-extern void init_stdio (void); +-extern void restore_stdio (void); +-extern int memory_read (int32 asi, uint32 addr, uint32 *data, +- int32 sz, int32 *ws); +-extern int memory_write (int32 asi, uint32 addr, uint32 *data, +- int32 sz, int32 *ws); +-extern int sis_memory_write (uint32 addr, +- const unsigned char *data, uint32 length); +-extern int sis_memory_read (uint32 addr, char *data, +- uint32 length); ++extern struct memsys erc32sys; + + /* func.c */ ++extern struct pstate sregs; ++extern struct estate ebase; ++extern struct evcell evbuf[]; ++extern struct irqcell irqarr[]; ++extern int nfp; ++extern int ift; ++extern int ctrl_c; ++extern int sis_verbose; ++extern char *sis_version; ++extern int sparclite; ++extern int sparclite_board; ++extern uint32 last_load_addr; ++extern int wrp; ++extern int rom8; ++extern int uben; ++extern int irqpend; ++extern int ext_irl; ++extern int termsave; ++extern int dumbio; ++extern char uart_dev1[]; ++extern char uart_dev2[]; ++ + extern void set_regi (struct pstate *sregs, int32 reg, + uint32 rval); + extern void get_regi (struct pstate *sregs, int32 reg, char *buf); +@@ -186,6 +225,7 @@ extern void init_bpt (struct pstate *sregs); + extern void init_signals (void); + + struct disassemble_info; ++extern struct disassemble_info dinfo; + extern void dis_mem (uint32 addr, uint32 len, + struct disassemble_info *info); + extern void event (void (*cfunc) (), int32 arg, uint64 delta); +@@ -197,7 +237,12 @@ extern int check_bpt (struct pstate *sregs); + extern void reset_all (void); + extern void sys_reset (void); + extern void sys_halt (void); +-extern int bfd_load (char *fname); ++extern double get_time (void); ++extern int nouartrx; ++extern host_callback *sim_callback; ++extern int current_target_byte_order; ++extern int dumbio; ++extern int cputype; + + /* exec.c */ + extern int dispatch_instruction (struct pstate *sregs); +@@ -217,3 +262,11 @@ extern void set_fsr (uint32 fsr); + /* help.c */ + extern void usage (void); + extern void gen_help (void); ++ ++extern struct memsys *ms; ++ ++/* leon2.c */ ++extern struct memsys leon2; ++ ++/* leon3.c */ ++extern struct memsys leon3; +diff --git a/sim/erc32/startsim b/sim/erc32/startsim +deleted file mode 100644 +index 1b9b41c..0000000 +--- a/sim/erc32/startsim ++++ /dev/null +@@ -1,4 +0,0 @@ +-# +-xterm -e sis $* & +-xterm -e tip /dev/ttypc & +- -- cgit v1.2.3