changeset 16:4f2df4ab82c8 ecos-sw-1999-06-18

Merge from eCos master repository on 1999-06-18-15:25:04-BST
author jlarmour
date Fri, 18 Jun 1999 07:59:09 +0000
parents c0d8793d9978
children a658ec000d9f
files packages/NEWS packages/hal/arm/arch/current/ChangeLog packages/hal/arm/arch/current/src/vectors.S packages/hal/common/current/ChangeLog packages/hal/common/current/include/pkgconf/hal.h packages/hal/mips/arch/current/ChangeLog packages/hal/mips/arch/current/src/hal_misc.c packages/hal/mips/arch/current/src/vectors.S packages/hal/mips/tx39/current/ChangeLog packages/hal/mips/tx39/current/src/mips_tx39.ld packages/hal/powerpc/arch/current/ChangeLog packages/hal/powerpc/arch/current/include/hal_cache.h packages/hal/powerpc/arch/current/include/ppc.inc packages/hal/powerpc/arch/current/src/hal_misc.c packages/hal/powerpc/arch/current/src/vectors.S packages/hal/powerpc/cogent/current/ChangeLog packages/hal/powerpc/cogent/current/src/PKGconf.mak packages/hal/powerpc/cogent/current/src/hal_aux.c packages/hal/powerpc/fads/current/ChangeLog packages/hal/powerpc/fads/current/src/PKGconf.mak packages/hal/powerpc/fads/current/src/hal_aux.c packages/hal/powerpc/sim/current/ChangeLog packages/hal/powerpc/sim/current/src/PKGconf.mak packages/hal/powerpc/sim/current/src/hal_aux.c packages/hal/sparclite/sleb/current/ChangeLog packages/hal/sparclite/sleb/current/tests/slebtime.cxx packages/io/serial/current/tests/ser_test_protocol.inl packages/kernel/current/ChangeLog packages/kernel/current/tests/PKGconf.mak packages/kernel/current/tests/dhrystone.c packages/language/c/libc/current/ChangeLog packages/language/c/libc/current/include/stdio.h packages/language/c/libm/current/src/PKGconf.mak
diffstat 33 files changed, 1660 insertions(+), 78 deletions(-) [+]
line wrap: on
line diff
--- a/packages/NEWS
+++ b/packages/NEWS
@@ -1,4 +1,4 @@
-* Will be new in eCos 1.3
+* These are the publically visible changes since eCos v1.2.1
 
 ** Target side platforms
 
--- a/packages/hal/arm/arch/current/ChangeLog
+++ b/packages/hal/arm/arch/current/ChangeLog
@@ -1,3 +1,8 @@
+1999-06-15  Gary Thomas  <gthomas@cygnus.co.uk>
+
+	* src/vectors.S (vectors): Some boards have an MMU, but the
+	reset vector needs to have an unmapped address!
+
 1999-06-09  Gary Thomas  <gthomas@cygnus.co.uk>
 
 	* src/vectors.S (reset_vector): Streamline ROM/STUBS code.
--- a/packages/hal/arm/arch/current/src/vectors.S
+++ b/packages/hal/arm/arch/current/src/vectors.S
@@ -66,6 +66,15 @@
 #define PTR(name) 		\
 .##name: .word	name
 
+#ifdef CYGHWR_HAL_ARM_HAS_MMU
+#define UNMAPPED(x) ((x)-__exception_handlers)
+#else
+#define UNMAPPED(x) (x)
+#endif
+                                
+#define UNMAPPED_PTR(name) 		\
+.##name: .word	UNMAPPED(name)
+
 
 	.file	"vectors.S"
 
@@ -91,7 +100,7 @@
 // they are copied in pairs.
 	.global	vectors
 vectors:
-PTR(reset_vector)
+UNMAPPED_PTR(reset_vector)
 PTR(undefined_instruction)
 PTR(software_interrupt)
 PTR(abort_prefetch)
--- a/packages/hal/common/current/ChangeLog
+++ b/packages/hal/common/current/ChangeLog
@@ -1,3 +1,9 @@
+1999-06-17  Nick Garnett  <nickg@cygnus.co.uk>
+
+	* include/pkgconf/hal.h: Added CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
+	to enable inclusion of ^C interrupt handler. Added CDL to control
+	it.
+
 1999-06-10  Gary Thomas  <gthomas@cygnus.co.uk>
 
 	* src/hal_stub.c: Need to init register pointer.
--- a/packages/hal/common/current/include/pkgconf/hal.h
+++ b/packages/hal/common/current/include/pkgconf/hal.h
@@ -331,6 +331,7 @@
      requires   CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
      requires   !CYGPKG_HAL_MIPS_TX39_JMR3904
      requires   !CYGPKG_HAL_POWERPC_FADS
+     requires   !CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
      description "
         This option causes the GDB stub to add a serial interrupt handler
         which will listen for GDB break packets. This lets you stop the
@@ -338,6 +339,19 @@
         or pressing the STOP button."
  }
 
