Mercurial > flash_v2
diff packages/kernel/current/src/debug/dbg-thread-demux.c @ 0:3111d98ba7b3 ecos-v1_1-release
Initial commit of eCos version 1.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 11:16:07 +0000 |
| parents | |
| children | 443894e2e912 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/kernel/current/src/debug/dbg-thread-demux.c @@ -0,0 +1,160 @@ +/*========================================================================== +// +// dbg-thread-demux.c +// +// GDB Stub ROM system calls +// +//========================================================================== +//####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 Cygnus Solutions. All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: +// Date: 1998-09-03 +// Purpose: GDB Stub ROM system calls +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + + +/* This file implements system calls out from the ROM debug stub into + the operating environment. + We assume they exist in the same address space. + This file should be linked into your operating environment, your O.S. + or whatever is managing multiple saved process contexts. + Your O.S. needs to implement and provide + dbg_thread_capabilities + dbg_currthread + dbg_threadlist + dbg_threadinfo + dbg_getthreadreg + dbg_setthreadreg + + The debug stub will call this function by calling it indirectly + vis a pre-assigned location possably somthing like a virtual vector table. + Where this is exactly is platform specific. + + The O.S. should call patch_dbg_syscalls() and pass the address of the + location to be patched with the dbg_thread_syscall_rmt function. + Nothing really calls this by name. + + This scheme would also work if we wanted to use a real trapped system call. + */ + +// ------------------------------------------------------------------------- + +#include <pkgconf/kernel.h> + +#include "cyg/hal/dbg-threads-api.h" +#include "dbg-thread-syscall.h" + +// ------------------------------------------------------------------------- + +static int dbg_thread_syscall_rmt( + enum dbg_syscall_ids id, + union dbg_thread_syscall_parms * p + ) +{ + switch (id) + { + case dbg_null_func : return 1 ; /* test the syscall apparatus */ + +#ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT + case dbg_capabilities_func : + return dbg_thread_capabilities(p->cap_parms.abilities) ; + break ; + case dbg_currthread_func : + return dbg_currthread(p->currthread_parms.ref) ; + break ; + case dbg_threadlist_func : + return dbg_threadlist(p->threadlist_parms.startflag, + p->threadlist_parms.lastid, + p->threadlist_parms.nextthreadid) ; + break ; + case dbg_threadinfo_func : + return dbg_threadinfo(p->info_parms.ref, + p->info_parms.info + ) ; + break ; + case dbg_getthreadreg_func : + return dbg_getthreadreg(p->reg_parms.thread, + p->reg_parms.regcount, + p->reg_parms.registers) ; + break ; + case dbg_setthreadreg_func : + return dbg_setthreadreg(p->reg_parms.thread, + p->reg_parms.regcount, + p->reg_parms.registers) ; + break ; +#endif /* CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT */ + default : + return 0 ; /* failure tue to non-implementation */ + } +} + +// ------------------------------------------------------------------------- +// When Cygmon calls us on the TX39 It has its own value in GP. We need to +// save that and set our own before proceeding. + +#ifdef CYG_HAL_TX39 +static int dbg_thread_syscall_rmt_1( + enum dbg_syscall_ids id, + union dbg_thread_syscall_parms * p + ) +{ + + register long gp_save; + int r; + asm ( "move %0,$28;" + ".extern _gp;" + "la $gp,_gp;" + : "=r"(gp_save) + ); + + r = dbg_thread_syscall_rmt( id, p ); + + asm ( "move $gp,%0;" :: "r"(gp_save) ); + + return r; + +} +#endif + +// ------------------------------------------------------------------------- + +void patch_dbg_syscalls(void * vector) +{ + dbg_syscall_func * f ; + f = vector ; +#ifdef CYG_HAL_TX39 + *f = dbg_thread_syscall_rmt_1 ; +#else + *f = dbg_thread_syscall_rmt ; +#endif +} + +// ------------------------------------------------------------------------- +// End of dbg-thread-demux.c
