From 11290355c9454c575d56c7928a725fd95e88d6f8 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 29 Sep 1995 17:19:16 +0000 Subject: all targets compile .. tony's patches in place --- c/build-tools/src/unhex.c | 2 +- c/build-tools/unhex.c | 2 +- c/src/exec/libcsupport/src/error.c | 2 +- c/src/exec/libcsupport/src/malloc.c | 130 ++++++++++++++++------ c/src/exec/score/cpu/hppa1.1/cpu.c | 21 +++- c/src/exec/score/cpu/hppa1.1/cpu.h | 9 +- c/src/exec/score/cpu/hppa1.1/cpu_asm.s | 12 +- c/src/exec/score/cpu/hppa1.1/hppa.h | 40 +++++-- c/src/exec/score/cpu/m68k/cpu_asm.s | 34 ++++-- c/src/exec/score/cpu/unix/cpu.c | 2 +- c/src/exec/score/headers/heap.h | 4 +- c/src/exec/score/include/rtems/score/heap.h | 4 +- c/src/exec/score/inline/heap.inl | 4 +- c/src/exec/score/inline/rtems/score/heap.inl | 4 +- c/src/exec/score/macros/heap.inl | 4 +- c/src/exec/score/macros/rtems/score/heap.inl | 4 +- c/src/exec/score/src/heap.c | 15 ++- c/src/exec/score/tools/hppa1.1/genoffsets.c | 4 +- c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h | 5 +- c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c | 6 +- c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c | 26 +---- c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c | 6 +- c/src/lib/libbsp/m68k/gen68302/startup/linkcmds | 1 + c/src/lib/libbsp/shmdr/dump.c | 1 - c/src/lib/libbsp/shmdr/fatal.c | 4 +- c/src/lib/libbsp/shmdr/getlq.c | 2 + c/src/lib/libbsp/shmdr/shm.h | 6 +- c/src/lib/libbsp/shmdr/shm_driver.h | 6 +- c/src/lib/libbsp/unix/posix/include/bsp.h | 1 - c/src/lib/libbsp/unix/posix/startup/bspstart.c | 5 + c/src/lib/libbsp/unix/posix/startup/setvec.c | 12 -- c/src/lib/libc/error.c | 2 +- c/src/lib/libc/malloc.c | 130 ++++++++++++++++------ c/src/lib/libcpu/hppa1.1/clock/clock.c | 5 +- c/src/lib/libmisc/error/error.c | 2 +- c/src/lib/libmisc/monitor/mon-extension.c | 34 +++--- c/src/lib/libmisc/monitor/mon-symbols.c | 8 +- c/src/lib/libmisc/monitor/monitor.h | 16 +-- c/src/lib/libmisc/stackchk/check.c | 9 +- c/src/lib/libmisc/stackchk/internal.h | 4 +- c/src/libchip/shmdr/dump.c | 1 - c/src/libchip/shmdr/fatal.c | 4 +- c/src/libchip/shmdr/getlq.c | 2 + c/src/libchip/shmdr/shm_driver.h | 6 +- c/src/libmisc/error/error.c | 2 +- c/src/libmisc/monitor/mon-extension.c | 34 +++--- c/src/libmisc/monitor/mon-symbols.c | 8 +- c/src/libmisc/monitor/monitor.h | 16 +-- c/src/libmisc/stackchk/check.c | 9 +- c/src/libmisc/stackchk/internal.h | 4 +- c/src/tests/samples/cdtest/main.cc | 3 +- c/src/tests/support/include/tmacros.h | 3 - cpukit/libcsupport/src/error.c | 2 +- cpukit/libcsupport/src/malloc.c | 130 ++++++++++++++++------ cpukit/libmisc/monitor/mon-extension.c | 34 +++--- cpukit/libmisc/monitor/mon-symbols.c | 8 +- cpukit/libmisc/monitor/monitor.h | 16 +-- cpukit/libmisc/stackchk/check.c | 9 +- cpukit/libmisc/stackchk/internal.h | 4 +- cpukit/score/cpu/hppa1.1/cpu.c | 21 +++- cpukit/score/cpu/unix/cpu.c | 2 +- cpukit/score/include/rtems/score/heap.h | 4 +- cpukit/score/inline/rtems/score/heap.inl | 4 +- cpukit/score/macros/rtems/score/heap.inl | 4 +- cpukit/score/src/heap.c | 15 ++- testsuites/samples/cdtest/main.cc | 3 +- testsuites/support/include/tmacros.h | 3 - tools/build/src/unhex.c | 2 +- tools/build/unhex.c | 2 +- tools/cpu/hppa1.1/genoffsets.c | 4 +- 70 files changed, 629 insertions(+), 318 deletions(-) diff --git a/c/build-tools/src/unhex.c b/c/build-tools/src/unhex.c index 540095d6f4..f149449302 100644 --- a/c/build-tools/src/unhex.c +++ b/c/build-tools/src/unhex.c @@ -86,7 +86,7 @@ void error(int errn, ...); #define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */ #define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */ -#define stol(p) strtol(p, (char **) NULL, 0) +#define stol(p) strtoul(p, (char **) NULL, 0) int unhex(FILE *ifp, char *inm, FILE *ofp, char *onm); int convert_Intel_records(FILE *ifp, char *inm, FILE *ofp, char *onm); diff --git a/c/build-tools/unhex.c b/c/build-tools/unhex.c index 540095d6f4..f149449302 100644 --- a/c/build-tools/unhex.c +++ b/c/build-tools/unhex.c @@ -86,7 +86,7 @@ void error(int errn, ...); #define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */ #define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */ -#define stol(p) strtol(p, (char **) NULL, 0) +#define stol(p) strtoul(p, (char **) NULL, 0) int unhex(FILE *ifp, char *inm, FILE *ofp, char *onm); int convert_Intel_records(FILE *ifp, char *inm, FILE *ofp, char *onm); diff --git a/c/src/exec/libcsupport/src/error.c b/c/src/exec/libcsupport/src/error.c index cfe1858e08..56224f2a56 100644 --- a/c/src/exec/libcsupport/src/error.c +++ b/c/src/exec/libcsupport/src/error.c @@ -39,7 +39,7 @@ * EXAMPLE * if ((fd = open(pathname, O_RDNLY)) < 0) * { - * rtems_error(FLOSS_ERROR_ERRNO, "open of '%s' failed", pathname); + * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname); * goto failed; * } */ diff --git a/c/src/exec/libcsupport/src/malloc.c b/c/src/exec/libcsupport/src/malloc.c index a7d14b14ab..8639198bed 100644 --- a/c/src/exec/libcsupport/src/malloc.c +++ b/c/src/exec/libcsupport/src/malloc.c @@ -14,9 +14,6 @@ */ #include -#ifdef RTEMS_LIBC -#include -#endif #include "libcsupport.h" #ifdef RTEMS_NEWLIB #include @@ -29,21 +26,30 @@ #include #include -/* - * XXX: Do we really need to duplicate these? It appears that they - * only cause typing problems. - */ +rtems_id RTEMS_Malloc_Heap; +size_t RTEMS_Malloc_Sbrk_amount; -#if 0 -void *malloc(size_t); -void *calloc(size_t, size_t); -void *realloc(void *, size_t); -void free(void *); -void *sbrk(size_t); +#ifdef RTEMS_DEBUG +#define MALLOC_STATS #endif -rtems_id RTEMS_Malloc_Heap; -size_t RTEMS_Malloc_Sbrk_amount; +#ifdef MALLOC_STATS +#define MSBUMP(f,n) malloc_stats.f += (n) + +struct { + unsigned32 space_available; /* current size of malloc area */ + unsigned32 malloc_calls; /* # calls to malloc */ + unsigned32 free_calls; + unsigned32 realloc_calls; + unsigned32 calloc_calls; + unsigned32 max_depth; /* most ever malloc'd at 1 time */ + unsigned64 lifetime_allocated; + unsigned64 lifetime_freed; +} malloc_stats; + +#else /* No malloc_stats */ +#define MSBUMP(f,n) +#endif void RTEMS_Malloc_Initialize( void *start, @@ -77,9 +83,9 @@ void RTEMS_Malloc_Initialize( old_address = u32_address; u32_address = (u32_address + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1); - /* - * Adjust the length by whatever we aligned by - */ + /* + * adjust the length by whatever we aligned by + */ length -= u32_address - old_address; } @@ -97,12 +103,19 @@ void RTEMS_Malloc_Initialize( rtems_build_name( 'H', 'E', 'A', 'P' ), starting_address, length, - 8, /* XXX : use CPU dependent RTEMS constant */ + CPU_ALIGNMENT, RTEMS_DEFAULT_ATTRIBUTES, &RTEMS_Malloc_Heap ); if ( status != RTEMS_SUCCESSFUL ) rtems_fatal_error_occurred( status ); + +#ifdef MALLOC_STATS + /* zero all the stats */ + (void) memset(&malloc_stats, 0, sizeof(malloc_stats)); +#endif + + MSBUMP(space_available, length); } void *malloc( @@ -115,6 +128,8 @@ void *malloc( rtems_unsigned32 sbrk_amount; rtems_status_code status; + MSBUMP(malloc_calls, 1); + if ( !size ) return (void *) 0; @@ -149,11 +164,6 @@ void *malloc( if (((rtems_unsigned32)starting_address = sbrk(the_size)) == -1) return (void *) 0; - /* - fprintf(stderr, "Extended the C heap starting at 0x%x for %d bytes\n", - (unsigned32)starting_address, the_size); - */ - status = rtems_region_extend( RTEMS_Malloc_Heap, starting_address, @@ -161,10 +171,12 @@ void *malloc( ); if ( status != RTEMS_SUCCESSFUL ) { sbrk(-the_size); - return(FALSE); errno = ENOMEM; return (void *) 0; } + + MSBUMP(space_available, the_size); + status = rtems_region_get_segment( RTEMS_Malloc_Heap, size, @@ -178,6 +190,17 @@ void *malloc( } } +#ifdef MALLOC_STATS + if (return_this) + { + unsigned32 current_depth; + MSBUMP(lifetime_allocated, size); + current_depth = malloc_stats.lifetime_allocated - malloc_stats.lifetime_freed; + if (current_depth > malloc_stats.max_depth) + malloc_stats.max_depth = current_depth; + } +#endif + return return_this; } @@ -189,6 +212,8 @@ void *calloc( register char *cptr; int length; + MSBUMP(calloc_calls, 1); + length = nelem * elsize; cptr = malloc( length ); if ( cptr ) @@ -206,6 +231,8 @@ void *realloc( rtems_status_code status; char *new_area; + MSBUMP(realloc_calls, 1); + if ( !ptr ) return malloc( size ); @@ -214,18 +241,18 @@ void *realloc( return (void *) 0; } - status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size ); - if ( status != RTEMS_SUCCESSFUL ) { - errno = EINVAL; - return (void *) 0; - } - new_area = malloc( size ); if ( !new_area ) { free( ptr ); return (void *) 0; } + status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size ); + if ( status != RTEMS_SUCCESSFUL ) { + errno = EINVAL; + return (void *) 0; + } + memcpy( new_area, ptr, (size < old_size) ? size : old_size ); free( ptr ); @@ -239,9 +266,21 @@ void free( { rtems_status_code status; + MSBUMP(free_calls, 1); + if ( !ptr ) return; +#ifdef MALLOC_STATS + { + unsigned32 size; + status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &size ); + if ( status == RTEMS_SUCCESSFUL ) { + MSBUMP(lifetime_freed, size); + } + } +#endif + status = rtems_region_return_segment( RTEMS_Malloc_Heap, ptr ); if ( status != RTEMS_SUCCESSFUL ) { errno = EINVAL; @@ -249,6 +288,35 @@ void free( } } +#ifdef MALLOC_STATS +/* + * Dump the malloc statistics + * May be called via atexit() (installable by our bsp) or + * at any time by user + */ + +void malloc_dump(void) +{ + unsigned32 allocated = malloc_stats.lifetime_allocated - malloc_stats.lifetime_freed; + + printf("Malloc stats\n"); + printf(" avail:%uk allocated:%uk (%d%%) max:%uk (%d%%) lifetime:%Luk freed:%Luk\n", + (unsigned int) malloc_stats.space_available / 1024, + (unsigned int) allocated / 1024, + /* avoid float! */ + (allocated * 100) / malloc_stats.space_available, + (unsigned int) malloc_stats.max_depth / 1024, + (malloc_stats.max_depth * 100) / malloc_stats.space_available, + (unsigned long long) malloc_stats.lifetime_allocated / 1024, + (unsigned long long) malloc_stats.lifetime_freed / 1024); + printf(" Call counts: malloc:%d free:%d realloc:%d calloc:%d\n", + malloc_stats.malloc_calls, + malloc_stats.free_calls, + malloc_stats.realloc_calls, + malloc_stats.calloc_calls); +} +#endif + /* * "Reentrant" versions of the above routines implemented above. */ diff --git a/c/src/exec/score/cpu/hppa1.1/cpu.c b/c/src/exec/score/cpu/hppa1.1/cpu.c index f132033595..09c5d3d54b 100644 --- a/c/src/exec/score/cpu/hppa1.1/cpu.c +++ b/c/src/exec/score/cpu/hppa1.1/cpu.c @@ -14,12 +14,13 @@ * Division Incorporated makes no representations about the * suitability of this software for any purpose. * - * $Id$ + * cpu.c,v 1.7 1995/09/19 14:49:35 joel Exp */ #include -#include -#include +#include +#include +#include void hppa_external_interrupt_initialize(void); void hppa_external_interrupt_enable(unsigned32); @@ -103,6 +104,20 @@ void _CPU_Initialize( _CPU_Table = *cpu_table; } +/*PAGE + * + * _CPU_ISR_Get_level + */ + +unsigned32 _CPU_ISR_Get_level(void) +{ + int level; + HPPA_ASM_SSM(0, level); /* change no bits; just get copy */ + if (level & HPPA_PSW_I) + return 1; + return 0; +} + /*PAGE * * _CPU_ISR_install_raw_handler diff --git a/c/src/exec/score/cpu/hppa1.1/cpu.h b/c/src/exec/score/cpu/hppa1.1/cpu.h index af3573d9a8..caeee7c8ff 100644 --- a/c/src/exec/score/cpu/hppa1.1/cpu.h +++ b/c/src/exec/score/cpu/hppa1.1/cpu.h @@ -20,7 +20,7 @@ * Note: * This file is included by both C and assembler code ( -DASM ) * - * $Id$ + * cpu.h,v 1.5 1995/09/11 19:24:10 joel Exp */ #ifndef __CPU_h @@ -30,9 +30,9 @@ extern "C" { #endif -#include /* pick up machine definitions */ +#include /* pick up machine definitions */ #ifndef ASM -#include +#include #endif /* conditional compilation parameters */ @@ -368,6 +368,9 @@ EXTERN void *_CPU_Interrupt_stack_high; else HPPA_ASM_SSM(HPPA_PSW_I, ignore); \ } +/* return current level */ +unsigned32 _CPU_ISR_Get_level( void ); + /* end of ISR handler macros */ /* diff --git a/c/src/exec/score/cpu/hppa1.1/cpu_asm.s b/c/src/exec/score/cpu/hppa1.1/cpu_asm.s index afca4b773f..ea7c879183 100644 --- a/c/src/exec/score/cpu/hppa1.1/cpu_asm.s +++ b/c/src/exec/score/cpu/hppa1.1/cpu_asm.s @@ -1,4 +1,4 @@ -# @(#)cpu_asm.S 1.6 - 95/05/16 +# @(#)cpu_asm.S 1.7 - 95/09/21 # # # TODO: @@ -24,14 +24,14 @@ # Division Incorporated makes no representations about the # suitability of this software for any purpose. # -# $Id$ +# cpu_asm.S,v 1.5 1995/09/19 14:49:36 joel Exp # -#include -#include -#include +#include +#include +#include -#include +#include .SPACE $PRIVATE$ .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31 diff --git a/c/src/exec/score/cpu/hppa1.1/hppa.h b/c/src/exec/score/cpu/hppa1.1/hppa.h index 74691eb1a7..1d9839995a 100644 --- a/c/src/exec/score/cpu/hppa1.1/hppa.h +++ b/c/src/exec/score/cpu/hppa1.1/hppa.h @@ -1,5 +1,5 @@ /* - * @(#)hppa.h 1.9 - 95/06/28 + * @(#)hppa.h 1.13 - 95/09/21 * * * Description: @@ -24,7 +24,7 @@ * Note: * This file is included by both C and assembler code ( -DASM ) * - * $Id$ + * hppa.h,v 1.4 1995/09/19 14:49:37 joel Exp */ #ifndef _INCLUDE_HPPA_H @@ -64,23 +64,23 @@ extern "C" { * present in a particular member of the family. */ -#if !defined(CPU_MODEL_NAME) +#if !defined(RTEMS_MODEL_NAME) #if defined(hppa7100) -#define CPU_MODEL_NAME "hppa 7100" +#define RTEMS_MODEL_NAME "hppa 7100" #elif defined(hppa7200) -#define CPU_MODEL_NAME "hppa 7200" +#define RTEMS_MODEL_NAME "hppa 7200" #else -#error "Unsupported CPU Model" +#define RTEMS_MODEL_NAME Unsupported CPU Model /* cause an error on usage */ #endif -#endif /* !defined(CPU_MODEL_NAME) */ +#endif /* !defined(RTEMS_MODEL_NAME) */ /* * Define the name of the CPU family. @@ -222,6 +222,32 @@ extern "C" { #define HPPA_CACHELINE_MASK (HPPA_CACHELINE_SIZE - 1) +/* + * TLB characteristics + * + * Flags and Access Control layout for using TLB protection insertion + * + * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |?|?|T|D|B|type |PL1|Pl2|U| access id |?| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + */ + +/* + * Access rights (type + PL1 + PL2) + */ +#define HPPA_PROT_R 0x00c00000 /* Read Only, no Write, no Execute */ +#define HPPA_PROT_RW 0x01c00000 /* Read & Write Only, no Execute */ +#define HPPA_PROT_RX 0x02c00000 /* Read & Execute Only, no Write */ +#define HPPA_PROT_RWX 0x03c00000 /* Read, Write, Execute */ +#define HPPA_PROT_X0 0x04c00000 /* Execute Only, Promote to Level 0 */ +#define HPPA_PROT_X1 0x05c00000 /* Execute Only, Promote to Level 1 */ +#define HPPA_PROT_X2 0x06c00000 /* Execute Only, Promote to Level 2 */ +#define HPPA_PROT_X3 0x07c00000 /* Execute Only, Promote to Level 3 */ + + /* * Inline macros for misc. interesting opcodes */ diff --git a/c/src/exec/score/cpu/m68k/cpu_asm.s b/c/src/exec/score/cpu/m68k/cpu_asm.s index 2f0758f33d..fb8ba678b2 100644 --- a/c/src/exec/score/cpu/m68k/cpu_asm.s +++ b/c/src/exec/score/cpu/m68k/cpu_asm.s @@ -59,15 +59,15 @@ restore: movml a0@,d1-d7/a2-a7 | restore context .global SYM (_CPU_Context_save_fp) SYM (_CPU_Context_save_fp): #if ( M68K_HAS_FPU == 1 ) - moval a7@(FPCONTEXT_ARG),a1 | a1 = &ptr to context area - moval a1@,a0 | a0 = Save context area + moval a7@(FPCONTEXT_ARG),a1 | a1 = &ptr to context area + moval a1@,a0 | a0 = Save context area fsave a0@- | save 68881/68882 state frame tstb a0@ | check for a null frame - beq nosv | Yes, skip save of user model - fmovem fp0-fp7,a0@- | save data registers (fp0-fp7) - fmovem fpc/fps/fpi,a0@- | and save control registers + beq nosv | Yes, skip save of user model + fmovem fp0-fp7,a0@- | save data registers (fp0-fp7) + fmovem fpc/fps/fpi,a0@- | and save control registers movl #-1,a0@- | place not-null flag on stack -nosv: movl a0,a1@ | save pointer to saved context +nosv: movl a0,a1@ | save pointer to saved context #endif rts @@ -75,15 +75,15 @@ nosv: movl a0,a1@ | save pointer to saved context .global SYM (_CPU_Context_restore_fp) SYM (_CPU_Context_restore_fp): #if ( M68K_HAS_FPU == 1 ) - moval a7@(FPCONTEXT_ARG),a1 | a1 = &ptr to context area - moval a1@,a0 | a0 = address of saved context + moval a7@(FPCONTEXT_ARG),a1 | a1 = &ptr to context area + moval a1@,a0 | a0 = address of saved context tstb a0@ | Null context frame? - beq norst | Yes, skip fp restore + beq norst | Yes, skip fp restore addql #4,a0 | throwaway non-null flag - fmovem a0@+,fpc/fps/fpi | restore control registers - fmovem a0@+,fp0-fp7 | restore data regs (fp0-fp7) + fmovem a0@+,fpc/fps/fpi | restore control registers + fmovem a0@+,fp0-fp7 | restore data regs (fp0-fp7) norst: frestore a0@+ | restore the fp state frame - movl a0,a1@ | save pointer to saved context + movl a0,a1@ | save pointer to saved context #endif rts @@ -112,6 +112,9 @@ norst: frestore a0@+ | restore the fp state frame * higher priority interrupt in the new context if * permitted by the new interrupt level mask, and (2) when * the original context regains the cpu. + * + * XXX: Code for switching to a software maintained interrupt stack is + * not in place. */ #if ( M68K_HAS_VBR == 1) @@ -134,6 +137,13 @@ SYM (_ISR_Handler): addql #1,SYM (_Thread_Dispatch_disable_level) | disable multitasking moveml d0-d1/a0-a1,a7@- | save d0-d1,a0-a1 +/* + * NOTE FOR CPUs WITHOUT HARDWARE INTERRUPT STACK: + * + * After the interrupted codes registers have been saved, it is save + * to switch to the software maintained interrupt stack. + */ + #if ( M68K_HAS_VBR == 0) movel a7@(SAVED+JSR_OFFSET),d0 | assume the exception table at 0x0000 addql #6,d0 | points to a jump table (jsr) in RAM diff --git a/c/src/exec/score/cpu/unix/cpu.c b/c/src/exec/score/cpu/unix/cpu.c index 54d4104ac7..a7b2140742 100644 --- a/c/src/exec/score/cpu/unix/cpu.c +++ b/c/src/exec/score/cpu/unix/cpu.c @@ -173,7 +173,7 @@ void _CPU_Signal_initialize( void ) void _CPU_Context_From_CPU_Init() { -#if defined(hppa1_1) && defined(RTEMS_UNIXLIB) +#if defined(hppa1_1) && defined(RTEMS_UNIXLIB_SETJMP) /* * HACK - set the _SYSTEM_ID to 0x20c so that setjmp/longjmp * will handle the full 32 floating point registers. diff --git a/c/src/exec/score/headers/heap.h b/c/src/exec/score/headers/heap.h index affd52cd73..dd50a0de8a 100644 --- a/c/src/exec/score/headers/heap.h +++ b/c/src/exec/score/headers/heap.h @@ -280,11 +280,11 @@ STATIC INLINE Heap_Block *_Heap_Block_at( /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -STATIC INLINE Heap_Block *_Heap_User_Block_at( +STATIC INLINE Heap_Block *_Heap_User_block_at( void *base ); diff --git a/c/src/exec/score/include/rtems/score/heap.h b/c/src/exec/score/include/rtems/score/heap.h index affd52cd73..dd50a0de8a 100644 --- a/c/src/exec/score/include/rtems/score/heap.h +++ b/c/src/exec/score/include/rtems/score/heap.h @@ -280,11 +280,11 @@ STATIC INLINE Heap_Block *_Heap_Block_at( /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -STATIC INLINE Heap_Block *_Heap_User_Block_at( +STATIC INLINE Heap_Block *_Heap_User_block_at( void *base ); diff --git a/c/src/exec/score/inline/heap.inl b/c/src/exec/score/inline/heap.inl index c32226852e..0d1b1231a7 100644 --- a/c/src/exec/score/inline/heap.inl +++ b/c/src/exec/score/inline/heap.inl @@ -94,11 +94,11 @@ STATIC INLINE Heap_Block *_Heap_Block_at( /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -STATIC INLINE Heap_Block *_Heap_User_Block_at( +STATIC INLINE Heap_Block *_Heap_User_block_at( void *base ) { diff --git a/c/src/exec/score/inline/rtems/score/heap.inl b/c/src/exec/score/inline/rtems/score/heap.inl index c32226852e..0d1b1231a7 100644 --- a/c/src/exec/score/inline/rtems/score/heap.inl +++ b/c/src/exec/score/inline/rtems/score/heap.inl @@ -94,11 +94,11 @@ STATIC INLINE Heap_Block *_Heap_Block_at( /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -STATIC INLINE Heap_Block *_Heap_User_Block_at( +STATIC INLINE Heap_Block *_Heap_User_block_at( void *base ) { diff --git a/c/src/exec/score/macros/heap.inl b/c/src/exec/score/macros/heap.inl index 47df055100..94f4ff9194 100644 --- a/c/src/exec/score/macros/heap.inl +++ b/c/src/exec/score/macros/heap.inl @@ -70,11 +70,11 @@ /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -#define _Heap_User_Block_at( _base ) \ +#define _Heap_User_block_at( _base ) \ _Heap_Block_at( \ (_base), \ -*(((unsigned32 *) (_base)) - 1) + -HEAP_BLOCK_USED_OVERHEAD \ diff --git a/c/src/exec/score/macros/rtems/score/heap.inl b/c/src/exec/score/macros/rtems/score/heap.inl index 47df055100..94f4ff9194 100644 --- a/c/src/exec/score/macros/rtems/score/heap.inl +++ b/c/src/exec/score/macros/rtems/score/heap.inl @@ -70,11 +70,11 @@ /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -#define _Heap_User_Block_at( _base ) \ +#define _Heap_User_block_at( _base ) \ _Heap_Block_at( \ (_base), \ -*(((unsigned32 *) (_base)) - 1) + -HEAP_BLOCK_USED_OVERHEAD \ diff --git a/c/src/exec/score/src/heap.c b/c/src/exec/score/src/heap.c index 2380678209..bccd30ccc0 100644 --- a/c/src/exec/score/src/heap.c +++ b/c/src/exec/score/src/heap.c @@ -301,7 +301,7 @@ boolean _Heap_Size_of_user_area( Heap_Block *next_block; unsigned32 the_size; - the_block = _Heap_User_Block_at( starting_address ); + the_block = _Heap_User_block_at( starting_address ); if ( !_Heap_Is_block_in( the_heap, the_block ) || _Heap_Is_block_free( the_block ) ) @@ -346,7 +346,7 @@ boolean _Heap_Free( Heap_Block *temporary_block; unsigned32 the_size; - the_block = _Heap_User_Block_at( starting_address ); + the_block = _Heap_User_block_at( starting_address ); if ( !_Heap_Is_block_in( the_heap, the_block ) || _Heap_Is_block_free( the_block ) ) { @@ -430,6 +430,8 @@ void _Heap_Walk( Heap_Block *the_block = 0; /* avoid warnings */ Heap_Block *next_block = 0; /* avoid warnings */ int notdone = 1; + int error = 0; + int passes = 0; /* * We don't want to allow walking the heap until we have @@ -455,9 +457,14 @@ void _Heap_Walk( if (the_block->back_flag != HEAP_DUMMY_FLAG) { printf("PASS: %d Back flag of 1st block isn't HEAP_DUMMY_FLAG\n", source); + error = 1; } while (notdone) { + passes++; + if (error && (passes > 10)) + abort(); + if (do_dump == TRUE) { printf("PASS: %d Block @ 0x%p Back %d, Front %d", source, the_block, @@ -477,6 +484,7 @@ void _Heap_Walk( if ( the_block->front_flag != HEAP_DUMMY_FLAG ) { next_block = _Heap_Next_block(the_block); if ( the_block->front_flag != next_block->back_flag ) { + error = 1; printf("PASS: %d Front and back flags don't match\n", source); printf(" Current Block: Back - %d, Front - %d", the_block->back_flag, the_block->front_flag); @@ -510,4 +518,7 @@ void _Heap_Walk( else the_block = next_block; } + + if (error) + abort(); } diff --git a/c/src/exec/score/tools/hppa1.1/genoffsets.c b/c/src/exec/score/tools/hppa1.1/genoffsets.c index 78ae74b4ec..3bec8e954b 100644 --- a/c/src/exec/score/tools/hppa1.1/genoffsets.c +++ b/c/src/exec/score/tools/hppa1.1/genoffsets.c @@ -1,5 +1,5 @@ /* - * @(#)genoffsets.c 1.5 - 95/05/16 + * @(#)genoffsets.c 1.7 - 95/09/25 * * * genoffsets.c @@ -82,7 +82,7 @@ printf( "\n" \ ); -#if defined(hpux) && defined(__hppa__) +#if defined(__hpux__) && defined(__hppa__) /* * Offsets of elements in the Context_control structure. diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h b/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h index 8bf036b22e..1f68dea214 100644 --- a/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h +++ b/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h @@ -13,8 +13,8 @@ * $Id$ */ -#ifndef __SIMHPPA_h -#define __SIMHPPA_h +#ifndef __PXFL_BSP_h +#define __PXFL_BSP_h #ifdef __cplusplus extern "C" { @@ -23,7 +23,6 @@ extern "C" { #include #include #include -#include /* * Define the time limits for RTEMS Test Suite test durations. diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c index 43052e223d..f2cd34d219 100644 --- a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c +++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c @@ -52,9 +52,7 @@ shm_config_table BSP_shm_cfgtbl; -void Shm_Cause_interrupt_simhppa( - rtems_unsigned32 node -); +void Shm_Cause_interrupt_pxfl( rtems_unsigned32 node ); void Shm_Get_configuration( rtems_unsigned32 localnode, @@ -65,7 +63,7 @@ void Shm_Get_configuration( BSP_shm_cfgtbl.length = 16 * KILOBYTE; BSP_shm_cfgtbl.format = SHM_BIG; - BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt_simhppa; + BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt_pxfl; #ifdef NEUTRAL_BIG BSP_shm_cfgtbl.convert = NULL_CONVERT; diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c index 50166b2b8e..fcd14428e1 100644 --- a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c +++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c @@ -1,4 +1,4 @@ -/* void Shm_Cause_interrupt_simhppa( node ) +/* void Shm_Cause_interrupt_pxfl( node ) * * This routine is the shared memory driver routine which * generates interrupts to other CPUs. @@ -24,13 +24,11 @@ #include #include -void Shm_Cause_interrupt_simhppa( +void Shm_Cause_interrupt_pxfl( rtems_unsigned32 node ) { Shm_Interrupt_information *intr; - rtems_unsigned8 *u8; - rtems_unsigned16 *u16; rtems_unsigned32 *u32; rtems_unsigned32 value; @@ -40,25 +38,13 @@ void Shm_Cause_interrupt_simhppa( switch ( intr->length ) { case NO_INTERRUPT: break; - case BYTE: - u8 = (rtems_unsigned8 *)intr->address; - fprintf( - stderr, - "Shm_Cause_interrupt_simhppa: Writes of unsigned8 not supported!!!\n" - ); - rtems_shutdown_executive( 0 ); - break; - case WORD: - u16 = (rtems_unsigned16 *)intr->address; - fprintf( - stderr, - "Shm_Cause_interrupt_simhppa: Writes of unsigned8 not supported!!!\n" - ); - rtems_shutdown_executive( 0 ); - break; case LONG: u32 = (rtems_unsigned32 *)intr->address; HPPA_ASM_STWAS( value, 0, u32 ); break; + default: + fprintf( stderr, "Shm_Cause_interrupt_pxfl: Unsupported length!!!\n" ); + rtems_shutdown_executive( 0 ); + break; } } diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c b/c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c index e711b64fb2..9d2aa5de73 100644 --- a/c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c +++ b/c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c @@ -55,9 +55,9 @@ set_vector( /* returns old vector */ else if ((vector >= HPPA_INTERRUPT_BSP_BASE) && (vector < (HPPA_INTERRUPT_BSP_BASE + HPPA_BSP_INTERRUPTS))) { - simhppa_interrupt_install(handler, - vector - HPPA_INTERRUPT_BSP_BASE, - (rtems_isr_entry *) &previous_isr); + pxfl_interrupt_install(handler, + vector - HPPA_INTERRUPT_BSP_BASE, + (rtems_isr_entry *) &previous_isr); } #endif diff --git a/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds b/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds index d6d53569f3..427adb0cd4 100644 --- a/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds +++ b/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds @@ -19,6 +19,7 @@ MEMORY } m302 = 0xf7f000; +_VBR = 0x000000; /* location of the VBR table (in RAM) */ SECTIONS { diff --git a/c/src/lib/libbsp/shmdr/dump.c b/c/src/lib/libbsp/shmdr/dump.c index e028ab4204..dc02961138 100644 --- a/c/src/lib/libbsp/shmdr/dump.c +++ b/c/src/lib/libbsp/shmdr/dump.c @@ -19,7 +19,6 @@ #include #include -#include #include "shm.h" diff --git a/c/src/lib/libbsp/shmdr/fatal.c b/c/src/lib/libbsp/shmdr/fatal.c index fc1e9f8624..b36ff8da41 100644 --- a/c/src/lib/libbsp/shmdr/fatal.c +++ b/c/src/lib/libbsp/shmdr/fatal.c @@ -22,7 +22,9 @@ #include "shm.h" void MPCI_Fatal( - rtems_unsigned32 error + Internal_errors_Source source, + boolean is_internal, + rtems_unsigned32 error ) { /* Eventually need to attempt to broadcast a K_FATAL message diff --git a/c/src/lib/libbsp/shmdr/getlq.c b/c/src/lib/libbsp/shmdr/getlq.c index 180c33ef00..ebc5bed8b6 100644 --- a/c/src/lib/libbsp/shmdr/getlq.c +++ b/c/src/lib/libbsp/shmdr/getlq.c @@ -33,6 +33,7 @@ Shm_Envelope_control *Shm_Locked_queue_Get( tmp_ecb = NULL; Shm_Lock( lq_cb ); + tmpfront = Shm_Convert(lq_cb->front); if ( tmpfront != Shm_Locked_queue_End_of_list ) { tmp_ecb = &Shm_Envelopes[ tmpfront ]; @@ -41,6 +42,7 @@ Shm_Envelope_control *Shm_Locked_queue_Get( lq_cb->rear = Shm_Locked_queue_End_of_list; tmp_ecb->next = Shm_Locked_queue_Not_on_list; } + Shm_Unlock( lq_cb ); return( tmp_ecb ); } diff --git a/c/src/lib/libbsp/shmdr/shm.h b/c/src/lib/libbsp/shmdr/shm.h index 5ccb0aab6b..f4671dde97 100644 --- a/c/src/lib/libbsp/shmdr/shm.h +++ b/c/src/lib/libbsp/shmdr/shm.h @@ -470,7 +470,11 @@ void Shm_Locked_queue_Initialize( /* portable routines */ void Init_env_pool(); void Shm_Print_statistics( void ); -void MPCI_Fatal( rtems_unsigned32 ); +void MPCI_Fatal( + Internal_errors_Source source, + boolean is_internal, + rtems_unsigned32 error + ); rtems_task Shm_Cause_interrupt( rtems_unsigned32 ); void Shm_Poll(); void Shm_setclockvec(); diff --git a/c/src/lib/libbsp/shmdr/shm_driver.h b/c/src/lib/libbsp/shmdr/shm_driver.h index 5ccb0aab6b..f4671dde97 100644 --- a/c/src/lib/libbsp/shmdr/shm_driver.h +++ b/c/src/lib/libbsp/shmdr/shm_driver.h @@ -470,7 +470,11 @@ void Shm_Locked_queue_Initialize( /* portable routines */ void Init_env_pool(); void Shm_Print_statistics( void ); -void MPCI_Fatal( rtems_unsigned32 ); +void MPCI_Fatal( + Internal_errors_Source source, + boolean is_internal, + rtems_unsigned32 error + ); rtems_task Shm_Cause_interrupt( rtems_unsigned32 ); void Shm_Poll(); void Shm_setclockvec(); diff --git a/c/src/lib/libbsp/unix/posix/include/bsp.h b/c/src/lib/libbsp/unix/posix/include/bsp.h index 0b3556c80f..4b9cf3f837 100644 --- a/c/src/lib/libbsp/unix/posix/include/bsp.h +++ b/c/src/lib/libbsp/unix/posix/include/bsp.h @@ -24,7 +24,6 @@ extern "C" { #include #include #include -#include /* * Define the time limits for RTEMS Test Suite test durations. diff --git a/c/src/lib/libbsp/unix/posix/startup/bspstart.c b/c/src/lib/libbsp/unix/posix/startup/bspstart.c index f948d5a038..8ce3e92ecb 100644 --- a/c/src/lib/libbsp/unix/posix/startup/bspstart.c +++ b/c/src/lib/libbsp/unix/posix/startup/bspstart.c @@ -195,6 +195,11 @@ bsp_postdriver_hook(void) if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) rtems_fatal_error_occurred('STIO'); #endif + +#if defined(MALLOC_STATS) + atexit(malloc_dump); +#endif + } /* diff --git a/c/src/lib/libbsp/unix/posix/startup/setvec.c b/c/src/lib/libbsp/unix/posix/startup/setvec.c index 6be1e50555..9825faa19b 100644 --- a/c/src/lib/libbsp/unix/posix/startup/setvec.c +++ b/c/src/lib/libbsp/unix/posix/startup/setvec.c @@ -8,8 +8,6 @@ * type - 0 indicates raw hardware connect * 1 indicates RTEMS interrupt connect * - * NOTE 'type' is ignored on hppa; all interrupts are owned by RTEMS - * * RETURNS: * address of previous interrupt handler * @@ -26,16 +24,6 @@ #include -/* - * Install an interrupt handler in the right place - * given its vector number from cpu/hppa.h - * There are 2 places an interrupt can be installed - * _ISR_Vector_table - * bsp interrupt XXX: nyi - * - * We decide which based on the vector number - */ - rtems_isr_entry set_vector( /* returns old vector */ rtems_isr_entry handler, /* isr routine */ diff --git a/c/src/lib/libc/error.c b/c/src/lib/libc/error.c index cfe1858e08..56224f2a56 100644 --- a/c/src/lib/libc/error.c +++ b/c/src/lib/libc/error.c @@ -39,7 +39,7 @@ * EXAMPLE * if ((fd = open(pathname, O_RDNLY)) < 0) * { - * rtems_error(FLOSS_ERROR_ERRNO, "open of '%s' failed", pathname); + * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname); * goto failed; * } */ diff --git a/c/src/lib/libc/malloc.c b/c/src/lib/libc/malloc.c index a7d14b14ab..8639198bed 100644 --- a/c/src/lib/libc/malloc.c +++ b/c/src/lib/libc/malloc.c @@ -14,9 +14,6 @@ */ #include -#ifdef RTEMS_LIBC -#include -#endif #include "libcsupport.h" #ifdef RTEMS_NEWLIB #include @@ -29,21 +26,30 @@ #include #include -/* - * XXX: Do we really need to duplicate these? It appears that they - * only cause typing problems. - */ +rtems_id RTEMS_Malloc_Heap; +size_t RTEMS_Malloc_Sbrk_amount; -#if 0 -void *malloc(size_t); -void *calloc(size_t, size_t); -void *realloc(void *, size_t); -void free(void *); -void *sbrk(size_t); +#ifdef RTEMS_DEBUG +#define MALLOC_STATS #endif -rtems_id RTEMS_Malloc_Heap; -size_t RTEMS_Malloc_Sbrk_amount; +#ifdef MALLOC_STATS +#define MSBUMP(f,n) malloc_stats.f += (n) + +struct { + unsigned32 space_available; /* current size of malloc area */ + unsigned32 malloc_calls; /* # calls to malloc */ + unsigned32 free_calls; + unsigned32 realloc_calls; + unsigned32 calloc_calls; + unsigned32 max_depth; /* most ever malloc'd at 1 time */ + unsigned64 lifetime_allocated; + unsigned64 lifetime_freed; +} malloc_stats; + +#else /* No malloc_stats */ +#define MSBUMP(f,n) +#endif void RTEMS_Malloc_Initialize( void *start, @@ -77,9 +83,9 @@ void RTEMS_Malloc_Initialize( old_address = u32_address; u32_address = (u32_address + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1); - /* - * Adjust the length by whatever we aligned by - */ + /* + * adjust the length by whatever we aligned by + */ length -= u32_address - old_address; } @@ -97,12 +103,19 @@ void RTEMS_Malloc_Initialize( rtems_build_name( 'H', 'E', 'A', 'P' ), starting_address, length, - 8, /* XXX : use CPU dependent RTEMS constant */ + CPU_ALIGNMENT, RTEMS_DEFAULT_ATTRIBUTES, &RTEMS_Malloc_Heap ); if ( status != RTEMS_SUCCESSFUL ) rtems_fatal_error_occurred( status ); + +#ifdef MALLOC_STATS + /* zero all the stats */ + (void) memset(&malloc_stats, 0, sizeof(malloc_stats)); +#endif + + MSBUMP(space_available, length); } void *malloc( @@ -115,6 +128,8 @@ void *malloc( rtems_unsigned32 sbrk_amount; rtems_status_code status; + MSBUMP(malloc_calls, 1); + if ( !size ) return (void *) 0; @@ -149,11 +164,6 @@ void *malloc( if (((rtems_unsigned32)starting_address = sbrk(the_size)) == -1) return (void *) 0; - /* - fprintf(stderr, "Extended the C heap starting at 0x%x for %d bytes\n", - (unsigned32)starting_address, the_size); - */ - status = rtems_region_extend( RTEMS_Malloc_Heap, starting_address, @@ -161,10 +171,12 @@ void *malloc( ); if ( status != RTEMS_SUCCESSFUL ) { sbrk(-the_size); - return(FALSE); errno = ENOMEM; return (void *) 0; } + + MSBUMP(space_available, the_size); + status = rtems_region_get_segment( RTEMS_Malloc_Heap, size, @@ -178,6 +190,17 @@ void *malloc( } } +#ifdef MALLOC_STATS + if (return_this) + { + unsigned32 current_depth; + MSBUMP(lifetime_allocated, size); + current_depth = malloc_stats.lifetime_allocated - malloc_stats.lifetime_freed; + if (current_depth > malloc_stats.max_depth) + malloc_stats.max_depth = current_depth; + } +#endif + return return_this; } @@ -189,6 +212,8 @@ void *calloc( register char *cptr; int length; + MSBUMP(calloc_calls, 1); + length = nelem * elsize; cptr = malloc( length ); if ( cptr ) @@ -206,6 +231,8 @@ void *realloc( rtems_status_code status; char *new_area; + MSBUMP(realloc_calls, 1); + if ( !ptr ) return malloc( size ); @@ -214,18 +241,18 @@ void *realloc( return (void *) 0; } - status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size ); - if ( status != RTEMS_SUCCESSFUL ) { - errno = EINVAL; - return (void *) 0; - } - new_area = malloc( size ); if ( !new_area ) { free( ptr ); return (void *) 0; } + status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size ); + if ( status != RTEMS_SUCCESSFUL ) { + errno = EINVAL; + return (void *) 0; + } + memcpy( new_area, ptr, (size < old_size) ? size : old_size ); free( ptr ); @@ -239,9 +266,21 @@ void free( { rtems_status_code status; + MSBUMP(free_calls, 1); + if ( !ptr ) return; +#ifdef MALLOC_STATS + { + unsigned32 size; + status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &size ); + if ( status == RTEMS_SUCCESSFUL ) { + MSBUMP(lifetime_freed, size); + } + } +#endif + status = rtems_region_return_segment( RTEMS_Malloc_Heap, ptr ); if ( status != RTEMS_SUCCESSFUL ) { errno = EINVAL; @@ -249,6 +288,35 @@ void free( } } +#ifdef MALLOC_STATS +/* + * Dump the malloc statistics + * May be called via atexit() (installable by our bsp) or + * at any time by user + */ + +void malloc_dump(void) +{ + unsigned32 allocated = malloc_stats.lifetime_allocated - malloc_stats.lifetime_freed; + + printf("Malloc stats\n"); + printf(" avail:%uk allocated:%uk (%d%%) max:%uk (%d%%) lifetime:%Luk freed:%Luk\n", + (unsigned int) malloc_stats.space_available / 1024, + (unsigned int) allocated / 1024, + /* avoid float! */ + (allocated * 100) / malloc_stats.space_available, + (unsigned int) malloc_stats.max_depth / 1024, + (malloc_stats.max_depth * 100) / malloc_stats.space_available, + (unsigned long long) malloc_stats.lifetime_allocated / 1024, + (unsigned long long) malloc_stats.lifetime_freed / 1024); + printf(" Call counts: malloc:%d free:%d realloc:%d calloc:%d\n", + malloc_stats.malloc_calls, + malloc_stats.free_calls, + malloc_stats.realloc_calls, + malloc_stats.calloc_calls); +} +#endif + /* * "Reentrant" versions of the above routines implemented above. */ diff --git a/c/src/lib/libcpu/hppa1.1/clock/clock.c b/c/src/lib/libcpu/hppa1.1/clock/clock.c index d91f85d440..85ecabd263 100644 --- a/c/src/lib/libcpu/hppa1.1/clock/clock.c +++ b/c/src/lib/libcpu/hppa1.1/clock/clock.c @@ -15,9 +15,12 @@ */ #include -#include #include +/* should get this from bsp.h, but it is not installed yet */ +rtems_isr_entry set_vector(rtems_isr_entry, rtems_vector_number, int); +extern rtems_configuration_table BSP_Configuration; + #include /* for atexit() */ extern rtems_cpu_table Cpu_table; /* owned by BSP */ diff --git a/c/src/lib/libmisc/error/error.c b/c/src/lib/libmisc/error/error.c index cfe1858e08..56224f2a56 100644 --- a/c/src/lib/libmisc/error/error.c +++ b/c/src/lib/libmisc/error/error.c @@ -39,7 +39,7 @@ * EXAMPLE * if ((fd = open(pathname, O_RDNLY)) < 0) * { - * rtems_error(FLOSS_ERROR_ERRNO, "open of '%s' failed", pathname); + * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname); * goto failed; * } */ diff --git a/c/src/lib/libmisc/monitor/mon-extension.c b/c/src/lib/libmisc/monitor/mon-extension.c index 230fab9ddf..481a21e7dd 100644 --- a/c/src/lib/libmisc/monitor/mon-extension.c +++ b/c/src/lib/libmisc/monitor/mon-extension.c @@ -1,5 +1,5 @@ /* - * @(#)extension.c 1.3 - 95/07/31 + * @(#)extension.c 1.6 - 95/09/25 * * * RTEMS Monitor extension support @@ -21,22 +21,22 @@ rtems_monitor_extension_canonical( Extension_Control *rtems_extension = (Extension_Control *) extension_void; rtems_extensions_table *e = &rtems_extension->Extension.Callouts; - rtems_monitor_symbol_canonical_by_value(&canonical_extension->create, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_create, e->thread_create); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->start, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_start, e->thread_start); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->restart, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_restart, e->thread_restart); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->delete, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_delete, e->thread_delete); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->tswitch, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_tswitch, e->thread_switch); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->begin, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_begin, e->thread_begin); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->exitted, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_exitted, e->thread_exitted); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->fatal, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_fatal, e->fatal); } @@ -72,29 +72,29 @@ rtems_monitor_extension_dump( length += rtems_monitor_pad(18, length); length += printf("create: "); - length += rtems_monitor_symbol_dump(&monitor_extension->create, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_create, verbose); length += printf("; start: "); - length += rtems_monitor_symbol_dump(&monitor_extension->start, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_start, verbose); length += printf("; restart: "); - length += rtems_monitor_symbol_dump(&monitor_extension->restart, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_restart, verbose); length += printf("\n"); length = 0; length += rtems_monitor_pad(18, length); length += printf("delete: "); - length += rtems_monitor_symbol_dump(&monitor_extension->delete, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_delete, verbose); length += printf("; switch: "); - length += rtems_monitor_symbol_dump(&monitor_extension->tswitch, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_tswitch, verbose); length += printf("; begin: "); - length += rtems_monitor_symbol_dump(&monitor_extension->begin, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_begin, verbose); length += printf("\n"); length = 0; length += rtems_monitor_pad(18, length); length += printf("exitted: "); - length += rtems_monitor_symbol_dump(&monitor_extension->exitted, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_exitted, verbose); length += printf("; fatal: "); - length += rtems_monitor_symbol_dump(&monitor_extension->fatal, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_fatal, verbose); length += printf("\n"); length = 0; printf("\n"); diff --git a/c/src/lib/libmisc/monitor/mon-symbols.c b/c/src/lib/libmisc/monitor/mon-symbols.c index f0e3ed3bc2..9cbd76d280 100644 --- a/c/src/lib/libmisc/monitor/mon-symbols.c +++ b/c/src/lib/libmisc/monitor/mon-symbols.c @@ -184,7 +184,7 @@ rtems_symbol_string_compare(const void *e1, void rtems_symbol_sort(rtems_symbol_table_t *table) { -#ifdef simhppa +#ifdef RTEMS_ON_SIMULATOR printf("Sorting symbols ... "); /* so slow we need a msg */ fflush(stdout); #endif @@ -195,7 +195,7 @@ rtems_symbol_sort(rtems_symbol_table_t *table) qsort((void *) table->symbols, (size_t) table->next, sizeof(rtems_symbol_t), rtems_symbol_string_compare); -#ifdef simhppa +#ifdef RTEMS_ON_SIMULATOR /* so slow we need a msg */ printf("done\n"); #endif @@ -401,11 +401,11 @@ rtems_monitor_symbol_dump( { if (canonical_symbol->offset == 0) length += printf("%.*s", - sizeof(canonical_symbol->name), + (int) sizeof(canonical_symbol->name), canonical_symbol->name); else length += printf("<%.*s+0x%x>", - sizeof(canonical_symbol->name), + (int) sizeof(canonical_symbol->name), canonical_symbol->name, canonical_symbol->offset); if (verbose) diff --git a/c/src/lib/libmisc/monitor/monitor.h b/c/src/lib/libmisc/monitor/monitor.h index c9df923928..2ee03f570b 100644 --- a/c/src/lib/libmisc/monitor/monitor.h +++ b/c/src/lib/libmisc/monitor/monitor.h @@ -140,14 +140,14 @@ typedef struct { rtems_id id; rtems_name name; /* end of common portion */ - rtems_monitor_symbol_t create; - rtems_monitor_symbol_t start; - rtems_monitor_symbol_t restart; - rtems_monitor_symbol_t delete; - rtems_monitor_symbol_t tswitch; - rtems_monitor_symbol_t begin; - rtems_monitor_symbol_t exitted; - rtems_monitor_symbol_t fatal; + rtems_monitor_symbol_t e_create; + rtems_monitor_symbol_t e_start; + rtems_monitor_symbol_t e_restart; + rtems_monitor_symbol_t e_delete; + rtems_monitor_symbol_t e_tswitch; + rtems_monitor_symbol_t e_begin; + rtems_monitor_symbol_t e_exitted; + rtems_monitor_symbol_t e_fatal; } rtems_monitor_extension_t; /* diff --git a/c/src/lib/libmisc/stackchk/check.c b/c/src/lib/libmisc/stackchk/check.c index c2ee9a0a10..29939d6d4c 100644 --- a/c/src/lib/libmisc/stackchk/check.c +++ b/c/src/lib/libmisc/stackchk/check.c @@ -128,10 +128,12 @@ void Stack_check_Initialize( void ) rtems_status_code status; Objects_Id id_ignored; unsigned32 *p; +#if 0 unsigned32 i; unsigned32 class_index; Thread_Control *the_thread; Objects_Information *information; +#endif if (stack_check_initialized) return; @@ -420,7 +422,11 @@ void Stack_check_Dump_threads_usage( * Stack_check_Fatal_extension */ -void Stack_check_Fatal_extension( unsigned32 status ) +void Stack_check_Fatal_extension( + Internal_errors_Source source, + boolean is_internal, + unsigned32 status +) { if (status == 0) Stack_check_Dump_usage(); @@ -443,6 +449,7 @@ void Stack_check_Dump_usage( void ) if (stack_check_initialized == 0) return; + printf("Stack usage by thread\n"); printf( " ID NAME LOW HIGH AVAILABLE USED\n" ); diff --git a/c/src/lib/libmisc/stackchk/internal.h b/c/src/lib/libmisc/stackchk/internal.h index 7cecbd6e1a..e98ec7e92e 100644 --- a/c/src/lib/libmisc/stackchk/internal.h +++ b/c/src/lib/libmisc/stackchk/internal.h @@ -77,7 +77,9 @@ void Stack_check_Switch_extension( */ void Stack_check_Fatal_extension( - unsigned32 + Internal_errors_Source source, + boolean is_internal, + unsigned32 status ); /* diff --git a/c/src/libchip/shmdr/dump.c b/c/src/libchip/shmdr/dump.c index e028ab4204..dc02961138 100644 --- a/c/src/libchip/shmdr/dump.c +++ b/c/src/libchip/shmdr/dump.c @@ -19,7 +19,6 @@ #include #include -#include #include "shm.h" diff --git a/c/src/libchip/shmdr/fatal.c b/c/src/libchip/shmdr/fatal.c index fc1e9f8624..b36ff8da41 100644 --- a/c/src/libchip/shmdr/fatal.c +++ b/c/src/libchip/shmdr/fatal.c @@ -22,7 +22,9 @@ #include "shm.h" void MPCI_Fatal( - rtems_unsigned32 error + Internal_errors_Source source, + boolean is_internal, + rtems_unsigned32 error ) { /* Eventually need to attempt to broadcast a K_FATAL message diff --git a/c/src/libchip/shmdr/getlq.c b/c/src/libchip/shmdr/getlq.c index 180c33ef00..ebc5bed8b6 100644 --- a/c/src/libchip/shmdr/getlq.c +++ b/c/src/libchip/shmdr/getlq.c @@ -33,6 +33,7 @@ Shm_Envelope_control *Shm_Locked_queue_Get( tmp_ecb = NULL; Shm_Lock( lq_cb ); + tmpfront = Shm_Convert(lq_cb->front); if ( tmpfront != Shm_Locked_queue_End_of_list ) { tmp_ecb = &Shm_Envelopes[ tmpfront ]; @@ -41,6 +42,7 @@ Shm_Envelope_control *Shm_Locked_queue_Get( lq_cb->rear = Shm_Locked_queue_End_of_list; tmp_ecb->next = Shm_Locked_queue_Not_on_list; } + Shm_Unlock( lq_cb ); return( tmp_ecb ); } diff --git a/c/src/libchip/shmdr/shm_driver.h b/c/src/libchip/shmdr/shm_driver.h index 5ccb0aab6b..f4671dde97 100644 --- a/c/src/libchip/shmdr/shm_driver.h +++ b/c/src/libchip/shmdr/shm_driver.h @@ -470,7 +470,11 @@ void Shm_Locked_queue_Initialize( /* portable routines */ void Init_env_pool(); void Shm_Print_statistics( void ); -void MPCI_Fatal( rtems_unsigned32 ); +void MPCI_Fatal( + Internal_errors_Source source, + boolean is_internal, + rtems_unsigned32 error + ); rtems_task Shm_Cause_interrupt( rtems_unsigned32 ); void Shm_Poll(); void Shm_setclockvec(); diff --git a/c/src/libmisc/error/error.c b/c/src/libmisc/error/error.c index cfe1858e08..56224f2a56 100644 --- a/c/src/libmisc/error/error.c +++ b/c/src/libmisc/error/error.c @@ -39,7 +39,7 @@ * EXAMPLE * if ((fd = open(pathname, O_RDNLY)) < 0) * { - * rtems_error(FLOSS_ERROR_ERRNO, "open of '%s' failed", pathname); + * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname); * goto failed; * } */ diff --git a/c/src/libmisc/monitor/mon-extension.c b/c/src/libmisc/monitor/mon-extension.c index 230fab9ddf..481a21e7dd 100644 --- a/c/src/libmisc/monitor/mon-extension.c +++ b/c/src/libmisc/monitor/mon-extension.c @@ -1,5 +1,5 @@ /* - * @(#)extension.c 1.3 - 95/07/31 + * @(#)extension.c 1.6 - 95/09/25 * * * RTEMS Monitor extension support @@ -21,22 +21,22 @@ rtems_monitor_extension_canonical( Extension_Control *rtems_extension = (Extension_Control *) extension_void; rtems_extensions_table *e = &rtems_extension->Extension.Callouts; - rtems_monitor_symbol_canonical_by_value(&canonical_extension->create, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_create, e->thread_create); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->start, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_start, e->thread_start); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->restart, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_restart, e->thread_restart); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->delete, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_delete, e->thread_delete); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->tswitch, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_tswitch, e->thread_switch); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->begin, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_begin, e->thread_begin); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->exitted, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_exitted, e->thread_exitted); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->fatal, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_fatal, e->fatal); } @@ -72,29 +72,29 @@ rtems_monitor_extension_dump( length += rtems_monitor_pad(18, length); length += printf("create: "); - length += rtems_monitor_symbol_dump(&monitor_extension->create, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_create, verbose); length += printf("; start: "); - length += rtems_monitor_symbol_dump(&monitor_extension->start, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_start, verbose); length += printf("; restart: "); - length += rtems_monitor_symbol_dump(&monitor_extension->restart, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_restart, verbose); length += printf("\n"); length = 0; length += rtems_monitor_pad(18, length); length += printf("delete: "); - length += rtems_monitor_symbol_dump(&monitor_extension->delete, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_delete, verbose); length += printf("; switch: "); - length += rtems_monitor_symbol_dump(&monitor_extension->tswitch, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_tswitch, verbose); length += printf("; begin: "); - length += rtems_monitor_symbol_dump(&monitor_extension->begin, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_begin, verbose); length += printf("\n"); length = 0; length += rtems_monitor_pad(18, length); length += printf("exitted: "); - length += rtems_monitor_symbol_dump(&monitor_extension->exitted, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_exitted, verbose); length += printf("; fatal: "); - length += rtems_monitor_symbol_dump(&monitor_extension->fatal, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_fatal, verbose); length += printf("\n"); length = 0; printf("\n"); diff --git a/c/src/libmisc/monitor/mon-symbols.c b/c/src/libmisc/monitor/mon-symbols.c index f0e3ed3bc2..9cbd76d280 100644 --- a/c/src/libmisc/monitor/mon-symbols.c +++ b/c/src/libmisc/monitor/mon-symbols.c @@ -184,7 +184,7 @@ rtems_symbol_string_compare(const void *e1, void rtems_symbol_sort(rtems_symbol_table_t *table) { -#ifdef simhppa +#ifdef RTEMS_ON_SIMULATOR printf("Sorting symbols ... "); /* so slow we need a msg */ fflush(stdout); #endif @@ -195,7 +195,7 @@ rtems_symbol_sort(rtems_symbol_table_t *table) qsort((void *) table->symbols, (size_t) table->next, sizeof(rtems_symbol_t), rtems_symbol_string_compare); -#ifdef simhppa +#ifdef RTEMS_ON_SIMULATOR /* so slow we need a msg */ printf("done\n"); #endif @@ -401,11 +401,11 @@ rtems_monitor_symbol_dump( { if (canonical_symbol->offset == 0) length += printf("%.*s", - sizeof(canonical_symbol->name), + (int) sizeof(canonical_symbol->name), canonical_symbol->name); else length += printf("<%.*s+0x%x>", - sizeof(canonical_symbol->name), + (int) sizeof(canonical_symbol->name), canonical_symbol->name, canonical_symbol->offset); if (verbose) diff --git a/c/src/libmisc/monitor/monitor.h b/c/src/libmisc/monitor/monitor.h index c9df923928..2ee03f570b 100644 --- a/c/src/libmisc/monitor/monitor.h +++ b/c/src/libmisc/monitor/monitor.h @@ -140,14 +140,14 @@ typedef struct { rtems_id id; rtems_name name; /* end of common portion */ - rtems_monitor_symbol_t create; - rtems_monitor_symbol_t start; - rtems_monitor_symbol_t restart; - rtems_monitor_symbol_t delete; - rtems_monitor_symbol_t tswitch; - rtems_monitor_symbol_t begin; - rtems_monitor_symbol_t exitted; - rtems_monitor_symbol_t fatal; + rtems_monitor_symbol_t e_create; + rtems_monitor_symbol_t e_start; + rtems_monitor_symbol_t e_restart; + rtems_monitor_symbol_t e_delete; + rtems_monitor_symbol_t e_tswitch; + rtems_monitor_symbol_t e_begin; + rtems_monitor_symbol_t e_exitted; + rtems_monitor_symbol_t e_fatal; } rtems_monitor_extension_t; /* diff --git a/c/src/libmisc/stackchk/check.c b/c/src/libmisc/stackchk/check.c index c2ee9a0a10..29939d6d4c 100644 --- a/c/src/libmisc/stackchk/check.c +++ b/c/src/libmisc/stackchk/check.c @@ -128,10 +128,12 @@ void Stack_check_Initialize( void ) rtems_status_code status; Objects_Id id_ignored; unsigned32 *p; +#if 0 unsigned32 i; unsigned32 class_index; Thread_Control *the_thread; Objects_Information *information; +#endif if (stack_check_initialized) return; @@ -420,7 +422,11 @@ void Stack_check_Dump_threads_usage( * Stack_check_Fatal_extension */ -void Stack_check_Fatal_extension( unsigned32 status ) +void Stack_check_Fatal_extension( + Internal_errors_Source source, + boolean is_internal, + unsigned32 status +) { if (status == 0) Stack_check_Dump_usage(); @@ -443,6 +449,7 @@ void Stack_check_Dump_usage( void ) if (stack_check_initialized == 0) return; + printf("Stack usage by thread\n"); printf( " ID NAME LOW HIGH AVAILABLE USED\n" ); diff --git a/c/src/libmisc/stackchk/internal.h b/c/src/libmisc/stackchk/internal.h index 7cecbd6e1a..e98ec7e92e 100644 --- a/c/src/libmisc/stackchk/internal.h +++ b/c/src/libmisc/stackchk/internal.h @@ -77,7 +77,9 @@ void Stack_check_Switch_extension( */ void Stack_check_Fatal_extension( - unsigned32 + Internal_errors_Source source, + boolean is_internal, + unsigned32 status ); /* diff --git a/c/src/tests/samples/cdtest/main.cc b/c/src/tests/samples/cdtest/main.cc index 1a12431701..d6b7126e5c 100644 --- a/c/src/tests/samples/cdtest/main.cc +++ b/c/src/tests/samples/cdtest/main.cc @@ -29,7 +29,6 @@ #include #include -#include #include extern "C" { @@ -128,7 +127,7 @@ cdtest(void) // in many implementations in order to get global constructors // run. // -// Ref: c/src/lib/libbsp/hppa1_1/simhppa/startup/bspstart.c +// Ref: c/src/lib/libbsp/hppa1_1/pxfl/startup/bspstart.c // diff --git a/c/src/tests/support/include/tmacros.h b/c/src/tests/support/include/tmacros.h index 6fb8402241..dc2a82f397 100644 --- a/c/src/tests/support/include/tmacros.h +++ b/c/src/tests/support/include/tmacros.h @@ -26,7 +26,6 @@ extern "C" { #include #include -#include #define FOREVER 1 /* infinite loop */ @@ -95,8 +94,6 @@ extern "C" { putchar( '\n' ); \ } -#define put_buffer( _buffer ) XYZ( _buffer ) - #define build_time( TB, MON, DAY, YR, HR, MIN, SEC, TK ) \ { (TB)->year = YR; \ (TB)->month = MON; \ diff --git a/cpukit/libcsupport/src/error.c b/cpukit/libcsupport/src/error.c index cfe1858e08..56224f2a56 100644 --- a/cpukit/libcsupport/src/error.c +++ b/cpukit/libcsupport/src/error.c @@ -39,7 +39,7 @@ * EXAMPLE * if ((fd = open(pathname, O_RDNLY)) < 0) * { - * rtems_error(FLOSS_ERROR_ERRNO, "open of '%s' failed", pathname); + * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname); * goto failed; * } */ diff --git a/cpukit/libcsupport/src/malloc.c b/cpukit/libcsupport/src/malloc.c index a7d14b14ab..8639198bed 100644 --- a/cpukit/libcsupport/src/malloc.c +++ b/cpukit/libcsupport/src/malloc.c @@ -14,9 +14,6 @@ */ #include -#ifdef RTEMS_LIBC -#include -#endif #include "libcsupport.h" #ifdef RTEMS_NEWLIB #include @@ -29,21 +26,30 @@ #include #include -/* - * XXX: Do we really need to duplicate these? It appears that they - * only cause typing problems. - */ +rtems_id RTEMS_Malloc_Heap; +size_t RTEMS_Malloc_Sbrk_amount; -#if 0 -void *malloc(size_t); -void *calloc(size_t, size_t); -void *realloc(void *, size_t); -void free(void *); -void *sbrk(size_t); +#ifdef RTEMS_DEBUG +#define MALLOC_STATS #endif -rtems_id RTEMS_Malloc_Heap; -size_t RTEMS_Malloc_Sbrk_amount; +#ifdef MALLOC_STATS +#define MSBUMP(f,n) malloc_stats.f += (n) + +struct { + unsigned32 space_available; /* current size of malloc area */ + unsigned32 malloc_calls; /* # calls to malloc */ + unsigned32 free_calls; + unsigned32 realloc_calls; + unsigned32 calloc_calls; + unsigned32 max_depth; /* most ever malloc'd at 1 time */ + unsigned64 lifetime_allocated; + unsigned64 lifetime_freed; +} malloc_stats; + +#else /* No malloc_stats */ +#define MSBUMP(f,n) +#endif void RTEMS_Malloc_Initialize( void *start, @@ -77,9 +83,9 @@ void RTEMS_Malloc_Initialize( old_address = u32_address; u32_address = (u32_address + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1); - /* - * Adjust the length by whatever we aligned by - */ + /* + * adjust the length by whatever we aligned by + */ length -= u32_address - old_address; } @@ -97,12 +103,19 @@ void RTEMS_Malloc_Initialize( rtems_build_name( 'H', 'E', 'A', 'P' ), starting_address, length, - 8, /* XXX : use CPU dependent RTEMS constant */ + CPU_ALIGNMENT, RTEMS_DEFAULT_ATTRIBUTES, &RTEMS_Malloc_Heap ); if ( status != RTEMS_SUCCESSFUL ) rtems_fatal_error_occurred( status ); + +#ifdef MALLOC_STATS + /* zero all the stats */ + (void) memset(&malloc_stats, 0, sizeof(malloc_stats)); +#endif + + MSBUMP(space_available, length); } void *malloc( @@ -115,6 +128,8 @@ void *malloc( rtems_unsigned32 sbrk_amount; rtems_status_code status; + MSBUMP(malloc_calls, 1); + if ( !size ) return (void *) 0; @@ -149,11 +164,6 @@ void *malloc( if (((rtems_unsigned32)starting_address = sbrk(the_size)) == -1) return (void *) 0; - /* - fprintf(stderr, "Extended the C heap starting at 0x%x for %d bytes\n", - (unsigned32)starting_address, the_size); - */ - status = rtems_region_extend( RTEMS_Malloc_Heap, starting_address, @@ -161,10 +171,12 @@ void *malloc( ); if ( status != RTEMS_SUCCESSFUL ) { sbrk(-the_size); - return(FALSE); errno = ENOMEM; return (void *) 0; } + + MSBUMP(space_available, the_size); + status = rtems_region_get_segment( RTEMS_Malloc_Heap, size, @@ -178,6 +190,17 @@ void *malloc( } } +#ifdef MALLOC_STATS + if (return_this) + { + unsigned32 current_depth; + MSBUMP(lifetime_allocated, size); + current_depth = malloc_stats.lifetime_allocated - malloc_stats.lifetime_freed; + if (current_depth > malloc_stats.max_depth) + malloc_stats.max_depth = current_depth; + } +#endif + return return_this; } @@ -189,6 +212,8 @@ void *calloc( register char *cptr; int length; + MSBUMP(calloc_calls, 1); + length = nelem * elsize; cptr = malloc( length ); if ( cptr ) @@ -206,6 +231,8 @@ void *realloc( rtems_status_code status; char *new_area; + MSBUMP(realloc_calls, 1); + if ( !ptr ) return malloc( size ); @@ -214,18 +241,18 @@ void *realloc( return (void *) 0; } - status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size ); - if ( status != RTEMS_SUCCESSFUL ) { - errno = EINVAL; - return (void *) 0; - } - new_area = malloc( size ); if ( !new_area ) { free( ptr ); return (void *) 0; } + status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size ); + if ( status != RTEMS_SUCCESSFUL ) { + errno = EINVAL; + return (void *) 0; + } + memcpy( new_area, ptr, (size < old_size) ? size : old_size ); free( ptr ); @@ -239,9 +266,21 @@ void free( { rtems_status_code status; + MSBUMP(free_calls, 1); + if ( !ptr ) return; +#ifdef MALLOC_STATS + { + unsigned32 size; + status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &size ); + if ( status == RTEMS_SUCCESSFUL ) { + MSBUMP(lifetime_freed, size); + } + } +#endif + status = rtems_region_return_segment( RTEMS_Malloc_Heap, ptr ); if ( status != RTEMS_SUCCESSFUL ) { errno = EINVAL; @@ -249,6 +288,35 @@ void free( } } +#ifdef MALLOC_STATS +/* + * Dump the malloc statistics + * May be called via atexit() (installable by our bsp) or + * at any time by user + */ + +void malloc_dump(void) +{ + unsigned32 allocated = malloc_stats.lifetime_allocated - malloc_stats.lifetime_freed; + + printf("Malloc stats\n"); + printf(" avail:%uk allocated:%uk (%d%%) max:%uk (%d%%) lifetime:%Luk freed:%Luk\n", + (unsigned int) malloc_stats.space_available / 1024, + (unsigned int) allocated / 1024, + /* avoid float! */ + (allocated * 100) / malloc_stats.space_available, + (unsigned int) malloc_stats.max_depth / 1024, + (malloc_stats.max_depth * 100) / malloc_stats.space_available, + (unsigned long long) malloc_stats.lifetime_allocated / 1024, + (unsigned long long) malloc_stats.lifetime_freed / 1024); + printf(" Call counts: malloc:%d free:%d realloc:%d calloc:%d\n", + malloc_stats.malloc_calls, + malloc_stats.free_calls, + malloc_stats.realloc_calls, + malloc_stats.calloc_calls); +} +#endif + /* * "Reentrant" versions of the above routines implemented above. */ diff --git a/cpukit/libmisc/monitor/mon-extension.c b/cpukit/libmisc/monitor/mon-extension.c index 230fab9ddf..481a21e7dd 100644 --- a/cpukit/libmisc/monitor/mon-extension.c +++ b/cpukit/libmisc/monitor/mon-extension.c @@ -1,5 +1,5 @@ /* - * @(#)extension.c 1.3 - 95/07/31 + * @(#)extension.c 1.6 - 95/09/25 * * * RTEMS Monitor extension support @@ -21,22 +21,22 @@ rtems_monitor_extension_canonical( Extension_Control *rtems_extension = (Extension_Control *) extension_void; rtems_extensions_table *e = &rtems_extension->Extension.Callouts; - rtems_monitor_symbol_canonical_by_value(&canonical_extension->create, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_create, e->thread_create); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->start, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_start, e->thread_start); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->restart, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_restart, e->thread_restart); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->delete, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_delete, e->thread_delete); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->tswitch, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_tswitch, e->thread_switch); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->begin, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_begin, e->thread_begin); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->exitted, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_exitted, e->thread_exitted); - rtems_monitor_symbol_canonical_by_value(&canonical_extension->fatal, + rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_fatal, e->fatal); } @@ -72,29 +72,29 @@ rtems_monitor_extension_dump( length += rtems_monitor_pad(18, length); length += printf("create: "); - length += rtems_monitor_symbol_dump(&monitor_extension->create, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_create, verbose); length += printf("; start: "); - length += rtems_monitor_symbol_dump(&monitor_extension->start, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_start, verbose); length += printf("; restart: "); - length += rtems_monitor_symbol_dump(&monitor_extension->restart, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_restart, verbose); length += printf("\n"); length = 0; length += rtems_monitor_pad(18, length); length += printf("delete: "); - length += rtems_monitor_symbol_dump(&monitor_extension->delete, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_delete, verbose); length += printf("; switch: "); - length += rtems_monitor_symbol_dump(&monitor_extension->tswitch, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_tswitch, verbose); length += printf("; begin: "); - length += rtems_monitor_symbol_dump(&monitor_extension->begin, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_begin, verbose); length += printf("\n"); length = 0; length += rtems_monitor_pad(18, length); length += printf("exitted: "); - length += rtems_monitor_symbol_dump(&monitor_extension->exitted, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_exitted, verbose); length += printf("; fatal: "); - length += rtems_monitor_symbol_dump(&monitor_extension->fatal, verbose); + length += rtems_monitor_symbol_dump(&monitor_extension->e_fatal, verbose); length += printf("\n"); length = 0; printf("\n"); diff --git a/cpukit/libmisc/monitor/mon-symbols.c b/cpukit/libmisc/monitor/mon-symbols.c index f0e3ed3bc2..9cbd76d280 100644 --- a/cpukit/libmisc/monitor/mon-symbols.c +++ b/cpukit/libmisc/monitor/mon-symbols.c @@ -184,7 +184,7 @@ rtems_symbol_string_compare(const void *e1, void rtems_symbol_sort(rtems_symbol_table_t *table) { -#ifdef simhppa +#ifdef RTEMS_ON_SIMULATOR printf("Sorting symbols ... "); /* so slow we need a msg */ fflush(stdout); #endif @@ -195,7 +195,7 @@ rtems_symbol_sort(rtems_symbol_table_t *table) qsort((void *) table->symbols, (size_t) table->next, sizeof(rtems_symbol_t), rtems_symbol_string_compare); -#ifdef simhppa +#ifdef RTEMS_ON_SIMULATOR /* so slow we need a msg */ printf("done\n"); #endif @@ -401,11 +401,11 @@ rtems_monitor_symbol_dump( { if (canonical_symbol->offset == 0) length += printf("%.*s", - sizeof(canonical_symbol->name), + (int) sizeof(canonical_symbol->name), canonical_symbol->name); else length += printf("<%.*s+0x%x>", - sizeof(canonical_symbol->name), + (int) sizeof(canonical_symbol->name), canonical_symbol->name, canonical_symbol->offset); if (verbose) diff --git a/cpukit/libmisc/monitor/monitor.h b/cpukit/libmisc/monitor/monitor.h index c9df923928..2ee03f570b 100644 --- a/cpukit/libmisc/monitor/monitor.h +++ b/cpukit/libmisc/monitor/monitor.h @@ -140,14 +140,14 @@ typedef struct { rtems_id id; rtems_name name; /* end of common portion */ - rtems_monitor_symbol_t create; - rtems_monitor_symbol_t start; - rtems_monitor_symbol_t restart; - rtems_monitor_symbol_t delete; - rtems_monitor_symbol_t tswitch; - rtems_monitor_symbol_t begin; - rtems_monitor_symbol_t exitted; - rtems_monitor_symbol_t fatal; + rtems_monitor_symbol_t e_create; + rtems_monitor_symbol_t e_start; + rtems_monitor_symbol_t e_restart; + rtems_monitor_symbol_t e_delete; + rtems_monitor_symbol_t e_tswitch; + rtems_monitor_symbol_t e_begin; + rtems_monitor_symbol_t e_exitted; + rtems_monitor_symbol_t e_fatal; } rtems_monitor_extension_t; /* diff --git a/cpukit/libmisc/stackchk/check.c b/cpukit/libmisc/stackchk/check.c index c2ee9a0a10..29939d6d4c 100644 --- a/cpukit/libmisc/stackchk/check.c +++ b/cpukit/libmisc/stackchk/check.c @@ -128,10 +128,12 @@ void Stack_check_Initialize( void ) rtems_status_code status; Objects_Id id_ignored; unsigned32 *p; +#if 0 unsigned32 i; unsigned32 class_index; Thread_Control *the_thread; Objects_Information *information; +#endif if (stack_check_initialized) return; @@ -420,7 +422,11 @@ void Stack_check_Dump_threads_usage( * Stack_check_Fatal_extension */ -void Stack_check_Fatal_extension( unsigned32 status ) +void Stack_check_Fatal_extension( + Internal_errors_Source source, + boolean is_internal, + unsigned32 status +) { if (status == 0) Stack_check_Dump_usage(); @@ -443,6 +449,7 @@ void Stack_check_Dump_usage( void ) if (stack_check_initialized == 0) return; + printf("Stack usage by thread\n"); printf( " ID NAME LOW HIGH AVAILABLE USED\n" ); diff --git a/cpukit/libmisc/stackchk/internal.h b/cpukit/libmisc/stackchk/internal.h index 7cecbd6e1a..e98ec7e92e 100644 --- a/cpukit/libmisc/stackchk/internal.h +++ b/cpukit/libmisc/stackchk/internal.h @@ -77,7 +77,9 @@ void Stack_check_Switch_extension( */ void Stack_check_Fatal_extension( - unsigned32 + Internal_errors_Source source, + boolean is_internal, + unsigned32 status ); /* diff --git a/cpukit/score/cpu/hppa1.1/cpu.c b/cpukit/score/cpu/hppa1.1/cpu.c index f132033595..09c5d3d54b 100644 --- a/cpukit/score/cpu/hppa1.1/cpu.c +++ b/cpukit/score/cpu/hppa1.1/cpu.c @@ -14,12 +14,13 @@ * Division Incorporated makes no representations about the * suitability of this software for any purpose. * - * $Id$ + * cpu.c,v 1.7 1995/09/19 14:49:35 joel Exp */ #include -#include -#include +#include +#include +#include void hppa_external_interrupt_initialize(void); void hppa_external_interrupt_enable(unsigned32); @@ -103,6 +104,20 @@ void _CPU_Initialize( _CPU_Table = *cpu_table; } +/*PAGE + * + * _CPU_ISR_Get_level + */ + +unsigned32 _CPU_ISR_Get_level(void) +{ + int level; + HPPA_ASM_SSM(0, level); /* change no bits; just get copy */ + if (level & HPPA_PSW_I) + return 1; + return 0; +} + /*PAGE * * _CPU_ISR_install_raw_handler diff --git a/cpukit/score/cpu/unix/cpu.c b/cpukit/score/cpu/unix/cpu.c index 54d4104ac7..a7b2140742 100644 --- a/cpukit/score/cpu/unix/cpu.c +++ b/cpukit/score/cpu/unix/cpu.c @@ -173,7 +173,7 @@ void _CPU_Signal_initialize( void ) void _CPU_Context_From_CPU_Init() { -#if defined(hppa1_1) && defined(RTEMS_UNIXLIB) +#if defined(hppa1_1) && defined(RTEMS_UNIXLIB_SETJMP) /* * HACK - set the _SYSTEM_ID to 0x20c so that setjmp/longjmp * will handle the full 32 floating point registers. diff --git a/cpukit/score/include/rtems/score/heap.h b/cpukit/score/include/rtems/score/heap.h index affd52cd73..dd50a0de8a 100644 --- a/cpukit/score/include/rtems/score/heap.h +++ b/cpukit/score/include/rtems/score/heap.h @@ -280,11 +280,11 @@ STATIC INLINE Heap_Block *_Heap_Block_at( /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -STATIC INLINE Heap_Block *_Heap_User_Block_at( +STATIC INLINE Heap_Block *_Heap_User_block_at( void *base ); diff --git a/cpukit/score/inline/rtems/score/heap.inl b/cpukit/score/inline/rtems/score/heap.inl index c32226852e..0d1b1231a7 100644 --- a/cpukit/score/inline/rtems/score/heap.inl +++ b/cpukit/score/inline/rtems/score/heap.inl @@ -94,11 +94,11 @@ STATIC INLINE Heap_Block *_Heap_Block_at( /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -STATIC INLINE Heap_Block *_Heap_User_Block_at( +STATIC INLINE Heap_Block *_Heap_User_block_at( void *base ) { diff --git a/cpukit/score/macros/rtems/score/heap.inl b/cpukit/score/macros/rtems/score/heap.inl index 47df055100..94f4ff9194 100644 --- a/cpukit/score/macros/rtems/score/heap.inl +++ b/cpukit/score/macros/rtems/score/heap.inl @@ -70,11 +70,11 @@ /*PAGE * - * _Heap_User_Block_at + * _Heap_User_block_at * */ -#define _Heap_User_Block_at( _base ) \ +#define _Heap_User_block_at( _base ) \ _Heap_Block_at( \ (_base), \ -*(((unsigned32 *) (_base)) - 1) + -HEAP_BLOCK_USED_OVERHEAD \ diff --git a/cpukit/score/src/heap.c b/cpukit/score/src/heap.c index 2380678209..bccd30ccc0 100644 --- a/cpukit/score/src/heap.c +++ b/cpukit/score/src/heap.c @@ -301,7 +301,7 @@ boolean _Heap_Size_of_user_area( Heap_Block *next_block; unsigned32 the_size; - the_block = _Heap_User_Block_at( starting_address ); + the_block = _Heap_User_block_at( starting_address ); if ( !_Heap_Is_block_in( the_heap, the_block ) || _Heap_Is_block_free( the_block ) ) @@ -346,7 +346,7 @@ boolean _Heap_Free( Heap_Block *temporary_block; unsigned32 the_size; - the_block = _Heap_User_Block_at( starting_address ); + the_block = _Heap_User_block_at( starting_address ); if ( !_Heap_Is_block_in( the_heap, the_block ) || _Heap_Is_block_free( the_block ) ) { @@ -430,6 +430,8 @@ void _Heap_Walk( Heap_Block *the_block = 0; /* avoid warnings */ Heap_Block *next_block = 0; /* avoid warnings */ int notdone = 1; + int error = 0; + int passes = 0; /* * We don't want to allow walking the heap until we have @@ -455,9 +457,14 @@ void _Heap_Walk( if (the_block->back_flag != HEAP_DUMMY_FLAG) { printf("PASS: %d Back flag of 1st block isn't HEAP_DUMMY_FLAG\n", source); + error = 1; } while (notdone) { + passes++; + if (error && (passes > 10)) + abort(); + if (do_dump == TRUE) { printf("PASS: %d Block @ 0x%p Back %d, Front %d", source, the_block, @@ -477,6 +484,7 @@ void _Heap_Walk( if ( the_block->front_flag != HEAP_DUMMY_FLAG ) { next_block = _Heap_Next_block(the_block); if ( the_block->front_flag != next_block->back_flag ) { + error = 1; printf("PASS: %d Front and back flags don't match\n", source); printf(" Current Block: Back - %d, Front - %d", the_block->back_flag, the_block->front_flag); @@ -510,4 +518,7 @@ void _Heap_Walk( else the_block = next_block; } + + if (error) + abort(); } diff --git a/testsuites/samples/cdtest/main.cc b/testsuites/samples/cdtest/main.cc index 1a12431701..d6b7126e5c 100644 --- a/testsuites/samples/cdtest/main.cc +++ b/testsuites/samples/cdtest/main.cc @@ -29,7 +29,6 @@ #include #include -#include #include extern "C" { @@ -128,7 +127,7 @@ cdtest(void) // in many implementations in order to get global constructors // run. // -// Ref: c/src/lib/libbsp/hppa1_1/simhppa/startup/bspstart.c +// Ref: c/src/lib/libbsp/hppa1_1/pxfl/startup/bspstart.c // diff --git a/testsuites/support/include/tmacros.h b/testsuites/support/include/tmacros.h index 6fb8402241..dc2a82f397 100644 --- a/testsuites/support/include/tmacros.h +++ b/testsuites/support/include/tmacros.h @@ -26,7 +26,6 @@ extern "C" { #include #include -#include #define FOREVER 1 /* infinite loop */ @@ -95,8 +94,6 @@ extern "C" { putchar( '\n' ); \ } -#define put_buffer( _buffer ) XYZ( _buffer ) - #define build_time( TB, MON, DAY, YR, HR, MIN, SEC, TK ) \ { (TB)->year = YR; \ (TB)->month = MON; \ diff --git a/tools/build/src/unhex.c b/tools/build/src/unhex.c index 540095d6f4..f149449302 100644 --- a/tools/build/src/unhex.c +++ b/tools/build/src/unhex.c @@ -86,7 +86,7 @@ void error(int errn, ...); #define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */ #define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */ -#define stol(p) strtol(p, (char **) NULL, 0) +#define stol(p) strtoul(p, (char **) NULL, 0) int unhex(FILE *ifp, char *inm, FILE *ofp, char *onm); int convert_Intel_records(FILE *ifp, char *inm, FILE *ofp, char *onm); diff --git a/tools/build/unhex.c b/tools/build/unhex.c index 540095d6f4..f149449302 100644 --- a/tools/build/unhex.c +++ b/tools/build/unhex.c @@ -86,7 +86,7 @@ void error(int errn, ...); #define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */ #define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */ -#define stol(p) strtol(p, (char **) NULL, 0) +#define stol(p) strtoul(p, (char **) NULL, 0) int unhex(FILE *ifp, char *inm, FILE *ofp, char *onm); int convert_Intel_records(FILE *ifp, char *inm, FILE *ofp, char *onm); diff --git a/tools/cpu/hppa1.1/genoffsets.c b/tools/cpu/hppa1.1/genoffsets.c index 78ae74b4ec..3bec8e954b 100644 --- a/tools/cpu/hppa1.1/genoffsets.c +++ b/tools/cpu/hppa1.1/genoffsets.c @@ -1,5 +1,5 @@ /* - * @(#)genoffsets.c 1.5 - 95/05/16 + * @(#)genoffsets.c 1.7 - 95/09/25 * * * genoffsets.c @@ -82,7 +82,7 @@ printf( "\n" \ ); -#if defined(hpux) && defined(__hppa__) +#if defined(__hpux__) && defined(__hppa__) /* * Offsets of elements in the Context_control structure. -- cgit v1.2.3