+  cdl_option CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT {
+     display    "Include GDB external break support"
+     parent     CYGPKG_HAL_DEBUG
+     requires   !CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
+     description "
+        This option adds an interrupt handler for the GDB serial line
+        which will listen for GDB break packets. This lets you stop the
+        target asynchronously when using GDB, usually by hitting Control+C
+        or pressing the STOP button. This option differs from
+        CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT in that it is used when the GDB
+        stubs are NOT present."
+ }
+
  cdl_option CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT {
      display    "Include GDB multi-threading debug support"
      parent     CYGPKG_HAL_DEBUG
@@ -351,6 +365,7 @@
 
 #undef   CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
 #undef   CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
+#define  CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
 #define  CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
 
 /*
--- a/packages/hal/mips/arch/current/ChangeLog
+++ b/packages/hal/mips/arch/current/ChangeLog
@@ -1,3 +1,18 @@
+1999-06-17  Nick Garnett  <nickg@cygnus.co.uk>
+
+	* src/vectors.S: Added code to discriminate different entry
+	conditions to the reset vector. Added code to translate an NMI
+	into a standard exception and added a new vector in the VSR table
+	for it.
+	Made above code not be present in RAM. Tidied away some debug
+	code.
+
+1999-06-11  Jonathan Larmour  <jlarmour@cygnus.co.uk>
+
+	* src/hal_misc.c: Make sure all symbol addresses are given an
+	appropriate type that they won't be relocated relative to $gp
+	Fix for CR 100800
+	
 1999-06-10  Nick Garnett  <nickg@cygnus.co.uk>
 
 	* include/hal_arch.h: Added macros to copy FPU registers between
--- a/packages/hal/mips/arch/current/src/hal_misc.c
+++ b/packages/hal/mips/arch/current/src/hal_misc.c
@@ -111,16 +111,18 @@ externC cyg_uint32 hal_default_isr(CYG_A
 /*------------------------------------------------------------------------*/
 /* data copy and bss zero functions                                       */
 
-typedef void (CYG_ROM_ADDRESS)(void);
+typedef void (CYG_SYM_ADDRESS)(void);
 
-extern char __ram_data_start;
-extern char __ram_data_end;
-extern CYG_ROM_ADDRESS __rom_data_start;    
+// All these must use this type of address to stop them being given relocations
+// relative to $gp (i.e. assuming they would be in .sdata)
+extern CYG_SYM_ADDRESS __ram_data_start;
+extern CYG_SYM_ADDRESS __ram_data_end;
+extern CYG_SYM_ADDRESS __rom_data_start;    
 
 #ifdef CYG_HAL_STARTUP_ROM      
 void hal_copy_data(void)
 {
-    char *p = &__ram_data_start;
+    char *p = (char *)&__ram_data_start;
     char *q = (char *)&__rom_data_start;
     
     while( p != (char *)&__ram_data_end )
@@ -128,8 +130,8 @@ void hal_copy_data(void)
 }
 #endif
 
-extern CYG_ROM_ADDRESS __bss_start;
-extern CYG_ROM_ADDRESS __bss_end;
+extern CYG_SYM_ADDRESS __bss_start;
+extern CYG_SYM_ADDRESS __bss_end;
 
 void hal_zero_bss(void)
 {
--- a/packages/hal/mips/arch/current/src/vectors.S
+++ b/packages/hal/mips/arch/current/src/vectors.S
@@ -64,6 +64,29 @@
 	
 FUNC_START(reset_vector)
 
+#ifndef CYG_HAL_STARTUP_RAM
+	# Decide whether this is an NMI, cold or warm boot.
+
+	mfc0	k0,status		# get status reg
+	lui	k1,0x0008		# isolate NMI bit
+	and	k1,k1,k0		
+	beqz	k1,1f			# skip if zero
+	nop
+
+	lar	k1,__nmi_entry		# jump to ROM nmi code
+	jalr	k1
+	nop
+1:	
+	lui	k1,0x0010		# isolate soft reset bit
+	and	k1,k1,k0		
+	beqz	k1,2f			# skip if zero
+	nop
+
+	lar	k1,__warm_start		# jump to ROM warm_start code
+	jr	k1
+	nop
+2:
+#endif	
 	lar	v0,_start		# jump to start
 	jr	v0
 	nop				# (delay slot)
@@ -95,6 +118,7 @@ FUNC_START(other_vector)
 	lw	k1,0(k1)		# k1 = pointer to VSR
 	jr	k1			# go there
 	nop				# (delay slot)
+
 FUNC_END(other_vector)
 	
 	.section ".utlb_vector","ax"
@@ -181,6 +205,75 @@ 9:	b	9b		# Loop if we return
 	
 FUNC_END(_start	)
 
+
+##-----------------------------------------------------------------------------
+		
+FUNC_START(__warm_start)
+
+	## The following is debug code left in here for now in case it
+	## proves useful in the near future.	
+#if 0
+	move	s0,t0
+	move	s1,a1
+	
+#	hal_diag_init
+
+	hal_diag_writec '$'
+	mfc0	a0,$30			# get ErrorEPC
+	lar	k0,hal_diag_ai_write_hex8
+	jalr	k0
+	nop
+	hal_diag_writec '-'	
+	move	a0,s0
+	jalr	k0
+	nop
+	hal_diag_writec '-'	
+	move	a0,s1
+	jalr	k0
+	nop
+1:	
+	b	1b
+	nop
+#endif
+	
+	# At present we treat this like an NMI. 
+	b	__nmi_entry
+	nop
+	
+FUNC_END(__warm_start)		
+
+##-----------------------------------------------------------------------------
+	
+FUNC_START(__nmi_entry)		
+
+	# Clear exception state
+	hal_cpu_except_enable
+	
+	# Move the ErrorEPC register to the EPC register so that the
+	# default exception handler saves the right PC value.
+	mfc0	k0,$30
+	nop; nop; nop;
+	mtc0	k0,epc
+	nop; nop; nop;	
+
+#if (INITIAL_SR & 0x00400000) == 0
+	# Taking this exception will have set the BEV bit to 1.
+	# If we normally run with it zero, we must clear it here.
+	mfc0	k0,status	
+	la	k1,0xFFBFFFFF
+	and	k0,k0,k1
+	mtc0	k0,status
+#endif	
+
+	la	k0,34*4
+	la	k1,hal_vsr_table	# Get VSR table
+	lw	k1,34*4(k1)		# load NMI vector
+	jr	k1			# go there
+	nop				# (delay slot)
+	
+FUNC_END(__nmi_entry)
+
+	
 ##-----------------------------------------------------------------------------
 ## Default exception VSR.
 ## Saves machine state and calls external handling code.
@@ -202,8 +295,6 @@ FUNC_START(__default_exception_vsr)
 	addi	sp,sp,-mips_exception_decrement
 				# space for registers + safety margin
 
-	mfc0	k0,cause
-	andi	k0,k0,0x7F		# isolate exception code	
 	sw	k0,mipsreg_vector(sp)	# store vector
 
 	# store GPRs
@@ -294,7 +385,7 @@ FUNC_START(__default_exception_vsr)
 	# go back to restore_state, below.
 			
 FUNC_END(__default_exception_vsr)
-	
+
 ##------------------------------------------------------------------------------
 ## Default interrupt VSR.
 ## Saves machine state and calls appropriate ISR. When done, calls
--- a/packages/hal/mips/tx39/current/ChangeLog
+++ b/packages/hal/mips/tx39/current/ChangeLog
@@ -1,3 +1,7 @@
+1999-06-16  Jesper Skov  <jskov@cygnus.co.uk>
+        CR 100804 workaround
+	* src/mips_tx39.ld: Suppress .mdebug in the final output.
+
 1999-06-02  Jonathan Larmour  <jlarmour@cygnus.co.uk>
 
 	* src/mips_tx39.ld: 
--- a/packages/hal/mips/tx39/current/src/mips_tx39.ld
+++ b/packages/hal/mips/tx39/current/src/mips_tx39.ld
@@ -155,24 +155,27 @@ GROUP(libtarget.a libgcc.a)
     __bss_end = ABSOLUTE (.); } \
     > _region_
 
+// The /DISCARD/ section ensures that the output will not contain a
+// .mdebug section as it confuses GDB. This is a workaround for CR 100804.
 #define SECTIONS_END . = ALIGN(4); _end = .; PROVIDE (end = .); \
-    .debug          0 : { *(.debug) } \
-    .line           0 : { *(.line) } \
-    .debug_srcinfo  0 : { *(.debug_srcinfo) } \
-    .debug_sfnames  0 : { *(.debug_sfnames) } \
-    .debug_aranges  0 : { *(.debug_aranges) } \
-    .debug_pubnames 0 : { *(.debug_pubnames) } \
-    .debug_info     0 : { *(.debug_info) } \
-    .debug_abbrev   0 : { *(.debug_abbrev) } \
-    .debug_line     0 : { *(.debug_line) } \
-    .debug_frame    0 : { *(.debug_frame) } \
-    .debug_str      0 : { *(.debug_str) } \
-    .debug_loc      0 : { *(.debug_loc) } \
-    .debug_macinfo  0 : { *(.debug_macinfo) } \
+    .debug           0 : { *(.debug) } \
+    .line            0 : { *(.line) } \
+    .debug_srcinfo   0 : { *(.debug_srcinfo) } \
+    .debug_sfnames   0 : { *(.debug_sfnames) } \
+    .debug_aranges   0 : { *(.debug_aranges) } \
+    .debug_pubnames  0 : { *(.debug_pubnames) } \
+    .debug_info      0 : { *(.debug_info) } \
+    .debug_abbrev    0 : { *(.debug_abbrev) } \
+    .debug_line      0 : { *(.debug_line) } \
+    .debug_frame     0 : { *(.debug_frame) } \
+    .debug_str       0 : { *(.debug_str) } \
+    .debug_loc       0 : { *(.debug_loc) } \
+    .debug_macinfo   0 : { *(.debug_macinfo) } \
     .debug_weaknames 0 : { *(.debug_weaknames) } \
     .debug_funcnames 0 : { *(.debug_funcnames) } \
     .debug_typenames 0 : { *(.debug_typenames) } \
-    .debug_varnames  0 : { *(.debug_varnames) }
+    .debug_varnames  0 : { *(.debug_varnames) }  \
+    /DISCARD/        0 : { *(.mdebug) }
 
 #include CYGHWR_MEMORY_LAYOUT_LDI
 
--- a/packages/hal/powerpc/arch/current/ChangeLog
+++ b/packages/hal/powerpc/arch/current/ChangeLog
@@ -1,3 +1,30 @@
+1999-06-17  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* src/vectors.S (CYG_MSR): define correctly for copying vectors,
+	even if ROM start.  Complete system init for ROM start.
+
+1999-06-15  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* include/ppc.inc: Add definitions of FUNC_START and FUNC_END.
+	They are needed by platform code.
+
+	* src/vectors.S: Remove definition of FUNC_START.
+
+1999-06-11  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* src/vectors.S (_start): remove some platform-conditional
+	initialization code; it is now in hal_hardware_init in the
+	platform HAL.
+
+	* src/hal_misc.c: remove very-platform-conditional definition of
+	memory descriptor table - it is now in platform HALs.
+	
+	* include/ppc_regs.h: simplify definition of CYGARC_REG_IMM_BASE.
+
+	* include/hal_cache.h (CYGARC_MEMDESC_CACHE): ...and other
+	macros... add support for external definitions of memory
+	descriptor table used in platform-specific initialization of MMU.
+
 1999-06-10  Hugo Tyson  <hmt@cygnus.co.uk>
 
 	* src/vectors.S (_start): Add better support for various startup
--- a/packages/hal/powerpc/arch/current/include/hal_cache.h
+++ b/packages/hal/powerpc/arch/current/include/hal_cache.h
@@ -61,9 +61,31 @@ typedef struct {
     cyg_uint8    flags;
 } cyg_memdesc_t;
 
+// each platform HAL must provide one of these to describe how memory
+// should be mapped/cached, ideally weak aliased so that apps can override:
+externC cyg_memdesc_t cyg_hal_mem_map[];
+
 #define CYGARC_MEMDESC_CI       1       // cache inhibit
 #define CYGARC_MEMDESC_GUARDED  2       // guarded
 
+// these macros should ease that task, and ease any future extension of the
+// structure (physical == virtual addresses):
+#define CYGARC_MEMDESC_CACHE( _va_, _sz_ ) \
+        { (_va_), (_va_), (_sz_), 0 }
+
+#define CYGARC_MEMDESC_NOCACHE( _va_, _sz_ ) \
+        { (_va_), (_va_), (_sz_), CYGARC_MEMDESC_CI }
+
+#define CYGARC_MEMDESC_CACHEGUARD( _va_, _sz_ ) \
+        { (_va_), (_va_), (_sz_), CYGARC_MEMDESC_GUARDED }
+
+#define CYGARC_MEMDESC_NOCACHEGUARD( _va_, _sz_ ) \
+        { (_va_), (_va_), (_sz_), CYGARC_MEMDESC_GUARDED|CYGARC_MEMDESC_CI }
+
+#define CYGARC_MEMDESC_TABLE_END      {0, 0, 0, 0}
+#define CYGARC_MEMDESC_TABLE          cyg_memdesc_t cyg_hal_mem_map[]
+#define CYGARC_MEMDESC_EMPTY_TABLE    { CYGARC_MEMDESC_TABLE_END }
+
 //=============================================================================
 // PowerPC simulator
 
--- a/packages/hal/powerpc/arch/current/include/ppc.inc
+++ b/packages/hal/powerpc/arch/current/include/ppc.inc
@@ -98,6 +98,14 @@
 	.endm
 #endif
 
+#define FUNC_START(name)        \
+        .type name,@function;   \
+        .globl name;            \
+name:   
+
+#define FUNC_END(name)          \
+	/* nothing for now */
+
 #------------------------------------------------------------------------------
 # Exception, interrupt and thread context save area layout
 # The layout of this structure is also defined in "hal_arch.h", for C
--- a/packages/hal/powerpc/arch/current/src/hal_misc.c
+++ b/packages/hal/powerpc/arch/current/src/hal_misc.c
@@ -385,31 +385,9 @@ hal_clear_MMU (void)
 #endif
 }
 
