Mercurial > flash_v2
changeset 90:70190fa0fe10 ecos-sw-2000-05-19
Merge from eCos master repository on 2000-05-19-07:47:03-BST
line wrap: on
line diff
--- a/host/libcdl/ChangeLog +++ b/host/libcdl/ChangeLog @@ -1,3 +1,13 @@ +2000-05-11 Bart Veer <bartv@redhat.com> + + * value.cxx (implements_update_handler): + Cope gracefully with implements properties where the destination + is not an interface. + + * transact.cxx (clear_structural_conflicts): + Prevent a structural conflict from being destroyed twice (only + likely to happen during a major delete operation). + 2000-04-14 Bart Veer <bartv@redhat.com> * infer.cxx (infer_set_valuable_value):
--- a/host/libcdl/transact.cxx +++ b/host/libcdl/transact.cxx @@ -1389,7 +1389,8 @@ CdlTransactionBody::clear_structural_con CYG_ASSERT_CLASSC(toplevel); for (conf_i = toplevel->structural_conflicts.begin(); conf_i != toplevel->structural_conflicts.end(); ) { CdlConflict conflict = *conf_i++; - if ((node == conflict->get_node()) && (prop == conflict->get_property()) && (*pFn)(conflict)) { + if ((node == conflict->get_node()) && (prop == conflict->get_property()) && + !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) { this->clear_conflict(conflict); } }
--- a/host/libcdl/value.cxx +++ b/host/libcdl/value.cxx @@ -2148,17 +2148,49 @@ CdlValuableBody::implements_update_handl // change to the implementors. Currently no attempt is made to // optimise interface updates, although this may have to change in // future. + + // Any changes to the interface itself can be ignored. + if ((CdlUpdate_ValueChange == change) || (CdlUpdate_ActiveChange == change)) { + CYG_REPORT_RETURN(); + return; + } + + // The second stage init is irrelevant + if (CdlUpdate_Init == change) { + CYG_REPORT_RETURN(); + return; + } + + // Possibilities: + // 1) source is being loaded, dest valid + // 2) source is being loaded, dest unknown + // 3) source is being unloaded, dest valid + // 4) source is being unloaded, dest unknown + // 5) dest has been created + // 6) dest is going away // - // As far as this code is concerned, any time that an implementor - // is loaded or unloaded the interface needs to be recalculated. - // Also if the destination is created then it needs to be - // recalculated, although that should really be the responsibility - // of the interface itself. In due course interfaces should be - // auto-generated if not explicitly defined. - if ((CdlUpdate_Loaded == change) || (CdlUpdate_Unloading == change) || (CdlUpdate_Created == change)) { - if (0 != dest) { - CdlInterface interface = dynamic_cast<CdlInterface>(dest); - CYG_ASSERT_CLASSC(interface); + // If we have a valid dest, it needs to be updated and any structural + // conflicts have to be cleared. + // + // If there is no dest, the implements property remains unbound. + // A suitable conflict is created in the base class. + // + // If the dest is invalid, a structural conflict has to be created. + if (CdlUpdate_Destroyed == change) { + // There is no need to do any clean-ups in the dest. + dest = 0; + } + if (0 == dest) { + transaction->clear_structural_conflicts(source, prop, &CdlConflict_DataBody::test); + } else { + CdlInterface interface = dynamic_cast<CdlInterface>(dest); + + if (0 == interface) { + std::string msg = source->get_class_name() + " " + source->get_name() + " cannot implement " + + dest->get_name() + "\n The latter is not an interface."; + CdlConflict_DataBody::make(transaction, source, prop, msg); + } else { + transaction->clear_structural_conflicts(source, prop, &CdlConflict_DataBody::test); interface->recalculate(transaction); } }
--- a/host/tools/ecostest/common/eCosTestDownloadFilter.cpp +++ b/host/tools/ecostest/common/eCosTestDownloadFilter.cpp @@ -53,7 +53,7 @@ #include "eCosStd.h" #include "eCosTrace.h" -#define DL_FILTER_VER "$Id: eCosTestDownloadFilter.cpp,v 1.7 2000/05/12 17:53:32 jlarmour Exp $" +#define DL_FILTER_VER "$Id: eCosTestDownloadFilter.cpp,v 1.8 2000/05/19 12:47:51 jlarmour Exp $" #include "eCosTestDownloadFilter.h" CeCosTestDownloadFilter::CeCosTestDownloadFilter():
--- a/host/tools/ecostest/common/eCosTestMonitorFilter.cpp +++ b/host/tools/ecostest/common/eCosTestMonitorFilter.cpp @@ -45,7 +45,7 @@ #include "eCosStd.h" -#define SER_FILTER_VER "$Id: eCosTestMonitorFilter.cpp,v 1.6 2000/05/12 17:53:32 jlarmour Exp $" +#define SER_FILTER_VER "$Id: eCosTestMonitorFilter.cpp,v 1.7 2000/05/19 12:47:51 jlarmour Exp $" #include "eCosTestMonitorFilter.h" CeCosTestMonitorFilter::CeCosTestMonitorFilter():
--- a/host/tools/ecostest/common/eCosTestSerialFilter.cpp +++ b/host/tools/ecostest/common/eCosTestSerialFilter.cpp @@ -51,7 +51,7 @@ #include "eCosStd.h" -#define SER_FILTER_VER "$Id: eCosTestSerialFilter.cpp,v 1.7 2000/05/12 17:53:32 jlarmour Exp $" +#define SER_FILTER_VER "$Id: eCosTestSerialFilter.cpp,v 1.8 2000/05/19 12:47:51 jlarmour Exp $" #include "eCosTestSerialFilter.h" #include "eCosThreadUtils.h"
--- a/packages/compat/uitron/current/ChangeLog +++ b/packages/compat/uitron/current/ChangeLog @@ -1,3 +1,11 @@ +2000-05-15 Hugo Tyson <hmt@cygnus.co.uk> + + * include/uit_ifnc.h (cyg_uitron_dsr): make this be extern "C" + always; it went wrong when uitron funcs are inline or C++. + + * src/uit_ifnc.cxx (CYGIMP_UITRON_INLINE_FUNCS): When [re]defining + this, match what CDL defined. Warnings--; + 2000-05-08 Jesper Skov <jskov@redhat.com> * tests/testintr.cxx (attach_isr, detach_isr): Don't check for
--- a/packages/compat/uitron/current/include/uit_ifnc.h +++ b/packages/compat/uitron/current/include/uit_ifnc.h @@ -69,6 +69,7 @@ // u I T R O N F U N C T I O N S // The function declarations themselves: +// ------------------- These functions can be inline if so configured CYG_UIT_FUNC_EXTERN_BEGIN // ****************************************************** @@ -142,13 +143,19 @@ ER isnd_msg ( ID mbxid, T_MSG *pk_m // (None) +CYG_UIT_FUNC_EXTERN_END +// ------------------- End of functions that can be inlined + + // ======================================================================== // DSR: use this DSR with the uITRON-type ISR that uses the functions above // to get delayed/safe execution of the wakeup-type functions above. +#ifdef __cplusplus +extern "C" +#endif void cyg_uitron_dsr( unsigned int vector, unsigned int count, unsigned int data ); -CYG_UIT_FUNC_EXTERN_END // ========================================================================
--- a/packages/compat/uitron/current/src/uit_ifnc.cxx +++ b/packages/compat/uitron/current/src/uit_ifnc.cxx @@ -48,7 +48,7 @@ // invoke the inline function definition to create static C linkage // functions here: -#define CYGIMP_UITRON_INLINE_FUNCS +#define CYGIMP_UITRON_INLINE_FUNCS 1 #include <cyg/compat/uitron/uit_func.h> // Now ensure that we create *outline* funcs for the ixxx_yyy() functions
--- a/packages/devs/eth/arm/ebsa285/current/ChangeLog +++ b/packages/devs/eth/arm/ebsa285/current/ChangeLog @@ -1,3 +1,8 @@ +2000-05-12 Hugo Tyson <hmt@cygnus.co.uk> + + * tests/test_net_realtime.h (tnr_print_activity): New routine to + check the system is working, tidied up the API. It works! + 2000-05-11 Hugo Tyson <hmt@cygnus.co.uk> * cdl/ebsa285_eth_drivers.cdl: Added export of the test header
--- a/packages/devs/eth/arm/ebsa285/current/tests/test_net_realtime.h +++ b/packages/devs/eth/arm/ebsa285/current/tests/test_net_realtime.h @@ -1,6 +1,5 @@ #ifndef CYGONCE_DEVS_ETH_ARM_EBSA285_TESTS_TEST_NET_REALTIME_H #define CYGONCE_DEVS_ETH_ARM_EBSA285_TESTS_TEST_NET_REALTIME_H - /*========================================================================== // // test_net_realtime.h @@ -44,9 +43,28 @@ //####DESCRIPTIONEND#### */ +// This is the API to this file: + +#define TNR_OFF() tnr_active = 0 +#define TNR_ON() tnr_active = 1 +#define TNR_INIT() tnr_init() +#define TNR_PRINT_ACTIVITY() tnr_print_activity() + +// Tests should use these if they are defined to test that the realtime +// characteristics of the world are preserved during a test. +// +// It is accepted that printing stuff via diag_printf() (and the test +// infra) disables interrupts for a long time. So invoke TNR_OFF/ON() +// either side of diagnostic prints, to prevent boguf firings of the +// realtime test. + +// ------------------------------------------------------------------------ + // This file rather assumes that the network is in use, and that therefore // there is also a kernel, and so on.... +#include <cyg/infra/testcase.h> // CYG_TEST_FAIL et al +#include <cyg/infra/diag.h> // diag_printf() #include <cyg/kernel/kapi.h> // Thread API #include <cyg/hal/hal_arch.h> // CYGNUM_HAL_STACK_SIZE_TYPICAL @@ -100,12 +118,22 @@ static cyg_handle_t tnr_thread_handle; static cyg_interrupt tnr_t1_intr, tnr_t2_intr; static cyg_handle_t tnr_t1_inth, tnr_t2_inth; - +struct { + int timer1_isr; + int timer2_isr; + int timer2_isr_active; + int timer2_dsr; + int timer2_thd; + int timer2_thd_active; +} tnr_activity_counts = { 0,0,0,0,0,0 }; + static cyg_uint32 tnr_timer1_isr(cyg_vector_t vector, cyg_addrword_t data) { + tnr_activity_counts.timer1_isr++; + if ( tnr_active ) - CYG_TEST_FAIL( "test_net_realtime: Timer1 fired" ); + CYG_TEST_FAIL_EXIT( "test_net_realtime: Timer1 fired" ); *SA110_TIMER1_CLEAR = 0; // Clear any pending interrupt (Data: don't care) HAL_INTERRUPT_ACKNOWLEDGE( CYGNUM_HAL_INTERRUPT_TIMER_1 ); @@ -115,13 +143,16 @@ static cyg_uint32 tnr_timer1_isr(cyg_vec static cyg_uint32 tnr_timer2_isr(cyg_vector_t vector, cyg_addrword_t data) { + tnr_activity_counts.timer2_isr++; + *SA110_TIMER2_CLEAR = 0; // Clear any pending interrupt (Data: don't care) HAL_INTERRUPT_ACKNOWLEDGE( CYGNUM_HAL_INTERRUPT_TIMER_2 ); if ( tnr_active ) { + tnr_activity_counts.timer2_isr_active++; if ( (*SA110_TIMER1_VALUE) > (4 * TNR_TIMER1_PERIOD_1mS) ) { // Then it has wrapped around, bad bad bad - CYG_TEST_FAIL( "tnr_timer2_isr: Timer1 wrapped" ); + CYG_TEST_FAIL_EXIT( "tnr_timer2_isr: Timer1 wrapped" ); } } tnr_t2_counter++; @@ -144,8 +175,10 @@ static cyg_uint32 tnr_timer2_isr(cyg_vec static void tnr_timer2_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) { + tnr_activity_counts.timer2_dsr++; + if ( CYGNUM_HAL_INTERRUPT_TIMER_2 != vector ) - CYG_TEST_FAIL( "tnr_timer2_dsr: Bad vector" ); + CYG_TEST_FAIL_EXIT( "tnr_timer2_dsr: Bad vector" ); cyg_semaphore_post( &tnr_sema ); } @@ -154,10 +187,12 @@ static void tnr_timer2_service_thread( c { while (1) { cyg_semaphore_wait( &tnr_sema ); + tnr_activity_counts.timer2_thd++; if ( tnr_active ) { + tnr_activity_counts.timer2_thd_active++; if ( (*SA110_TIMER1_VALUE) > (4 * TNR_TIMER1_PERIOD_1mS) ) { // Then it has wrapped around, bad bad bad - CYG_TEST_FAIL( "tnr_timer2_service_thread: Timer1 wrapped" ); + CYG_TEST_FAIL_EXIT( "tnr_timer2_service_thread: Timer1 wrapped" ); } } // Reset timer1 again. By doing this in time every time it should @@ -224,6 +259,20 @@ static void tnr_init( void ) cyg_interrupt_unmask( CYGNUM_HAL_INTERRUPT_TIMER_1 ); } +static void tnr_print_activity( void ) +{ + int tmp = tnr_active; + tnr_active = 0; + diag_printf( "Test-net-realtime: interrupt activity log:\n" ); + diag_printf( " timer1_isr %10d\n", tnr_activity_counts.timer1_isr ); + diag_printf( " timer2_isr %10d\n", tnr_activity_counts.timer2_isr ); + diag_printf( " (active) %10d\n", tnr_activity_counts.timer2_isr_active ); + diag_printf( " timer2_dsr %10d\n", tnr_activity_counts.timer2_dsr ); + diag_printf( " timer2_thd %10d\n", tnr_activity_counts.timer2_thd ); + diag_printf( " (active) %10d\n", tnr_activity_counts.timer2_thd_active ); + tnr_active = tmp; +} + #endif /* ifndef CYGONCE_DEVS_ETH_ARM_EBSA285_TESTS_TEST_NET_REALTIME_H */ /* EOF test_net_realtime.h */
--- a/packages/hal/mips/arch/current/ChangeLog +++ b/packages/hal/mips/arch/current/ChangeLog @@ -1,3 +1,21 @@ +2000-05-18 Jesper Skov <jskov@redhat.com> + + * include/hal_io.h: Allow platforms to override IO macro + definitions. + +2000-05-16 Jesper Skov <jskov@redhat.com> + + * include/hal_intr.h: + * src/vectors.S: + Filter 'break 0x7' (GCC division-by-zero) exceptions out into a + new vector. + Fix typo. + +2000-05-15 Jesper Skov <jskov@redhat.com> + + * src/vectors.S: Allow warm-start to be treated like cold-start if + platform requires it. + 2000-05-10 Jesper Skov <jskov@redhat.com> * include/arch.inc: Force assembler into MIPS3 mode before using
--- a/packages/hal/mips/arch/current/include/hal_intr.h +++ b/packages/hal/mips/arch/current/include/hal_intr.h @@ -92,6 +92,11 @@ #define CYGNUM_HAL_VECTOR_OVERFLOW 12 // Reserved #define CYGNUM_HAL_VECTOR_RESERVED_13 13 +// Division-by-zero [reserved vector] +// This is caused by 'trap 0x7' which GCC puts in the code to check +// for division by zero. The break_vsr_springboard in vectors.S is the +// only caller of this vector. +#define CYGNUM_HAL_VECTOR_DIV_BY_ZERO 14 // Floating point exception #ifdef CYGHWR_HAL_MIPS_FPU #define CYGNUM_HAL_VECTOR_FPE 15 @@ -121,6 +126,7 @@ CYGNUM_HAL_VECTOR_RESERVED_INSTRUCTION #define CYGNUM_HAL_EXCEPTION_COPROCESSOR CYGNUM_HAL_VECTOR_COPROCESSOR #define CYGNUM_HAL_EXCEPTION_OVERFLOW CYGNUM_HAL_VECTOR_OVERFLOW +#define CYGNUM_HAL_EXCEPTION_DIV_BY_ZERO CYGNUM_HAL_VECTOR_DIV_BY_ZERO // Min/Max exception numbers and how many there are #define CYGNUM_HAL_EXCEPTION_MIN 1 @@ -336,11 +342,14 @@ CYG_MACRO_END externC void __default_exception_vsr(void); externC void __default_interrupt_vsr(void); +externC void __break_vsr_springboard(void); #define HAL_VSR_SET_TO_ECOS_HANDLER( _vector_, _poldvsr_ ) CYG_MACRO_START \ HAL_VSR_SET( _vector_, _vector_ == CYGNUM_HAL_VECTOR_INTERRUPT \ ? (CYG_ADDRESS)__default_interrupt_vsr \ - : (CYG_ADDRESS)__default_exception_vsr, \ + : _vector_ == CYGNUM_HAL_VECTOR_BREAKPOINT \ + ? (CYG_ADDRESS)__break_vsr_springboard \ + : (CYG_ADDRESS)__default_exception_vsr, \ _poldvsr_ ); \ CYG_MACRO_END
--- a/packages/hal/mips/arch/current/include/hal_io.h +++ b/packages/hal/mips/arch/current/include/hal_io.h @@ -63,6 +63,10 @@ typedef volatile CYG_ADDRWORD HAL_IO_REGISTER; //----------------------------------------------------------------------------- +// HAL IO macros. +#ifndef HAL_IO_MACROS_DEFINED + +//----------------------------------------------------------------------------- // BYTE Register access. // Individual and vectorized access to 8 bit registers. @@ -135,6 +139,11 @@ typedef volatile CYG_ADDRWORD HAL_IO_REG ((volatile CYG_WORD32 *)(_register_))[_j_] = (_buf_)[_i_]; \ } +#define HAL_IO_MACROS_DEFINED + +#endif + + //----------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_HAL_IO_H // End of hal_io.h
--- a/packages/hal/mips/arch/current/src/vectors.S +++ b/packages/hal/mips/arch/current/src/vectors.S @@ -63,7 +63,7 @@ .section ".reset_vector","ax" # Reset vector at 0xBFC00000 - + FUNC_START(reset_vector) #ifndef CYG_HAL_STARTUP_RAM @@ -236,11 +236,18 @@ 1: b 1b nop #endif - - # At present we treat this like an NMI. + + # Treat a warm-start either as a cold-start or an NMI +#if defined(CYGHWR_HAL_MIPS_WARMSTART_COLDSTART) + lar v0,_start # jump to start + jr v0 + nop # (delay slot) +#else + # Defaults to NMI b __nmi_entry nop - +#endif + FUNC_END(__warm_start) ##----------------------------------------------------------------------------- @@ -730,14 +737,42 @@ FUNC_START(hal_interrupt_stack_call_pend FUNC_END(hal_interrupt_stack_call_pending_DSRs) #endif -##----------------------------------------------------------------------------- +##----------------------------------------------------------------------------- ## Short circuit in case any code tries to use "__gccmain()" FUNC_START(__gccmain) jr ra nop FUNC_END(__gccmain) + +##----------------------------------------------------------------------------- +## VSR springboard for break instruction exceptions +## Both GCC and GDB use break instructions. GCC for division-by-zero +## notification and GDB for program-flow breakpoints. This springboard +## looks for the d-b-z kind and directs them to another vector so libc +## can handle these without affecting the debugger. +FUNC_START(__break_vsr_springboard) + mfc0 k0,epc + mfc0 k1,cause + bltzl k1,1f + addi k0,k0,4 # delay slot (only executed if BD set) +1: lw k1,0(k0) # get break instruction + la k0,0x0007000d # break 0x7 used by GCC for d-b-z + bne k0,k1,2f + nop + ori k0,$0,14*4 # CYGNUM_HAL_VECTOR_DIV_BY_ZERO + la k1,hal_vsr_table # address of VSR table + add k1,k1,k0 # offset of VSR entry + lw k1,0(k1) # k1 = pointer to VSR + jr k1 # go there + nop # (delay slot) +2: ori k0,$0,9*4 # CYGNUM_HAL_VECTOR_BREAKPOINT + j __default_exception_vsr + nop # (delay slot) +FUNC_END(__break_vsr_springboard) + + ##----------------------------------------------------------------------------- ## Interrupt Stack. ## Used during intialization and for executing ISRs.
--- a/packages/kernel/current/ChangeLog +++ b/packages/kernel/current/ChangeLog @@ -1,3 +1,8 @@ +2000-05-15 Jonathan Larmour <jlarmour@redhat.co.uk> + + * cdl/counters.cdl (CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY): + Default to CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY + 2000-05-04 Jonathan Larmour <jlarmour@redhat.co.uk> * include/instrmnt.h: Remove all CYG_UNUSED_PARAMs as they could
--- a/packages/kernel/current/cdl/counters.cdl +++ b/packages/kernel/current/cdl/counters.cdl @@ -203,9 +203,8 @@ cdl_option CYGVAR_KERNEL_COUNTERS_CLOCK_ cdl_option CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY { display "Measure real-time \[clock\] DSR latency" - requires CYGVAR_KERNEL_COUNTERS_CLOCK requires CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY - default_value 0 + default_value CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY description " Measure the DSR latency as seen by the real-time clock timer interrupt. This requires hardware support, defined by
--- a/packages/language/c/libc/current/ChangeLog +++ b/packages/language/c/libc/current/ChangeLog @@ -1,3 +1,7 @@ +2000-05-16 Jesper Skov <jskov@redhat.com> + + * tests/signal/signal2.c: Also reset DIV_BY_ZERO vector. + 2000-04-05 Jesper Skov <jskov@redhat.com> * src/time/settime.cxx:
--- a/packages/language/c/libc/current/tests/signal/signal2.c +++ b/packages/language/c/libc/current/tests/signal/signal2.c @@ -176,6 +176,9 @@ main( int argc, char *argv[] ) #ifdef CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION, NULL ); #endif +#ifdef CYGNUM_HAL_EXCEPTION_DIV_BY_ZERO + HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_DIV_BY_ZERO, NULL ); +#endif #endif #ifdef CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS
