Mercurial > ecos
changeset 16:4f2df4ab82c8 ecos-sw-1999-06-18
Merge from eCos master repository on 1999-06-18-15:25:04-BST
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)