-// The memory map is weakly defined, allowing the application to redefine
-// it if necessary. The regions defined below are the minimum requirements.
-cyg_memdesc_t cyg_hal_mem_map[] CYGBLD_ATTRIB_WEAK = {
-#ifdef CYGPKG_HAL_POWERPC_COGENT
-    // Mapping for the Cogent CMA101/102 boards.
-    {0xfff00000, 0xfff00000, 0x00100000,
-     CYGARC_MEMDESC_CI},            // ROM region
-    {0xff000000, 0xff000000, 0x00100000, 
-     CYGARC_MEMDESC_CI},            // MCP registers
-    {0x0e000000, 0x0e000000, 0x01000000, 
-     CYGARC_MEMDESC_CI},            // IO registers
-    {0x00000000, 0x00000000, 0x00800000,
-     0},                            // Main memory
-#endif
-#ifdef CYGPKG_HAL_POWERPC_SIM
-    // Mapping for the simulator. This is only used for special debugging:
-    // CYG_MSR in vectors.S must be changed to enable the MMU.
-    {0x00000000, 0x00000000, 0x00800000,
-     0},                            // Main memory
-    {0xf0000000, 0xf0000000, 0x00020000, 
-     CYGARC_MEMDESC_CI},            // diag registers
-#endif
-    {0, 0, 0, 0}                    // Table end
-};
-
+// NB this demands that the platform HAL has provided an
+//          externC cyg_memdesc_t cyg_hal_mem_map[];
+// as detailed in hal_cache.h:
 externC void hal_MMU_init (void)
 {
     int id = 0;
--- a/packages/hal/powerpc/arch/current/src/vectors.S
+++ b/packages/hal/powerpc/arch/current/src/vectors.S
@@ -52,11 +52,6 @@
 #include "cyg/hal/ppc_regs.h"        
 #include "cyg/hal/ppc.inc"
 
-#define FUNC_START(name)        \
-        .type name,@function;   \
-        .globl name;            \
-name:   
-
 #===========================================================================
                 
         .file   "vectors.S"
@@ -81,7 +76,11 @@ name:
 
 #define CYG_MSR_COMMON (MSR_FP | MSR_ME | MSR_IR | MSR_DR | MSR_RI)
 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_STUBS)
-#define CYG_MSR (CYG_MSR_COMMON | MSR_IP)
+# ifdef CYG_HAL_POWERPC_COPY_VECTORS
+#  define CYG_MSR CYG_MSR_COMMON
+# else
+#  define CYG_MSR (CYG_MSR_COMMON | MSR_IP)
+# endif
 #endif
 #ifdef CYG_HAL_STARTUP_RAM      
 #define CYG_MSR CYG_MSR_COMMON
@@ -93,7 +92,6 @@ name:
 #define CYG_MSR (CYG_MSR_COMMON & ~(MSR_IR | MSR_DR))
 #endif
 
-
 #===========================================================================
 # If the following option is enabled, we only save registers up to R12.
 # The PowerPC ABI defines registers 13..31 as callee saved and thus we do
@@ -244,6 +242,10 @@ rom_vectors_end:
         # Disable special MPC8xx "development support" which
 	# suppresses trace exceptions. The CPU seems to hang, not 
         # executing from offset 0x1e00(?) as expected.
+
+        lwi	r3,0x00000007
+        mtspr	ICTRL,r3
+
         li      r3,0
         mtspr   DER, r3
 #endif
@@ -260,7 +262,7 @@ rom_vectors_end:
         # Call platform specific hardware initialization
         # This may include memory controller initialization. It is not
         # safe to access RAM until after this point.
-        bl      hal_hardware_init
+        bl      hal_hardware_init	# this is platform dependent
 
         # set up stack
         lwi     sp,__interrupt_stack
@@ -368,7 +370,6 @@ 2:
         bl      initialize_stub
 #endif
 
-	
         .extern cyg_start
         bl      cyg_start                       # call cyg_start
 9:      
--- a/packages/hal/powerpc/cogent/current/ChangeLog
+++ b/packages/hal/powerpc/cogent/current/ChangeLog
@@ -1,3 +1,12 @@
+1999-06-11  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* src/PKGconf.mak: Build the new file.
+
+	* src/hal_aux.c (CYGARC_MEMDESC_TABLE): New file, to define this
+	object for per-platform table-driven memory map initialization.
+	The table used to be in hal_misc.c in the architectural HAL; this
+	is platform dependent so better and cleaner here.
+
 1999-05-20  Gary Thomas  <gthomas@cygnus.co.uk>
 
 	* include/pkgconf/hal_powerpc_cogent.h: Move RTC setup here.
--- a/packages/hal/powerpc/cogent/current/src/PKGconf.mak
+++ b/packages/hal/powerpc/cogent/current/src/PKGconf.mak
@@ -32,7 +32,7 @@ PACKAGE       := hal_powerpc_cogent
 include ../../../../../pkgconf/pkgconf.mak
 
 LIBRARY       := libtarget.a
-COMPILE       := hal_diag.c cogent.S plf_stub.c
+COMPILE       := hal_diag.c hal_aux.c cogent.S plf_stub.c
 OTHER_OBJS    :=
 OTHER_TARGETS :=
 OTHER_CLEAN   :=
new file mode 100644
--- /dev/null
+++ b/packages/hal/powerpc/cogent/current/src/hal_aux.c
@@ -0,0 +1,65 @@
+//=============================================================================
+//
+//      hal_aux.c
+//
+//      HAL auxiliary objects and code; per platform
+//
+//=============================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   hmt
+// Contributors:hmt
+// Date:        1999-06-08
+// Purpose:     HAL aux objects: startup tables.
+// Description: Tables for per-platform initialization
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <pkgconf/hal.h>
+
+#include <cyg/infra/cyg_type.h>         // base types
+#include <cyg/infra/cyg_trac.h>         // tracing macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+
+#include <cyg/hal/hal_io.h>             // IO macros
+#include <cyg/hal/hal_diag.h>
+#include <cyg/hal/hal_intr.h>           // Interrupt macros
+#include <cyg/hal/hal_cache.h>          // Cache macros
+
+// The memory map is weakly defined, allowing the application to redefine
+// it if necessary. The regions defined below are the minimum requirements.
+CYGARC_MEMDESC_TABLE CYGBLD_ATTRIB_WEAK = {
+    // Mapping for the Cogent CMA101/102 boards.
+    CYGARC_MEMDESC_NOCACHE( 0xfff00000, 0x00100000 ), // ROM region
+    CYGARC_MEMDESC_NOCACHE( 0xff000000, 0x00100000 ), // MCP registers
+    CYGARC_MEMDESC_NOCACHE( 0x0e000000, 0x01000000 ), // IO registers
+    CYGARC_MEMDESC_CACHE(   0x00000000, 0x00800000 ), // Main memory
+
+    CYGARC_MEMDESC_TABLE_END
+};
+
+// EOF hal_aux.c
--- a/packages/hal/powerpc/fads/current/ChangeLog
+++ b/packages/hal/powerpc/fads/current/ChangeLog
@@ -1,3 +1,12 @@
+1999-06-11  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* src/PKGconf.mak: Build the new file.
+
+	* src/hal_aux.c (CYGARC_MEMDESC_TABLE): New file, to define this
+	object for per-platform table-driven memory map initialization.
+	The table used to be in hal_misc.c in the architectural HAL; this
+	is platform dependent so better and cleaner here.
+
 1999-06-10  Hugo Tyson  <hmt@cygnus.co.uk>
 
 	* src/PKGconf.mak: Add quicc_smc2.c, which now lives in here;
--- a/packages/hal/powerpc/fads/current/src/PKGconf.mak
+++ b/packages/hal/powerpc/fads/current/src/PKGconf.mak
@@ -53,7 +53,7 @@ PACKAGE       := hal_powerpc_fads
 include ../../../../../pkgconf/pkgconf.mak
 
 LIBRARY       := libtarget.a
-COMPILE       := hal_diag.c fads.S quicc_smc2.c
+COMPILE       := hal_diag.c hal_aux.c fads.S quicc_smc2.c
 OTHER_OBJS    :=
 OTHER_TARGETS :=
 OTHER_CLEAN   :=
new file mode 100644
--- /dev/null
+++ b/packages/hal/powerpc/fads/current/src/hal_aux.c
@@ -0,0 +1,57 @@
+//=============================================================================
+//
+//      hal_aux.c
+//
+//      HAL auxiliary objects and code; per platform
+//
+//=============================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   hmt
+// Contributors:hmt
+// Date:        1999-06-08
+// Purpose:     HAL aux objects: startup tables.
+// Description: Tables for per-platform initialization
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <pkgconf/hal.h>
+
+#include <cyg/infra/cyg_type.h>         // base types
+#include <cyg/infra/cyg_trac.h>         // tracing macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+
+#include <cyg/hal/hal_io.h>             // IO macros
+#include <cyg/hal/hal_diag.h>
+#include <cyg/hal/hal_intr.h>           // Interrupt macros
+#include <cyg/hal/hal_cache.h>          // Cache macros
+
+// The memory map is weakly defined, allowing the application to redefine
+// it if necessary. The FADS board requires no regions.
+CYGARC_MEMDESC_TABLE CYGBLD_ATTRIB_WEAK = CYGARC_MEMDESC_EMPTY_TABLE;
+
+// EOF hal_aux.c
--- a/packages/hal/powerpc/sim/current/ChangeLog
+++ b/packages/hal/powerpc/sim/current/ChangeLog
@@ -1,3 +1,12 @@
+1999-06-11  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* src/PKGconf.mak: Build the new file.
+
+	* src/hal_aux.c (CYGARC_MEMDESC_TABLE): New file, to define this
+	object for per-platform table-driven memory map initialization.
+	The table used to be in hal_misc.c in the architectural HAL; this
+	is platform dependent so better and cleaner here.
+
 1999-05-20  Gary Thomas  <gthomas@cygnus.co.uk>
 
 	* include/pkgconf/hal_powerpc_sim.h: Move RTC setup here.
--- a/packages/hal/powerpc/sim/current/src/PKGconf.mak
+++ b/packages/hal/powerpc/sim/current/src/PKGconf.mak
@@ -32,7 +32,7 @@ PACKAGE       := hal_powerpc_sim
 include ../../../../../pkgconf/pkgconf.mak
 
 LIBRARY       := libtarget.a
-COMPILE       := sim.S
+COMPILE       := sim.S hal_aux.c
 OTHER_OBJS    :=
 OTHER_TARGETS :=
 OTHER_CLEAN   :=
new file mode 100644
--- /dev/null
+++ b/packages/hal/powerpc/sim/current/src/hal_aux.c
@@ -0,0 +1,64 @@
+//=============================================================================
+//
+//      hal_aux.c
+//
+//      HAL auxiliary objects and code; per platform
+//
+//=============================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   hmt
+// Contributors:hmt
+// Date:        1999-06-08
+// Purpose:     HAL aux objects: startup tables.
+// Description: Tables for per-platform initialization
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <pkgconf/hal.h>
+
+#include <cyg/infra/cyg_type.h>         // base types
+#include <cyg/infra/cyg_trac.h>         // tracing macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+
+#include <cyg/hal/hal_io.h>             // IO macros
+#include <cyg/hal/hal_diag.h>
+#include <cyg/hal/hal_intr.h>           // Interrupt macros
+#include <cyg/hal/hal_cache.h>          // Cache macros
+
+// The memory map is weakly defined, allowing the application to redefine
+// it if necessary. The regions defined below are the minimum requirements.
+CYGARC_MEMDESC_TABLE CYGBLD_ATTRIB_WEAK = {
+    // Mapping for the simulator. This is only used for special debugging:
+    // CYG_MSR in vectors.S must be changed to enable the MMU.
+    CYGARC_MEMDESC_CACHE(   0x00000000, 0x00800000 ), // Main memory
+    CYGARC_MEMDESC_NOCACHE( 0xf0000000, 0x00020000 ), // diag registers
+
+    CYGARC_MEMDESC_TABLE_END
+};
+
+// EOF hal_aux.c
--- a/packages/hal/sparclite/sleb/current/ChangeLog
+++ b/packages/hal/sparclite/sleb/current/ChangeLog
@@ -1,3 +1,8 @@
+1999-06-14  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* tests/slebtime.cxx (entry2): Fix a dumb fencepost prob in some
+	string poking code for output without printf...
+
 1999-04-23  Jesper Skov  <jskov@cygnus.co.uk>
 
 	* src/hal_diag.c (hal_bsp_console_write): Added a workaround for PR
