summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJiri Gaisler <jiri@gaisler.se>2014-11-14 23:19:09 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-12-04 13:00:50 +0100
commitaf8c147a572933c47d2b1e126e9f71c5be11ec43 (patch)
tree6f6ecc8a3461146970cf6344a24da9b6050dfb4f /tools
parent4bdba3e552f22bbd82ffc9ab2c915a7b4f2eadd5 (diff)
gdb patch to add leon2/3 support to sis
This fixes the commit 4bdba3e552f22bbd82ffc9ab2c915a7b4f2eadd5 which added a patch patch.
Diffstat (limited to 'tools')
-rw-r--r--tools/4.11/gdb/sparc/gdb-7.7-7.8-sis-leon2-leon3-fixup.diff17839
1 files changed, 8910 insertions, 8929 deletions
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 <jiri@gaisler.se>
-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 <f> Set the simulated "system clock" to <f> 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 <program>' and debug as
+-usual.
+-
+-The native simulator commands can be reached using the GDB 'sim'
+-command:
+-
+-sim <sis_command>
+-
+-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 <f> Set the simulated "system clock" to <f> 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 <program>' and debug as
-+-usual.
-+-
-+-The native simulator commands can be reached using the GDB 'sim'
-+-command:
-+-
-+-sim <sis_command>
-+-
-+-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 <address> [inst_count]
-+
-+ The go command will set pc to <address> and npc to <address> + 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 <f> Set the simulated "system clock" to <f> MHz.
-++
-++ -v Verbose mode.
-++
-++ -nogdb Disable GDB breakpoint handling (see below)
-++
-++To start debugging a program type 'load <program>' and debug as
-++usual.
-++
-++The native simulator commands can be reached using the GDB 'sim'
-++command:
-++
-++sim <sis_command>
-++
-++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 </dev/null 6>&1
-++test -n "$DJDIR" || exec 7<&0 </dev/null
-++exec 6>&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<lib dir> if you have libraries in a
-+ nonstandard directory <lib dir>
-+ LIBS libraries to pass to the linker, e.g. -l<library>
-+- CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
-++ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
-+ you have headers in a nonstandard directory <include dir>
-+ 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 <stdio.h>
-++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 <stdarg.h>
-+ #include <stdio.h>
-+-#include <sys/types.h>
-+-#include <sys/stat.h>
-++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 <address> [inst_count]
+
+ The go command will set pc to <address> and npc to <address> + 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 <f> Set the simulated "system clock" to <f> MHz.
++
++ -v Verbose mode.
++
++ -nogdb Disable GDB breakpoint handling (see below)
++
++To start debugging a program type 'load <program>' and debug as
++usual.
++
++The native simulator commands can be reached using the GDB 'sim'
++command:
++
++sim <sis_command>
++
++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 </dev/null 6>&1
++test -n "$DJDIR" || exec 7<&0 </dev/null
++exec 6>&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<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+- CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
++ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ 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 <stdio.h>
++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 <stdarg.h>
+ #include <stdio.h>
+-#include <sys/types.h>
+-#include <sys/stat.h>
++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 <sys/types.h>
++ #include <sys/param.h>
++
++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 <sys/types.h>
++ #include <sys/param.h>
++
++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 <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <limits.h>
++
++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 <limits.h>
++
++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 <sys/types.h>
-++ #include <sys/param.h>
-++
-++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 <sys/types.h>
-++ #include <sys/param.h>
-++
-++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 <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
-++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-++/* end confdefs.h. */
-++#include <limits.h>
-++
-++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 <limits.h>
-++
-++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 2>/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 <stdio.h>
-+-
-+-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 <errno.h>
-+ #include <sys/types.h>
-+ #include <stdio.h>
-+ #include <string.h>
-+@@ -30,16 +31,9 @@
-+ #include <sys/file.h>
-+ #include <unistd.h>
-+ #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 <math.h>
-+ #include <stdio.h>
-+
-+-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 2>/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 <stdio.h>
+-
+-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 <errno.h>
+ #include <sys/types.h>
+ #include <stdio.h>
+ #include <string.h>
+@@ -30,16 +31,9 @@
+ #include <sys/file.h>
+ #include <unistd.h>
+ #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 <math.h>
+ #include <stdio.h>
+
+-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 <stdlib.h>
+ #include <ctype.h>
+ #include "sis.h"
+-#include "end.h"
+ #include <dis-asm.h>
+ #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;i<count/4;i++) wbuffer[i] = ntohl(wbuffer[i]); // endian swap
++#endif
++ ms->sis_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 <http://www.gnu.org/licenses/>.
++ *
++ */
++
++
++#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 <http://www.gnu.org/licenses/>.
++ *
++ */
++
++
++/* 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 <string.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <time.h>
+ #include <sys/fcntl.h>
+ #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; i<length; i+=4) {
++ ibuf[i] = ntohl(ibufp[i]);
++ }
++ return (ms->sis_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; i<length; i+=4) {
++ *ibuf = htonl(*ibuf);
++ ibuf++;
++ }
++ return (len);
++#else
++ return (ms->sis_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 <http://www.gnu.org/licenses/>.
++ *
++ * Leon2 emulation, based on leon3.c .
++ */
++
++/* The control space devices */
++
++#include "config.h"
++#include <errno.h>
++#include <sys/types.h>
++#include <stdio.h>
++#include <string.h>
++#include <termios.h>
++#include <sys/fcntl.h>
++#include <sys/file.h>
++#include <unistd.h>
++#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<NTIMERS; i++) {
++ if (gpt_ctrl[i] & 1) {
++ gpt_counter[i] -= 1;
++ if (gpt_counter[i] == -1) {
++ set_irq(TIMER_IRQ + i);
++ if (gpt_ctrl[i] & 2)
++ gpt_counter[i] = gpt_reload[i];
++ }
++ }
++ }
++ event(gpt_intr, 0, gpt_scaler + 1);
++ gpt_scaler_start = now();
++}
++
++static void
++gpt_init()
++{
++ if (sis_verbose)
++ printf("GPT started (period %d)\n\r", gpt_scaler + 1);
++}
++
++static void
++gpt_reset()
++{
++ event(gpt_intr, 0, gpt_scaler + 1);
++ gpt_scaler_start = now();
++}
++
++static void
++gpt_scaler_set(val)
++ uint32 val;
++{
++ gpt_scaler = val & 0x0ffff; /* 16-bit scaler */
++}
++
++static void
++timer_ctrl(val, i)
++ uint32 val;
++ int i;
++{
++ if (val & 4) { /* reload */
++ gpt_counter[i] = gpt_reload[i];
++ }
++ gpt_ctrl[i] = val & 0xb;
++}
++
++/* 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
++store_bytes (mem, waddr, data, sz, ws)
++ unsigned char *mem;
++ uint32 waddr;
++ uint32 *data;
++ int32 sz;
++ int32 *ws;
++{
++ switch (sz) {
++ case 0:
++#ifdef HOST_LITTLE_ENDIAN
++ waddr ^= 3;
++#endif
++ mem[waddr] = *data & 0x0ff;
++ *ws = 0;
++ break;
++ case 1:
++#ifdef HOST_LITTLE_ENDIAN
++ waddr ^= 2;
++#endif
++ *((unsigned short *) &(mem[waddr])) = *data & 0x0ffff;
++ *ws = 0;
++ break;
++ case 2:
++ *((uint32 *) &(mem[waddr])) = *data;
++ *ws = 0;
++ break;
++ case 3:
++ *((uint32 *) &(mem[waddr])) = data[0];
++ *((uint32 *) &(mem[waddr + 4])) = data[1];
++ *ws = 0;
++ break;
++ }
++}
++
++
++/* Memory emulation */
++
++static int
++memory_iread(addr, data, ws)
++ uint32 addr;
++ uint32 *data;
++ int32 *ws;
++{
++ if ((addr >= 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 <http://www.gnu.org/licenses/>.
++ *
++ * Leon3 emulation, loosely based on erc32.c .
++ */
++
++/* The control space devices */
++
++#include "config.h"
++#include <errno.h>
++#include <sys/types.h>
++#include <stdio.h>
++#include <string.h>
++#include <termios.h>
++#include <sys/fcntl.h>
++#include <sys/file.h>
++#include <unistd.h>
++#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 <stdlib.h>
-+ #include <ctype.h>
-+ #include "sis.h"
-+-#include "end.h"
-+ #include <dis-asm.h>
-+ #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;i<count/4;i++) wbuffer[i] = ntohl(wbuffer[i]); // endian swap
-++#endif
-++ ms->sis_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 <http://www.gnu.org/licenses/>.
-++ *
-++ */
-++
-++
-++#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 <http://www.gnu.org/licenses/>.
-++ *
-++ */
-++
-++
-++/* 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 <string.h>
-+ #include <stdio.h>
-+ #include <stdlib.h>
-+-#include <time.h>
-+ #include <sys/fcntl.h>
-+ #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; i<length; i+=4) {
-++ ibuf[i] = ntohl(ibufp[i]);
-++ }
-++ return (ms->sis_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; i<length; i+=4) {
-++ *ibuf = htonl(*ibuf);
-++ ibuf++;
-++ }
-++ return (len);
-++#else
-++ return (ms->sis_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 <http://www.gnu.org/licenses/>.
-++ *
-++ * Leon2 emulation, based on leon3.c .
-++ */
-++
-++/* The control space devices */
-++
-++#include "config.h"
-++#include <errno.h>
-++#include <sys/types.h>
-++#include <stdio.h>
-++#include <string.h>
-++#include <termios.h>
-++#include <sys/fcntl.h>
-++#include <sys/file.h>
-++#include <unistd.h>
-++#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<NTIMERS; i++) {
-++ if (gpt_ctrl[i] & 1) {
-++ gpt_counter[i] -= 1;
-++ if (gpt_counter[i] == -1) {
-++ set_irq(TIMER_IRQ + i);
-++ if (gpt_ctrl[i] & 2)
-++ gpt_counter[i] = gpt_reload[i];
-++ }
-++ }
-++ }
-++ event(gpt_intr, 0, gpt_scaler + 1);
-++ gpt_scaler_start = now();
-++}
-++
-++static void
-++gpt_init()
-++{
-++ if (sis_verbose)
-++ printf("GPT started (period %d)\n\r", gpt_scaler + 1);
-++}
-++
-++static void
-++gpt_reset()
-++{
-++ event(gpt_intr, 0, gpt_scaler + 1);
-++ gpt_scaler_start = now();
-++}
-++
-++static void
-++gpt_scaler_set(val)
-++ uint32 val;
-++{
-++ gpt_scaler = val & 0x0ffff; /* 16-bit scaler */
-++}
-++
-++static void
-++timer_ctrl(val, i)
-++ uint32 val;
-++ int i;
-++{
-++ if (val & 4) { /* reload */
-++ gpt_counter[i] = gpt_reload[i];
-++ }
-++ gpt_ctrl[i] = val & 0xb;
-++}
-++
-++/* 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
-++store_bytes (mem, waddr, data, sz, ws)
-++ unsigned char *mem;
-++ uint32 waddr;
-++ uint32 *data;
-++ int32 sz;
-++ int32 *ws;
-++{
-++ switch (sz) {
-++ case 0:
-++#ifdef HOST_LITTLE_ENDIAN
-++ waddr ^= 3;
-++#endif
-++ mem[waddr] = *data & 0x0ff;
-++ *ws = 0;
-++ break;
-++ case 1:
-++#ifdef HOST_LITTLE_ENDIAN
-++ waddr ^= 2;
-++#endif
-++ *((unsigned short *) &(mem[waddr])) = *data & 0x0ffff;
-++ *ws = 0;
-++ break;
-++ case 2:
-++ *((uint32 *) &(mem[waddr])) = *data;
-++ *ws = 0;
-++ break;
-++ case 3:
-++ *((uint32 *) &(mem[waddr])) = data[0];
-++ *((uint32 *) &(mem[waddr + 4])) = data[1];
-++ *ws = 0;
-++ break;
-++ }
-++}
-++
-++
-++/* Memory emulation */
-++
-++static int
-++memory_iread(addr, data, ws)
-++ uint32 addr;
-++ uint32 *data;
-++ int32 *ws;
-++{
-++ if ((addr >= 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 <http://www.gnu.org/licenses/>.
-++ *
-++ * Leon3 emulation, loosely based on erc32.c .
-++ */
-++
-++/* The control space devices */
-++
-++#include "config.h"
-++#include <errno.h>
-++#include <sys/types.h>
-++#include <stdio.h>
-++#include <string.h>
-++#include <termios.h>
-++#include <sys/fcntl.h>
-++#include <sys/file.h>
-++#include <unistd.h>
-++#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<NGPTIMERS; i++) {
-++ if (gpt_ctrl[i] & 1) {
-++ gpt_counter[i] -= 1;
-++ if (gpt_counter[i] == -1) {
-++ if (gpt_ctrl[i] & 8)
-++ set_irq(GPTIMER_IRQ + i);
-++ if (gpt_ctrl[i] & 2)
-++ gpt_counter[i] = gpt_reload[i];
-++ }
-++ }
-++ }
-++ event(gpt_intr, 0, gpt_scaler + 1);
-++ gpt_scaler_start = now();
-++}
-++
-++static void
-++gpt_init()
-++{
-++ if (sis_verbose)
-++ printf("GPT started (period %d)\n\r", gpt_scaler + 1);
-++
-++ grlib_apbpp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_GPTIMER, 0, 8),
-++ GRLIB_PP_APBADDR(0x80000300, 0xFFF));
-++}
-++
-++static void
-++gpt_reset()
-++{
-++ event(gpt_intr, 0, gpt_scaler + 1);
-++ gpt_scaler_start = now();
-++}
-++
-++static void
-++gpt_scaler_set(val)
-++ uint32 val;
-++{
-++ gpt_scaler = val & 0x0ffff; /* 16-bit scaler */
-++}
-++
-++static void
-++timer_ctrl(val, i)
-++ uint32 val;
-++ int i;
-++{
-++ if (val & 4) { /* reload */
-++ gpt_counter[i] = gpt_reload[i];
-++ }
-++ gpt_ctrl[i] = val & 0xb;
-++}
-++
-++/* 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
-++store_bytes (mem, waddr, data, sz, ws)
-++ unsigned char *mem;
-++ uint32 waddr;
-++ uint32 *data;
-++ int32 sz;
-++ int32 *ws;
-++{
-++ switch (sz) {
-++ case 0:
-++#ifdef HOST_LITTLE_ENDIAN
-++ waddr ^= 3;
-++#endif
-++ mem[waddr] = *data & 0x0ff;
-++ *ws = 0;
-++ break;
-++ case 1:
-++#ifdef HOST_LITTLE_ENDIAN
-++ waddr ^= 2;
-++#endif
-++ *((unsigned short *) &(mem[waddr])) = *data & 0x0ffff;
-++ *ws = 0;
-++ break;
-++ case 2:
-++ *((uint32 *) &(mem[waddr])) = *data;
-++ *ws = 0;
-++ break;
-++ case 3:
-++ *((uint32 *) &(mem[waddr])) = data[0];
-++ *((uint32 *) &(mem[waddr + 4])) = data[1];
-++ *ws = 0;
-++ break;
-++ }
-++}
-++
-++
-++/* Memory emulation */
-++
-++static int
-++memory_iread(addr, data, ws)
-++ uint32 addr;
-++ uint32 *data;
-++ int32 *ws;
-++{
-++ if ((addr >= 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 <stdlib.h>
-+ #endif
-+ #include <stdio.h>
-+-#include <time.h>
-+ #include <sys/fcntl.h>
-+ #include "sis.h"
-+ #include <dis-asm.h>
-+@@ -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<NGPTIMERS; i++) {
++ if (gpt_ctrl[i] & 1) {
++ gpt_counter[i] -= 1;
++ if (gpt_counter[i] == -1) {
++ if (gpt_ctrl[i] & 8)
++ set_irq(GPTIMER_IRQ + i);
++ if (gpt_ctrl[i] & 2)
++ gpt_counter[i] = gpt_reload[i];
++ }
++ }
++ }
++ event(gpt_intr, 0, gpt_scaler + 1);
++ gpt_scaler_start = now();
++}
++
++static void
++gpt_init()
++{
++ if (sis_verbose)
++ printf("GPT started (period %d)\n\r", gpt_scaler + 1);
++
++ grlib_apbpp_add(GRLIB_PP_ID(VENDOR_GAISLER, GAISLER_GPTIMER, 0, 8),
++ GRLIB_PP_APBADDR(0x80000300, 0xFFF));
++}
++
++static void
++gpt_reset()
++{
++ event(gpt_intr, 0, gpt_scaler + 1);
++ gpt_scaler_start = now();
++}
++
++static void
++gpt_scaler_set(val)
++ uint32 val;
++{
++ gpt_scaler = val & 0x0ffff; /* 16-bit scaler */
++}
++
++static void
++timer_ctrl(val, i)
++ uint32 val;
++ int i;
++{
++ if (val & 4) { /* reload */
++ gpt_counter[i] = gpt_reload[i];
++ }
++ gpt_ctrl[i] = val & 0xb;
++}
++
++/* 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
++store_bytes (mem, waddr, data, sz, ws)
++ unsigned char *mem;
++ uint32 waddr;
++ uint32 *data;
++ int32 sz;
++ int32 *ws;
++{
++ switch (sz) {
++ case 0:
++#ifdef HOST_LITTLE_ENDIAN
++ waddr ^= 3;
++#endif
++ mem[waddr] = *data & 0x0ff;
++ *ws = 0;
++ break;
++ case 1:
++#ifdef HOST_LITTLE_ENDIAN
++ waddr ^= 2;
++#endif
++ *((unsigned short *) &(mem[waddr])) = *data & 0x0ffff;
++ *ws = 0;
++ break;
++ case 2:
++ *((uint32 *) &(mem[waddr])) = *data;
++ *ws = 0;
++ break;
++ case 3:
++ *((uint32 *) &(mem[waddr])) = data[0];
++ *((uint32 *) &(mem[waddr + 4])) = data[1];
++ *ws = 0;
++ break;
++ }
++}
++
++
++/* Memory emulation */
++
++static int
++memory_iread(addr, data, ws)
++ uint32 addr;
++ uint32 *data;
++ int32 *ws;
++{
++ if ((addr >= 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 <stdlib.h>
+ #endif
+ #include <stdio.h>
+-#include <time.h>
+ #include <sys/fcntl.h>
+ #include "sis.h"
+ #include <dis-asm.h>
+@@ -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 &
+-