URL
https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk
Subversion Repositories openrisc_me
Compare Revisions
- This comparison shows the changes necessary to convert path
/openrisc/trunk/rtos/ecos-2.0/packages/hal/common/v2_0/include
- from Rev 27 to Rev 174
- ↔ Reverse comparison
Rev 27 → Rev 174
/dbg-thread-syscall.h
0,0 → 1,111
//======================================================================== |
// |
// dbg-thread-syscall.h |
// |
// Supports thread-aware debugging |
// |
//======================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//======================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): Red Hat, nickg |
// Contributors: Red Hat, nickg |
// Date: 1998-08-25 |
// Purpose: |
// Description: Supports thread-aware debugging |
// Usage: This header is not to be included by user code. |
// This file should be included only by |
// thread-syscall-relay.c and dbg-thread-demux.c |
// |
//####DESCRIPTIONEND#### |
// |
//======================================================================== |
|
|
enum dbg_syscall_ids |
{ |
dbg_null_func , |
dbg_capabilities_func, |
dbg_currthread_func, |
dbg_threadlist_func, |
dbg_threadinfo_func, |
dbg_getthreadreg_func, |
dbg_setthreadreg_func, |
dbg_scheduler_func, |
} ; |
|
|
union dbg_thread_syscall_parms |
{ |
struct |
{ |
struct dbg_capabilities * abilities ; |
} cap_parms ; |
|
struct |
{ |
threadref * ref ; |
} currthread_parms ; |
|
struct |
{ |
int startflag ; |
threadref * lastid ; |
threadref * nextthreadid ; |
} threadlist_parms ; |
|
struct |
{ |
threadref * ref ; |
struct cygmon_thread_debug_info * info ; |
} info_parms ; |
|
struct |
{ |
threadref * thread ; |
int regcount ; |
void * registers ; |
} reg_parms ; |
struct |
{ |
threadref * thread ; /* 64-bit thread identifier */ |
int lock; /* 0 == unlock, 1 == lock */ |
int mode; /* 0 == short (step), 1 == continue */ |
} scheduler_parms ; |
} ; |
|
|
typedef int (*dbg_syscall_func) (enum dbg_syscall_ids id, |
union dbg_thread_syscall_parms * p ) ; |
/hal_spd.h
0,0 → 1,78
#ifndef CYGONCE_HAL_HAL_SPD_H |
#define CYGONCE_HAL_HAL_SPD_H |
|
//============================================================================= |
// |
// hal_spd.h |
// |
// HAL header for SDRAM Serial Presence Detect support. |
// |
//============================================================================= |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//============================================================================= |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): msalter |
// Contributors:msalter |
// Date: 2002-01-17 |
// Purpose: Generic HAL SPD header. |
// Usage: #include <cyg/hal/hal_spd.h> |
// Description: This header provides byte numbers and bit definitions for |
// serial EEPROM containing SDRAM module information. |
// |
//####DESCRIPTIONEND#### |
// |
//============================================================================= |
|
// Commonly used bytes |
#define SPD_BANKCNT 5 // number of module banks |
#define SPD_CONFIG 11 // DIMM configuration type (Parity or not, EEC) |
#define SPD_REFRESH 12 // Referesh rate |
#define SPD_SDRAM_WIDTH 13 // DRAM width |
#define SPD_MOD_ATTRIB 21 // DRAM module attribute |
#define SPD_BANKSZ 31 // module bank density |
#define SPD_CHECKSUM 63 // checksum for bytes 0-62 |
|
// SPD_MOD_ATTRIB bits |
#define SPD_ATTRIB_BUF_CTL 0x01 // Buffered Addr/Control inputs |
#define SPD_ATTRIB_REG_CTL 0x02 // Registered Addr/Control inputs |
#define SPD_ATTRIB_PLL 0x04 // On-card PLL |
#define SPD_ATTRIB_BUF_DQ 0x08 // Buffered DQMB inputs |
#define SPD_ATTRIB_REG_DQ 0x10 // Registered DQMB inputs |
#define SPD_ATTRIB_DIFF 0x20 // Differential clock input |
#define SPD_ATTRIB_RRA 0x40 // Redundant Row Address |
|
//----------------------------------------------------------------------------- |
#endif // CYGONCE_HAL_HAL_SPD_H |
// End of hal_spd.h |
/dbg-threads-api.h
0,0 → 1,161
//======================================================================== |
// |
// dbg-threads-api.h |
// |
// Supports thread-aware debugging |
// |
//======================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//======================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): Red Hat, nickg |
// Contributors: Red Hat, nickg |
// Date: 1998-08-25 |
// Purpose: |
// Description: These are the calls used to extract operating system |
// specific information used in supporting thread aware |
// debugging. The Operating Environment being debugged |
// needs to supply these functions. |
// Usage: This header is not to be included by user code. |
// |
//####DESCRIPTIONEND#### |
// |
//======================================================================== |
|
#if !defined(DBG_THREADS_API_INCLUDED) |
#define DBG_THREADS_API_INCLUDED 1 |
|
#include <cyg/infra/cyg_type.h> /* externC */ |
|
#define has_thread_void 0 |
#define has_thread_current 1 |
#define has_thread_registers 2 |
#define has_thread_reg_change 4 |
#define has_thread_list 8 |
#define has_thread_info 16 |
|
typedef unsigned char threadref[8] ; |
|
struct dbg_capabilities |
{ |
unsigned long mask1 ; |
} ; |
|
|
/* fill in the list of thread aware capabilities */ |
externC int dbg_thread_capabilities(struct dbg_capabilities * cbp) ; |
|
|
/* Fillin the identifier of the current thread */ |
/* return 1 if defined, 0 if not defined */ |
externC int dbg_currthread(threadref * varparm) ; |
|
/* Return the unique ID number of a given thread. */ |
/* Return 0 if not valid. */ |
externC int dbg_thread_id(threadref *threadid); |
|
/* Return the unique ID number of the current thread. */ |
externC int dbg_currthread_id(void); |
|
/* get the first or next member of the list of known threads */ |
externC int dbg_threadlist(int startflag, |
threadref * lastthreadid, |
threadref * next_thread |
) ; |
|
/* return 1 if next_threadid has been filled in with a value */ |
/* return 0 if there are none or no more */ |
|
/* The O.S can fill in the following information about a thread when queried. |
The structure of thise strings is determined by the O.S. |
It is display oriented, so figure out what the users need to see. |
Nulls are OK but GDB will fill some not so meaningful data. |
These pointers may be in the calles private structures, the info will |
get copied immediatly after the call to retreive it. |
*/ |
struct cygmon_thread_debug_info |
{ |
threadref thread_id ; |
int context_exists ; /* To the point where examining its state, |
registers and stack makes sense to GDB */ |
char * thread_display ; /* As shown in thread status window, name, state */ |
char * unique_thread_name ; /* human readable identifier, window label */ |
char * more_display ; /* more detailed info about thread. |
priority, queuedepth, state, stack usage, statistics */ |
} ; |
|
|
|
|
externC int dbg_threadinfo( |
threadref * threadid, |
struct cygmon_thread_debug_info * info) ; |
|
/* Return 1 if threadid is defined and info copied, 0 otherwise */ |
|
/* The O.S should fillin the array of registers using values from the |
saves context. The array MUST be in GDB register save order even if |
the saved context is different or smaller. Do not alter the values of |
registers which are NOT in the O.S. thread context. Their default values |
have already been assigned. |
*/ |
|
externC int dbg_getthreadreg( |
threadref * osthreadid, |
int regcount, /* count of registers in the array */ |
void * regval) ; /* fillin this array */ |
|
|
/* The O.S. should scan through this list of registers which are in |
GDB order and the O.S. should replace the values of all registers |
which are defined in the saved context of thread or process identified |
by osthreadid. Return 0 if the threadis does not map to a known |
process or other error. Return 1 if the setting is successful. */ |
|
externC int dbg_setthreadreg( |
threadref * osthreadid, |
int regcount , /* number of registers */ |
void * regval) ; |
|
/* Control over OS scheduler. With the scheduler locked it should not |
perform any rescheduling in response to interrupts. */ |
externC int dbg_scheduler( |
threadref * osthreadid, |
int lock, /* 0 == unlock, 1 == lock */ |
int mode); /* 0 == step, 1 == continue */ |
|
|
|
#endif /* DBG_THREADS_API_INCLUDED */ |
/hal_arbiter.h
0,0 → 1,142
#ifndef CYGONCE_HAL_HAL_ARBITER_H |
#define CYGONCE_HAL_HAL_ARBITER_H |
|
//============================================================================= |
// |
// hal_arbiter.h |
// |
// Functionality used by ISR arbiters |
// |
//============================================================================= |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//============================================================================= |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): jskov |
// Contributors:jskov |
// Date: 2001-06-29 |
// Purpose: Functionality used by ISR arbiters |
// Usage: #include <cyg/hal/hal_arbiter.h> |
// |
//####DESCRIPTIONEND#### |
// |
//============================================================================= |
|
#include <cyg/hal/hal_intr.h> // hal_interrupt_x tables |
#include <cyg/hal/drv_api.h> // CYG_ISR_HANDLED |
|
//============================================================================= |
// Function used to call ISRs from ISR arbiters |
// An arbiter is hooked on the shared interrupt vector and looks like this: |
// |
// cyg_uint32 _arbitration_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data) |
// { |
// cyg_uint32 isr_ret; |
// // decode interrupt source and for each active source call the ISR |
// if (source_A_active) { |
// isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_SOURCE_A); |
// #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN |
// if (isr_ret & CYG_ISR_HANDLED) |
// #endif |
// return isr_ret; |
// } |
// if (source_B_active) { |
// isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_SOURCE_B); |
// #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN |
// if (isr_ret & CYG_ISR_HANDLED) |
// #endif |
// return isr_ret; |
// } |
// ... |
// return 0; |
// } |
// |
// Remember to attach and enable the arbiter source: |
// HAL_INTERRUPT_ATTACH(CYGNUM_HAL_INTERRUPT_ARBITER, &_arbitration_isr, 0, 0); |
// HAL_INTERRUPT_SET_LEVEL(CYGNUM_HAL_INTERRUPT_ARBITER, 1); |
// HAL_INTERRUPT_UNMASK(CYGNUM_HAL_INTERRUPT_ARBITER); |
// |
|
typedef cyg_uint32 cyg_ISR(cyg_uint32 vector, CYG_ADDRWORD data); |
|
extern void cyg_interrupt_post_dsr( CYG_ADDRWORD intr_obj ); |
|
#ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN |
|
static inline cyg_uint32 |
hal_call_isr (cyg_uint32 vector) |
{ |
cyg_ISR *isr; |
CYG_ADDRWORD data; |
cyg_uint32 isr_ret; |
|
isr = (cyg_ISR*) hal_interrupt_handlers[vector]; |
data = hal_interrupt_data[vector]; |
|
isr_ret = (*isr) (vector, data); |
|
#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT |
if (isr_ret & CYG_ISR_CALL_DSR) { |
cyg_interrupt_post_dsr (hal_interrupt_objects[vector]); |
} |
#endif |
|
return isr_ret & ~CYG_ISR_CALL_DSR; |
} |
|
#else |
|
// In chained mode, assume vector 0 points to the chain |
// handler. Simply call it with the vector number and let it find the |
// ISR to call - it will also post DSRs as required. |
static inline cyg_uint32 |
hal_call_isr (cyg_uint32 vector) |
{ |
cyg_ISR *isr; |
CYG_ADDRWORD data; |
cyg_uint32 isr_ret; |
|
isr = (cyg_ISR*) hal_interrupt_handlers[0]; |
data = hal_interrupt_data[0]; |
|
isr_ret = (*isr) (vector, data); |
|
return isr_ret; |
} |
|
#endif |
|
//----------------------------------------------------------------------------- |
#endif // CYGONCE_HAL_HAL_ARBITER_H |
// End of hal_arbiter.h |
/hal_tables.h
0,0 → 1,115
#ifndef CYGONCE_HAL_TABLES_H |
#define CYGONCE_HAL_TABLES_H |
|
/*========================================================================== |
// |
// hal_tables.h |
// |
// Data table management |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): nickg |
// Date: 2000-09-04 |
// Purpose: Provide HAL tables |
// Description: This file defines a mechanism to include "tables" of objects |
// that are always included in the image no matter what, and are |
// constrained between labels. |
// |
// Usage: #include <cyg/hal/hal_tables.h> |
// |
//####DESCRIPTIONEND#### |
// |
//========================================================================*/ |
|
#include <pkgconf/hal.h> |
#include <cyg/infra/cyg_type.h> |
|
#include <cyg/hal/hal_arch.h> |
|
/*------------------------------------------------------------------------*/ |
|
#define __string(_x) #_x |
#define __xstring(_x) __string(_x) |
|
#ifndef CYG_HAL_TABLE_BEGIN |
#define CYG_HAL_TABLE_BEGIN( _label, _name ) \ |
__asm__(".section \".ecos.table." __xstring(_name) ".begin\",\"aw\"\n" \ |
".globl " __xstring(CYG_LABEL_DEFN(_label)) "\n" \ |
".type " __xstring(CYG_LABEL_DEFN(_label)) ",object\n" \ |
".p2align " __xstring(CYGARC_P2ALIGNMENT) "\n" \ |
__xstring(CYG_LABEL_DEFN(_label)) ":\n" \ |
".previous\n" \ |
) |
#endif |
|
#ifndef CYG_HAL_TABLE_END |
#define CYG_HAL_TABLE_END( _label, _name ) \ |
__asm__(".section \".ecos.table." __xstring(_name) ".finish\",\"aw\"\n" \ |
".globl " __xstring(CYG_LABEL_DEFN(_label)) "\n" \ |
".type " __xstring(CYG_LABEL_DEFN(_label)) ",object\n" \ |
".p2align " __xstring(CYGARC_P2ALIGNMENT) "\n" \ |
__xstring(CYG_LABEL_DEFN(_label)) ":\n" \ |
".previous\n" \ |
) |
#endif |
|
// This macro must be applied to any types whose objects are to be placed in |
// tables |
#ifndef CYG_HAL_TABLE_TYPE |
#define CYG_HAL_TABLE_TYPE CYGBLD_ATTRIB_ALIGN( CYGARC_ALIGNMENT ) |
#endif |
|
#ifndef CYG_HAL_TABLE_EXTRA |
#define CYG_HAL_TABLE_EXTRA( _name ) \ |
CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".extra") |
#endif |
|
#ifndef CYG_HAL_TABLE_ENTRY |
#define CYG_HAL_TABLE_ENTRY( _name ) \ |
CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data") |
#endif |
|
#ifndef CYG_HAL_TABLE_QUALIFIED_ENTRY |
#define CYG_HAL_TABLE_QUALIFIED_ENTRY( _name, _qual ) \ |
CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data." \ |
__xstring(_qual)) |
#endif |
|
/*------------------------------------------------------------------------*/ |
/* EOF hal_tables.h */ |
#endif // CYGONCE_HAL_TABLES_H |
/hal_misc.h
0,0 → 1,123
#ifndef CYGONCE_HAL_HAL_MISC_H |
#define CYGONCE_HAL_HAL_MISC_H |
|
//============================================================================= |
// |
// hal_misc.h |
// |
// HAL header for miscellaneous helper routines |
// |
//============================================================================= |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//============================================================================= |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): jskov |
// Contributors:jskov |
// Date: 2000-06-08 |
// Purpose: Miscellaneous routines shared between HALs |
// Usage: #include <cyg/hal/hal_misc.h> |
// |
//####DESCRIPTIONEND#### |
// |
//============================================================================= |
|
#ifndef __ASSEMBLER__ |
#include <cyg/infra/cyg_type.h> // types & externC |
|
//============================================================================= |
externC cyg_bool cyg_hal_is_break(char *buf, int size); |
externC void cyg_hal_user_break( CYG_ADDRWORD *regs ); |
#endif |
|
//============================================================================= |
|
#define BIT0 0x00000001 |
#define BIT1 0x00000002 |
#define BIT2 0x00000004 |
#define BIT3 0x00000008 |
#define BIT4 0x00000010 |
#define BIT5 0x00000020 |
#define BIT6 0x00000040 |
#define BIT7 0x00000080 |
#define BIT8 0x00000100 |
#define BIT9 0x00000200 |
#define BIT10 0x00000400 |
#define BIT11 0x00000800 |
#define BIT12 0x00001000 |
#define BIT13 0x00002000 |
#define BIT14 0x00004000 |
#define BIT15 0x00008000 |
#define BIT16 0x00010000 |
#define BIT17 0x00020000 |
#define BIT18 0x00040000 |
#define BIT19 0x00080000 |
#define BIT20 0x00100000 |
#define BIT21 0x00200000 |
#define BIT22 0x00400000 |
#define BIT23 0x00800000 |
#define BIT24 0x01000000 |
#define BIT25 0x02000000 |
#define BIT26 0x04000000 |
#define BIT27 0x08000000 |
#define BIT28 0x10000000 |
#define BIT29 0x20000000 |
#define BIT30 0x40000000 |
#define BIT31 0x80000000 |
|
#define SZ_1K 0x00000400 |
#define SZ_2K 0x00000800 |
#define SZ_4K 0x00001000 |
#define SZ_8K 0x00002000 |
#define SZ_16K 0x00004000 |
#define SZ_32K 0x00008000 |
#define SZ_64K 0x00010000 |
#define SZ_128K 0x00020000 |
#define SZ_256K 0x00040000 |
#define SZ_512K 0x00080000 |
#define SZ_1M 0x00100000 |
#define SZ_2M 0x00200000 |
#define SZ_4M 0x00400000 |
#define SZ_8M 0x00800000 |
#define SZ_16M 0x01000000 |
#define SZ_32M 0x02000000 |
#define SZ_64M 0x04000000 |
#define SZ_128M 0x08000000 |
#define SZ_256M 0x10000000 |
#define SZ_512M 0x20000000 |
#define SZ_1G 0x40000000 |
|
//----------------------------------------------------------------------------- |
#endif // CYGONCE_HAL_HAL_MISC_H |
// End of hal_misc.h |
/hal_stub.h
0,0 → 1,390
#ifndef CYGONCE_HAL_HAL_STUB_H |
#define CYGONCE_HAL_HAL_STUB_H |
|
//============================================================================= |
// |
// hal_stub.h |
// |
// HAL header for GDB stub support. |
// |
//============================================================================= |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//============================================================================= |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): jskov |
// Contributors:jskov |
// Date: 1999-02-12 |
// Purpose: Generic HAL stub header. |
// Usage: #include <cyg/hal/hal_stub.h> |
// Description: This header is included by generic-stub.c to provide an |
// interface to the eCos-specific stub implementation. It is |
// not to be included by user code, and is only placed in a |
// publically accessible directory so that platform stub packages |
// are able to include it if required. |
// |
//####DESCRIPTIONEND#### |
// |
//============================================================================= |
|
#include <pkgconf/hal.h> |
|
#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
#define USE_GDBSTUB_PROTOTYPES 0 // avoid stub-tservice.h atm |
#ifndef __ECOS__ |
#define __ECOS__ // use to mark eCos hacks |
#endif |
|
#include <cyg/hal/basetype.h> // HAL_LABEL_NAME |
#include <cyg/hal/hal_arch.h> // HAL header |
#include <cyg/infra/cyg_type.h> // cyg_uint32 and CYG_BYTEORDER |
|
#ifndef __CYGMON_TYPES |
#define __CYGMON_TYPES |
typedef cyg_uint32 uint32; |
typedef cyg_int32 int32; |
#endif // __CYGMON_TYPES |
|
#ifdef CYGBLD_HAL_PLATFORM_STUB_H |
#include CYGBLD_HAL_PLATFORM_STUB_H |
#else |
#include <cyg/hal/plf_stub.h> |
#endif |
#include <cyg/hal/generic-stub.h> |
|
#ifdef __cplusplus |
extern "C" { |
#endif |
#if 0 |
} // to make below format correctly. |
#endif |
|
//----------------------------------------------------------------------------- |
// Definitions for generic-stub.c |
|
#define __set_mem_fault_trap(x) ({__mem_fault = 0; x(); __mem_fault;}) |
|
#if (CYG_BYTEORDER==CYG_LSBFIRST) |
# if !defined(__LITTLE_ENDIAN__) |
# define __LITTLE_ENDIAN__ |
# endif |
# if !defined(_LITTLE_ENDIAN) |
# define _LITTLE_ENDIAN |
# endif |
#endif |
|
//----------------------------------------------------------------------------- |
// Dummy definitions for harvard memory support for princeton memory systems. |
#ifndef TARGET_HAS_HARVARD_MEMORY |
typedef target_register_t target_addr_t; |
#define TARGET_ADDR_IS_PROGMEM(x) 0 |
#define TARGET_ADDR_TO_PTR(x) ((char *) (x)) |
#endif |
|
//---------------------------------------------------------------------------- |
// Signal definitions to avoid 'signal.h'/ |
#define SIGHUP 1 /* hangup */ |
#define SIGINT 2 /* interrupt */ |
#define SIGQUIT 3 /* quit */ |
#define SIGILL 4 /* illegal instruction (not reset when caught) */ |
#define SIGTRAP 5 /* trace trap (not reset when caught) */ |
#define SIGIOT 6 /* IOT instruction */ |
#define SIGABRT 6 /* used by abort, replace SIGIOT in the future */ |
#define SIGEMT 7 /* EMT instruction */ |
#define SIGFPE 8 /* floating point exception */ |
#define SIGKILL 9 /* kill (cannot be caught or ignored) */ |
#define SIGBUS 10 /* bus error */ |
#define SIGSEGV 11 /* segmentation violation */ |
#define SIGSYS 12 /* bad argument to system call */ |
#define SIGPIPE 13 /* write on a pipe with no one to read it */ |
#define SIGALRM 14 /* alarm clock */ |
#define SIGTERM 15 /* software termination signal from kill */ |
|
//---------------------------------------------------------------------------- |
// Thread support. This setting is used in thread-pkts.h |
#ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT |
#define DEBUG_THREADS 1 |
#else |
#define DEBUG_THREADS 0 |
#endif |
|
// The function stub_copy_registers() is statically defined in |
// thread-packets.c, but in eCos this external stub is defined as it |
// is used in dbg_gdb.cxx. |
externC void __stub_copy_registers(target_register_t *dest, |
target_register_t *src); |
|
//---------------------------------------------------------------------------- |
// Hardware Watch/Breakpoint support. These are the possible return values |
// of HAL_STUB_IS_STOPPED_BY_HARDWARE(). |
#define HAL_STUB_HW_STOP_NONE 0 // target did not stop for hw watch/break |
#define HAL_STUB_HW_STOP_BREAK 1 // target stopped for hw breakpoint |
#define HAL_STUB_HW_STOP_WATCH 2 // target stopped for write-only watchpoint |
#define HAL_STUB_HW_STOP_RWATCH 3 // target stopped for read-only watchpoint |
#define HAL_STUB_HW_STOP_AWATCH 4 // target stopped for access watchpoint |
|
//---------------------------------------------------------------------------- |
// Memory accessor functions. |
#define TARGET_HAS_OWN_MEM_FUNCS |
|
//---------------------------------------------------------------------------- |
// Memory access checks. |
|
#ifndef CYG_HAL_STUB_PERMIT_DATA_READ |
#define CYG_HAL_STUB_PERMIT_DATA_READ(_addr_, __count_) (1) |
#endif |
|
#ifndef CYG_HAL_STUB_PERMIT_DATA_WRITE |
#define CYG_HAL_STUB_PERMIT_DATA_WRITE(_addr_, __count_) (1) |
#endif |
|
#ifdef TARGET_HAS_HARVARD_MEMORY |
|
#ifndef CYG_HAL_STUB_PERMIT_CODE_READ |
#define CYG_HAL_STUB_PERMIT_CODE_READ(_addr_, __count_) (1) |
#endif |
|
#ifndef CYG_HAL_STUB_PERMIT_CODE_WRITE |
#define CYG_HAL_STUB_PERMIT_CODE_WRITE(_addr_, __count_) (1) |
#endif |
|
#endif |
|
//---------------------------------------------------------------------------- |
// Target extras?! |
extern int __process_target_query(char * pkt, char * out, int maxOut); |
extern int __process_target_set(char * pkt, char * out, int maxout); |
extern int __process_target_packet(char * pkt, char * out, int maxout); |
|
//--------------------------------------------------------------------------- |
// Declarations to avoid compiler warnings. |
|
// Set the baud rate for the current serial port. |
extern void __set_baud_rate (int baud); |
|
// Write C to the current serial port. |
extern void putDebugChar (int c); |
|
// Read one character from the current serial port. |
extern int getDebugChar (void); |
|
// Push CH back onto the debug stream. |
extern void ungetDebugChar (int ch); |
|
// Reset the board. |
extern void __reset (void); |
|
// Multi-bp support. |
#ifndef __set_breakpoint |
extern int __set_breakpoint (target_register_t addr, target_register_t len); |
#endif |
#ifndef __remove_breakpoint |
extern int __remove_breakpoint (target_register_t addr, target_register_t len); |
#endif |
#ifndef __set_hw_breakpoint |
extern int __set_hw_breakpoint (target_register_t addr, target_register_t len); |
#endif |
#ifndef __remove_hw_breakpoint |
extern int __remove_hw_breakpoint (target_register_t addr, target_register_t len); |
#endif |
#ifndef __set_hw_watchpoint |
extern int __set_hw_watchpoint (target_register_t addr, target_register_t len, int ztype); |
#endif |
#ifndef __remove_hw_watchpoint |
extern int __remove_hw_watchpoint (target_register_t addr, target_register_t len, int ztype); |
#endif |
|
/* Install the standard set of trap handlers for the stub. */ |
extern void __install_traps (void); |
|
/* Address in text section of a breakpoint instruction. */ |
|
#ifndef BREAKINST_DEFINED |
#define BREAKINST_DEFINED |
extern void _breakinst (void); |
#endif |
|
/* The opcode for a breakpoint instruction. */ |
|
extern unsigned long __break_opcode (void); |
|
/* Function to flush output buffers */ |
extern void hal_flush_output(void); |
|
#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT |
// This one may assume a valid saved interrupt context on some platforms |
extern void cyg_hal_gdb_interrupt (target_register_t pc); |
// This one does not; use from CRITICAL_IO_REGION macros below. |
extern void cyg_hal_gdb_place_break (target_register_t pc); |
// Remove a break from either above - or not if cyg_hal_gdb_running_step |
extern int cyg_hal_gdb_remove_break (target_register_t pc); |
// Bool: is such a breakpoint set? |
extern int cyg_hal_gdb_break_is_set (void); |
|
/* This is used so that the generic stub can tell |
* cyg_hal_gdb_remove_break() not to bother when we are avoiding stepping |
* through a critical region ie. hal_diag_write_char() usually - that |
* shares the GDB IO device. |
*/ |
extern volatile int cyg_hal_gdb_running_step; |
|
// Use these in hal_diag.c when about to write a whole $O packet to GDB. |
// NB they require __builtin_return_address() to work: if your platform |
// does not support this, use HAL_DISABLE_INTERRUPTS &c instead. |
|
#if 1 // Can use the address of a label: this is more portable |
|
// This macro may already have been defined by the architecture HAL |
#ifndef CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION |
#define CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION( _old_ ) \ |
do { \ |
HAL_DISABLE_INTERRUPTS(_old_); \ |
cyg_hal_gdb_place_break( (target_register_t)&&cyg_hal_gdb_break_place ); \ |
} while ( 0 ) |
#endif |
|
// This macro may already have been defined by the architecture HAL |
// Notice the trick to *use* the label - sometimes the tools want to |
// move the label if unused, which is bad. |
#ifndef CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION |
#define CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION( _old_ ) \ |
do { \ |
cyg_hal_gdb_remove_break( (target_register_t)&&cyg_hal_gdb_break_place ); \ |
HAL_RESTORE_INTERRUPTS(_old_); \ |
_old_ = 1; /* actually use the label as a label... */ \ |
cyg_hal_gdb_break_place:; \ |
if ( (_old_)-- > 0 ) /* ...or the compiler might move it! */ \ |
goto cyg_hal_gdb_break_place; \ |
} while ( 0 ) |
#endif |
|
#else // use __builtin_return_address instead. |
|
#define CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION( _old_ ) \ |
do { \ |
HAL_DISABLE_INTERRUPTS(_old_); \ |
cyg_hal_gdb_place_break((target_register_t)__builtin_return_address(0)); \ |
} while ( 0 ) |
|
#define CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION( _old_ ) \ |
do { \ |
cyg_hal_gdb_remove_break((target_register_t)__builtin_return_address(0)); \ |
HAL_RESTORE_INTERRUPTS(_old_); \ |
} while ( 0 ) |
|
#endif |
|
#else // NO debug_gdb_break_support |
|
// so define these just to do interrupts: |
#define CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION( _old_ ) \ |
do { \ |
HAL_DISABLE_INTERRUPTS(_old_); \ |
} while (0); |
|
#define CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION( _old_ ) \ |
do { \ |
HAL_RESTORE_INTERRUPTS(_old_); \ |
} while (0); |
|
#endif |
|
//---------------------------------------------------------------------------- |
// eCos extensions to the stub |
|
extern void hal_output_gdb_string(target_register_t str, int string_len); |
|
extern target_register_t registers[]; // The current saved registers. |
extern target_register_t * _registers ; |
extern HAL_SavedRegisters *_hal_registers; |
|
extern int cyg_hal_gdb_break; |
|
#ifdef CYGPKG_ISOINFRA |
# include <pkgconf/isoinfra.h> |
#endif |
#ifdef CYGINT_ISO_STRING_STRFUNCS |
# include <string.h> |
#else |
//----------------------------------------------------------------------------- |
// String helpers. These really should come from ISOINFRA |
static inline char *strcpy( char *s, const char *t) |
{ |
char *r = s; |
|
while( *t ) *s++ = *t++; |
|
// Terminate the copied string. |
*s = 0; |
|
return r; |
} |
|
static inline size_t strlen( const char *s ) |
{ |
int r = 0; |
while( *s++ ) r++; |
return r; |
} |
#endif |
|
//----------------------------------------------------------------------------- |
// Repeat the cache definitions here to avoid too much hackery in |
// generic-stub.h |
/* Flush the instruction cache. */ |
extern void flush_i_cache (void); |
|
/* Flush the data cache. */ |
extern void __flush_d_cache (void); |
|
typedef enum { |
CACHE_NOOP, CACHE_ENABLE, CACHE_DISABLE, CACHE_FLUSH |
} cache_control_t; |
|
/* Perform the specified operation on the instruction cache. |
Returns 1 if the cache is enabled, 0 otherwise. */ |
extern int __instruction_cache (cache_control_t request); |
/* Perform the specified operation on the data cache. |
Returns 1 if the cache is enabled, 0 otherwise. */ |
extern int __data_cache (cache_control_t request); |
|
#ifdef __cplusplus |
} // extern "C" |
#endif |
|
#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
|
//----------------------------------------------------------------------------- |
#endif // CYGONCE_HAL_HAL_STUB_H |
// End of hal_stub.h |
/hal_if.h
0,0 → 1,675
#ifndef CYGONCE_HAL_HAL_IF_H |
#define CYGONCE_HAL_HAL_IF_H |
|
//============================================================================= |
// |
// hal_if.h |
// |
// HAL header for ROM/RAM calling interface. |
// |
//============================================================================= |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. |
// Copyright (C) 2002 Gary Thomas |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//============================================================================= |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): jskov |
// Contributors:jskov |
// Date: 2000-06-07 |
// Purpose: HAL RAM/ROM calling interface |
// Description: ROM/RAM calling interface table definitions. The layout is a |
// combination of libbsp and vectors already in use by some |
// eCos platforms. |
// Usage: #include <cyg/hal/hal_if.h> |
// |
//####DESCRIPTIONEND#### |
// |
//============================================================================= |
|
#include <cyg/infra/cyg_type.h> // types & externC |
#include <cyg/hal/dbg-threads-api.h> |
#include <cyg/hal/dbg-thread-syscall.h> |
|
#include <stdarg.h> |
|
#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT |
|
// Architecture/var/platform may override the accessor macros. |
#include <cyg/hal/hal_arch.h> |
|
// Special monitor locking procedures. These are necessary when the monitor |
// and eCos share facilities, e.g. the network hardware. |
#ifdef CYGPKG_NET |
#include <cyg/hal/hal_intr.h> |
#include <cyg/hal/drv_api.h> // cyg_drv_dsr_lock(), etc |
#define _ENTER_MONITOR() \ |
cyg_uint32 ints; \ |
HAL_DISABLE_INTERRUPTS(ints); \ |
cyg_drv_dsr_lock() |
|
#define _EXIT_MONITOR() \ |
cyg_drv_dsr_unlock(); \ |
HAL_RESTORE_INTERRUPTS(ints) |
#else // !CYGPKG_NET |
#define _ENTER_MONITOR() CYG_EMPTY_STATEMENT |
#define _EXIT_MONITOR() CYG_EMPTY_STATEMENT |
#endif |
|
//-------------------------------------------------------------------------- |
#ifndef _BSP_HANDLER_T_DEFINED |
#define _BSP_HANDLER_T_DEFINED |
typedef int (*bsp_handler_t)(int __irq_nr, void *__regs); |
#endif // _BSP_HANDLER_T_DEFINED |
|
//-------------------------------------------------------------------------- |
// Communication interface table. CYGNUM_CALL_IF_CONSOLE_PROCS and |
// CYGNUM_CALL_IF_DEBUG_PROCS point to instances (possibly the same) |
// of this table. |
|
typedef enum { |
/* |
* For serial ports, the control function may be used to set and get the |
* current baud rate. Usage: |
* |
* err = (*__control)(COMMCTL_SETBAUD, int bits_per_second); |
* err => Zero if successful, -1 if error. |
* |
* baud = (*__control)(COMMCTL_GETBAUD); |
* baud => -1 if error, current baud otherwise. |
*/ |
__COMMCTL_SETBAUD=0, |
__COMMCTL_GETBAUD, |
|
/* |
* Install and remove debugger interrupt handlers. These are the receiver |
* interrupt routines which are used to change control from a running |
* program to the debugger stub. |
*/ |
__COMMCTL_INSTALL_DBG_ISR, |
__COMMCTL_REMOVE_DBG_ISR, |
|
/* |
* Disable comm port interrupt. Returns TRUE if interrupt was enabled, |
* FALSE otherwise. |
*/ |
__COMMCTL_IRQ_DISABLE, |
|
/* |
* Enable comm port interrupt. |
*/ |
__COMMCTL_IRQ_ENABLE, |
|
/* |
* Returns the number of the interrupt vector used by the debug |
* interrupt handler. |
*/ |
__COMMCTL_DBG_ISR_VECTOR, |
|
/* |
* Returns the current timeout value and sets a new timeout. |
* Timeout resolution is in milliseconds. |
* old_timeout = (*__control)(__COMMCTL_SET_TIMEOUT, |
* cyg_int32 new_timeout); |
*/ |
__COMMCTL_SET_TIMEOUT, |
|
/* |
* Forces driver to send all characters which may be buffered in |
* the driver. This only flushes the driver buffers, not necessarily |
* any hardware FIFO, etc. |
*/ |
__COMMCTL_FLUSH_OUTPUT, |
|
/* |
* Forces driver to enable or disable flushes when a newline is |
* seen in the output stream. Flushing at line boundaries occurs |
* in the driver, not necessarily any hardware FIFO, etc. Line |
* buffering is optional and may only be available in some drivers. |
*/ |
__COMMCTL_ENABLE_LINE_FLUSH, |
__COMMCTL_DISABLE_LINE_FLUSH, |
|
} __comm_control_cmd_t; |
|
|
#define CYGNUM_COMM_IF_CH_DATA 0 |
#define CYGNUM_COMM_IF_WRITE 1 |
#define CYGNUM_COMM_IF_READ 2 |
#define CYGNUM_COMM_IF_PUTC 3 |
#define CYGNUM_COMM_IF_GETC 4 |
#define CYGNUM_COMM_IF_CONTROL 5 |
#define CYGNUM_COMM_IF_DBG_ISR 6 |
#define CYGNUM_COMM_IF_GETC_TIMEOUT 7 |
|
#define CYGNUM_COMM_IF_TABLE_SIZE 8 |
|
typedef volatile CYG_ADDRWORD hal_virtual_comm_table_t[CYGNUM_COMM_IF_TABLE_SIZE]; |
|
// The below is a (messy) attempt at adding some type safety to the |
// above array. At the same time, the accessors allow the |
// implementation to be easily changed in the future (both tag->data |
// table and structure implementations have been suggested). |
|
typedef void* __comm_if_ch_data_t; |
typedef void (*__comm_if_write_t)(void* __ch_data, const cyg_uint8* __buf, |
cyg_uint32 __len); |
typedef int (*__comm_if_read_t)(void* __ch_data, cyg_uint8* __buf, |
cyg_uint32 __len); |
typedef void (*__comm_if_putc_t)(void* __ch_data, cyg_uint8 __ch); |
typedef cyg_uint8 (*__comm_if_getc_t)(void* __ch_data); |
typedef int (*__comm_if_control_t)(void *__ch_data, |
__comm_control_cmd_t __func, ...); |
typedef int (*__comm_if_dbg_isr_t)(void *__ch_data, |
int* __ctrlc, CYG_ADDRWORD __vector, |
CYG_ADDRWORD __data); |
typedef cyg_bool (*__comm_if_getc_timeout_t)(void* __ch_data, cyg_uint8* __ch); |
|
#define __call_COMM0(_n_,_rt_,_t_) \ |
static __inline__ _rt_ \ |
__call_COMM_##_n_(hal_virtual_comm_table_t t) \ |
{ \ |
_rt_ res; \ |
void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ |
_ENTER_MONITOR(); \ |
res = ((_t_)(t[CYGNUM_COMM_##_n_]))(dp); \ |
_EXIT_MONITOR(); \ |
return res; \ |
} |
|
#define __call_voidCOMM(_n_,_rt_,_t_) \ |
static __inline__ _rt_ \ |
__call_COMM_##_n_(hal_virtual_comm_table_t t) \ |
{ \ |
void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ |
_ENTER_MONITOR(); \ |
((_t_)(t[CYGNUM_COMM_##_n_]))(dp); \ |
_EXIT_MONITOR(); \ |
} |
|
#define __call_COMM1(_n_,_rt_,_t_,_t1_) \ |
static __inline__ _rt_ \ |
__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_) \ |
{ \ |
_rt_ res; \ |
void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ |
_ENTER_MONITOR(); \ |
res = ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_); \ |
_EXIT_MONITOR(); \ |
return res; \ |
} |
|
#define __call_voidCOMM1(_n_,_rt_,_t_,_t1_) \ |
static __inline__ _rt_ \ |
__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_) \ |
{ \ |
void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ |
_ENTER_MONITOR(); \ |
((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_); \ |
_EXIT_MONITOR(); \ |
} |
|
#define __call_COMM2(_n_,_rt_,_t_,_t1_,_t2_) \ |
static __inline__ _rt_ \ |
__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_, _t2_ _p2_) \ |
{ \ |
_rt_ res; \ |
void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ |
_ENTER_MONITOR(); \ |
res = ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_, _p2_); \ |
_EXIT_MONITOR(); \ |
return res; \ |
} |
|
#define __call_voidCOMM2(_n_,_rt_,_t_,_t1_,_t2_) \ |
static __inline__ _rt_ \ |
__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_, _t2_ _p2_) \ |
{ \ |
void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ |
_ENTER_MONITOR(); \ |
((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_, _p2_); \ |
_EXIT_MONITOR(); \ |
} |
|
#define __call_COMM3(_n_,_rt_,_t_,_t1_,_t2_,_t3_) \ |
static __inline__ _rt_ \ |
__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_, _t2_ _p2_, _t3_ _p3_) \ |
{ \ |
_rt_ res; \ |
void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ |
_ENTER_MONITOR(); \ |
res = ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_, _p2_, _p3_); \ |
_EXIT_MONITOR(); \ |
return res; \ |
} |
|
#define __call_voidCOMM3(_n_,_rt_,_t_,_t1_,_t2_,_t3_) \ |
static __inline__ _rt_ \ |
__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_, _t2_ _p2_, _t3_ _p3_) \ |
{ \ |
void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ |
_ENTER_MONITOR(); \ |
((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_, _p2_, _p3_); \ |
_EXIT_MONITOR(); \ |
} |
|
#ifndef CYGACC_COMM_IF_DEFINED |
|
#define CYGACC_COMM_IF_CH_DATA(_t_) \ |
((__comm_if_ch_data_t)((_t_)[CYGNUM_COMM_IF_CH_DATA])) |
#define CYGACC_COMM_IF_CH_DATA_SET(_t_, _x_) \ |
(_t_)[CYGNUM_COMM_IF_CH_DATA]=(CYG_ADDRWORD)(_x_) |
|
__call_voidCOMM2(IF_WRITE, void, __comm_if_write_t, const cyg_uint8 *, cyg_uint32) |
#define CYGACC_COMM_IF_WRITE(_t_, _b_, _l_) \ |
__call_COMM_IF_WRITE(_t_, _b_, _l_) |
#define CYGACC_COMM_IF_WRITE_SET(_t_, _x_) \ |
(_t_)[CYGNUM_COMM_IF_WRITE]=(CYG_ADDRWORD)(_x_) |
|
__call_voidCOMM2(IF_READ, void, __comm_if_read_t, cyg_uint8 *, cyg_uint32) |
#define CYGACC_COMM_IF_READ(_t_, _b_, _l_) \ |
__call_COMM_IF_READ(_t_, _b_, _l_) |
#define CYGACC_COMM_IF_READ_SET(_t_, _x_) \ |
(_t_)[CYGNUM_COMM_IF_READ]=(CYG_ADDRWORD)(_x_) |
|
__call_voidCOMM1(IF_PUTC, void, __comm_if_putc_t, cyg_uint8) |
#define CYGACC_COMM_IF_PUTC(_t_, _c_) \ |
__call_COMM_IF_PUTC(_t_,_c_) |
#define CYGACC_COMM_IF_PUTC_SET(_t_, _x_) \ |
(_t_)[CYGNUM_COMM_IF_PUTC]=(CYG_ADDRWORD)(_x_) |
|
__call_COMM0(IF_GETC, cyg_uint8, __comm_if_getc_t) |
#define CYGACC_COMM_IF_GETC(_t_) \ |
__call_COMM_IF_GETC(_t_) |
#define CYGACC_COMM_IF_GETC_SET(_t_, _x_) \ |
(_t_)[CYGNUM_COMM_IF_GETC]=(CYG_ADDRWORD)(_x_) |
|
// This macro has not been changed to use inline functions like the |
// others, simply because it uses variable arguments, and the change |
// would break binary compatibility. |
#define CYGACC_COMM_IF_CONTROL(_t_, args...) \ |
({ int res; \ |
_ENTER_MONITOR(); \ |
res = ((__comm_if_control_t)((_t_)[CYGNUM_COMM_IF_CONTROL]))(CYGACC_COMM_IF_CH_DATA(_t_), args); \ |
_EXIT_MONITOR(); \ |
res;}) |
#define CYGACC_COMM_IF_CONTROL_SET(_t_, _x_) \ |
(_t_)[CYGNUM_COMM_IF_CONTROL]=(CYG_ADDRWORD)(_x_) |
|
__call_COMM3(IF_DBG_ISR, int, __comm_if_dbg_isr_t, int *, CYG_ADDRWORD, CYG_ADDRWORD) |
#define CYGACC_COMM_IF_DBG_ISR(_t_, _c_, _v_, _d_) \ |
__call_COMM_IF_DBG_ISR(_t_, _c_, _v_, _d_) |
#define CYGACC_COMM_IF_DBG_ISR_SET(_t_, _x_) \ |
(_t_)[CYGNUM_COMM_IF_DBG_ISR]=(CYG_ADDRWORD)(_x_) |
|
__call_COMM1(IF_GETC_TIMEOUT, cyg_bool, __comm_if_getc_timeout_t, cyg_uint8 *) |
#define CYGACC_COMM_IF_GETC_TIMEOUT(_t_, _c_) \ |
__call_COMM_IF_GETC_TIMEOUT(_t_, _c_) |
#define CYGACC_COMM_IF_GETC_TIMEOUT_SET(_t_, _x_) \ |
(_t_)[CYGNUM_COMM_IF_GETC_TIMEOUT]=(CYG_ADDRWORD)(_x_) |
|
#endif // CYGACC_COMM_IF_DEFINED |
|
//-------------------------------------------------------------------------- |
// Main calling interface table. Will be assigned a location by the |
// linker script. Both ROM and RAM startup applications will know about |
// the location. |
#define CYGNUM_CALL_IF_VERSION 0 |
#define CYGNUM_CALL_IF_available_1 1 |
#define CYGNUM_CALL_IF_available_2 2 |
#define CYGNUM_CALL_IF_available_3 3 |
#define CYGNUM_CALL_IF_KILL_VECTOR 4 |
#define CYGNUM_CALL_IF_CONSOLE_PROCS 5 |
#define CYGNUM_CALL_IF_DEBUG_PROCS 6 |
#define CYGNUM_CALL_IF_FLUSH_DCACHE 7 |
#define CYGNUM_CALL_IF_FLUSH_ICACHE 8 |
#define CYGNUM_CALL_IF_available_9 9 |
#define CYGNUM_CALL_IF_available_10 10 |
#define CYGNUM_CALL_IF_available_11 11 |
#define CYGNUM_CALL_IF_SET_DEBUG_COMM 12 |
#define CYGNUM_CALL_IF_SET_CONSOLE_COMM 13 |
#define CYGNUM_CALL_IF_MONITOR_VERSION 14 |
#define CYGNUM_CALL_IF_DBG_SYSCALL 15 |
#define CYGNUM_CALL_IF_RESET 16 |
#define CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG 17 |
#define CYGNUM_CALL_IF_DELAY_US 18 |
#define CYGNUM_CALL_IF_DBG_DATA 19 |
#define CYGNUM_CALL_IF_FLASH_CFG_OP 20 |
#define CYGNUM_CALL_IF_MONITOR_RETURN 21 |
|
#define CYGNUM_CALL_IF_LAST_ENTRY CYGNUM_CALL_IF_MONITOR_RETURN |
|
#define CYGNUM_CALL_IF_INSTALL_BPT_FN 35 |
|
#define CYGNUM_CALL_IF_TABLE_SIZE 64 |
|
externC volatile CYG_ADDRWORD hal_virtual_vector_table[CYGNUM_CALL_IF_TABLE_SIZE]; |
|
// Table version contains version information for both the CALL table |
// itself (the number of the last active entry in the table), and the |
// COMM table (the size of the table). |
#define CYGNUM_CALL_IF_TABLE_VERSION_CALL CYGNUM_CALL_IF_LAST_ENTRY |
#define CYGNUM_CALL_IF_TABLE_VERSION_CALL_HACK (CYGNUM_CALL_IF_TABLE_SIZE+1) |
#define CYGNUM_CALL_IF_TABLE_VERSION_CALL_MAX CYGNUM_CALL_IF_TABLE_SIZE |
#define CYGNUM_CALL_IF_TABLE_VERSION_COMM CYGNUM_COMM_IF_TABLE_SIZE |
#define CYGNUM_CALL_IF_TABLE_VERSION_CALL_MASK 0x0000ffff |
#define CYGNUM_CALL_IF_TABLE_VERSION_COMM_MASK 0xffff0000 |
#define CYGNUM_CALL_IF_TABLE_VERSION_COMM_shift 16 |
|
|
// These are special debug/console procs IDs |
// QUERY_CURRENT will cause the ID of the currently selected proc ID to be |
// returned. |
// EMPTY this is the ID used for an empty procs table (i.e, NULL |
// pointer) |
// MANGLER selects the procs space reserved for the console mangler |
// allowing the application to temporarily disable mangling |
// or temporarily switch in different console procs. |
#define CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT -1 |
#define CYGNUM_CALL_IF_SET_COMM_ID_EMPTY -2 |
#define CYGNUM_CALL_IF_SET_COMM_ID_MANGLER -3 |
|
// The below is a (messy) attempt at adding some type safety to the |
// above array. At the same time, the accessors allow the |
// implementation to be easily changed in the future (both tag->data |
// table and structure implementations have been suggested). |
|
typedef int __call_if_version_t; |
typedef void* __call_if_ictrl_table_t; |
typedef void* __call_if_exc_table_t; |
typedef bsp_handler_t *__call_if_dbg_vector_t; |
typedef bsp_handler_t __call_if_kill_vector_t; |
typedef hal_virtual_comm_table_t *__call_if_console_procs_t; |
typedef hal_virtual_comm_table_t *__call_if_debug_procs_t; |
typedef void (__call_if_flush_dcache_t)(void *__p, int __nbytes); |
typedef void (__call_if_flush_icache_t)(void *__p, int __nbytes); |
typedef int (__call_if_set_debug_comm_t)(int __comm_id); |
typedef int (__call_if_set_console_comm_t)(int __comm_id); |
typedef void* __call_if_dbg_data_t; |
typedef int (__call_if_dbg_syscall_t) (enum dbg_syscall_ids id, |
union dbg_thread_syscall_parms *p ); |
typedef void (__call_if_reset_t)(void); |
typedef int __call_if_console_interrupt_flag_t; |
typedef void (__call_if_delay_us_t)(cyg_int32 usecs); |
typedef void (__call_if_install_bpt_fn_t)(void *__epc); |
typedef cyg_bool (__call_if_flash_cfg_op_fn_t)(int __oper, char *__key, |
void *__val, int __type); |
typedef char *__call_if_monitor_version_t; |
typedef void (__call_if_monitor_return_t)(int status); |
|
#ifndef CYGACC_CALL_IF_DEFINED |
|
#define __data_VV(_n_,_tt_) \ |
static __inline__ _tt_ \ |
__call_vv_##_n_(void) \ |
{ \ |
return ((_tt_)hal_virtual_vector_table[_n_]); \ |
} |
|
#define __call_VV0(_n_,_tt_,_rt_) \ |
static __inline__ _rt_ \ |
__call_vv_##_n_(void) \ |
{ \ |
_rt_ res; \ |
_ENTER_MONITOR(); \ |
res = ((_tt_ *)hal_virtual_vector_table[_n_])(); \ |
_EXIT_MONITOR(); \ |
return res; \ |
} |
|
#define __call_voidVV0(_n_,_tt_,_rt_) \ |
static __inline__ _rt_ \ |
__call_vv_##_n_(void) \ |
{ \ |
_ENTER_MONITOR(); \ |
((_tt_ *)hal_virtual_vector_table[_n_])(); \ |
_EXIT_MONITOR(); \ |
} |
|
#define __call_VV1(_n_,_tt_,_rt_,_t1_) \ |
static __inline__ _rt_ \ |
__call_vv_##_n_(_t1_ _p1_) \ |
{ \ |
_rt_ res; \ |
_ENTER_MONITOR(); \ |
res = ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_); \ |
_EXIT_MONITOR(); \ |
return res; \ |
} |
|
#define __call_voidVV1(_n_,_tt_,_rt_,_t1_) \ |
static __inline__ _rt_ \ |
__call_vv_##_n_(_t1_ _p1_) \ |
{ \ |
_ENTER_MONITOR(); \ |
((_tt_ *)hal_virtual_vector_table[_n_])(_p1_); \ |
_EXIT_MONITOR(); \ |
} |
|
#define __call_VV2(_n_,_tt_,_rt_,_t1_,_t2_) \ |
static __inline__ _rt_ \ |
__call_vv_##_n_(_t1_ _p1_, _t2_ _p2_) \ |
{ \ |
_rt_ res; \ |
_ENTER_MONITOR(); \ |
res = ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_,_p2_); \ |
_EXIT_MONITOR(); \ |
return res; \ |
} |
|
#define __call_voidVV2(_n_,_tt_,_rt_,_t1_,_t2_) \ |
static __inline__ _rt_ \ |
__call_vv_##_n_(_t1_ _p1_, _t2_ _p2_) \ |
{ \ |
_ENTER_MONITOR(); \ |
((_tt_ *)hal_virtual_vector_table[_n_])(_p1_,_p2_); \ |
_EXIT_MONITOR(); \ |
} |
|
#define __call_VV4(_n_,_tt_,_rt_,_t1_,_t2_,_t3_,_t4_) \ |
static __inline__ _rt_ \ |
__call_vv_##_n_(_t1_ _p1_, _t2_ _p2_, _t3_ _p3_, _t4_ _p4_) \ |
{ \ |
_rt_ res; \ |
_ENTER_MONITOR(); \ |
res = ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_,_p2_,_p3_,_p4_); \ |
_EXIT_MONITOR(); \ |
return res; \ |
} |
|
#define __call_voidVV4(_n_,_tt_,_rt_,_t1_,_t2_,_t3_,_t4_) \ |
static __inline__ _rt_ \ |
__call_vv_##_n_(_t1_ _p1_, _t2_ _p2_, _t3_ _p3_, _t4_ _p4_) \ |
{ \ |
_ENTER_MONITOR(); \ |
((_tt_ *)hal_virtual_vector_table[_n_])(_p1_,_p2_,_p3_,_p4_); \ |
_EXIT_MONITOR(); \ |
} |
|
|
#define CYGACC_DATA_VV(t,e) __call_vv_##e() |
#define CYGACC_CALL_VV0(t,e) __call_vv_##e |
#define CYGACC_CALL_VV1(t,e,p1) __call_vv_##e((p1)) |
#define CYGACC_CALL_VV2(t,e,p1,p2) __call_vv_##e((p1),(p2)) |
#define CYGACC_CALL_VV3(t,e,p1,p2,p3) __call_vv_##e((p1),(p2),(p3)) |
#define CYGACC_CALL_VV4(t,e,p1,p2,p3,p4) __call_vv_##e((p1),(p2),(p3),(p4)) |
|
#define CYGACC_CALL_IF_VERSION() \ |
CYGACC_DATA_VV(__call_if_version_t, CYGNUM_CALL_IF_VERSION) |
__data_VV(CYGNUM_CALL_IF_VERSION, __call_if_version_t) |
#define CYGACC_CALL_IF_VERSION_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_VERSION]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_KILL_VECTOR() \ |
CYGACC_DATA_VV(__call_if_kill_vector_t, CYGNUM_CALL_IF_KILL_VECTOR) |
__data_VV(CYGNUM_CALL_IF_KILL_VECTOR, __call_if_kill_vector_t) |
#define CYGACC_CALL_IF_KILL_VECTOR_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_KILL_VECTOR]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_CONSOLE_PROCS() \ |
CYGACC_DATA_VV(__call_if_console_procs_t, CYGNUM_CALL_IF_CONSOLE_PROCS) |
__data_VV(CYGNUM_CALL_IF_CONSOLE_PROCS, __call_if_console_procs_t) |
#define CYGACC_CALL_IF_CONSOLE_PROCS_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_PROCS]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_FLUSH_DCACHE(_p_, _n_) \ |
((__call_if_flush_dcache_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_DCACHE])((_p_), (_n_)) |
#define CYGACC_CALL_IF_FLUSH_DCACHE_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_DCACHE]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_FLUSH_ICACHE(_p_, _n_) \ |
((__call_if_flush_icache_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_ICACHE])((_p_), (_n_)) |
#define CYGACC_CALL_IF_FLUSH_ICACHE_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_ICACHE]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_DEBUG_PROCS() \ |
CYGACC_DATA_VV(__call_if_debug_procs_t, CYGNUM_CALL_IF_DEBUG_PROCS) |
__data_VV(CYGNUM_CALL_IF_DEBUG_PROCS, __call_if_debug_procs_t) |
#define CYGACC_CALL_IF_DEBUG_PROCS_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_DEBUG_PROCS]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_SET_DEBUG_COMM(_i_) \ |
CYGACC_CALL_VV1(__call_if_set_debug_comm_t*, CYGNUM_CALL_IF_SET_DEBUG_COMM, (_i_)) |
__call_VV1(CYGNUM_CALL_IF_SET_DEBUG_COMM, __call_if_set_debug_comm_t, int, int) |
#define CYGACC_CALL_IF_SET_DEBUG_COMM_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_SET_DEBUG_COMM]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_SET_CONSOLE_COMM(_i_) \ |
CYGACC_CALL_VV1(__call_if_set_console_comm_t*, CYGNUM_CALL_IF_SET_CONSOLE_COMM, (_i_)) |
__call_VV1(CYGNUM_CALL_IF_SET_CONSOLE_COMM, __call_if_set_console_comm_t, int, int) |
#define CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_DBG_DATA() \ |
CYGACC_DATA_VV(__call_if_dbg_data_t, CYGNUM_CALL_IF_DBG_DATA) |
__data_VV(CYGNUM_CALL_IF_DBG_DATA, __call_if_dbg_data_t) |
#define CYGACC_CALL_IF_DBG_DATA_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_DATA]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_DBG_SYSCALL(_id_,_p_) \ |
CYGACC_CALL_VV2(__call_if_dbg_syscall_t, CYGNUM_CALL_IF_DBG_SYSCALL, _id_, _p_) |
__call_VV2(CYGNUM_CALL_IF_DBG_SYSCALL, __call_if_dbg_syscall_t, int, enum dbg_syscall_ids , union dbg_thread_syscall_parms *) |
#define CYGACC_CALL_IF_DBG_SYSCALL_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_SYSCALL]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_RESET() \ |
CYGACC_CALL_VV0(__call_if_reset_t*, CYGNUM_CALL_IF_RESET)() |
__call_voidVV0(CYGNUM_CALL_IF_RESET, __call_if_reset_t, void) |
#define CYGACC_CALL_IF_RESET_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_RESET]=(CYG_ADDRWORD)(_x_) |
#define CYGACC_CALL_IF_RESET_GET() \ |
((__call_if_reset_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_RESET]) |
|
#define CYGACC_CALL_IF_MONITOR_VERSION() \ |
CYGACC_DATA_VV(__call_if_monitor_version_t, CYGNUM_CALL_IF_MONITOR_VERSION) |
__data_VV(CYGNUM_CALL_IF_MONITOR_VERSION, __call_if_monitor_version_t) |
#define CYGACC_CALL_IF_MONITOR_VERSION_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_MONITOR_VERSION]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG() \ |
CYGACC_DATA_VV(__call_if_console_interrupt_flag_t, CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG) |
__data_VV(CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG, __call_if_console_interrupt_flag_t) |
#define CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_DELAY_US(_u_) \ |
CYGACC_CALL_VV1(__call_if_delay_us_t*, CYGNUM_CALL_IF_DELAY_US, (_u_)) |
__call_voidVV1(CYGNUM_CALL_IF_DELAY_US, __call_if_delay_us_t, void, cyg_int32) |
#define CYGACC_CALL_IF_DELAY_US_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_DELAY_US]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_INSTALL_BPT_FN(_e_) \ |
CYGACC_CALL_VV1(__call_if_install_bpt_fn_t*, CYGNUM_CALL_IF_INSTALL_BPT_FN, (_e_)) |
__call_voidVV1(CYGNUM_CALL_IF_INSTALL_BPT_FN, __call_if_install_bpt_fn_t, void, void *) |
#define CYGACC_CALL_IF_INSTALL_BPT_FN_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_INSTALL_BPT_FN]=(CYG_ADDRWORD)(_x_) |
|
#define CYGACC_CALL_IF_FLASH_CFG_OP(_o_,_k_,_d_,_t_) \ |
CYGACC_CALL_VV4(__call_if_flash_cfg_op_fn_t*, CYGNUM_CALL_IF_FLASH_CFG_OP, (_o_),(_k_),(_d_),(_t_)) |
__call_VV4(CYGNUM_CALL_IF_FLASH_CFG_OP, __call_if_flash_cfg_op_fn_t, cyg_bool, int, char *, void *, int) |
#define CYGACC_CALL_IF_FLASH_CFG_OP_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_FLASH_CFG_OP]=(CYG_ADDRWORD)(_x_) |
#define CYGNUM_CALL_IF_FLASH_CFG_GET (0) |
|
#define CYGACC_CALL_IF_MONITOR_RETURN(_u_) \ |
CYGACC_CALL_VV1(__call_if_monitor_return_t*, CYGNUM_CALL_IF_MONITOR_RETURN, (_u_)) |
__call_voidVV1(CYGNUM_CALL_IF_MONITOR_RETURN, __call_if_monitor_return_t, void, int) |
#define CYGACC_CALL_IF_MONITOR_RETURN_SET(_x_) \ |
hal_virtual_vector_table[CYGNUM_CALL_IF_MONITOR_RETURN]=(CYG_ADDRWORD)(_x_) |
|
// These need to be kept uptodate with the (unadorned) masters |
// in RedBoot's flash_config.h: |
#define CYGNUM_FLASH_CFG_OP_CONFIG_EMPTY 0 |
#define CYGNUM_FLASH_CFG_OP_CONFIG_BOOL 1 |
#define CYGNUM_FLASH_CFG_OP_CONFIG_INT 2 |
#define CYGNUM_FLASH_CFG_OP_CONFIG_STRING 3 |
#define CYGNUM_FLASH_CFG_OP_CONFIG_SCRIPT 4 |
#define CYGNUM_FLASH_CFG_OP_CONFIG_IP 5 |
#define CYGNUM_FLASH_CFG_OP_CONFIG_ESA 6 |
|
#endif // CYGACC_CALL_IF_DEFINED |
|
//-------------------------------------------------------------------------- |
// Diag wrappers. |
externC void hal_if_diag_init(void); |
externC void hal_if_diag_write_char(char c); |
externC void hal_if_diag_read_char(char *c); |
|
//-------------------------------------------------------------------------- |
// Ctrl-c support. |
externC cyg_uint32 hal_ctrlc_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data); |
externC cyg_bool hal_ctrlc_check(CYG_ADDRWORD vector, CYG_ADDRWORD data); |
|
#define HAL_CTRLC_ISR hal_ctrlc_isr |
#define HAL_CTRLC_CHECK hal_ctrlc_check |
|
#else |
|
#if defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) \ |
|| defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) |
// Then other code might invoke this macro |
#define HAL_CTRLC_CHECK(a1,a2) (0) // Nothing, no CTRLC here |
#endif |
|
#endif // CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT |
|
//-------------------------------------------------------------------------- |
// Functions provided by the HAL interface. |
externC void hal_if_init(void); |
#if 0 != CYGINT_HAL_PLF_IF_INIT |
externC void plf_if_init(void); |
#endif |
|
//----------------------------------------------------------------------------- |
#endif // CYGONCE_HAL_HAL_IF_H |
// End of hal_if.h |
/hal_endian.h
0,0 → 1,110
#ifndef CYGONCE_HAL_HAL_ENDIAN_H |
#define CYGONCE_HAL_HAL_ENDIAN_H |
|
//============================================================================= |
// |
// hal_endian.h |
// |
// Endian conversion macros |
// |
//============================================================================= |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//============================================================================= |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): jskov |
// Contributors:jskov |
// Date: 2001-10-04 |
// Purpose: Endian conversion macros |
// Usage: #include <cyg/hal/hal_endian.h> |
// |
//####DESCRIPTIONEND#### |
// |
//============================================================================= |
|
#include <pkgconf/hal.h> // CYGBLD_HAL_ENDIAN_H |
#include <cyg/infra/cyg_type.h> // endian setting |
|
// Allow HALs to override the generic implementation of swap macros |
#ifdef CYGBLD_HAL_ENDIAN_H |
# include CYGBLD_HAL_ENDIAN_H |
#endif |
|
#ifndef CYG_SWAP16 |
# define CYG_SWAP16(_x_) \ |
({ cyg_uint16 _x = (_x_); ((_x << 8) | (_x >> 8)); }) |
#endif |
|
#ifndef CYG_SWAP32 |
# define CYG_SWAP32(_x_) \ |
({ cyg_uint32 _x = (_x_); \ |
((_x << 24) | \ |
((0x0000FF00UL & _x) << 8) | \ |
((0x00FF0000UL & _x) >> 8) | \ |
(_x >> 24)); }) |
#endif |
|
|
#if (CYG_BYTEORDER == CYG_LSBFIRST) |
# define CYG_CPU_TO_BE16(_x_) CYG_SWAP16((_x_)) |
# define CYG_CPU_TO_BE32(_x_) CYG_SWAP32((_x_)) |
# define CYG_BE16_TO_CPU(_x_) CYG_SWAP16((_x_)) |
# define CYG_BE32_TO_CPU(_x_) CYG_SWAP32((_x_)) |
|
# define CYG_CPU_TO_LE16(_x_) (_x_) |
# define CYG_CPU_TO_LE32(_x_) (_x_) |
# define CYG_LE16_TO_CPU(_x_) (_x_) |
# define CYG_LE32_TO_CPU(_x_) (_x_) |
|
#elif (CYG_BYTEORDER == CYG_MSBFIRST) |
|
# define CYG_CPU_TO_BE16(_x_) (_x_) |
# define CYG_CPU_TO_BE32(_x_) (_x_) |
# define CYG_BE16_TO_CPU(_x_) (_x_) |
# define CYG_BE32_TO_CPU(_x_) (_x_) |
|
# define CYG_CPU_TO_LE16(_x_) CYG_SWAP16((_x_)) |
# define CYG_CPU_TO_LE32(_x_) CYG_SWAP32((_x_)) |
# define CYG_LE16_TO_CPU(_x_) CYG_SWAP16((_x_)) |
# define CYG_LE32_TO_CPU(_x_) CYG_SWAP32((_x_)) |
|
#else |
|
# error "Endian mode not selected" |
|
#endif |
|
//----------------------------------------------------------------------------- |
#endif // CYGONCE_HAL_HAL_ENDIAN_H |
// End of hal_endian.h |
/drv_api.h
0,0 → 1,251
#ifndef CYGONCE_HAL_DRV_API_H |
#define CYGONCE_HAL_DRV_API_H |
|
/*========================================================================== |
// |
// drv_api.h |
// |
// Native API for Kernel |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): nickg |
// Date: 1999-02-24 |
// Purpose: Driver API |
// Description: This file defines the API used by device drivers to access |
// system services. When the kernel is present it maps directly |
// to the Kernel C API. When the kernel is absent, it is provided |
// by a set of HAL functions. |
// |
// Usage: #include <cyg/kernel/kapi.h> |
// |
//####DESCRIPTIONEND#### |
// |
//========================================================================*/ |
|
#include <pkgconf/hal.h> |
#include <cyg/infra/cyg_type.h> |
|
#ifdef CYGPKG_KERNEL |
|
/*------------------------------------------------------------------------*/ |
/* Kernel co-resident version of API */ |
|
#include <pkgconf/kernel.h> |
|
#ifndef CYGFUN_KERNEL_API_C |
#error Driver API requres Kernel API to be present |
#endif |
|
#include <cyg/kernel/kapi.h> |
|
#define cyg_drv_isr_lock cyg_interrupt_disable |
#define cyg_drv_isr_unlock cyg_interrupt_enable |
|
#define cyg_drv_dsr_lock cyg_scheduler_lock |
#define cyg_drv_dsr_unlock cyg_scheduler_unlock |
|
#define cyg_drv_mutex_t cyg_mutex_t |
#define cyg_drv_mutex_init cyg_mutex_init |
#define cyg_drv_mutex_destroy cyg_mutex_destroy |
#define cyg_drv_mutex_lock cyg_mutex_lock |
#define cyg_drv_mutex_trylock cyg_mutex_trylock |
#define cyg_drv_mutex_unlock cyg_mutex_unlock |
#define cyg_drv_mutex_release cyg_mutex_release |
|
#define cyg_drv_cond_t cyg_cond_t |
#define cyg_drv_cond_init cyg_cond_init |
#define cyg_drv_cond_destroy cyg_cond_destroy |
#define cyg_drv_cond_wait cyg_cond_wait |
#define cyg_drv_cond_signal cyg_cond_signal |
#define cyg_drv_cond_broadcast cyg_cond_broadcast |
|
#define cyg_drv_interrupt_create cyg_interrupt_create |
#define cyg_drv_interrupt_delete cyg_interrupt_delete |
#define cyg_drv_interrupt_attach cyg_interrupt_attach |
#define cyg_drv_interrupt_detach cyg_interrupt_detach |
#define cyg_drv_interrupt_mask cyg_interrupt_mask |
#define cyg_drv_interrupt_unmask cyg_interrupt_unmask |
#define cyg_drv_interrupt_mask_intunsafe cyg_interrupt_mask_intunsafe |
#define cyg_drv_interrupt_unmask_intunsafe cyg_interrupt_unmask_intunsafe |
#define cyg_drv_interrupt_acknowledge cyg_interrupt_acknowledge |
#define cyg_drv_interrupt_configure cyg_interrupt_configure |
#define cyg_drv_interrupt_level cyg_interrupt_level |
#define cyg_drv_interrupt_set_cpu cyg_interrupt_set_cpu |
#define cyg_drv_interrupt_get_cpu cyg_interrupt_get_cpu |
|
#define cyg_drv_spinlock_t cyg_spinlock_t |
#define cyg_drv_spinlock_init cyg_spinlock_init |
#define cyg_drv_spinlock_spin cyg_spinlock_spin |
#define cyg_drv_spinlock_clear cyg_spinlock_clear |
#define cyg_drv_spinlock_try cyg_spinlock_try |
#define cyg_drv_spinlock_test cyg_spinlock_test |
#define cyg_drv_spinlock_spin_intsave cyg_spinlock_spin_intsave |
#define cyg_drv_spinlock_clear_intsave cyg_spinlock_clear_intsave |
|
#else /* CYGPKG_KERNEL */ |
|
/*------------------------------------------------------------------------*/ |
/* Non-kernel version of API */ |
|
typedef CYG_ADDRWORD cyg_addrword_t; /* May hold pointer or word */ |
typedef cyg_addrword_t cyg_handle_t; /* Object handle */ |
typedef cyg_uint32 cyg_priority_t; /* type for priorities */ |
typedef cyg_uint32 cyg_vector_t; /* Interrupt vector id */ |
typedef cyg_uint32 cyg_cpu_t; /* CPU id */ |
typedef int cyg_bool_t; |
typedef cyg_int32 cyg_code_t; /* type for various codes */ |
|
typedef cyg_uint32 cyg_ISR_t( cyg_vector_t vector, cyg_addrword_t data); |
typedef void cyg_DSR_t(cyg_vector_t vector, |
cyg_ucount32 count, |
cyg_addrword_t data); |
|
|
externC void cyg_drv_isr_lock(void); |
externC void cyg_drv_isr_unlock(void); |
|
externC void cyg_drv_dsr_lock(void); |
externC void cyg_drv_dsr_unlock(void); |
|
typedef struct |
{ |
cyg_atomic lock; |
} cyg_drv_mutex_t; |
|
externC void cyg_drv_mutex_init( cyg_drv_mutex_t *mutex ); |
externC void cyg_drv_mutex_destroy( cyg_drv_mutex_t *mutex ); |
externC cyg_bool_t cyg_drv_mutex_lock( cyg_drv_mutex_t *mutex ); |
externC cyg_bool_t cyg_drv_mutex_trylock( cyg_drv_mutex_t *mutex ); |
externC void cyg_drv_mutex_unlock( cyg_drv_mutex_t *mutex ); |
externC void cyg_drv_mutex_release( cyg_drv_mutex_t *mutex ); |
|
typedef struct |
{ |
cyg_atomic wait; |
cyg_drv_mutex_t *mutex; |
} cyg_drv_cond_t; |
|
externC void cyg_drv_cond_init( cyg_drv_cond_t *cond, cyg_drv_mutex_t *mutex ); |
externC void cyg_drv_cond_destroy( cyg_drv_cond_t *cond ); |
externC cyg_bool_t cyg_drv_cond_wait( cyg_drv_cond_t *cond ); |
externC void cyg_drv_cond_signal( cyg_drv_cond_t *cond ); |
externC void cyg_drv_cond_broadcast( cyg_drv_cond_t *cond ); |
|
typedef struct cyg_interrupt |
{ |
cyg_vector_t vector; |
cyg_priority_t priority; |
cyg_ISR_t *isr; |
cyg_DSR_t *dsr; |
CYG_ADDRWORD data; |
|
struct cyg_interrupt* volatile next_dsr; |
volatile cyg_int32 dsr_count; |
|
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN |
struct cyg_interrupt *next; |
#endif |
|
} cyg_interrupt; |
|
externC void cyg_drv_interrupt_create( |
cyg_vector_t vector, |
cyg_priority_t priority, |
cyg_addrword_t data, |
cyg_ISR_t *isr, |
cyg_DSR_t *dsr, |
cyg_handle_t *handle, |
cyg_interrupt *intr |
); |
externC void cyg_drv_interrupt_delete( cyg_handle_t interrupt ); |
externC void cyg_drv_interrupt_attach( cyg_handle_t interrupt ); |
externC void cyg_drv_interrupt_detach( cyg_handle_t interrupt ); |
|
externC void cyg_drv_interrupt_mask( cyg_vector_t vector ); |
externC void cyg_drv_interrupt_mask_intunsafe( cyg_vector_t vector ); |
externC void cyg_drv_interrupt_unmask( cyg_vector_t vector ); |
externC void cyg_drv_interrupt_unmask_intunsafe( cyg_vector_t vector ); |
externC void cyg_drv_interrupt_acknowledge( cyg_vector_t vector ); |
externC void cyg_drv_interrupt_configure( |
cyg_vector_t vector, |
cyg_bool_t level, |
cyg_bool_t up |
); |
externC void cyg_drv_interrupt_level( cyg_vector_t vector, cyg_priority_t level ); |
externC void cyg_drv_interrupt_set_cpu( cyg_vector_t vector, cyg_cpu_t cpu ); |
externC cyg_cpu_t cyg_drv_interrupt_get_cpu( cyg_vector_t vector ); |
|
|
enum cyg_ISR_results |
{ |
CYG_ISR_HANDLED = 1, /* Interrupt was handled */ |
CYG_ISR_CALL_DSR = 2 /* Schedule DSR */ |
}; |
|
|
typedef struct |
{ |
cyg_atomic lock; |
} cyg_drv_spinlock_t; |
|
void cyg_drv_spinlock_init( |
cyg_drv_spinlock_t *lock, /* spinlock to initialize */ |
cyg_bool_t locked /* init locked or unlocked */ |
); |
|
void cyg_drv_spinlock_destroy( cyg_drv_spinlock_t *lock ); |
|
void cyg_drv_spinlock_spin( cyg_drv_spinlock_t *lock ); |
|
void cyg_drv_spinlock_clear( cyg_drv_spinlock_t *lock ); |
|
cyg_bool_t cyg_drv_spinlock_try( cyg_drv_spinlock_t *lock ); |
|
cyg_bool_t cyg_drv_spinlock_test( cyg_drv_spinlock_t *lock ); |
|
void cyg_drv_spinlock_spin_intsave( cyg_drv_spinlock_t *lock, |
cyg_addrword_t *istate ); |
|
void cyg_drv_spinlock_clear_intsave( cyg_drv_spinlock_t *lock, |
cyg_addrword_t istate ); |
|
#endif /* CYGPKG_KERNEL */ |
|
/*------------------------------------------------------------------------*/ |
/* EOF drv_api.h */ |
#endif // CYGONCE_HAL_DRV_API_H |
/generic-stub.h
0,0 → 1,363
//======================================================================== |
// |
// generic-stub.h |
// |
// Definitions for the generic GDB remote stub |
// |
//======================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//======================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): Red Hat, nickg |
// Contributors: Red Hat, nickg, dmoseley |
// Date: 1998-06-08 |
// Purpose: |
// Description: Definitions for the generic GDB remote stub |
// Usage: This header is not to be included by user code, and is |
// only placed in a publically accessible directory so |
// that platform stub packages are able to include it |
// if required. |
// |
//####DESCRIPTIONEND#### |
// |
//======================================================================== |
|
|
#ifndef GENERIC_STUB_H |
#define GENERIC_STUB_H |
|
#ifdef __cplusplus |
extern "C" { |
#endif |
|
/* Three typedefs must be provided before including this file. |
target_register_t should correspond to the largest register value on |
this target processor. |
regnames_t corresponds to a type representing a register number. |
uint32 must correspond to at least a 32-bit unsigned integer type |
(it may be larger). */ |
|
#ifndef ASM |
|
#ifndef __ECOS__ |
#include "dbg-serial.h" |
#endif // __ECOS__ |
|
struct gdb_packet |
{ |
/* The checksum calculated so far. */ |
uint32 checksum; |
/* The checksum we've received from the remote side. */ |
uint32 xmitcsum; |
/* Contents of the accumulated packet. */ |
char *contents; |
/* Number of characters received. */ |
uint32 length; |
/* |
* state is the current state: |
* 0 = looking for start of packet |
* 1 = got start of packet, looking for # terminator |
* 2 = looking for first byte of checksum |
* 3 = looking for second byte of checksum (indicating end of packet) |
*/ |
char state; |
char err; // This is set if the packet should be tossed because of overflow |
}; |
|
/* Return the currently-saved value corresponding to register REG. */ |
extern target_register_t get_register (regnames_t reg); |
|
/* Write the contents of register WHICH into VALUE as raw bytes */ |
extern int get_register_as_bytes (regnames_t which, char *value); |
|
#ifdef CYGHWR_REGISTER_VALIDITY_CHECKING |
// Return the validity of register REG. |
extern int get_register_valid (regnames_t reg); |
#endif |
|
/* Store VALUE in the register corresponding to WHICH. */ |
extern void put_register (regnames_t which, target_register_t value); |
|
extern int put_register_as_bytes (regnames_t which, char *value); |
|
/* Set the next instruction to be executed when the user program resumes |
execution to PC. */ |
#if !defined(SET_PC_PROTOTYPE_EXISTS) && !defined(set_pc) |
#define SET_PC_PROTOTYPE_EXISTS |
extern void set_pc (target_register_t pc); |
#endif |
|
/* Set the return value of the currently-pending syscall to VALUE. */ |
extern void set_syscall_value (target_register_t value); |
|
/* Return the Nth argument to the currently-pending syscall (starting from |
0). */ |
extern target_register_t get_syscall_arg (int n); |
|
/* Initialize the stub. This will also install any trap handlers needed by |
the stub. */ |
extern void initialize_stub (void); |
|
/* Initialize the hardware. */ |
extern void initHardware (void); |
|
/* Skip the current instruction. */ |
extern void __skipinst (void); |
|
/* If the address in the PC register corresponds to the breakpoint() |
instruction, return a non-zero value. */ |
#ifndef __is_breakpoint_function |
extern int __is_breakpoint_function (void); |
#endif |
|
/* Execute a breakpoint instruction. Restarting will cause the instruction |
to be skipped. */ |
#ifndef breakpoint |
extern void breakpoint (void); |
#endif |
|
/* Return the syscall # corresponding to this system call. */ |
extern int __get_syscall_num (void); |
|
/* Transfer exception event processing to the stub. */ |
extern void __switch_to_stub (void); |
|
/* Send an exit packet containing the specified status. */ |
extern void __send_exit_status (int status); |
|
/* Copy COUNT bytes of memory from ADDR to BUF. |
ADDR is assumed to live in the user program's space. |
Returns number of bytes successfully read |
(caller must check to see if less than requested). */ |
extern int __read_mem_safe (void *buf, |
void *addr, |
int count); |
|
extern int __read_progmem_safe (void *buf, |
void *addr, |
int count); |
|
/* Copy COUNT bytes of memory from BUF to ADDR. |
ADDR is assumed to live in the user program's space. |
Returns number of bytes successfully read |
(caller must check to see if less than requested). */ |
#ifndef __write_mem_safe |
extern int __write_mem_safe (void *buf, |
void *addr, |
int count); |
#endif |
|
extern int __write_progmem_safe (void *buf, |
void *addr, |
int count); |
|
/* Set to a non-zero value if a memory fault occurs while |
__set_mem_fault_trap () is running. */ |
extern volatile int __mem_fault; |
|
#ifndef __ECOS__ |
#if 1 |
#include "stub-tservice.h" /* target dependent stub services */ |
#else |
/* Flush the instruction cache. */ |
extern void flush_i_cache (void); |
|
/* Flush the data cache. */ |
extern void __flush_d_cache (void); |
|
typedef enum { |
CACHE_NOOP, CACHE_ENABLE, CACHE_DISABLE, CACHE_FLUSH |
} cache_control_t; |
|
/* Perform the specified operation on the instruction cache. |
Returns 1 if the cache is enabled, 0 otherwise. */ |
extern int __instruction_cache (cache_control_t request); |
/* Perform the specified operation on the data cache. |
Returns 1 if the cache is enabled, 0 otherwise. */ |
extern int __data_cache (cache_control_t request); |
#endif |
#endif // __ECOS__ |
|
/* Write the 'T' packet in BUFFER. SIGVAL is the signal the program |
received. */ |
extern void __build_t_packet (int sigval, char *buffer); |
|
/* Return 1 when a complete packet has been received, 0 if the packet |
is not yet complete, or -1 if an erroneous packet was NAKed. */ |
int __add_char_to_packet (unsigned character, struct gdb_packet *packet); |
|
typedef int (*__PFI)(int); |
typedef void (*__PFV)(void); |
|
/* When an exception occurs, __process_exception_vec will be invoked with |
the signal number corresponding to the trap/exception. The function |
should return zero if it wishes execution to resume from the saved |
register values; a non-zero value indicates that the exception handler |
should be reinvoked. */ |
#if !defined(PROCESS_EXCEPTION_VEC_PROTOTYPE_EXISTS) |
#define PROCESS_EXCEPTION_VEC_PROTOTYPE_EXISTS |
extern volatile __PFI __process_exception_vec; |
#endif |
|
/* __process_exit_vec is invoked when a 'k' kill packet is received |
from GDB. */ |
extern volatile __PFV __process_exit_vec; |
|
/* If SIGSYSCALL is defined, and such a signal value is returned from |
__computeSignal (), the function pointed to by this vector will |
be invoked. |
|
If the return value is negative, the user program is assumed to |
have received the corresponding positive signal value, and an |
exception will be processed. Otherwise, the user program is |
restarted from the next instruction. */ |
extern volatile __PFI __process_syscall_vec; |
|
/* A continue packet was received from GDB with a signal value. The function |
pointed to by __process_signal_vec will be invoked with this signal |
value. |
|
If a zero value is returned, we will ignore the signal, and proceed |
with the continue request. Otherwise, the program will be killed |
with the signal. */ |
extern volatile __PFI __process_signal_vec; |
|
/* If non-NULL, __init_vec is called right before the user program is |
resumed. */ |
extern volatile __PFV __init_vec; |
/* if non-NULL, __cleanup_vec is called after the user program takes |
an exception. */ |
extern volatile __PFV __cleanup_vec; |
|
/* Send an 'O' packet to GDB containing STR. */ |
extern int __output_gdb_string (target_register_t addr, int string_len); |
|
/* Request MAXLEN bytes of input from GDB to be stored in DEST. If BLOCK |
is set, GDB should block until MAXLEN bytes are available to be |
read; otherwise, it will return immediately with whatever data is |
available. |
The return value is the number of bytes written into DEST. */ |
extern int __get_gdb_input (target_register_t dest, int maxlen, int block); |
|
/* Return the ASCII equivalent of C (C>=0 && C<=15). The result will be |
lower-case. */ |
extern char __tohex (int c); |
|
/* Convert COUNT bytes of the memory region in MEM to a hexadecimal |
string in DEST. |
The resulting string will contain 2*COUNT characters. |
If MAY_FAULT is non-zero, memory faults are trapped; if a fault occurs, |
a NULL value will be returned. |
The value returned is one byte past the end of the string written. */ |
extern char *__mem2hex (char *mem, char *dest, int count, int may_fault); |
|
/* Given a hexadecimal string in MEM, write the equivalent bytes to DEST. |
The string is assumed to contain 2*COUNT characters. |
If MAY_FAULT is non-zero, memory faults are trapped; if a fault occurs, |
a NULL value will be returned. |
Otherwise, the value returned is one byte past the last byte written. */ |
extern char *__hex2mem (char *buf, char *mem, int count, int may_fault); |
|
/* Set the program arguments passed into the user program's main */ |
extern void __set_program_args (int argc, char **argv); |
|
/* Return the user program arguments passed in from GDB (via an 'A' |
packet). argcPtr is a pointer into the user program, which will hold |
the number of arguments; the strings are returned. */ |
extern char **__get_program_args (target_register_t argcPtr); |
|
/* Encode PACKET as a remote protocol packet and send it to GDB; this takes |
care of sending the initial '$' character, as well as the trailing '#' |
and checksum, and also waits for an ACK from the remote side, resending |
as necessary. */ |
extern void __putpacket (char *packet); |
|
/* Retrieve the next remote protocol packet from GDB, taking care of verifying |
the checksum and sending an ACK when necessary. */ |
extern void __getpacket (char *buffer); |
|
/* Convert the hexadecimal string pointed to by *PTR into an integer, |
and store it in the value pointed to by INTVALUE. The number of |
characters read from *PTR will be returned; *PTR will point to the first |
non-hexadecmial character encountered. */ |
extern unsigned int __hexToInt (char **ptr, target_register_t *intValue); |
|
/* Convert the value in INTVALUE into a string of hexadecimal |
characters stored in PTR. NUMBITS are the number of bits to use |
in INTVALUE. The number of characters written to PTR will be returned. */ |
extern unsigned int __intToHex (char *ptr, |
target_register_t intValue, |
int numBits); |
|
/* Handle an exception, usually some sort of hardware or software trap. |
This is responsible for communicating the exception to GDB. */ |
extern void __handle_exception (void); |
|
/* Send a 'X' packet with signal SIGVAL to GDB. */ |
extern void __kill_program (int sigval); |
|
/* Given a packet pointed to by PACKETCONTENTS, decode it and respond to |
GDB appropriately. */ |
extern int __process_packet (char *packetContents); |
|
/* Write the C-style string pointed to by STR to the GDB comm port. |
Used for printing debug messages. */ |
extern void __putDebugStr (char *str); |
|
#if defined(NO_MALLOC) && !defined(MAX_BP_NUM) |
#define MAX_BP_NUM 64 /* Maximum allowed # of breakpoints */ |
#endif |
|
extern int hal_syscall_handler(void); |
extern int __is_bsp_syscall(void); |
|
extern void __install_breakpoint_list (void); |
extern void __clear_breakpoint_list (void); |
extern int __display_breakpoint_list (void (*print_func)(target_register_t)); |
|
/* 'Z' packet types */ |
#define ZTYPE_SW_BREAKPOINT 0 |
#define ZTYPE_HW_BREAKPOINT 1 |
#define ZTYPE_HW_WATCHPOINT_WRITE 2 |
#define ZTYPE_HW_WATCHPOINT_READ 3 |
#define ZTYPE_HW_WATCHPOINT_ACCESS 4 |
|
#endif /* ASM */ |
|
#ifdef __cplusplus |
} /* extern "C" */ |
#endif |
|
#endif /* GENERIC_STUB_H */ |