--- a/packages/hal/sparclite/sleb/current/tests/slebtime.cxx
+++ b/packages/hal/sparclite/sleb/current/tests/slebtime.cxx
@@ -112,11 +112,11 @@ static void entry2( CYG_ADDRWORD arg )
         s[9] = '0';
         s[8] = '0';
         for ( i = 0; i < LOOPS; i++ ) {
-            s[ sizeof( s ) - 1 ] = '0' + loops[ i ] / 1       % 10;
-            s[ sizeof( s ) - 2 ] = '0' + loops[ i ] / 10      % 10;
-            s[ sizeof( s ) - 3 ] = '0' + loops[ i ] / 100     % 10;
-            s[ sizeof( s ) - 4 ] = '0' + loops[ i ] / 1000    % 10;
-            s[ sizeof( s ) - 5 ] = '0' + loops[ i ] / 10000   % 10;
+            s[ sizeof( s ) - 2 ] = '0' + loops[ i ] / 1       % 10;
+            s[ sizeof( s ) - 3 ] = '0' + loops[ i ] / 10      % 10;
+            s[ sizeof( s ) - 4 ] = '0' + loops[ i ] / 100     % 10;
+            s[ sizeof( s ) - 5 ] = '0' + loops[ i ] / 1000    % 10;
+            s[ sizeof( s ) - 6 ] = '0' + loops[ i ] / 10000   % 10;
             CYG_TEST_INFO( s );
             if ( '9' == s[9]++ ) {
                 s[9] = '0';
--- a/packages/io/serial/current/tests/ser_test_protocol.inl
+++ b/packages/io/serial/current/tests/ser_test_protocol.inl
@@ -213,7 +213,6 @@ typedef enum {
 // A few predefined configurations. These must all be valid for any
 // given target until change_config is behaving correctly.
 cyg_ser_cfg_t test_configs[] = {
-
 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && !defined(CYGPKG_HAL_ARM_PID)
     { CYGNUM_SERIAL_BAUD_9600, CYGNUM_SERIAL_WORD_LENGTH_8, 
       CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE },
--- a/packages/kernel/current/ChangeLog
+++ b/packages/kernel/current/ChangeLog
@@ -1,3 +1,7 @@
+1999-06-18  Jesper Skov  <jskov@cygnus.co.uk>
+
+	* tests/dhrystone.c: Added unsupported header.
+
 1999-06-10  Hugo Tyson  <hmt@cygnus.co.uk>
 
 	* src/debug/dbg_gdb.cxx (dbg_threadinfo): Report counted sleep
@@ -8,6 +12,14 @@ 1999-06-01  Hugo Tyson  <hmt@masala.cygn
 	* src/debug/dbg_gdb.cxx (dbg_threadinfo): Make the thread state
 	string a little more sensible when read as plain english.
 
+1999-05-31  Jesper Skov  <jskov@cygnus.co.uk>
+
+	* tests/dhrystone.c: 
+	* tests/PKGconf.mak (TESTS): 
+	Added dhrystone test.
+
+	Updated to 2.1 from ftp.nosc.mil
+	
 1999-05-27  Nick Garnett  <nickg@cygnus.co.uk>
 
 	* src/intr/intr.cxx (Cyg_Interrupt::chain_isr): Calls
--- a/packages/kernel/current/tests/PKGconf.mak
+++ b/packages/kernel/current/tests/PKGconf.mak
@@ -39,7 +39,8 @@ TESTS	      := bin_sem0 bin_sem1 bin_sem
 		 kthread0 kthread1 mbox1 memfix1 memfix2 memvar1 memvar2\
 		 mutex0 mutex1 mutex2 sched1 sync2 sync3 \
 		 thread0 thread1 thread2 release kill thread_gdb \
-		 tm_basic
+		 tm_basic dhrystone
+
 ifndef CYG_HAL_ARM
 TESTS	+= kcache1 kcache2
 endif
@@ -48,5 +49,4 @@ ifndef CYGPKG_HAL_ARM_AEB
 TESTS   += stress_threads
 endif
 
-
 include $(COMPONENT_REPOSITORY)/pkgconf/makrules.tst
new file mode 100644
--- /dev/null
+++ b/packages/kernel/current/tests/dhrystone.c
@@ -0,0 +1,1155 @@
+//=============================================================================
+//####UNSUPPORTEDBEGIN####
+//
+// -------------------------------------------
+// This source file has been contributed to eCos/Cygnus. It may have been
+// changed slightly to provide an interface consistent with those of other 
+// files.
+//
+// The functionality and contents of this file is supplied "AS IS"
+// without any form of support and will not necessarily be kept up
+// to date by Cygnus.
+//
+// The style of programming used in this file may not comply with the
+// eCos programming guidelines. Please do not use as a base for other
+// files.
+//
+// All inquiries about this file, or the functionality provided by it,
+// should be directed to the 'ecos-discuss' mailing list (see
+// http://sourceware.cygnus.com/ecos/intouch.html for details).
+//
+// Contributed by: Kevin Hester <khester@opticworks.com>
+// Maintained by:  <Unmaintained>
+// See also:
+//   Motorola's "Example Software Initializing the SMC as a UART" package 
+//   (smc2.zip) at:
+//    http://www.mot.com/SPS/RISC/netcomm/tools/index.html#MPC860_table
+// -------------------------------------------
+//
+//####UNSUPPORTEDEND####
+//=============================================================================
+// Originally three different files, dhry.h, dhry21a.c and dhry21b.c
+// Merged into one file and changed a little to avoid compilation warnings.
+// The files were found at:
+// FTP ftp.nosc.mil/pub/aburto/dhrystone
+//=============================================================================
+
+#include <pkgconf/system.h>
+#include <cyg/infra/cyg_type.h>
+#include <cyg/infra/testcase.h>
+
+#if defined(CYGPKG_KERNEL) && defined(CYGPKG_LIBC)
+
+#include <pkgconf/kernel.h>
+#include <pkgconf/libc.h>
+
+#if defined(CYGFUN_KERNEL_API_C) \
+    && defined(CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT)
+
+#include <cyg/hal/hal_cache.h>
+#include <cyg/kernel/kapi.h>
+#include <stdlib.h>
+
+// Time in seconds.
+double
+dtime(void)
+{
+    return (double) cyg_current_time() / 100;
+}
+
+// Number of loops to run.
+#define PASSES 500000
+
+// Used in the code below to mark changes to the code.
+#define __ECOS__
+
+#undef true
+#undef false
+
+
+/*
+ *************************************************************************
+ *
+ *                   "DHRYSTONE" Benchmark Program
+ *                   -----------------------------
+ *
+ *  Version:    C, Version 2.1
+ *
+ *  File:       dhry.h (part 1 of 3)
+ *
+ *  Date:       May 25, 1988
+ *
+ *  Author:     Reinhold P. Weicker
+ *              Siemens Nixdorf Inf. Syst.
+ *              STM OS 32
+ *              Otto-Hahn-Ring 6
+ *              W-8000 Muenchen 83
+ *              Germany
+ *                      Phone:    [+49]-89-636-42436
+ *                                (8-17 Central European Time)
+ *                      UUCP:     weicker@ztivax.uucp@unido.uucp
+ *                      Internet: weicker@ztivax.siemens.com
+ *
+ *              Original Version (in Ada) published in
+ *              "Communications of the ACM" vol. 27., no. 10 (Oct. 1984),
+ *              pp. 1013 - 1030, together with the statistics
+ *              on which the distribution of statements etc. is based.
+ *
+ *              In this C version, the following C library functions are
+ *              used:
+ *              - strcpy, strcmp (inside the measurement loop)
+ *              - printf, scanf (outside the measurement loop)
+ *
+ *  Collection of Results:
+ *              Reinhold Weicker (address see above) and
+ *              
+ *              Rick Richardson
+ *              PC Research. Inc.
+ *              94 Apple Orchard Drive
+ *              Tinton Falls, NJ 07724
+ *                      Phone:  (201) 834-1378 (9-17 EST)
+ *                      UUCP:   ...!uunet!pcrat!rick
+ *
+ *      Please send results to Rick Richardson and/or Reinhold Weicker.
+ *      Complete information should be given on hardware and software
+ *      used. Hardware information includes: Machine type, CPU, type and
+ *      size of caches; for microprocessors: clock frequency, memory speed
+ *      (number of wait states). Software information includes: Compiler
+ *      (and runtime library) manufacturer and version, compilation
+ *      switches, OS version. The Operating System version may give an
+ *      indication about the compiler; Dhrystone itself performs no OS
+ *      calls in the measurement loop.
+ *
+ *      The complete output generated by the program should be mailed
+ *      such that at least some checks for correctness can be made.
+ *
+ *************************************************************************
+ *
+ *  History:    This version C/2.1 has been made for two reasons:
+ *
+ *              1) There is an obvious need for a common C version of
+ *              Dhrystone, since C is at present the most popular system
+ *              programming language for the class of processors
+ *              (microcomputers, minicomputers) where Dhrystone is used
+ *              most. There should be, as far as possible, only one C
+ *              version of Dhrystone such that results can be compared
+ *              without restrictions. In the past, the C versions
+ *              distributed by Rick Richardson (Version 1.1) and by
+ *              Reinhold Weicker had small (though not significant)
+ *              differences.
+ *
+ *              2) As far as it is possible without changes to the
+ *              Dhrystone statistics, optimizing compilers should be
+ *              prevented from removing significant statements.
+ *
+ *              This C version has been developed in cooperation with
+ *              Rick Richardson (Tinton Falls, NJ), it incorporates many
+ *              ideas from the "Version 1.1" distributed previously by
+ *              him over the UNIX network Usenet.
+ *              I also thank Chaim Benedelac (National Semiconductor),
+ *              David Ditzel (SUN), Earl Killian and John Mashey (MIPS),
+ *              Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley)
+ *              for their help with comments on earlier versions of the
+ *              benchmark.
+ *
+ *  Changes:    In the initialization part, this version follows mostly
+ *              Rick Richardson's version distributed via Usenet, not the
+ *              version distributed earlier via floppy disk by Reinhold
+ *              Weicker. As a concession to older compilers, names have
+ *              been made unique within the first 8 characters. Inside the
+ *              measurement loop, this version follows the version
+ *              previously distributed by Reinhold Weicker.
+ *
+ *              At several places in the benchmark, code has been added,
+ *              but within the measurement loop only in branches that
+ *              are not executed. The intention is that optimizing
+ *              compilers should be prevented from moving code out of the
+ *              measurement loop, or from removing code altogether. Since
+ *              the statements that are executed within the measurement
+ *              loop have NOT been changed, the numbers defining the
+ *              "Dhrystone distribution" (distribution of statements,
+ *              operand types and locality) still hold. Except for
+ *              sophisticated optimizing compilers, execution times for
+ *              this version should be the same as for previous versions.
+ *
+ *              Since it has proven difficult to subtract the time for the
+ *              measurement loop overhead in a correct way, the loop check
+ *              has been made a part of the benchmark. This does have
+ *              an impact - though a very minor one - on the distribution
+ *              statistics which have been updated for this version.
+ *
+ *              All changes within the measurement loop are described
+ *              and discussed in the companion paper "Rationale for
+ *              Dhrystone version 2".
+ *
+ *              Because of the self-imposed limitation that the order and
+ *              distribution of the executed statements should not be
+ *              changed, there are still cases where optimizing compilers
+ *              may not generate code for some statements. To a certain
+ *              degree, this is unavoidable for small synthetic
+ *              benchmarks. Users of the benchmark are advised to check
+ *              code listings whether code is generated for all statements
+ *              of Dhrystone.
+ *
+ *              Version 2.1 is identical to version 2.0 distributed via
+ *              the UNIX network Usenet in March 1988 except that it
+ *              corrects some minor deficiencies that were found by users
+ *              of version 2.0. The only change within the measurement
+ *              loop is that a non-executed "else" part was added to the
+ *              "if" statement in Func_3, and a non-executed "else" part
+ *              removed from Proc_3.
+ *
+ *************************************************************************
+ *
+ * Defines:     The following "Defines" are possible:
+ *              -DROPT         (default: Not defined)
+ *                      As an approximation to what an average C
+ *                      programmer might do, the "register" storage class
+ *                      is applied (if enabled by -DROPT)
+ *                      - for local variables, if they are used
+ *                        (dynamically) five or more times
+ *                      - for parameters if they are used (dynamically)
+ *                        six or more times
+ *                      Note that an optimal "register" strategy is
+ *                      compiler-dependent, and that "register"
+ *                      declarations do not necessarily lead to faster
+ *                      execution.
+ *              -DNOSTRUCTASSIGN        (default: Not defined)
+ *                      Define if the C compiler does not support
+ *                      assignment of structures.
+ *              -DNOENUMS               (default: Not defined)
+ *                      Define if the C compiler does not support
+ *                      enumeration types.
+ *
+ *************************************************************************
+ *
+ *  Compilation model and measurement (IMPORTANT):
+ *
+ *  This C version of Dhrystone consists of three files:
+ *  - dhry.h (this file, containing global definitions and comments)
+ *  - dhry_1.c (containing the code corresponding to Ada package Pack_1)
+ *  - dhry_2.c (containing the code corresponding to Ada package Pack_2)
+ *
+ *  The following "ground rules" apply for measurements:
+ *  - Separate compilation
+ *  - No procedure merging
+ *  - Otherwise, compiler optimizations are allowed but should be
+ *    indicated
+ *  - Default results are those without register declarations
+ *  See the companion paper "Rationale for Dhrystone Version 2" for a more
+ *  detailed discussion of these ground rules.
+ *
+ *  For 16-Bit processors (e.g. 80186, 80286), times for all compilation
+ *  models ("small", "medium", "large" etc.) should be given if possible,
+ *  together with a definition of these models for the compiler system
+ *  used.
+ *
+ *************************************************************************
+ *
+ *  Dhrystone (C version) statistics:
+ *
+ *  [Comment from the first distribution, updated for version 2.
+ *   Note that because of language differences, the numbers are slightly
+ *   different from the Ada version.]
+ *
+ *  The following program contains statements of a high level programming
+ *  language (here: C) in a distribution considered representative:
+ *
+ *    assignments                  52 (51.0 %)
+ *    control statements           33 (32.4 %)
+ *    procedure, function calls    17 (16.7 %)
+ *
+ *  103 statements are dynamically executed. The program is balanced with
+ *  respect to the three aspects:
+ *
+ *    - statement type
+ *    - operand type
+ *    - operand locality
+ *         operand global, local, parameter, or constant.
+ *
+ *  The combination of these three aspects is balanced only approximately.
+ *
+ *  1. Statement Type:
+ *  -----------------             number
+ *
+ *     V1 = V2                     9
+ *       (incl. V1 = F(..)
+ *     V = Constant               12
+ *     Assignment,                 7
+ *       with array element
+ *     Assignment,                 6
+ *       with record component
+ *                                --
+ *                                34       34
+ *
+ *     X = Y +|-|"&&"|"|" Z        5
+ *     X = Y +|-|"==" Constant     6
+ *     X = X +|- 1                 3
+ *     X = Y *|/ Z                 2
+ *     X = Expression,             1
+ *           two operators
+ *     X = Expression,             1
+ *           three operators
+ *                                --
+ *                                18       18
+ *
+ *     if ....                    14
+ *       with "else"      7
+ *       without "else"   7
+ *           executed        3
+ *           not executed    4
+ *     for ...                     7  |  counted every time
+ *     while ...                   4  |  the loop condition
+ *     do ... while                1  |  is evaluated
+ *     switch ...                  1
+ *     break                       1
+ *     declaration with            1
+ *       initialization
+ *                                --
+ *                                34       34
+ *
+ *     P (...)  procedure call    11
+ *       user procedure      10
+ *       library procedure    1
+ *     X = F (...)
+ *             function  call      6
+ *       user function        5
+ *       library function     1
+ *                                --
+ *                                17       17
+ *                                        ---
+ *                                        103
+ *
+ *    The average number of parameters in procedure or function calls
+ *    is 1.82 (not counting the function values as implicit parameters).
+ *
+ *
+ *  2. Operators
+ *  ------------
+ *                          number    approximate
+ *                                    percentage
+ *
+ *    Arithmetic             32          50.8
+ *
+ *       +                     21          33.3
+ *       -                      7          11.1
+ *       *                      3           4.8
+ *       / (int div)            1           1.6
+ *
+ *    Comparison             27           42.8
+ *
+ *       ==                     9           14.3
+ *       /=                     4            6.3
+ *       >                      1            1.6
+ *       <                      3            4.8
+ *       >=                     1            1.6
+ *       <=                     9           14.3
+ *
+ *    Logic                   4            6.3
+ *
+ *       && (AND-THEN)          1            1.6
+ *       |  (OR)                1            1.6
+ *       !  (NOT)               2            3.2
+ * 
+ *                           --          -----
+ *                           63          100.1
+ *
+ *
+ *  3. Operand Type (counted once per operand reference):
+ *  ---------------
+ *                          number    approximate
+ *                                    percentage
+ *
+ *     Integer               175        72.3 %
+ *     Character              45        18.6 %
+ *     Pointer                12         5.0 %
+ *     String30                6         2.5 %
+ *     Array                   2         0.8 %
+ *     Record                  2         0.8 %
+ *                           ---       -------
+ *                           242       100.0 %
+ *
+ *  When there is an access path leading to the final operand (e.g. a
+ *  record component), only the final data type on the access path is
+ *  counted.
+ *
+ *
+ *  4. Operand Locality:
+ *  -------------------
+ *                                number    approximate
+ *                                          percentage
+ *
+ *     local variable              114        47.1 %
+ *     global variable              22         9.1 %
+ *     parameter                    45        18.6 %
+ *        value                        23         9.5 %
+ *        reference                    22         9.1 %
+ *     function result               6         2.5 %
+ *     constant                     55        22.7 %
+ *                                 ---       -------
+ *                                 242       100.0 %
+ *
+ *
+ *  The program does not compute anything meaningful, but it is
+ *  syntactically and semantically correct. All variables have a value
+ *  assigned to them before they are used as a source operand.
+ *
+ *  There has been no explicit effort to account for the effects of a
+ *  cache, or to balance the use of long or short displacements for code
+ *  or data.
+ *
+ *************************************************************************
+ */
+
+/* Compiler and system dependent definitions: */
+
+#define Mic_secs_Per_Second     1000000.0
+                /* Berkeley UNIX C returns process times in seconds/HZ */
+
+#ifdef  NOSTRUCTASSIGN
+#define structassign(d, s)      memcpy(&(d), &(s), sizeof(d))
+#else
+#define structassign(d, s)      d = s
+#endif
+
+#ifdef  NOENUM
+#define Ident_1 0
+#define Ident_2 1
+#define Ident_3 2
+#define Ident_4 3
+#define Ident_5 4
+  typedef int   Enumeration;
+#else
+  typedef       enum    {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5}
+                Enumeration;
+#endif
+        /* for boolean and enumeration types in Ada, Pascal */
+
+/* General definitions: */
+
+#include <stdio.h>
+                /* for strcpy, strcmp */
+
+#define Null 0 
+                /* Value of a Null pointer */
+#define true  1
+#define false 0
+
+typedef int     One_Thirty;
+typedef int     One_Fifty;
+typedef char    Capital_Letter;
+typedef int     Boolean;
+typedef char    Str_30 [31];
+typedef int     Arr_1_Dim [50];
+typedef int     Arr_2_Dim [50] [50];
+
+typedef struct record 
+    {
+    struct record *Ptr_Comp;
+    Enumeration    Discr;
+    union {
+          struct {
+                  Enumeration Enum_Comp;
+                  int         Int_Comp;
+                  char        Str_Comp [31];
+                  } var_1;
+          struct {
+                  Enumeration E_Comp_2;
+                  char        Str_2_Comp [31];
+                  } var_2;
+          struct {
+                  char        Ch_1_Comp;
+                  char        Ch_2_Comp;
+                  } var_3;
+          } variant;
+      } Rec_Type, *Rec_Pointer;
+
+#ifdef __ECOS__
+
+#ifndef ROPT
+#define REG
+        /* REG becomes defined as empty */
+        /* i.e. no register variables   */
+#else
+#define REG register
+#endif
+
+Boolean Func_2 (Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref);
+Boolean Func_3 (Enumeration Enum_Par_Val);
+
+void Proc_1 (REG Rec_Pointer Ptr_Val_Par);
+void Proc_2 (One_Fifty* Int_Par_Ref);
+void Proc_3 (Rec_Pointer *Ptr_Ref_Par);
+void Proc_4 (void);
+void Proc_5 (void);
+void Proc_6 (Enumeration Enum_Val_Par, Enumeration* Enum_Ref_Par);
+void Proc_7 (One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val, 
+            One_Fifty* Int_Par_Ref);
+void Proc_8 (Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref,
+             int Int_1_Par_Val, int Int_2_Par_Val);
+Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val);
+
+#endif // __ECOS__
+
+/*
+ *************************************************************************
+ *
+ *                   "DHRYSTONE" Benchmark Program
+ *                   -----------------------------
+ *
+ *  Version:    C, Version 2.1
+ *
+ *  File:       dhry_1.c (part 2 of 3)
+ *
+ *  Date:       May 25, 1988
+ *
+ *  Author:     Reinhold P. Weicker
+ *
+ *************************************************************************
+ */
+
+#include <stdio.h>
+#ifndef __ECOS__
+#include "dhry.h"
+#endif // __ECOS__
+
+/* Global Variables: */
+
+Rec_Pointer     Ptr_Glob,
+                Next_Ptr_Glob;
+int             Int_Glob;
+Boolean         Bool_Glob;
+char            Ch_1_Glob,
+                Ch_2_Glob;
+int             Arr_1_Glob [50];
+int             Arr_2_Glob [50] [50];
+
+char Reg_Define[] = "Register option selected.";
+
+#ifndef __ECOS__
+extern char     *malloc ();
+Enumeration     Func_1 ();
+#endif
+  /* 
+  forward declaration necessary since Enumeration may not simply be int
+  */
+
+#ifndef __ECOS__
+#ifndef ROPT
+#define REG
+        /* REG becomes defined as empty */
+        /* i.e. no register variables   */
+#else
+#define REG register
+#endif
+#endif
+
+/* variables for time measurement: */
+
+#define Too_Small_Time 2
+                /* Measurements should last at least 2 seconds */
+
+double          Begin_Time,
+                End_Time,
+                User_Time;
+
+double          Microseconds,
+                Dhrystones_Per_Second,
+                Vax_Mips;
+
+/* end of variables for time measurement */
+
+
+#ifndef __ECOS__
+void main ()
+#else // __ECOS__
+int main (void)
+#endif // __ECOS__
+/*****/
+
+  /* main program, corresponds to procedures        */
+  /* Main and Proc_0 in the Ada version             */
+{
+#ifndef __ECOS__
+  double   dtime();
+#endif // __ECOS__
+
+        One_Fifty       Int_1_Loc;
+  REG   One_Fifty       Int_2_Loc;
+        One_Fifty       Int_3_Loc;
+  REG   char            Ch_Index;
+        Enumeration     Enum_Loc;
+        Str_30          Str_1_Loc;
+        Str_30          Str_2_Loc;
+  REG   int             Run_Index;
+  REG   int             Number_Of_Runs;
+
+#ifndef __ECOS__
+        FILE            *Ap;
+
+  /* Initializations */
+
+  if ((Ap = fopen("dhry.res","a+")) == NULL)
+    {
+       printf("Can not open dhry.res\n\n");
+       exit(1);
+    }
+#endif // __ECOS__
+
+  Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
+  Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
+
+  Ptr_Glob->Ptr_Comp                    = Next_Ptr_Glob;
+  Ptr_Glob->Discr                       = Ident_1;
+  Ptr_Glob->variant.var_1.Enum_Comp     = Ident_3;
+  Ptr_Glob->variant.var_1.Int_Comp      = 40;
+  strcpy (Ptr_Glob->variant.var_1.Str_Comp, 
+          "DHRYSTONE PROGRAM, SOME STRING");
+  strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING");
+
+  Arr_2_Glob [8][7] = 10;
+        /* Was missing in published program. Without this statement,    */
+        /* Arr_2_Glob [8][7] would have an undefined value.             */
+        /* Warning: With 16-Bit processors and Number_Of_Runs > 32000,  */
+        /* overflow may occur for this array element.                   */
+
+  printf ("\n");
+  printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n");
+  printf ("\n");
+/*  
+  if (Reg)
+  {
+    printf ("Program compiled with 'register' attribute\n");
+    printf ("\n");
+  }
+  else
+  {
+    printf ("Program compiled without 'register' attribute\n");
+    printf ("\n");
+  }
+*/
+#ifdef __ECOS__
+  Number_Of_Runs = PASSES;
+#else // __ECOS__
+  printf ("Please give the number of runs through the benchmark: ");
+  {
+    int n;
+    scanf ("%d", &n);
+    Number_Of_Runs = n;
+  }
+  printf ("\n");
+#endif // __ECOS__
+
+  printf ("Execution starts, %d runs through Dhrystone\n",Number_Of_Runs);
+
+  /***************/
+  /* Start timer */
+  /***************/
+ 
+  Begin_Time = dtime();
+  
+  for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index)
+  {
+
+    Proc_5();
+    Proc_4();
+      /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */
+    Int_1_Loc = 2;
+    Int_2_Loc = 3;
+    strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING");
+    Enum_Loc = Ident_2;
+    Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc);
+      /* Bool_Glob == 1 */
+    while (Int_1_Loc < Int_2_Loc)  /* loop body executed once */
+    {
+      Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc;
+        /* Int_3_Loc == 7 */
+      Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc);
+        /* Int_3_Loc == 7 */
+      Int_1_Loc += 1;
+    } /* while */
+      /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
+    Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc);
+      /* Int_Glob == 5 */
+    Proc_1 (Ptr_Glob);
+    for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index)
+                             /* loop body executed twice */
+    {
+      if (Enum_Loc == Func_1 (Ch_Index, 'C'))
+          /* then, not executed */
+        {
+        Proc_6 (Ident_1, &Enum_Loc);
+        strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING");
+        Int_2_Loc = Run_Index;
+        Int_Glob = Run_Index;
+        }
+    }
+      /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
+    Int_2_Loc = Int_2_Loc * Int_1_Loc;
+    Int_1_Loc = Int_2_Loc / Int_3_Loc;
+    Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc;
+      /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */
+    Proc_2 (&Int_1_Loc);
+      /* Int_1_Loc == 5 */
+
+  } /* loop "for Run_Index" */
+
+  /**************/
+  /* Stop timer */
+  /**************/
+
+  End_Time = dtime();
+
+  printf ("Execution ends\n");
+  printf ("\n");
+  printf ("Final values of the variables used in the benchmark:\n");
+  printf ("\n");
+  printf ("Int_Glob:            %d\n", Int_Glob);
+  printf ("        should be:   %d\n", 5);
+  printf ("Bool_Glob:           %d\n", Bool_Glob);
+  printf ("        should be:   %d\n", 1);
+  printf ("Ch_1_Glob:           %c\n", Ch_1_Glob);
+  printf ("        should be:   %c\n", 'A');
+  printf ("Ch_2_Glob:           %c\n", Ch_2_Glob);
+  printf ("        should be:   %c\n", 'B');
+  printf ("Arr_1_Glob[8]:       %d\n", Arr_1_Glob[8]);
+  printf ("        should be:   %d\n", 7);
+  printf ("Arr_2_Glob[8][7]:    %d\n", Arr_2_Glob[8][7]);
+  printf ("        should be:   Number_Of_Runs + 10\n");
+  printf ("Ptr_Glob->\n");
+  printf ("  Ptr_Comp:          %d\n", (int) Ptr_Glob->Ptr_Comp);
+  printf ("        should be:   (implementation-dependent)\n");
+  printf ("  Discr:             %d\n", Ptr_Glob->Discr);
+  printf ("        should be:   %d\n", 0);
+  printf ("  Enum_Comp:         %d\n", Ptr_Glob->variant.var_1.Enum_Comp);
+  printf ("        should be:   %d\n", 2);
+  printf ("  Int_Comp:          %d\n", Ptr_Glob->variant.var_1.Int_Comp);
+  printf ("        should be:   %d\n", 17);
+  printf ("  Str_Comp:          %s\n", Ptr_Glob->variant.var_1.Str_Comp);
+  printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n");
+  printf ("Next_Ptr_Glob->\n");
+  printf ("  Ptr_Comp:          %d\n", (int) Next_Ptr_Glob->Ptr_Comp);
+  printf ("        should be:   (implementation-dependent), same as above\n");
+  printf ("  Discr:             %d\n", Next_Ptr_Glob->Discr);
+  printf ("        should be:   %d\n", 0);
+  printf ("  Enum_Comp:         %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp);
+  printf ("        should be:   %d\n", 1);
+  printf ("  Int_Comp:          %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp);
+  printf ("        should be:   %d\n", 18);
+  printf ("  Str_Comp:          %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp);
+  printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n");
+  printf ("Int_1_Loc:           %d\n", Int_1_Loc);
+  printf ("        should be:   %d\n", 5);
+  printf ("Int_2_Loc:           %d\n", Int_2_Loc);
+  printf ("        should be:   %d\n", 13);
+  printf ("Int_3_Loc:           %d\n", Int_3_Loc);
+  printf ("        should be:   %d\n", 7);
+  printf ("Enum_Loc:            %d\n", Enum_Loc);
+  printf ("        should be:   %d\n", 1);
+  printf ("Str_1_Loc:           %s\n", Str_1_Loc);
+  printf ("        should be:   DHRYSTONE PROGRAM, 1'ST STRING\n");
+  printf ("Str_2_Loc:           %s\n", Str_2_Loc);
+  printf ("        should be:   DHRYSTONE PROGRAM, 2'ND STRING\n");
+  printf ("\n");
+
+  User_Time = End_Time - Begin_Time;
+
+  if (User_Time < Too_Small_Time)
+  {
+    printf ("Measured time too small to obtain meaningful results\n");
+    printf ("Please increase number of runs\n");
+    printf ("\n");
+  }
+  else
+  {
+    Microseconds = User_Time * Mic_secs_Per_Second 
+                        / (double) Number_Of_Runs;
+    Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time;
+    Vax_Mips = Dhrystones_Per_Second / 1757.0;
+
+#ifdef ROPT
+    printf ("Register option selected?  YES\n");
+#else
+    printf ("Register option selected?  NO\n");
+#ifndef __ECOS__
+    strcpy(Reg_Define, "Register option not selected.");
+#endif // __ECOS__
+#endif
+    printf ("Microseconds for one run through Dhrystone: ");
+#ifdef __ECOS__
+    printf ("%7.1f \n", Microseconds);
+    printf ("Dhrystones per Second:                      ");
+    printf ("%10.1f \n", Dhrystones_Per_Second);
+    printf ("VAX MIPS rating = %10.3f \n",Vax_Mips);
+    printf ("\n");
+#else // __ECOS__
+    printf ("%7.1lf \n", Microseconds);
+    printf ("Dhrystones per Second:                      ");
+    printf ("%10.1lf \n", Dhrystones_Per_Second);
+    printf ("VAX MIPS rating = %10.3lf \n",Vax_Mips);
+    printf ("\n");
+
+  fprintf(Ap,"\n");
+  fprintf(Ap,"Dhrystone Benchmark, Version 2.1 (Language: C)\n");
+  fprintf(Ap,"%s\n",Reg_Define);
+  fprintf(Ap,"Microseconds for one loop: %7.1lf\n",Microseconds);
+  fprintf(Ap,"Dhrystones per second: %10.1lf\n",Dhrystones_Per_Second);
+  fprintf(Ap,"VAX MIPS rating: %10.3lf\n",Vax_Mips);
+  fclose(Ap);
+#endif // __ECOS__  
+  }
+  
+#ifdef __ECOS__
+  CYG_TEST_PASS_FINISH("Dhrystone test");
+#endif // __ECOS__
+}
+
+
+#ifdef __ECOS__
+void
+#endif // __ECOS__
+Proc_1 (Ptr_Val_Par)
+/******************/
+
+REG Rec_Pointer Ptr_Val_Par;
+    /* executed once */
+{
+  REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp;  
+                                        /* == Ptr_Glob_Next */
+  /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp,    */
+  /* corresponds to "rename" in Ada, "with" in Pascal           */
+  
+  structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob);
+  Ptr_Val_Par->variant.var_1.Int_Comp = 5;
+  Next_Record->variant.var_1.Int_Comp 
+        = Ptr_Val_Par->variant.var_1.Int_Comp;
+  Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp;
+  Proc_3 (&Next_Record->Ptr_Comp);
+    /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp 
+                        == Ptr_Glob->Ptr_Comp */
+  if (Next_Record->Discr == Ident_1)
+    /* then, executed */
+  {
+    Next_Record->variant.var_1.Int_Comp = 6;
+    Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, 
+           &Next_Record->variant.var_1.Enum_Comp);
+    Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp;
+    Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, 
+           &Next_Record->variant.var_1.Int_Comp);
+  }
+  else /* not executed */
+    structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp);
+} /* Proc_1 */
+
+
+#ifdef __ECOS__
+void
+#endif // __ECOS__
+Proc_2 (Int_Par_Ref)
+/******************/
+    /* executed once */
+    /* *Int_Par_Ref == 1, becomes 4 */
+
+One_Fifty   *Int_Par_Ref;
+{
+  One_Fifty  Int_Loc;
+#ifdef __ECOS__
+  Enumeration   Enum_Loc = Ident_1;
+#else // __ECOS__
+  Enumeration   Enum_Loc;
+#endif // __ECOS__
+
+  Int_Loc = *Int_Par_Ref + 10;
+  do /* executed once */
+    if (Ch_1_Glob == 'A')
+      /* then, executed */
+    {
+      Int_Loc -= 1;
+      *Int_Par_Ref = Int_Loc - Int_Glob;
+      Enum_Loc = Ident_1;
+    } /* if */
+  while (Enum_Loc != Ident_1); /* true */
+} /* Proc_2 */
+
+
+#ifdef __ECOS__
+void
+#endif // __ECOS__
+Proc_3 (Ptr_Ref_Par)
+/******************/
+    /* executed once */
+    /* Ptr_Ref_Par becomes Ptr_Glob */
+
+Rec_Pointer *Ptr_Ref_Par;
+
+{
+  if (Ptr_Glob != Null)
+    /* then, executed */
+    *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp;
+  Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp);
+} /* Proc_3 */
+
+
+#ifdef __ECOS__
+void
+#endif // __ECOS__
+Proc_4 () /* without parameters */
+/*******/
+    /* executed once */
+{
+  Boolean Bool_Loc;
+
+  Bool_Loc = Ch_1_Glob == 'A';
+  Bool_Glob = Bool_Loc | Bool_Glob;
+  Ch_2_Glob = 'B';
+} /* Proc_4 */
+
+
+#ifdef __ECOS__
+void
+#endif // __ECOS__
+Proc_5 () /* without parameters */
+/*******/
+    /* executed once */
+{
+  Ch_1_Glob = 'A';
+  Bool_Glob = false;
+} /* Proc_5 */
+
+
+        /* Procedure for the assignment of structures,          */
+        /* if the C compiler doesn't support this feature       */
+#ifdef  NOSTRUCTASSIGN
+memcpy (d, s, l)
+register char   *d;
+register char   *s;
+register int    l;
+{
+        while (l--) *d++ = *s++;
+}
+#endif
+
+/*
+ *************************************************************************
+ *
+ *                   "DHRYSTONE" Benchmark Program
+ *                   -----------------------------
+ *
+ *  Version:    C, Version 2.1
+ *
+ *  File:       dhry_2.c (part 3 of 3)
+ *
+ *  Date:       May 25, 1988
+ *
+ *  Author:     Reinhold P. Weicker
+ *
+ *************************************************************************
+ */
+
+#ifndef __ECOS__
+#include "dhry.h"
+
+#ifndef REG
+#define REG
+        /* REG becomes defined as empty */
+        /* i.e. no register variables   */
+#else
+#define REG register
+#endif
+#endif // __ECOS__
+
+extern  int     Int_Glob;
+extern  char    Ch_1_Glob;
+
+#ifdef __ECOS__
+void
+#endif // __ECOS__
+Proc_6 (Enum_Val_Par, Enum_Ref_Par)
+/*********************************/
+    /* executed once */
+    /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */
+
+Enumeration  Enum_Val_Par;
+Enumeration *Enum_Ref_Par;
+{
+  *Enum_Ref_Par = Enum_Val_Par;
+  if (! Func_3 (Enum_Val_Par))
+    /* then, not executed */
+    *Enum_Ref_Par = Ident_4;
+  switch (Enum_Val_Par)
+  {
+    case Ident_1: 
+      *Enum_Ref_Par = Ident_1;
+      break;
+    case Ident_2: 
+      if (Int_Glob > 100)
+        /* then */
+      *Enum_Ref_Par = Ident_1;
+      else *Enum_Ref_Par = Ident_4;
+      break;
+    case Ident_3: /* executed */
+      *Enum_Ref_Par = Ident_2;
+      break;
+    case Ident_4: break;
+    case Ident_5: 
+      *Enum_Ref_Par = Ident_3;
+      break;
+  } /* switch */
+} /* Proc_6 */
+
+
+#ifdef __ECOS__
+void
+#endif // __ECOS__
+Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref)
+/**********************************************/
+    /* executed three times                                      */
+    /* first call:      Int_1_Par_Val == 2, Int_2_Par_Val == 3,  */
+    /*                  Int_Par_Ref becomes 7                    */
+    /* second call:     Int_1_Par_Val == 10, Int_2_Par_Val == 5, */
+    /*                  Int_Par_Ref becomes 17                   */
+    /* third call:      Int_1_Par_Val == 6, Int_2_Par_Val == 10, */
+    /*                  Int_Par_Ref becomes 18                   */
+One_Fifty       Int_1_Par_Val;
+One_Fifty       Int_2_Par_Val;
+One_Fifty      *Int_Par_Ref;
+{
+  One_Fifty Int_Loc;
+
+  Int_Loc = Int_1_Par_Val + 2;
+  *Int_Par_Ref = Int_2_Par_Val + Int_Loc;
+} /* Proc_7 */
+
+
+#ifdef __ECOS__
+void
+#endif // __ECOS__
+Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val)
+/*********************************************************************/
+    /* executed once      */
+    /* Int_Par_Val_1 == 3 */
+    /* Int_Par_Val_2 == 7 */
+Arr_1_Dim       Arr_1_Par_Ref;
+Arr_2_Dim       Arr_2_Par_Ref;
+int             Int_1_Par_Val;
+int             Int_2_Par_Val;
+{
+  REG One_Fifty Int_Index;
+  REG One_Fifty Int_Loc;
+
+  Int_Loc = Int_1_Par_Val + 5;
+  Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val;
+  Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc];
+  Arr_1_Par_Ref [Int_Loc+30] = Int_Loc;
+  for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index)
+    Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc;
+  Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1;
+  Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc];
+  Int_Glob = 5;
+} /* Proc_8 */
+
+
+Enumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val)
+/*************************************************/
+    /* executed three times                                         */
+    /* first call:      Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R'    */
+    /* second call:     Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C'    */
+    /* third call:      Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C'    */
+
+Capital_Letter   Ch_1_Par_Val;
+Capital_Letter   Ch_2_Par_Val;
+{
+  Capital_Letter        Ch_1_Loc;
+  Capital_Letter        Ch_2_Loc;
+
+  Ch_1_Loc = Ch_1_Par_Val;
+  Ch_2_Loc = Ch_1_Loc;
+  if (Ch_2_Loc != Ch_2_Par_Val)
+    /* then, executed */
+    return (Ident_1);
+  else  /* not executed */
+  {
+    Ch_1_Glob = Ch_1_Loc;
+    return (Ident_2);
+   }
+} /* Func_1 */
+
+
+Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref)
+/*************************************************/
+    /* executed once */
+    /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */
+    /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */
+
+Str_30  Str_1_Par_Ref;
+Str_30  Str_2_Par_Ref;
+{
+  REG One_Thirty        Int_Loc;
+#ifdef __ECOS__
+      Capital_Letter    Ch_Loc = 'A';
+#else // __ECOS__
+      Capital_Letter    Ch_Loc;
+#endif // __ECOS__
+
+  Int_Loc = 2;
+  while (Int_Loc <= 2) /* loop body executed once */
+    if (Func_1 (Str_1_Par_Ref[Int_Loc],
+                Str_2_Par_Ref[Int_Loc+1]) == Ident_1)
+      /* then, executed */
+    {
+      Ch_Loc = 'A';
+      Int_Loc += 1;
+    } /* if, while */
+  if (Ch_Loc >= 'W' && Ch_Loc < 'Z')
+    /* then, not executed */
+    Int_Loc = 7;
+  if (Ch_Loc == 'R')
+    /* then, not executed */
+    return (true);
+  else /* executed */
+  {
+    if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0)
+      /* then, not executed */
+    {
+      Int_Loc += 7;
+      Int_Glob = Int_Loc;
+      return (true);
+    }
+    else /* executed */
+      return (false);
+  } /* if Ch_Loc */
+} /* Func_2 */
+
+
+Boolean Func_3 (Enum_Par_Val)
+/***************************/
+    /* executed once        */
+    /* Enum_Par_Val == Ident_3 */
+Enumeration Enum_Par_Val;
+{
+  Enumeration Enum_Loc;
+
+  Enum_Loc = Enum_Par_Val;
+  if (Enum_Loc == Ident_3)
+    /* then, executed */
+    return (true);
+  else /* not executed */
+    return (false);
+} /* Func_3 */
+
+#else
+#define NA_MSG "CYGFUN_KERNEL_API_C && CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT"
+#endif // CYGFUN_KERNEL_API_C && CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT
+
+#else
+#define NA_MSG "CYGPKG_KERNEL && CYGPKG_LIBC"
+#endif // CYGPKG_KERNEL && CYGPKG_LIBC
+
+#ifdef NA_MSG
+externC void
+cyg_start( void )
+{
+    CYG_TEST_INIT();
+    CYG_TEST_NA("Requires " NA_MSG);
+}
+#endif
--- a/packages/language/c/libc/current/ChangeLog
+++ b/packages/language/c/libc/current/ChangeLog
@@ -1,3 +1,8 @@
+1999-06-11  Jonathan Larmour  <jlarmour@cygnus.co.uk>
+
+	* include/stdio.h: Make FILEs array types so they won't be
+	given $gp relocations on MIPS targets
+
 1999-05-27  Jesper Skov  <jskov@cygnus.co.uk>
 
 	* tests/time/ctime.c: Fixed compiler warning.
