diff packages/hal/common/current/src/hal_misc.c @ 101:c37d3a9e1b28 ecos-sw-2000-06-16

Merge from eCos master repository on 2000-06-16-07:47:03-BST
author jlarmour
date Fri, 16 Jun 2000 16:43:59 +0000
parents
children 5a0cc6c243a9
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/hal/common/current/src/hal_misc.c
@@ -0,0 +1,147 @@
+//==========================================================================
+//
+//      hal_misc.c
+//
+//      Common HAL miscellaneous functions
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//                                                                          
+// -------------------------------------------                              
+// The contents of this file are subject to the Red Hat eCos Public License 
+// Version 1.1 (the "License"); you may not use this file except in         
+// compliance with the License.  You may obtain a copy of the License at    
+// http://www.redhat.com/                                                   
+//                                                                          
+// 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 Configurable Operating System,      
+// released September 30, 1998.                                             
+//                                                                          
+// The Initial Developer of the Original Code is Red Hat.                   
+// Portions created by Red Hat are                                          
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.                             
+// All Rights Reserved.                                                     
+// -------------------------------------------                              
+//                                                                          
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    nickg
+// Contributors: nickg, jskov
+// Date:         2000-06-08
+// Purpose:      HAL miscellaneous functions
+// Description:  This file contains miscellaneous functions provided by the
+//               HAL.
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+#include <pkgconf/hal.h>
+
+#include <cyg/hal/hal_arch.h>
+#include <cyg/hal/hal_if.h>
+
+#include <cyg/hal/hal_intr.h>
+#include <cyg/hal/hal_misc.h>           // our header
+
+#include <cyg/infra/cyg_type.h>         // Base types
+#include <cyg/infra/cyg_trac.h>         // tracing macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+
+//--------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Macro for finding return address. 
+#ifndef CYGARC_HAL_GET_RETURN_ADDRESS
+
+#define CYGARC_HAL_GET_RETURN_ADDRESS(_x_) \
+  (_x_) = (CYG_ADDRWORD)&&__backup_return_address
+
+#define CYGARC_HAL_GET_RETURN_ADDRESS_BACKUP() \
+__backup_return_address:
+
+#endif
+
+//--------------------------------------------------------------------------
+// Functions to support the detection and execution of a user provoked
+// program break. These are usually called from interrupt routines.
+
+cyg_bool
+cyg_hal_is_break(char *buf, int size)
+{
+    while( size )
+        if( buf[--size] == 0x03 ) return true;
+
+    return false;
+}
+
+void 
+cyg_hal_user_break( CYG_ADDRWORD *regs )
+{
+#if defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs) \
+    || defined(CYGSEM_HAL_USE_ROM_MONITOR_CygMon) \
+    || defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
+
+    CYG_ADDRWORD __ra;
+    CYG_WORD32 __pc;
+    HAL_SavedRegisters *sreg = (HAL_SavedRegisters *)regs;
+
+    CYGARC_HAL_GET_RETURN_ADDRESS(__ra);
+
+    if( regs == NULL ) __pc = __ra;
+    else __pc = sreg->pc;
+
+    CYGACC_CALL_IF_INSTALL_BPT_FN()((void *)__pc);
+
+    CYGARC_HAL_GET_RETURN_ADDRESS_BACKUP();
+    
+#else
+
+    HAL_BREAKPOINT(breakinst);
+
+#endif
+}
+
+
+//--------------------------------------------------------------------------
+// The system default interrupt ISR. It calls the architecture default
+// ISR as well if necessary.
+externC cyg_uint32 hal_arch_default_isr(CYG_ADDRWORD vector, 
+                                        CYG_ADDRWORD data);
+
+cyg_uint32
+hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)
+{
+    cyg_uint32 result;
+
+#if (defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT)        \
+     || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT)) && \
+    defined(CYGHWR_HAL_GDB_PORT_VECTOR) &&              \
+    defined(HAL_CTRLC_ISR)
+
+#ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN    
+    if( vector == CYGHWR_HAL_GDB_PORT_VECTOR )
+#endif        
+    {
+        result = HAL_CTRLC_ISR( vector, data );
+        if( 0 != result ) return result;
+    }
+#endif
+
+    result = hal_arch_default_isr (vector, data);
+    if( 0 != result) return result;
+
+    CYG_TRACE1(true, "Interrupt: %d", vector);
+    CYG_FAIL("Spurious Interrupt!!!");
+    return 0;
+}
+
+
+//--------------------------------------------------------------------------
+// End of hal_misc.c