From b3ac6a8dfe10aeaf3a9c59fd145bddfff119480e Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 12 Sep 1995 19:45:42 +0000 Subject: Initial attempt at building HP PA-RISC using Solaris hosted tools. Changed back to Newlib for Solaris UNIX simulator. --- c/src/exec/libcsupport/src/newlibc.c | 16 +++- c/src/exec/score/cpu/hppa1.1/cpu.c | 6 +- c/src/exec/score/src/mpci.c | 2 +- c/src/exec/score/src/thread.c | 3 + c/src/exec/score/tools/hppa1.1/genoffsets.c | 134 ++++++++++++++++++++++++++-- c/src/lib/libc/newlibc.c | 16 +++- c/src/lib/libc/support.c | 3 +- cpukit/libcsupport/src/newlibc.c | 16 +++- cpukit/score/cpu/hppa1.1/cpu.c | 6 +- cpukit/score/src/mpci.c | 2 +- cpukit/score/src/thread.c | 3 + tools/cpu/hppa1.1/genoffsets.c | 134 ++++++++++++++++++++++++++-- 12 files changed, 313 insertions(+), 28 deletions(-) diff --git a/c/src/exec/libcsupport/src/newlibc.c b/c/src/exec/libcsupport/src/newlibc.c index e041668375..db959d6156 100644 --- a/c/src/exec/libcsupport/src/newlibc.c +++ b/c/src/exec/libcsupport/src/newlibc.c @@ -119,10 +119,19 @@ libc_switch_hook(rtems_tcb *current_task, /* XXX We can't use rtems_task_set_note() here since SYSI task has a * tid of 0, which is treated specially (optimized, actually) * by rtems_task_set_note + * + * NOTE: The above comment is no longer true and we need to use + * the extension data areas added about the same time. */ - impure_value = (rtems_unsigned32) _REENT; - MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value); + /* + * Don't touch the outgoing task if it has been deleted. + */ + + if ( !_States_Is_transient( current_task->current_state ) ) { + impure_value = (rtems_unsigned32) _REENT; + MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value); + } _REENT = (struct _reent *) MY_task_get_note(heir_task, LIBC_NOTEPAD); @@ -171,7 +180,8 @@ libc_delete_hook(rtems_tcb *current_task, ptr = (struct _reent *) MY_task_get_note(deleted_task, LIBC_NOTEPAD); } - if (ptr) + /* if (ptr) */ + if (ptr && ptr != &libc_global_reent) { _wrapup_reent(ptr); _reclaim_reent(ptr); diff --git a/c/src/exec/score/cpu/hppa1.1/cpu.c b/c/src/exec/score/cpu/hppa1.1/cpu.c index 6cb6347151..6dee0c1225 100644 --- a/c/src/exec/score/cpu/hppa1.1/cpu.c +++ b/c/src/exec/score/cpu/hppa1.1/cpu.c @@ -33,8 +33,8 @@ void hppa_external_interrupt(unsigned32, CPU_Interrupt_frame *); * So we use our own prototype instead of rtems_isr_entry */ -typedef rtems_isr ( *hppa_rtems_isr_entry )( - rtems_vector_number, +typedef void ( *hppa_rtems_isr_entry )( + ISR_Vector_number, CPU_Interrupt_frame * ); @@ -193,7 +193,7 @@ void _CPU_ISR_install_vector( void hppa_external_interrupt_initialize(void) { - rtems_isr_entry ignore; + hppa_rtems_isr_entry ignore; /* mark them all unused */ diff --git a/c/src/exec/score/src/mpci.c b/c/src/exec/score/src/mpci.c index ee72d6c396..33bfee80c5 100644 --- a/c/src/exec/score/src/mpci.c +++ b/c/src/exec/score/src/mpci.c @@ -67,7 +67,7 @@ void _MPCI_Handler_initialization( THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_RPC_REPLY, NULL, - RTEMS_TIMEOUT + RTEMS_TIMEOUT /* XXX */ ); } diff --git a/c/src/exec/score/src/thread.c b/c/src/exec/score/src/thread.c index d507e8e075..3f58c8ef12 100644 --- a/c/src/exec/score/src/thread.c +++ b/c/src/exec/score/src/thread.c @@ -471,6 +471,9 @@ void _Thread_Close( if ( the_thread->extensions ) (void) _Workspace_Free( the_thread->extensions ); + + the_thread->Start.stack = NULL; + the_thread->extensions = NULL; } /*PAGE diff --git a/c/src/exec/score/tools/hppa1.1/genoffsets.c b/c/src/exec/score/tools/hppa1.1/genoffsets.c index 4b2fcba408..78ae74b4ec 100644 --- a/c/src/exec/score/tools/hppa1.1/genoffsets.c +++ b/c/src/exec/score/tools/hppa1.1/genoffsets.c @@ -24,12 +24,14 @@ #include +void print_information( void ); + int main( int argc, char **argv ) { - unsigned int size; + unsigned int size = 0; /* * Print the file header @@ -59,10 +61,6 @@ printf( "\n" ); -/* - * Offsets of elements in the Context_control structure. - */ - #define PRINT_IT( STRING, TYPE, FIELD ) \ printf( "#define\t%s\t0x%p\t\t/* %d */\n", \ STRING, \ @@ -84,6 +82,12 @@ printf( "\n" \ ); +#if defined(hpux) && defined(__hppa__) + +/* + * Offsets of elements in the Context_control structure. + */ + PRINT_COMMENT("Context_Control information"); PRINT_IT( "FLAGS_OFFSET", Context_Control *, flags ); @@ -172,6 +176,12 @@ printf( printf( "#define\tCPU_INTERRUPT_FRAME_SIZE\t%d\t\t/* 0x%x */\n", size, size ); +#else + + print_information(); + +#endif + #undef PRINT_IT #undef PRINT_SIZE #undef PRINT_COMMENT @@ -189,3 +199,117 @@ printf( return 0; } + +void print_information( void ) +{ + +#define PRINT_IT( STRING, NUMBER ) \ + printf( "#define\t%s\t0x%x\t\t/* %d */\n", \ + STRING, \ + NUMBER, \ + NUMBER ); + +#define PRINT_SIZE( STRING, NUMBER ) \ + printf( "#define\t%s\t0x%x\t\t/* %d */\n", \ + STRING, \ + NUMBER, \ + NUMBER ); + +#define PRINT_COMMENT( STRING ) \ + printf( \ + "\n" \ + "/*\n" \ + " * " STRING "\n" \ + " */\n" \ + "\n" \ + ); + +/* + * Offsets of elements in the Context_control structure. + */ + + PRINT_COMMENT("Context_Control information"); + + PRINT_IT( "FLAGS_OFFSET", 0x00 ); + PRINT_IT( "R1_OFFSET", 0x04 ); + PRINT_IT( "R2_OFFSET", 0x08 ); + PRINT_IT( "R3_OFFSET", 0x0c ); + PRINT_IT( "R4_OFFSET", 0x00 ); + PRINT_IT( "R5_OFFSET", 0x14 ); + PRINT_IT( "R6_OFFSET", 0x18 ); + PRINT_IT( "R7_OFFSET", 0x1c ); + PRINT_IT( "R8_OFFSET", 0x20 ); + PRINT_IT( "R9_OFFSET", 0x24 ); + PRINT_IT( "R10_OFFSET", 0x28 ); + PRINT_IT( "R11_OFFSET", 0x2c ); + PRINT_IT( "R12_OFFSET", 0x30 ); + PRINT_IT( "R13_OFFSET", 0x34 ); + PRINT_IT( "R14_OFFSET", 0x38 ); + PRINT_IT( "R15_OFFSET", 0x3c ); + PRINT_IT( "R16_OFFSET", 0x40 ); + PRINT_IT( "R17_OFFSET", 0x44 ); + PRINT_IT( "R18_OFFSET", 0x48 ); + PRINT_IT( "R19_OFFSET", 0x4c ); + PRINT_IT( "R20_OFFSET", 0x50 ); + PRINT_IT( "R21_OFFSET", 0x54 ); + PRINT_IT( "R22_OFFSET", 0x58 ); + PRINT_IT( "R23_OFFSET", 0x5c ); + PRINT_IT( "R24_OFFSET", 0x60 ); + PRINT_IT( "R25_OFFSET", 0x64 ); + PRINT_IT( "R26_OFFSET", 0x68 ); + PRINT_IT( "R27_OFFSET", 0x6c ); + PRINT_IT( "R28_OFFSET", 0x70 ); + PRINT_IT( "R29_OFFSET", 0x74 ); + PRINT_IT( "R30_OFFSET", 0x78 ); + PRINT_IT( "R31_OFFSET", 0x7c ); + + /* + * And common aliases for the above + */ + + PRINT_COMMENT("Common aliases for above"); + + PRINT_IT( "RP_OFFSET", 0x08 ); + PRINT_IT( "ARG3_OFFSET", 0x5c ); + PRINT_IT( "ARG2_OFFSET", 0x60 ); + PRINT_IT( "ARG1_OFFSET", 0x64 ); + PRINT_IT( "ARG0_OFFSET", 0x68 ); + PRINT_IT( "SP_OFFSET", 0x78 ); + PRINT_IT( "DP_OFFSET", 0x6c ); + PRINT_IT( "RET0_OFFSET", 0x74 ); + PRINT_IT( "RET1_OFFSET", 0x74 ); + + PRINT_SIZE("CPU_CONTEXT_SIZE", 168 ); + + PRINT_COMMENT("Context_Control_fp information"); + + PRINT_SIZE("CPU_CONTEXT_FP_SIZE", 256); + + /* + * And the control registers + */ + + PRINT_COMMENT("Control register portion of context"); + + PRINT_IT( "SAR_OFFSET", 0x80 ); + PRINT_IT( "IPSW_OFFSET", 0x84 ); + PRINT_IT( "IIR_OFFSET", 0x88 ); + PRINT_IT( "IOR_OFFSET", 0x8c ); + PRINT_IT( "ISR_OFFSET", 0x90 ); + PRINT_IT( "PCOQFRONT_OFFSET", 0x94 ); + PRINT_IT( "PCOQBACK_OFFSET", 0x98 ); + PRINT_IT( "PCSQFRONT_OFFSET", 0x9c ); + PRINT_IT( "PCSQBACK_OFFSET", 0xa0 ); + PRINT_IT( "ITIMER_OFFSET", 0xa4 ); + + /* + * Full interrupt frame (integer + float) + */ + + PRINT_COMMENT("Interrupt frame information"); + + PRINT_IT( "INTEGER_CONTEXT_OFFSET", 0x00 ); + PRINT_IT( "FP_CONTEXT_OFFSET", 0xa8 ); + PRINT_SIZE( "CPU_INTERRUPT_FRAME_SIZE", 448 ); + +} diff --git a/c/src/lib/libc/newlibc.c b/c/src/lib/libc/newlibc.c index e041668375..db959d6156 100644 --- a/c/src/lib/libc/newlibc.c +++ b/c/src/lib/libc/newlibc.c @@ -119,10 +119,19 @@ libc_switch_hook(rtems_tcb *current_task, /* XXX We can't use rtems_task_set_note() here since SYSI task has a * tid of 0, which is treated specially (optimized, actually) * by rtems_task_set_note + * + * NOTE: The above comment is no longer true and we need to use + * the extension data areas added about the same time. */ - impure_value = (rtems_unsigned32) _REENT; - MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value); + /* + * Don't touch the outgoing task if it has been deleted. + */ + + if ( !_States_Is_transient( current_task->current_state ) ) { + impure_value = (rtems_unsigned32) _REENT; + MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value); + } _REENT = (struct _reent *) MY_task_get_note(heir_task, LIBC_NOTEPAD); @@ -171,7 +180,8 @@ libc_delete_hook(rtems_tcb *current_task, ptr = (struct _reent *) MY_task_get_note(deleted_task, LIBC_NOTEPAD); } - if (ptr) + /* if (ptr) */ + if (ptr && ptr != &libc_global_reent) { _wrapup_reent(ptr); _reclaim_reent(ptr); diff --git a/c/src/lib/libc/support.c b/c/src/lib/libc/support.c index 13a2d0c2a5..51fe4070e2 100644 --- a/c/src/lib/libc/support.c +++ b/c/src/lib/libc/support.c @@ -25,7 +25,8 @@ void MY_task_set_note( api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; - api->Notepads[ notepad ] = note; + if ( api ) + api->Notepads[ notepad ] = note; } diff --git a/cpukit/libcsupport/src/newlibc.c b/cpukit/libcsupport/src/newlibc.c index e041668375..db959d6156 100644 --- a/cpukit/libcsupport/src/newlibc.c +++ b/cpukit/libcsupport/src/newlibc.c @@ -119,10 +119,19 @@ libc_switch_hook(rtems_tcb *current_task, /* XXX We can't use rtems_task_set_note() here since SYSI task has a * tid of 0, which is treated specially (optimized, actually) * by rtems_task_set_note + * + * NOTE: The above comment is no longer true and we need to use + * the extension data areas added about the same time. */ - impure_value = (rtems_unsigned32) _REENT; - MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value); + /* + * Don't touch the outgoing task if it has been deleted. + */ + + if ( !_States_Is_transient( current_task->current_state ) ) { + impure_value = (rtems_unsigned32) _REENT; + MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value); + } _REENT = (struct _reent *) MY_task_get_note(heir_task, LIBC_NOTEPAD); @@ -171,7 +180,8 @@ libc_delete_hook(rtems_tcb *current_task, ptr = (struct _reent *) MY_task_get_note(deleted_task, LIBC_NOTEPAD); } - if (ptr) + /* if (ptr) */ + if (ptr && ptr != &libc_global_reent) { _wrapup_reent(ptr); _reclaim_reent(ptr); diff --git a/cpukit/score/cpu/hppa1.1/cpu.c b/cpukit/score/cpu/hppa1.1/cpu.c index 6cb6347151..6dee0c1225 100644 --- a/cpukit/score/cpu/hppa1.1/cpu.c +++ b/cpukit/score/cpu/hppa1.1/cpu.c @@ -33,8 +33,8 @@ void hppa_external_interrupt(unsigned32, CPU_Interrupt_frame *); * So we use our own prototype instead of rtems_isr_entry */ -typedef rtems_isr ( *hppa_rtems_isr_entry )( - rtems_vector_number, +typedef void ( *hppa_rtems_isr_entry )( + ISR_Vector_number, CPU_Interrupt_frame * ); @@ -193,7 +193,7 @@ void _CPU_ISR_install_vector( void hppa_external_interrupt_initialize(void) { - rtems_isr_entry ignore; + hppa_rtems_isr_entry ignore; /* mark them all unused */ diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c index ee72d6c396..33bfee80c5 100644 --- a/cpukit/score/src/mpci.c +++ b/cpukit/score/src/mpci.c @@ -67,7 +67,7 @@ void _MPCI_Handler_initialization( THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_RPC_REPLY, NULL, - RTEMS_TIMEOUT + RTEMS_TIMEOUT /* XXX */ ); } diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c index d507e8e075..3f58c8ef12 100644 --- a/cpukit/score/src/thread.c +++ b/cpukit/score/src/thread.c @@ -471,6 +471,9 @@ void _Thread_Close( if ( the_thread->extensions ) (void) _Workspace_Free( the_thread->extensions ); + + the_thread->Start.stack = NULL; + the_thread->extensions = NULL; } /*PAGE diff --git a/tools/cpu/hppa1.1/genoffsets.c b/tools/cpu/hppa1.1/genoffsets.c index 4b2fcba408..78ae74b4ec 100644 --- a/tools/cpu/hppa1.1/genoffsets.c +++ b/tools/cpu/hppa1.1/genoffsets.c @@ -24,12 +24,14 @@ #include +void print_information( void ); + int main( int argc, char **argv ) { - unsigned int size; + unsigned int size = 0; /* * Print the file header @@ -59,10 +61,6 @@ printf( "\n" ); -/* - * Offsets of elements in the Context_control structure. - */ - #define PRINT_IT( STRING, TYPE, FIELD ) \ printf( "#define\t%s\t0x%p\t\t/* %d */\n", \ STRING, \ @@ -84,6 +82,12 @@ printf( "\n" \ ); +#if defined(hpux) && defined(__hppa__) + +/* + * Offsets of elements in the Context_control structure. + */ + PRINT_COMMENT("Context_Control information"); PRINT_IT( "FLAGS_OFFSET", Context_Control *, flags ); @@ -172,6 +176,12 @@ printf( printf( "#define\tCPU_INTERRUPT_FRAME_SIZE\t%d\t\t/* 0x%x */\n", size, size ); +#else + + print_information(); + +#endif + #undef PRINT_IT #undef PRINT_SIZE #undef PRINT_COMMENT @@ -189,3 +199,117 @@ printf( return 0; } + +void print_information( void ) +{ + +#define PRINT_IT( STRING, NUMBER ) \ + printf( "#define\t%s\t0x%x\t\t/* %d */\n", \ + STRING, \ + NUMBER, \ + NUMBER ); + +#define PRINT_SIZE( STRING, NUMBER ) \ + printf( "#define\t%s\t0x%x\t\t/* %d */\n", \ + STRING, \ + NUMBER, \ + NUMBER ); + +#define PRINT_COMMENT( STRING ) \ + printf( \ + "\n" \ + "/*\n" \ + " * " STRING "\n" \ + " */\n" \ + "\n" \ + ); + +/* + * Offsets of elements in the Context_control structure. + */ + + PRINT_COMMENT("Context_Control information"); + + PRINT_IT( "FLAGS_OFFSET", 0x00 ); + PRINT_IT( "R1_OFFSET", 0x04 ); + PRINT_IT( "R2_OFFSET", 0x08 ); + PRINT_IT( "R3_OFFSET", 0x0c ); + PRINT_IT( "R4_OFFSET", 0x00 ); + PRINT_IT( "R5_OFFSET", 0x14 ); + PRINT_IT( "R6_OFFSET", 0x18 ); + PRINT_IT( "R7_OFFSET", 0x1c ); + PRINT_IT( "R8_OFFSET", 0x20 ); + PRINT_IT( "R9_OFFSET", 0x24 ); + PRINT_IT( "R10_OFFSET", 0x28 ); + PRINT_IT( "R11_OFFSET", 0x2c ); + PRINT_IT( "R12_OFFSET", 0x30 ); + PRINT_IT( "R13_OFFSET", 0x34 ); + PRINT_IT( "R14_OFFSET", 0x38 ); + PRINT_IT( "R15_OFFSET", 0x3c ); + PRINT_IT( "R16_OFFSET", 0x40 ); + PRINT_IT( "R17_OFFSET", 0x44 ); + PRINT_IT( "R18_OFFSET", 0x48 ); + PRINT_IT( "R19_OFFSET", 0x4c ); + PRINT_IT( "R20_OFFSET", 0x50 ); + PRINT_IT( "R21_OFFSET", 0x54 ); + PRINT_IT( "R22_OFFSET", 0x58 ); + PRINT_IT( "R23_OFFSET", 0x5c ); + PRINT_IT( "R24_OFFSET", 0x60 ); + PRINT_IT( "R25_OFFSET", 0x64 ); + PRINT_IT( "R26_OFFSET", 0x68 ); + PRINT_IT( "R27_OFFSET", 0x6c ); + PRINT_IT( "R28_OFFSET", 0x70 ); + PRINT_IT( "R29_OFFSET", 0x74 ); + PRINT_IT( "R30_OFFSET", 0x78 ); + PRINT_IT( "R31_OFFSET", 0x7c ); + + /* + * And common aliases for the above + */ + + PRINT_COMMENT("Common aliases for above"); + + PRINT_IT( "RP_OFFSET", 0x08 ); + PRINT_IT( "ARG3_OFFSET", 0x5c ); + PRINT_IT( "ARG2_OFFSET", 0x60 ); + PRINT_IT( "ARG1_OFFSET", 0x64 ); + PRINT_IT( "ARG0_OFFSET", 0x68 ); + PRINT_IT( "SP_OFFSET", 0x78 ); + PRINT_IT( "DP_OFFSET", 0x6c ); + PRINT_IT( "RET0_OFFSET", 0x74 ); + PRINT_IT( "RET1_OFFSET", 0x74 ); + + PRINT_SIZE("CPU_CONTEXT_SIZE", 168 ); + + PRINT_COMMENT("Context_Control_fp information"); + + PRINT_SIZE("CPU_CONTEXT_FP_SIZE", 256); + + /* + * And the control registers + */ + + PRINT_COMMENT("Control register portion of context"); + + PRINT_IT( "SAR_OFFSET", 0x80 ); + PRINT_IT( "IPSW_OFFSET", 0x84 ); + PRINT_IT( "IIR_OFFSET", 0x88 ); + PRINT_IT( "IOR_OFFSET", 0x8c ); + PRINT_IT( "ISR_OFFSET", 0x90 ); + PRINT_IT( "PCOQFRONT_OFFSET", 0x94 ); + PRINT_IT( "PCOQBACK_OFFSET", 0x98 ); + PRINT_IT( "PCSQFRONT_OFFSET", 0x9c ); + PRINT_IT( "PCSQBACK_OFFSET", 0xa0 ); + PRINT_IT( "ITIMER_OFFSET", 0xa4 ); + + /* + * Full interrupt frame (integer + float) + */ + + PRINT_COMMENT("Interrupt frame information"); + + PRINT_IT( "INTEGER_CONTEXT_OFFSET", 0x00 ); + PRINT_IT( "FP_CONTEXT_OFFSET", 0xa8 ); + PRINT_SIZE( "CPU_INTERRUPT_FRAME_SIZE", 448 ); + +} -- cgit v1.2.3