--- a/packages/language/c/libc/current/include/stdio.h
+++ b/packages/language/c/libc/current/include/stdio.h
@@ -85,12 +85,18 @@
 typedef cyg_ucount32 fpos_t;
 
 
-typedef CYG_ADDRESS FILE; // FILE is just cast to an address here. It is
-                          // uncast internally to the C library in stream.hxx
-                          // as the C++ Cyg_StdioStream class. Optional
-                          // run-time checking can be enabled to ensure that
-                          // the cast is valid, using the standard assertion
-                          // functionality
+// FILE is just cast to an address here. It is uncast internally to the
+// C library in stream.hxx  as the C++ Cyg_StdioStream class.
+// Optional run-time checking can be enabled to ensure that the cast is
+// valid, using the standard assertion functionality.
+//
+// The array size is irrelevant other than being more than 8, and is present
+// to stop references to FILEs being marked as able to be put in the small
+// data section. We can't just mark it as in the ".data" section as on some
+// targets it may actually be ".common". Maybe this doesn't matter?
+// FIXME: This doesn't work if things are larger than 16 are put in sdata,
+// e.g. on mips by specifying -G 32
+typedef CYG_ADDRESS FILE[16];
 
 // EXTERNAL VARIABLES
 
@@ -106,7 +112,7 @@ typedef CYG_ADDRESS FILE; // FILE is jus
 
 #ifndef CYGPRI_LIBC_STDIO_NO_DEFAULT_STREAMS
 extern FILE cyg_libc_stdio_stdin, cyg_libc_stdio_stdout,
-            cyg_libc_stdio_stderr; 
+            cyg_libc_stdio_stderr;
 
 #define stdin  (&cyg_libc_stdio_stdin)
 #define stdout (&cyg_libc_stdio_stdout)
--- a/packages/language/c/libm/current/src/PKGconf.mak
+++ b/packages/language/c/libm/current/src/PKGconf.mak
@@ -71,4 +71,5 @@ OTHER_OBJS    :=
 OTHER_TARGETS :=
 OTHER_CLEAN   :=
 
+
 include $(COMPONENT_REPOSITORY)/pkgconf/makrules.src