基于ecos的redboot

源代码在线查看: dbg-threads-syscall.c

软件大小: 3069 K
上传用户: downloader_006
关键词: redboot ecos
下载地址: 免注册下载 普通下载 VIP

相关代码

				//========================================================================
				//
				//      dbg-threads-syscall.c
				//
				//      Pseudo system calls for multi-threaded debug support
				//
				//========================================================================
				//####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):     Red Hat, nickg
				// Contributors:  Red Hat, nickg
				// Date:          1998-08-25
				// Purpose:       
				// Description:   Pseudo system calls to bind system specific multithread
				//                debug support with a ROM monitor, cygmon. We call it
				//                Cygmon, but the feature lives in libstub.
				// Usage:         
				//
				//####DESCRIPTIONEND####
				//
				//========================================================================
				
				#include 
				#include 
				
				#if !defined(CYGPKG_KERNEL) && defined(CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT)
				
				/* Only include this code if we do not have a kernel. Otherwise the kernel
				 * supplies these functions for the app we are linked with.
				 */
				
				#include 
				#include 
				
				
				static dbg_syscall_func * dbg_syscall_ptr ;
				
				static union dbg_thread_syscall_parms tcall ;
				
				/* ----- INIT_THREADS_SYSCALL --------------------------------------- */
				/* Some external bing and configuration logic knows how to setup
				   the ststem calls. In the first implementation, we have used a vector
				   in the secondary vector table. This functions allows us to isolate that
				   sort of system specific detail. Similarly, we do not export the
				   specific detail of a dbg_syscall_func.
				 */
				
				
				void init_threads_syscall(void * vector)
				{
				   dbg_syscall_ptr = vector ; /* AH, the easy compatability of the
				   void pointer*/
				} /* init_threads_syscall */
				
				/* All forms of failure return 0 */
				/* Whether non support, incomplete initialization, unknown thread */
				static __inline__ int dbg_thread_syscall(
								     enum dbg_syscall_ids id)
				{
				  dbg_syscall_func f ; /* double indirect via */
				  if (0 ==(f = *dbg_syscall_ptr)) return 0 ; /* no pointer to vector */
				  if (0 == *f) return 0 ; /* vector not initialized */
				  return (*f)(id,&tcall);
				}
				
				
				
				
				/* ------- INIT_THREAD_SYSCALL -------------------------------------------  */
				/* Received the address of the entry in the secondary interrupt vector table */
				/* This table is the interchange between the O.S. and Cygmon/libstub         */
				/* This could get more complex so, I am doing it with a function
				   rather than exposing the internals.
				 */
				void init_thread_syscall(void * vector)
				{
				  dbg_syscall_ptr = vector ;
				}
				
				int dbg_thread_capabilities(struct dbg_capabilities * cbp)
				{
				#if 0    
				  tcall.cap_parms.abilities = cbp ;
				  return dbg_thread_syscall(dbg_capabilities_func) ;
				#else
				    cbp->mask1 = has_thread_current     |
				        has_thread_registers            |
				        has_thread_reg_change           |
				        has_thread_list                 |
				        has_thread_info                 ;
				    return 1 ; 
				#endif  
				}
				
				int dbg_currthread(threadref * varparm)
				{
				  tcall.currthread_parms.ref = varparm ;
				  return dbg_thread_syscall(dbg_currthread_func) ;
				}
				
				
				int dbg_threadlist(
						   int startflag,
						   threadref * lastthreadid,
						   threadref * next_thread
						   )
				{
				  tcall.threadlist_parms.startflag = startflag ;
				  tcall.threadlist_parms.lastid = lastthreadid ;
				  tcall.threadlist_parms.nextthreadid = next_thread ;
				  return dbg_thread_syscall(dbg_threadlist_func) ;
				}
				
				int dbg_threadinfo(
						   threadref * threadid,
						   struct cygmon_thread_debug_info * info)
				{
				  tcall.info_parms.ref = threadid ;
				  tcall.info_parms.info = info ;
				  return dbg_thread_syscall(dbg_threadinfo_func) ;
				}
				
				int dbg_getthreadreg(
						     threadref * osthreadid,
						     int regcount, /* count of registers in the array */
						     void * regval)  /* fillin this array */
				{
				  tcall.reg_parms.thread =    osthreadid ;
				  tcall.reg_parms.regcount =  regcount ;
				  tcall.reg_parms.registers = regval ;
				  return dbg_thread_syscall(dbg_getthreadreg_func) ;
				}
				
				int dbg_setthreadreg(
						     threadref * osthreadid, 
						     int regcount , /* number of registers */
						     void * regval)
				{
				  tcall.reg_parms.thread =    osthreadid ;
				  tcall.reg_parms.regcount =  regcount ;
				  tcall.reg_parms.registers =  regval ;
				  return dbg_thread_syscall(dbg_setthreadreg_func) ;
				} /* dbg_setthreadreg */
				
				int dbg_scheduler(threadref *thread_id, int lock, int mode)
				{
				  tcall.scheduler_parms.thread    = thread_id;
				  tcall.scheduler_parms.lock      = lock ;
				  tcall.scheduler_parms.mode      = mode ;
				
				  return dbg_thread_syscall(dbg_scheduler_func) ;
				}
				
				
				
				#if (CYG_BYTEORDER == CYG_LSBFIRST)
				
				unsigned long swap32(unsigned long x)
				{
				    unsigned long r = 0;
				
				    r |= (x>>24)&0xFF;
				    r |= ((x>>16)&0xFF)				    r |= ((x>>8)&0xFF)				    r |= ((x)&0xFF)				
				    return r;
				}
				
				#else
				
				#define swap32(x) ((unsigned long)(x))
				
				#endif
				
				int dbg_currthread_id(void)
				{
				    threadref ref;
				    if( dbg_currthread( &ref ) )
				        return (cyg_uint16)swap32(((unsigned long *)ref)[1]);
				    else return 0;
				}
				
				#endif
							

相关资源