diff options
Diffstat (limited to '')
77 files changed, 3220 insertions, 957 deletions
diff --git a/c/src/lib/include/console.h b/c/src/lib/include/console.h index d102c6a1b1..02196de7a9 100644 --- a/c/src/lib/include/console.h +++ b/c/src/lib/include/console.h @@ -22,14 +22,43 @@ extern "C" { #endif #define CONSOLE_DRIVER_TABLE_ENTRY \ - { console_initialize, NULL, NULL, NULL, NULL, NULL } + { console_initialize, console_open, console_close, \ + console_read, console_write, console_control } rtems_device_driver console_initialize( rtems_device_major_number, rtems_device_minor_number, - void *, - rtems_id, - rtems_unsigned32 * + void * +); + +rtems_device_driver console_open( + rtems_device_major_number, + rtems_device_minor_number, + void * +); + +rtems_device_driver console_close( + rtems_device_major_number, + rtems_device_minor_number, + void * +); + +rtems_device_driver console_read( + rtems_device_major_number, + rtems_device_minor_number, + void * +); + +rtems_device_driver console_write( + rtems_device_major_number, + rtems_device_minor_number, + void * +); + +rtems_device_driver console_control( + rtems_device_major_number, + rtems_device_minor_number, + void * ); #ifdef __cplusplus 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 723a66a1e9..8bf036b22e 100644 --- a/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h +++ b/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h @@ -67,18 +67,6 @@ extern void Clock_delay(rtems_unsigned32 microseconds); Clock_delay(microseconds); /* - * Todo: this should be put somewhere else - */ - -#undef CLOCK_DRIVER_TABLE_ENTRY -#define CLOCK_DRIVER_TABLE_ENTRY { Clock_initialize, NULL, NULL, NULL, NULL, Clock_control } -rtems_device_driver Clock_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp -); - -/* * We printf() to a buffer if multiprocessing, *or* if this is set. * ref: src/lib/libbsp/hppa/simhppa/iosupp/consupp.c */ @@ -86,6 +74,10 @@ rtems_device_driver Clock_control( extern int use_print_buffer; /* + * Device Driver Table Entries + */ + +/* * When not doing printf to a buffer, we do printf thru RTEMS libio * and our tty driver. Set it up so that console is right. */ @@ -94,6 +86,10 @@ extern int use_print_buffer; { tty_initialize, tty_open, tty_close, tty_read, tty_write, tty_control } /* + * NOTE: Use the standard Clock driver entry + */ + +/* * How many libio files we want */ #define BSP_LIBIO_MAX_FDS 20 diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspstart.c b/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspstart.c index 7e9b70f82e..2620d41df4 100644 --- a/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspstart.c +++ b/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspstart.c @@ -131,7 +131,7 @@ bsp_libc_init(void) RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* - * Init the RTEMS libio facility to provide UNIX-like system + * Init the RTEMS libio facility to provide UNIX-like system * calls for use by newlib (ie: provide __open, __close, etc) * Uses malloc() to get area for the iops, so must be after malloc init */ diff --git a/c/src/lib/libbsp/i386/force386/clock/ckinit.c b/c/src/lib/libbsp/i386/force386/clock/ckinit.c index 45400dbd49..45a64f6f14 100644 --- a/c/src/lib/libbsp/i386/force386/clock/ckinit.c +++ b/c/src/lib/libbsp/i386/force386/clock/ckinit.c @@ -19,33 +19,44 @@ */ #include <bsp.h> -#include <clockdrv.h> + +#include <rtems/libio.h> + #include <stdlib.h> -volatile rtems_unsigned32 Clock_driver_ticks; +#define CLOCK_VECTOR 0x38 + rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ + +volatile rtems_unsigned32 Clock_driver_ticks; + rtems_isr_entry Old_ticker; -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval -) -{ - Install_clock( Clock_isr ); -} +void Clock_exit( void ); + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_major_number rtems_clock_minor = 0; -void ReInstall_clock( - rtems_isr_entry clock_isr +/* + * This is the ISR handler. + */ + +rtems_isr Clock_isr( + rtems_vector_number vector ) { - rtems_unsigned32 isrlevel = 0; - - rtems_interrupt_disable( isrlevel ); - (void) set_vector( clock_isr, 0x38, 1 ); - rtems_interrupt_enable( isrlevel ); + /* enable_tracing(); */ + Clock_driver_ticks += 1; + if ( Clock_isrs == 1 ) { + rtems_clock_tick(); + Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; + } + else + Clock_isrs -= 1; } void Install_clock( @@ -56,7 +67,7 @@ void Install_clock( Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; if ( BSP_Configuration.ticks_per_timeslice ) { - Old_ticker = ( rtems_isr_entry ) set_vector( clock_isr, 0x38, 1 ); + Old_ticker = ( rtems_isr_entry ) set_vector( clock_isr, CLOCK_VECTOR, 1 ); outport_byte( TBCR, 0x14 ); /* reset it, delay mode, 50X */ outport_byte( TBDR, 0x50 ); /* 1 millisecond */ outport_byte( IERA, 0x41 ); /* enable interrupt for B */ @@ -64,6 +75,17 @@ void Install_clock( atexit( Clock_exit ); } +void ReInstall_clock( + rtems_isr_entry clock_isr +) +{ + rtems_unsigned32 isrlevel = 0; + + rtems_interrupt_disable( isrlevel ); + (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); +} + void Clock_exit( void ) { if ( BSP_Configuration.ticks_per_timeslice ) { @@ -73,3 +95,49 @@ void Clock_exit( void ) } } +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/lib/libbsp/i386/force386/console/console.c b/c/src/lib/libbsp/i386/force386/console/console.c index f1f019c487..2b68f329c0 100644 --- a/c/src/lib/libbsp/i386/force386/console/console.c +++ b/c/src/lib/libbsp/i386/force386/console/console.c @@ -14,11 +14,10 @@ #define F386_INIT -#include <stdlib.h> +#include <bsp.h> +#include <rtems/libio.h> -#include <rtems.h> -#include "console.h" -#include "bsp.h" +#include <stdlib.h> /* console_cleanup * @@ -61,18 +60,29 @@ void console_cleanup( void ) rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { - /* - * flush the console now and at exit. Just in case. - */ + rtems_status_code status; + + /* + * flush the console now and at exit. Just in case. + */ + + console_cleanup(); + + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); - console_cleanup(); + atexit( console_cleanup ); - atexit( console_cleanup ); + return RTEMS_SUCCESSFUL; } @@ -172,48 +182,103 @@ void outbyte( } /* - * __read -- read bytes from the serial port. Ignore fd, since - * we only have stdin. + * Open entry point */ - -int __read( - int fd, - char *buf, - int nbytes + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} - for (i = 0; i < nbytes; i++) { - *(buf + i) = inbyte(); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; +/* + * read bytes from the serial port. We only have stdin. + */ + +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } - + /* - * __write -- write bytes to the serial port. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ - -int __write( - int fd, - char *buf, - int nbytes + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; - - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r'); + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r'); } - outbyte (*(buf + i)); + outbyte( buffer[ count ] ); } - return (nbytes); + return maximum; } + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + diff --git a/c/src/lib/libbsp/i386/force386/include/bsp.h b/c/src/lib/libbsp/i386/force386/include/bsp.h index cc8fb2d3ba..c6c553e454 100644 --- a/c/src/lib/libbsp/i386/force386/include/bsp.h +++ b/c/src/lib/libbsp/i386/force386/include/bsp.h @@ -22,6 +22,8 @@ extern "C" { #include <rtems.h> #include <iosupp.h> +#include <console.h> +#include <clockdrv.h> /* * Define the time limits for RTEMS Test Suite test durations. @@ -128,6 +130,24 @@ extern "C" { #define BSP_EXTERN extern #endif +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* miscellaneous stuff assumed to exist */ extern rtems_configuration_table BSP_Configuration; diff --git a/c/src/lib/libbsp/i386/force386/startup/bspstart.c b/c/src/lib/libbsp/i386/force386/startup/bspstart.c index 78def6375c..19cb28e450 100644 --- a/c/src/lib/libbsp/i386/force386/startup/bspstart.c +++ b/c/src/lib/libbsp/i386/force386/startup/bspstart.c @@ -20,11 +20,16 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> +#include <rtems/libio.h> + #include <libcsupport.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON #include <stackchk.h> +#endif /* * The original table from the application and our copy of it with @@ -36,6 +41,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -52,6 +59,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -70,12 +85,44 @@ void bsp_libc_init() } -int bsp_start( +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} + +int main( int argc, char **argv, char **environp ) { + + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + /* * FORCE documentation incorrectly states that the bus request * level is initialized to 3. It is actually initialized by @@ -92,7 +139,7 @@ int bsp_start( Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */ + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ @@ -137,6 +184,12 @@ int bsp_start( BSP_Configuration.maximum_extensions++; #endif + /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + rtems_initialize_executive( &BSP_Configuration, &Cpu_table ); /* does not return */ /* no cleanup necessary for Force CPU-386 */ diff --git a/c/src/lib/libbsp/i386/go32/clock/ckinit.c b/c/src/lib/libbsp/i386/go32/clock/ckinit.c index 5ac1c10d98..fa6a8bf057 100644 --- a/c/src/lib/libbsp/i386/go32/clock/ckinit.c +++ b/c/src/lib/libbsp/i386/go32/clock/ckinit.c @@ -11,67 +11,81 @@ */ #include <bsp.h> -#include <clockdrv.h> +#include <rtems/libio.h> + #include <stdlib.h> volatile rtems_unsigned32 Clock_driver_ticks; -rtems_unsigned32 Clock_isrs_per_tick; /* ISRs per tick */ -rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ +rtems_unsigned32 Clock_isrs_per_tick; /* ISRs per tick */ +rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ rtems_isr_entry Old_ticker; -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval -) -{ - Install_clock( Clock_isr ); -} +#define CLOCK_VECTOR 0x8 -void ReInstall_clock( - rtems_isr_entry clock_isr +void Clock_exit( void ); + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; + +rtems_isr Clock_isr( + rtems_vector_number vector ) { - rtems_unsigned32 isrlevel = 0; + /* touch interrupt controller for irq0 (0x20+0) */ + outport_byte( 0x20, 0x20 ); - rtems_interrupt_disable( isrlevel ); - (void) set_vector( clock_isr, 0x8, 1 ); - rtems_interrupt_enable( isrlevel ); + Clock_driver_ticks += 1; + +#if 0 && defined(pentium) + { + extern long long Last_RDTSC; + __asm __volatile( ".byte 0x0F, 0x31" : "=A" (Last_RDTSC) ); + } +#endif + + if ( Clock_isrs == 1 ) { + rtems_clock_tick(); + Clock_isrs = Clock_isrs_per_tick; + } else { + Clock_isrs -= 1; + } } void Install_clock( rtems_isr_entry clock_isr ) { - unsigned int microseconds_per_isr; + unsigned int microseconds_per_isr; #if 0 - /* Initialize clock from on-board real time clock. This breaks the */ + /* Initialize clock from on-board real time clock. This breaks the */ /* test code which assumes which assumes the application will do it. */ { - rtems_time_of_day Now; - extern void init_rtc( void ); - extern long rtc_read( rtems_time_of_day * tod ); - init_rtc(); - if ( rtc_read( &Now ) >= 0 ) - clock_set( &Now ); - } + rtems_time_of_day Now; + extern void init_rtc( void ); + extern long rtc_read( rtems_time_of_day * tod ); + init_rtc(); + if ( rtc_read( &Now ) >= 0 ) + clock_set( &Now ); + } #endif - /* Start by assuming hardware counter is large enough, then */ - /* scale it until it actually fits. */ + /* Start by assuming hardware counter is large enough, then */ + /* scale it until it actually fits. */ Clock_driver_ticks = 0; Clock_isrs_per_tick = 1; if ( BSP_Configuration.microseconds_per_tick == 0 ) - microseconds_per_isr = 10000; /* default 10 ms */ + microseconds_per_isr = 10000; /* default 10 ms */ else - microseconds_per_isr = BSP_Configuration.microseconds_per_tick; + microseconds_per_isr = BSP_Configuration.microseconds_per_tick; while ( US_TO_TICK(microseconds_per_isr) > 65535 ) { - Clock_isrs_per_tick *= 10; - microseconds_per_isr /= 10; + Clock_isrs_per_tick *= 10; + microseconds_per_isr /= 10; } /* Initialize count in ckisr.c */ @@ -83,43 +97,101 @@ void Install_clock( #endif if ( BSP_Configuration.ticks_per_timeslice ) { - /* 105/88 approximates TIMER_TICK*1e-6 */ - unsigned int count = US_TO_TICK( microseconds_per_isr ); + /* 105/88 approximates TIMER_TICK*1e-6 */ + unsigned int count = US_TO_TICK( microseconds_per_isr ); - Old_ticker = (rtems_isr_entry) set_vector( clock_isr, 0x8, 1 ); - outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN ); - outport_byte( TIMER_CNTR0, count >> 0 & 0xff ); - outport_byte( TIMER_CNTR0, count >> 8 & 0xff ); + Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN ); + outport_byte( TIMER_CNTR0, count >> 0 & 0xff ); + outport_byte( TIMER_CNTR0, count >> 8 & 0xff ); } atexit( Clock_exit ); } +void ReInstall_clock( + rtems_isr_entry clock_isr +) +{ + rtems_unsigned32 isrlevel = 0; + + rtems_interrupt_disable( isrlevel ); + (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); +} + void Clock_exit( void ) { if ( BSP_Configuration.ticks_per_timeslice ) { - extern void rtc_set_dos_date( void ); - - /* reset to DOS value: */ - outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN ); - outport_byte( TIMER_CNTR0, 0 ); - outport_byte( TIMER_CNTR0, 0 ); - - /* reset time-of-day */ - rtc_set_dos_date(); - - /* re-enable old handler: assume it was one of ours */ - set_vector( (rtems_isr_entry)Old_ticker, 0x8, 1 ); + extern void rtc_set_dos_date( void ); + + /* reset to DOS value: */ + outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN ); + outport_byte( TIMER_CNTR0, 0 ); + outport_byte( TIMER_CNTR0, 0 ); + + /* reset time-of-day */ + rtc_set_dos_date(); + + /* re-enable old handler: assume it was one of ours */ + set_vector( (rtems_isr_entry)Old_ticker, CLOCK_VECTOR, 1 ); } } +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} #if 0 && defined(pentium) -/* This can be used to get extremely accurate timing on a pentium. */ -/* It isn't supported. [bryce] */ +/* This can be used to get extremely accurate timing on a pentium. */ +/* It isn't supported. [bryce] */ #define HZ 90.0 volatile long long Last_RDTSC; #define RDTSC()\ ({ long long _now; __asm __volatile (".byte 0x0F,0x31":"=A"(_now)); _now; }) + long long Kernel_Time_ns( void ) { extern rtems_unsigned32 _TOD_Ticks_per_second; @@ -128,7 +200,7 @@ long long Kernel_Time_ns( void ) int flags; disable_intr( flags ); now = 1e9 * Clock_driver_ticks / isrs_per_second - + (RDTSC() - Last_RDTSC) * (1000.0/HZ); + + (RDTSC() - Last_RDTSC) * (1000.0/HZ); enable_intr( flags ); return now; } diff --git a/c/src/lib/libbsp/i386/go32/console/console.c b/c/src/lib/libbsp/i386/go32/console/console.c index d7e5641e22..3265f46de0 100644 --- a/c/src/lib/libbsp/i386/go32/console/console.c +++ b/c/src/lib/libbsp/i386/go32/console/console.c @@ -8,9 +8,8 @@ #include <stdlib.h> -#include <rtems.h> -#include "console.h" -#include "bsp.h" +#include <bsp.h> +#include <rtems/libio.h> #include <dpmi.h> #include <go32.h> @@ -42,40 +41,55 @@ void console_cleanup( void ) * Return values: */ -/* Set this if console I/O should use go32 (DOS) read/write calls. */ -/* Otherwise, direct hardware accesses will be used. */ -int _IBMPC_Use_Go32_IO = 0; +/* Set this if console I/O should use go32 (DOS) read/write calls. */ +/* Otherwise, direct hardware accesses will be used. */ -static rtems_isr_entry old_keyboard_isr = NULL; -extern void _IBMPC_keyboard_isr( rtems_unsigned32 interrupt ); +int _IBMPC_Use_Go32_IO = 0; +static rtems_isr_entry old_keyboard_isr = NULL; + +extern void _IBMPC_keyboard_isr( rtems_unsigned32 interrupt ); rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { - if ( _IBMPC_Use_Go32_IO ) { - /* Nothing. We let DOS and go32 do all the work. */ - } else { - /* Grap the keyboard interrupt so DOS doesn't steal our */ - /* keystrokes. */ - rtems_status_code status; - status = rtems_interrupt_catch( _IBMPC_keyboard_isr, 9, - &old_keyboard_isr ); - if ( status ) { - int write( int, void *, int ); - void exit( int ); - char msg[] = "error initializing keyboard\n"; - write( 2, msg, sizeof msg - 1 ); - exit( 1 ); - } + rtems_status_code status; + + if ( _IBMPC_Use_Go32_IO ) { + /* Nothing. We let DOS and go32 do all the work. */ + } else { + /* Grap the keyboard interrupt so DOS doesn't steal our */ + /* keystrokes. */ + rtems_status_code status; + + status = + rtems_interrupt_catch( _IBMPC_keyboard_isr, 9, &old_keyboard_isr ); + + if ( status ) { + int write( int, void *, int ); + void exit( int ); + + char msg[] = "error initializing keyboard\n"; + write( 2, msg, sizeof msg - 1 ); + exit( 1 ); } + } - atexit( console_cleanup ); + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + atexit( console_cleanup ); + + return RTEMS_SUCCESSFUL; } @@ -117,7 +131,7 @@ char inbyte( void ) void outbyte( char ch ); outbyte( ch ); if ( ch == '\r' ) - outbyte( '\n' ); + outbyte( '\n' ); #endif return ch; } @@ -138,49 +152,104 @@ void outbyte( char ch ) } /* - * __read -- read bytes from the console. Ignore fd, since - * we only have stdin. + * Open entry point */ + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} -int __read( - int fd, - char *buf, - int nbytes +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; - - for ( i = 0; i < nbytes; i++ ) { - buf[i] = inbyte(); - if ( buf[i] == '\r' ) { - /* What if this goes past the end of the buffer? We're hosed. [bhc] */ - buf[i++] = '\n'; - buf[i] = '\0'; - break; + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ + +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + /* What if this goes past the end of the buffer? We're hosed. [bhc] */ + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; + break; } } - return i; + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } - + /* - * __write -- write bytes to the console. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ - -int __write( - int fd, - char *buf, - int nbytes + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; - - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r'); + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r'); } - outbyte (*(buf + i)); + outbyte( buffer[ count ] ); } - return (nbytes); + return maximum; } + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + diff --git a/c/src/lib/libbsp/i386/go32/include/bsp.h b/c/src/lib/libbsp/i386/go32/include/bsp.h index a41d57dc77..5bafd27bd4 100644 --- a/c/src/lib/libbsp/i386/go32/include/bsp.h +++ b/c/src/lib/libbsp/i386/go32/include/bsp.h @@ -22,6 +22,8 @@ extern "C" { #include <rtems.h> #include <iosupp.h> +#include <console.h> +#include <clockdrv.h> /* * Define the time limits for RTEMS Test Suite test durations. @@ -124,6 +126,24 @@ extern "C" { #define BSP_EXTERN extern #endif +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* functions */ int _IBMPC_chrdy( char * ch ); @@ -134,15 +154,6 @@ void _IBMPC_outch( unsigned char ); extern rtems_configuration_table BSP_Configuration; -#if 0 -extern i386_IDT_slot Interrupt_descriptor_table[ 256 ]; -extern i386_GDT_slot Global_descriptor_table[ 8192 ]; -BSP_EXTERN unsigned short Idt[3]; /* Interrupt Descriptor Table Address */ -BSP_EXTERN unsigned short Gdt[3]; /* Global Descriptor Table Address */ -BSP_EXTERN unsigned int Idt_base; -BSP_EXTERN unsigned int Gdt_base; -#endif - /* routines */ i386_isr_entry set_vector( diff --git a/c/src/lib/libbsp/i386/go32/startup/bspstart.c b/c/src/lib/libbsp/i386/go32/startup/bspstart.c index 21594766ad..940c04270a 100644 --- a/c/src/lib/libbsp/i386/go32/startup/bspstart.c +++ b/c/src/lib/libbsp/i386/go32/startup/bspstart.c @@ -20,11 +20,18 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> +#include <rtems/libio.h> + #include <libcsupport.h> - +#include <z8036.h> + +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON #include <stackchk.h> +#endif /* * The original table from the application and our copy of it with @@ -36,6 +43,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -57,6 +66,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -74,60 +91,116 @@ void bsp_libc_init() #endif } - -void bsp_start() + +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) { - extern void * sbrk( int ); - - Cpu_table.pretasking_hook = NULL; - Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */ - Cpu_table.idle_task = NULL; /* do not override system IDLE task */ - Cpu_table.do_zero_of_workspace = TRUE; - Cpu_table.interrupt_table_segment = 0;/* get_ds(); */ - Cpu_table.interrupt_table_offset = (void *)0; - Cpu_table.interrupt_stack_size = 4096; - Cpu_table.extra_system_initialization_stack = 0; - - /* - * Copy the table - */ - BSP_Configuration = Configuration; - - BSP_Configuration.work_space_start = sbrk( Configuration.work_space_size ); - if ( BSP_Configuration.work_space_start == 0 ) { - /* Big trouble */ - int write( int, void *, int ); - void _exit( int ); - char msg[] = "bsp_start() couldn't sbrk() RTEMS work space\n"; - write( 2, msg, sizeof msg - 1 ); - _exit( 1 ); - } - - /* - * Add 1 region for Malloc in libc_low - */ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} - BSP_Configuration.maximum_regions++; +/* This is the original command line passed from DOS */ +char ** Go32_Argv; - /* - * Add 1 extension for newlib libc - */ +int main( + int argc, + char **argv, + char **environp +) +{ + extern void * sbrk( int ); + extern volatile void _exit( int ); + + /* Set up arguments that we can access later */ + Go32_Argv = argv; + + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + + Cpu_table.pretasking_hook = NULL; + Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ + Cpu_table.postdriver_hook = bsp_postdriver_hook; + Cpu_table.idle_task = NULL; /* do not override system IDLE task */ + Cpu_table.do_zero_of_workspace = TRUE; + Cpu_table.interrupt_table_segment = 0;/* get_ds(); */ + Cpu_table.interrupt_table_offset = (void *)0; + Cpu_table.interrupt_stack_size = 4096; + Cpu_table.extra_system_initialization_stack = 0; + + /* + * Copy the table + */ + BSP_Configuration = Configuration; + + BSP_Configuration.work_space_start = sbrk( Configuration.work_space_size ); + if ( BSP_Configuration.work_space_start == 0 ) { + /* Big trouble */ + int write( int, void *, int ); + char msg[] = "bsp_start() couldn't sbrk() RTEMS work space\n"; + write( 2, msg, sizeof msg - 1 ); + _exit( 1 ); + } + + /* + * Add 1 region for Malloc in libc_low + */ + + BSP_Configuration.maximum_regions++; + + /* + * Add 1 extension for newlib libc + */ #ifdef RTEMS_NEWLIB - BSP_Configuration.maximum_extensions++; + BSP_Configuration.maximum_extensions++; #endif - /* - * Add another extension if using the stack checker - */ + /* + * Add another extension if using the stack checker + */ #ifdef STACK_CHECKER_ON - BSP_Configuration.maximum_extensions++; + BSP_Configuration.maximum_extensions++; #endif - rtems_initialize_executive( &BSP_Configuration, &Cpu_table ); - /* does not return */ + /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + + rtems_initialize_executive( &BSP_Configuration, &Cpu_table ); + /* does not return */ + + /* We only return here if the executive has finished. This happens */ + /* when the task has called exit(). */ + /* At this point we call _exit() which resides in djgcc. */ + + for (;;) + _exit( 0 ); + + /* no cleanup necessary for GO32 */ - /* no cleanup necessary for GO32 */ + return 0; } diff --git a/c/src/lib/libbsp/i960/cvme961/clock/ckinit.c b/c/src/lib/libbsp/i960/cvme961/clock/ckinit.c index 623101075d..b479ad137c 100644 --- a/c/src/lib/libbsp/i960/cvme961/clock/ckinit.c +++ b/c/src/lib/libbsp/i960/cvme961/clock/ckinit.c @@ -20,32 +20,28 @@ #include <stdlib.h> -#include <rtems.h> #include <bsp.h> -#include <clockdrv.h> +#include <rtems/libio.h> + +#define CLOCK_VECTOR 5 rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ i960_isr_entry Old_ticker; volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */ -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id id, - rtems_unsigned32 *rval ) -{ - Install_clock( Clock_isr ); - atexit( Clock_exit ); -} +void Clock_exit( void ); + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; -void ReInstall_clock( - rtems_isr_entry clock_isr -) -{ - (void) set_vector( clock_isr, 5, 1 ); -} + +/* this is later in the file to avoid it being inlined */ +rtems_isr Clock_isr( rtems_vector_number vector ); void Install_clock( rtems_isr_entry clock_isr @@ -57,13 +53,20 @@ void Install_clock( Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; if ( BSP_Configuration.ticks_per_timeslice ) { - Old_ticker = set_vector( clock_isr, 5, 1 ); + Old_ticker = set_vector( clock_isr, CLOCK_VECTOR, 1 ); victimer = (volatile unsigned char *) 0xa00000c3; *victimer = 0x12; *victimer = 0x92; /* 1000 HZ */ } } +void ReInstall_clock( + rtems_isr_entry clock_isr +) +{ + (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); +} + void Clock_exit() { unsigned char *victimer; @@ -75,3 +78,68 @@ void Clock_exit() /* do not restore old vector */ } } + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + atexit( Clock_exit ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} + +rtems_isr Clock_isr( + rtems_vector_number vector +) +{ + /* enable_tracing(); */ + Clock_driver_ticks += 1; + if ( Clock_isrs == 1 ) { + rtems_clock_tick(); + Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; + } + else + Clock_isrs -= 1; + i960_clear_intr( 5 ); +} + diff --git a/c/src/lib/libbsp/i960/cvme961/console/console.c b/c/src/lib/libbsp/i960/cvme961/console/console.c index 8ba0352304..192c7f2d16 100644 --- a/c/src/lib/libbsp/i960/cvme961/console/console.c +++ b/c/src/lib/libbsp/i960/cvme961/console/console.c @@ -1,5 +1,5 @@ /* - * This file contains the MVME136 console IO package. + * This file contains the CVME961 console IO package. * * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994. * On-Line Applications Research Corporation (OAR). @@ -14,9 +14,8 @@ #define C961_INIT -#include <rtems.h> -#include "console.h" -#include "bsp.h" +#include <bsp.h> +#include <rtems/libio.h> /* console_initialize * @@ -32,12 +31,21 @@ rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { - *status = RTEMS_SUCCESSFUL; + rtems_status_code status; + + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; } /* @@ -100,48 +108,103 @@ void outbyte( } /* - * __read -- read bytes from the serial port. Ignore fd, since - * we only have stdin. + * Open entry point */ - -int __read( - int fd, - char *buf, - int nbytes + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; - - for (i = 0; i < nbytes; i++) { - *(buf + i) = inbyte(); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ + +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } - + /* - * __write -- write bytes to the serial port. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ - -int __write( - int fd, - char *buf, - int nbytes + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; - - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r'); + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r'); } - outbyte (*(buf + i)); + outbyte( buffer[ count ] ); } - return (nbytes); + return maximum; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } + diff --git a/c/src/lib/libbsp/i960/cvme961/include/bsp.h b/c/src/lib/libbsp/i960/cvme961/include/bsp.h index ca870b3cd3..9b6caab59d 100644 --- a/c/src/lib/libbsp/i960/cvme961/include/bsp.h +++ b/c/src/lib/libbsp/i960/cvme961/include/bsp.h @@ -24,6 +24,8 @@ extern "C" { #include <rtems.h> #include <iosupp.h> +#include <console.h> +#include <clockdrv.h> /* * Define the time limits for RTEMS Test Suite test durations. @@ -115,6 +117,24 @@ extern rtems_configuration_table BSP_Configuration; BSP_EXTERN i960ca_PRCB *Prcb; BSP_EXTERN i960ca_control_table *Ctl_tbl; +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* functions */ void bsp_cleanup( void ); diff --git a/c/src/lib/libbsp/i960/cvme961/startup/bspstart.c b/c/src/lib/libbsp/i960/cvme961/startup/bspstart.c index afb9b7e733..8298efcffe 100644 --- a/c/src/lib/libbsp/i960/cvme961/startup/bspstart.c +++ b/c/src/lib/libbsp/i960/cvme961/startup/bspstart.c @@ -20,12 +20,17 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> -#include "libcsupport.h" - - -#include "stackchk.h" +#include <rtems/libio.h> + +#include <libcsupport.h> + +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON +#include <stackchk.h> +#endif /* * The original table from the application and our copy of it with @@ -38,6 +43,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -54,6 +61,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -70,12 +85,43 @@ void bsp_libc_init() #endif } -int bsp_start( +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} + +int main( int argc, char **argv, char **environp ) { + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + /* set node number in SQSIO4 CTL REG */ *((rtems_unsigned32 *)0xc00000b0) = @@ -110,7 +156,7 @@ int bsp_start( Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */ + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ @@ -150,6 +196,12 @@ int bsp_start( BSP_Configuration.maximum_extensions++; #endif + /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + BSP_Configuration.work_space_start = (void *) (RAM_END - BSP_Configuration.work_space_size); diff --git a/c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c b/c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c index d5f0f5e023..8715cdcc26 100644 --- a/c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c +++ b/c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c @@ -19,36 +19,46 @@ */ #include <stdlib.h> - -#include <rtems.h> + #include <bsp.h> -#include <clockdrv.h> +#include <rtems/libio.h> rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */ rtems_isr_entry Old_ticker; -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval -) -{ - Install_clock( Clock_isr ); -} +void Clock_exit( void ); -void ReInstall_clock( - rtems_isr_entry clock_isr +#define CLOCK_VECTOR TIMER_VECTOR + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; + +/* + * ISR Handler + */ + +rtems_isr Clock_isr( + rtems_vector_number vector ) { - rtems_unsigned32 isrlevel = 0 ; + Clock_driver_ticks += 1; - rtems_interrupt_disable( isrlevel ); - (void) set_vector( clock_isr, TIMER_VECTOR, 1 ); - rtems_interrupt_enable( isrlevel ); + Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xE2 ); + Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x22 ); + Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xC6 ); + + if ( Clock_isrs == 1 ) { + rtems_clock_tick(); + Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; + } + else + Clock_isrs -= 1; } void Install_clock( @@ -61,7 +71,7 @@ void Install_clock( Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; if ( BSP_Configuration.ticks_per_timeslice ) { - Old_ticker = (rtems_isr_entry) set_vector( clock_isr, TIMER_VECTOR, 1 ); + Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 ); Z8x36_WRITE( TIMER, MASTER_CFG, 0xd4 ); Z8x36_READ ( TIMER, MASTER_INTR, data ); @@ -69,7 +79,7 @@ void Install_clock( Z8x36_WRITE( TIMER, CT1_TIME_CONST_MSB, 0x04 ); Z8x36_WRITE( TIMER, CT1_TIME_CONST_LSB, 0xCE ); Z8x36_WRITE( TIMER, CT1_MODE_SPEC, 0x83 ); - Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, TIMER_VECTOR ); + Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, CLOCK_VECTOR ); Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x20 ); Z8x36_READ ( TIMER, MASTER_INTR, data ); Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0xDA) | 0x80 ); @@ -87,6 +97,17 @@ void Install_clock( } } +void ReInstall_clock( + rtems_isr_entry clock_isr +) +{ + rtems_unsigned32 isrlevel = 0 ; + + rtems_interrupt_disable( isrlevel ); + (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); +} + void Clock_exit( void ) { rtems_unsigned8 data; @@ -99,3 +120,51 @@ void Clock_exit( void ) } } + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} + diff --git a/c/src/lib/libbsp/m68k/dmv152/console/console.c b/c/src/lib/libbsp/m68k/dmv152/console/console.c index bb0f365b9c..ed0cd801c8 100644 --- a/c/src/lib/libbsp/m68k/dmv152/console/console.c +++ b/c/src/lib/libbsp/m68k/dmv152/console/console.c @@ -14,10 +14,9 @@ #define D152_INIT -#include <rtems.h> -#include "console.h" -#include "bsp.h" - +#include <bsp.h> +#include <rtems/libio.h> + /* console_initialize * * This routine initializes the console IO driver. @@ -28,19 +27,27 @@ * * Return values: */ - + rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { - *status = RTEMS_SUCCESSFUL; + rtems_status_code status; + + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; } - /* is_character_ready * * This routine returns TRUE if a character is available. @@ -139,48 +146,102 @@ void outbyte( } /* - * __read -- read bytes from the serial port. Ignore fd, since - * we only have stdin. + * Open entry point */ -int __read( - int fd, - char *buf, - int nbytes +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ - for (i = 0; i < nbytes; i++) { - *(buf + i) = inbyte(); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } /* - * __write -- write bytes to the serial port. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ -int __write( - int fd, - char *buf, - int nbytes +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r'); + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r'); } - outbyte (*(buf + i)); + outbyte( buffer[ count ] ); } - return (nbytes); + return maximum; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } diff --git a/c/src/lib/libbsp/m68k/dmv152/include/bsp.h b/c/src/lib/libbsp/m68k/dmv152/include/bsp.h index c2d3918e7f..5a31136005 100644 --- a/c/src/lib/libbsp/m68k/dmv152/include/bsp.h +++ b/c/src/lib/libbsp/m68k/dmv152/include/bsp.h @@ -21,7 +21,10 @@ extern "C" { #endif #include <rtems.h> +#include <console.h> +#include <clockdrv.h> #include <iosupp.h> +#include <vmeintr.h> #include <z8530.h> #include <z8536.h> @@ -151,6 +154,24 @@ extern rtems_configuration_table BSP_Configuration; extern m68k_isr_entry M68Kvec[]; /* vector table address */ +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* functions */ void bsp_cleanup( void ); diff --git a/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c b/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c index e66abc9ad2..4079ee4a8e 100644 --- a/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c +++ b/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c @@ -21,11 +21,17 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> +#include <rtems/libio.h> + #include <libcsupport.h> -#include <vmeintr.h> - + +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON +#include <stackchk.h> +#endif /* * The original table from the application and our copy of it with * some changes. @@ -36,6 +42,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -52,6 +60,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -69,7 +85,33 @@ void bsp_libc_init() #endif } -int bsp_start( +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} + +int main( int argc, char **argv, char **environp @@ -79,6 +121,11 @@ int bsp_start( int index; void *vbr; + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + monitors_vector_table = (m68k_isr_entry *)0; /* Monitor Vectors are at 0 */ m68k_set_vbr( monitors_vector_table ); @@ -115,7 +162,7 @@ int bsp_start( Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */ + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ @@ -159,6 +206,12 @@ int bsp_start( BSP_Configuration.maximum_extensions++; #endif + /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + rtems_initialize_executive( &BSP_Configuration, &Cpu_table ); /* does not return */ diff --git a/c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c b/c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c index be3cf6ab21..f842bbc83c 100644 --- a/c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c +++ b/c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c @@ -20,11 +20,12 @@ #include <stdlib.h> /* for atexit() */ -#include <rtems.h> #include <bsp.h> -#include <clockdrv.h> +#include <rtems/libio.h> + #include "m68302.h" +#define CLOCK_VECTOR 137 #define TMR1_VAL ( RBIT_TMR_RST /* software reset the timer */\ | RBIT_TMR_ICLK_MASTER16 /* master clock divided by 16 */\ @@ -49,18 +50,35 @@ volatile rtems_unsigned32 Clock_driver_ticks; */ rtems_unsigned32 Clock_isrs; +void Clock_exit( void ); + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval +/* + * ISR Handler + */ + +rtems_isr Clock_isr( + rtems_vector_number vector ) { - Install_clock( Clock_isr ); -} + Clock_driver_ticks += 1; + m302.reg.isr = RBIT_ISR_TIMER1; /* clear in-service bit */ + m302.reg.ter1 = (RBIT_TER_REF | RBIT_TER_CAP); /* clear timer intr request */ + + if ( Clock_isrs == 1 ) { + rtems_clock_tick(); + Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; + } + else + Clock_isrs -= 1; +} void Install_clock( rtems_isr_entry clock_isr @@ -71,7 +89,7 @@ void Install_clock( Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; if ( BSP_Configuration.ticks_per_timeslice ) { -/* set_vector( clock_isr, 137, 1 );*/ +/* set_vector( clock_isr, CLOCK_VECTOR, 1 );*/ m302.reg.trr1 = TRR1_VAL; /* set timer reference register */ m302.reg.tmr1 = TMR1_VAL; /* set timer mode register & enable */ @@ -84,6 +102,16 @@ void Install_clock( } } +void ReInstall_clock( + rtems_isr_entry clock_isr +) +{ + rtems_unsigned32 isrlevel; + + rtems_interrupt_disable( isrlevel ); + /* (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); */ + rtems_interrupt_enable( isrlevel ); +} void Clock_exit( void ) { @@ -92,3 +120,51 @@ void Clock_exit( void ) /* do not restore old vector */ } } + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr( CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} + diff --git a/c/src/lib/libbsp/m68k/gen68302/console/console.c b/c/src/lib/libbsp/m68k/gen68302/console/console.c index 7f488c5cfd..dd461e4557 100644 --- a/c/src/lib/libbsp/m68k/gen68302/console/console.c +++ b/c/src/lib/libbsp/m68k/gen68302/console/console.c @@ -14,9 +14,8 @@ #define GEN68302_INIT -#include <rtems.h> -#include "console.h" #include <bsp.h> +#include <rtems/libio.h> #include "m68302.h" @@ -34,11 +33,10 @@ rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { + rtems_status_code status; volatile m302_dualPortRAM_t *p = &m302; p->reg.pacnt |= 0x0003; /* enable RXD2 and TXD2 signals */ @@ -81,9 +79,18 @@ rtems_device_driver console_initialize( p->reg.scc[1].sccm = 0x03; /* enable only Tx & Rx interrupts */ p->reg.scc[1].scm = 0x01BD; - *status = RTEMS_SUCCESSFUL; -} + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; +} /* is_character_ready * @@ -194,48 +201,102 @@ void outbyte( } /* - * __read -- read bytes from the serial port. Ignore fd, since - * we only have stdin. + * Open entry point + */ + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point */ -int __read( - int fd, - char *buf, - int nbytes +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ - for (i = 0; i < nbytes; i++) { - *(buf + i) = inbyte(); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } /* - * __write -- write bytes to the serial port. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ -int __write( - int fd, - char *buf, - int nbytes +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r'); + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r'); } - outbyte (*(buf + i)); + outbyte( buffer[ count ] ); } - return (nbytes); + return maximum; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } diff --git a/c/src/lib/libbsp/m68k/gen68302/include/bsp.h b/c/src/lib/libbsp/m68k/gen68302/include/bsp.h index 04745e01d6..eed274fb9a 100644 --- a/c/src/lib/libbsp/m68k/gen68302/include/bsp.h +++ b/c/src/lib/libbsp/m68k/gen68302/include/bsp.h @@ -23,7 +23,9 @@ extern "C" { #endif #include <rtems.h> +#include <console.h> #include <iosupp.h> +#include <clockdrv.h> /* * Define the time limits for RTEMS Test Suite test durations. @@ -81,6 +83,24 @@ extern "C" { #define EXTERN extern #endif +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* miscellaneous stuff assumed to exist */ extern rtems_configuration_table BSP_Configuration; diff --git a/c/src/lib/libbsp/m68k/gen68302/start/start302.s b/c/src/lib/libbsp/m68k/gen68302/start/start302.s index 2682066e84..d92ed1ce6b 100644 --- a/c/src/lib/libbsp/m68k/gen68302/start/start302.s +++ b/c/src/lib/libbsp/m68k/gen68302/start/start302.s @@ -227,7 +227,10 @@ loop: movel d0,a1@+ | to zero out uninitialized movec a0,isp | set interrupt stack #endif - jsr SYM (bsp_start) + move.l #0,a7@- | environp + move.l #0,a7@- | argv + move.l #0,a7@- | argc + jsr SYM (main) nop Bad: bra Bad diff --git a/c/src/lib/libbsp/m68k/gen68302/start302/start302.s b/c/src/lib/libbsp/m68k/gen68302/start302/start302.s index 2682066e84..d92ed1ce6b 100644 --- a/c/src/lib/libbsp/m68k/gen68302/start302/start302.s +++ b/c/src/lib/libbsp/m68k/gen68302/start302/start302.s @@ -227,7 +227,10 @@ loop: movel d0,a1@+ | to zero out uninitialized movec a0,isp | set interrupt stack #endif - jsr SYM (bsp_start) + move.l #0,a7@- | environp + move.l #0,a7@- | argv + move.l #0,a7@- | argc + jsr SYM (main) nop Bad: bra Bad diff --git a/c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c b/c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c index 976046cf9f..72e1656e04 100644 --- a/c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c +++ b/c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c @@ -20,10 +20,17 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> +#include <rtems/libio.h> + #include <libcsupport.h> - + +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON +#include <stackchk.h> +#endif /* * The original table from the application and our copy of it with @@ -35,6 +42,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -58,6 +67,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -75,13 +92,43 @@ void bsp_libc_init() #endif } +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} -int bsp_start( +int main( int argc, char **argv, char **environp ) { + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + /* * Allocate the memory for the RTEMS Work Space. This can come from * a variety of places: hard coded address, malloc'ed from outside @@ -90,7 +137,7 @@ int bsp_start( * of work space from the last physical address on the CPU board. */ #if 0 -a Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/; + Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/; #endif @@ -123,6 +170,12 @@ a Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/; #endif /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + + /* * Need to "allocate" the memory for the RTEMS Workspace and * tell the RTEMS configuration where it is. This memory is * not malloc'ed. It is just "pulled from the air". @@ -143,7 +196,7 @@ a Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/; Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ diff --git a/c/src/lib/libbsp/m68k/idp/clock/ckinit.c b/c/src/lib/libbsp/m68k/idp/clock/ckinit.c index b27e9bbe38..7966fc61d1 100644 --- a/c/src/lib/libbsp/m68k/idp/clock/ckinit.c +++ b/c/src/lib/libbsp/m68k/idp/clock/ckinit.c @@ -26,9 +26,8 @@ #include <stdlib.h> -#include <rtems.h> -#include <clockdrv.h> #include <bsp.h> +#include <rtems/libio.h> rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ volatile rtems_unsigned32 Clock_driver_ticks; @@ -39,30 +38,53 @@ extern rtems_configuration_table Configuration; extern void led_putnum(); void Disable_clock(); -#define TIMER_VECTOR 0x4D +#define CLOCK_VECTOR 0x4D -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval -) -{ - Install_clock( Clock_isr ); -} +void Clock_exit( void ); + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; + -void ReInstall_clock( clock_isr ) -rtems_isr_entry clock_isr; -{ - rtems_unsigned32 isrlevel = 0 ; +/* + * ISR Handler + * + * + * ((1ms * 6.5 MHz) / 2^5) = 203.125) where 6.5 MHz is the clock rate of the + * MC68230, 2^5 is the prescaler factor, and 1ms is the common interrupt + * interval for the Clock_isr routine. + * Therefore, 203 (decimal) is the number to program into the CPRH-L registers + * of the MC68230 for countdown. However, I have found that 193 instead of + * 203 provides greater accuracy -- why? The crystal should be more accurate + * than that + */ - rtems_interrupt_disable( isrlevel ); - (void) set_vector( clock_isr, TIMER_VECTOR, 1 ); - rtems_interrupt_enable( isrlevel ); +rtems_isr Clock_isr( + rtems_vector_number vector +) +{ + Clock_driver_ticks += 1; + /* acknowledge interrupt + TSR = 1; */ + MC68230_WRITE (TSR, 1); + + if ( Clock_isrs == 1 ) { + rtems_clock_tick(); + /* Cast to an integer so that 68EC040 IDP which doesn't have an FPU doesn't + have a heart attack -- if you use newlib1.6 or greater and get + libgcc.a for gcc with software floating point support, this is not + a problem */ + Clock_isrs = + (int)(BSP_Configuration.microseconds_per_tick / 1000); + } + else + Clock_isrs -= 1; } -/* The following was added for debugging purposes */ void Disable_clock() { /* Disable timer */ @@ -77,7 +99,7 @@ rtems_isr_entry clock_isr; if ( Configuration.ticks_per_timeslice ) { /* led_putnum('c'); * for debugging purposes */ - Old_ticker = (rtems_isr_entry) set_vector( clock_isr, TIMER_VECTOR, 1 ); + Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 ); /* Disable timer for initialization */ MC68230_WRITE (TCR, 0x00); @@ -85,8 +107,8 @@ rtems_isr_entry clock_isr; /* some PI/T initialization stuff here -- see comment in the ckisr.c file in this directory to understand why I use the values that I do */ /* Set up the interrupt vector on the MC68230 chip: - TIVR = TIMER_VECTOR; */ - MC68230_WRITE (TIVR, TIMER_VECTOR); + TIVR = CLOCK_VECTOR; */ + MC68230_WRITE (TIVR, CLOCK_VECTOR); /* Set CPRH through CPRL to 193 (not 203) decimal for countdown--see ckisr.c CPRH = 0x00; @@ -108,6 +130,17 @@ rtems_isr_entry clock_isr; } } +void ReInstall_clock( clock_isr ) +rtems_isr_entry clock_isr; +{ + rtems_unsigned32 isrlevel = 0 ; + + rtems_interrupt_disable( isrlevel ); + (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); +} + +/* The following was added for debugging purposes */ void Clock_exit( void ) { rtems_unsigned8 data; @@ -123,3 +156,51 @@ void Clock_exit( void ) /* do not restore old vector */ } } + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} + diff --git a/c/src/lib/libbsp/m68k/idp/console/console.c b/c/src/lib/libbsp/m68k/idp/console/console.c index 7bb720c120..5540d26fcd 100644 --- a/c/src/lib/libbsp/m68k/idp/console/console.c +++ b/c/src/lib/libbsp/m68k/idp/console/console.c @@ -11,17 +11,15 @@ #define MIDP_INIT -#include "rtems.h" -#include "console.h" -#include "bsp.h" +#include <bsp.h> +#include <rtems/libio.h> -#include "ringbuf.h" +#include <ringbuf.h> Ring_buffer_t Buffer[ 2 ]; rtems_isr C_Receive_ISR(rtems_vector_number vector); - /* console_initialize * * This routine initializes the console IO driver. @@ -36,18 +34,44 @@ rtems_isr C_Receive_ISR(rtems_vector_number vector); rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { + rtems_status_code status; Ring_buffer_Initialize( &Buffer[ 0 ] ); Ring_buffer_Initialize( &Buffer[ 1 ] ); init_pit(); - *status = RTEMS_SUCCESSFUL; + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + status = rtems_io_register_name( + "/dev/tty00", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + status = rtems_io_register_name( + "/dev/tty01", + major, + (rtems_device_minor_number) 1 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; } @@ -151,66 +175,108 @@ void outbyte( } /* - * __read -- read bytes from the serial port. Ignore fd, since - * we only have stdin. + * Open entry point + */ + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. */ -int __read( - int fd, - char *buf, - int nbytes +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; - int port; - - /* - * Map port A to stdin, stdout, and stderr. - * Map everything else to port B. - */ - - if ( fd <= 2 ) port = 0; - else port = 1; - - for (i = 0; i < nbytes; i++) { - *(buf + i) = inbyte( port ); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + if ( minor > 1 ) + return RTEMS_INVALID_NUMBER; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte( minor ); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } /* - * __write -- write bytes to the serial port. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ -int __write( - int fd, - char *buf, - int nbytes +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; - int port; - - /* - * Map port A to stdin, stdout, and stderr. - * Map everything else to port B. - */ - - if ( fd <= 2 ) port = 0; - else port = 1; - - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r', port ); + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + if ( minor > 1 ) + return RTEMS_INVALID_NUMBER; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r', minor ); } - outbyte (*(buf + i), port ); + outbyte( buffer[ count ], minor ); } - return (nbytes); + return maximum; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } diff --git a/c/src/lib/libbsp/m68k/idp/include/bsp.h b/c/src/lib/libbsp/m68k/idp/include/bsp.h index 68faeba68c..65fcfe1e6e 100644 --- a/c/src/lib/libbsp/m68k/idp/include/bsp.h +++ b/c/src/lib/libbsp/m68k/idp/include/bsp.h @@ -10,6 +10,7 @@ #include <rtems.h> #include <console.h> +#include <clockdrv.h> #include <mc68230.h> #include <mc68681.h> @@ -52,6 +53,24 @@ #define EXTERN extern #endif +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* miscellaneous stuff assumed to exist */ extern rtems_configuration_table BSP_Configuration; diff --git a/c/src/lib/libbsp/m68k/idp/startup/bspstart.c b/c/src/lib/libbsp/m68k/idp/startup/bspstart.c index a0b738c53e..233449282e 100644 --- a/c/src/lib/libbsp/m68k/idp/startup/bspstart.c +++ b/c/src/lib/libbsp/m68k/idp/startup/bspstart.c @@ -20,9 +20,17 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> +#include <rtems/libio.h> + #include <libcsupport.h> + +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON +#include <stackchk.h> +#endif unsigned char *duart_base; extern struct duart_regs duart_info; @@ -41,6 +49,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -56,6 +66,14 @@ void bsp_libc_init() /* Create 64 KByte memory region for RTEMS executive */ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); + + /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); /* * Set up for the libc handling. @@ -76,7 +94,33 @@ void bsp_libc_init() } -int bsp_start( +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} + +int main( int argc, char **argv, char **environp @@ -85,6 +129,11 @@ int bsp_start( m68k_isr_entry *monitors_vector_table; int index; + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + duart_base = (unsigned char *)DUART_ADDR; /* @@ -121,7 +170,7 @@ int bsp_start( Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ @@ -164,6 +213,12 @@ int bsp_start( BSP_Configuration.maximum_extensions++; #endif + /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + /* led_putnum('e'); * for debugging purposes only */ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );/* does not return */ diff --git a/c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c b/c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c index de88fe9252..195d4a11af 100644 --- a/c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c +++ b/c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c @@ -20,9 +20,8 @@ #include <stdlib.h> -#include <rtems.h> #include <bsp.h> -#include <clockdrv.h> +#include <rtems/libio.h> #include <z8036.h> #define MICRVAL 0xe2 /* disable lower chain, no vec */ @@ -35,31 +34,43 @@ #define T1CSRVAL 0xc6 /* enable interrupt, allow and */ /* and trigger countdown */ +#define TIMER 0xfffb0000 +#define RELOAD 0x24 /* clr IP & IUS,allow countdown */ + +#define CLOCK_VECTOR 66 + rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ -volatile rtems_unsigned32 Clock_driver_ticks; - /* ticks since initialization */ + +volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */ + rtems_isr_entry Old_ticker; -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval -) -{ - Install_clock( Clock_isr ); -} +void Clock_exit( void ); -void ReInstall_clock( - rtems_isr_entry clock_isr +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; + +/* + * ISR Handler + */ + +rtems_isr Clock_isr( + rtems_vector_number vector ) { - rtems_unsigned32 isrlevel; + Clock_driver_ticks += 1; + ((volatile struct z8036_map *) TIMER)->CT1_CMD_STATUS = RELOAD; - rtems_interrupt_disable( isrlevel ); - (void) set_vector( clock_isr, 66, 1 ); - rtems_interrupt_enable( isrlevel ); + if ( Clock_isrs == 1 ) { + rtems_clock_tick(); + Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; + } + else + Clock_isrs -= 1; } void Install_clock( @@ -72,30 +83,42 @@ void Install_clock( Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; if ( BSP_Configuration.ticks_per_timeslice ) { - Old_ticker = (rtems_isr_entry) set_vector( clock_isr, 66, 1 ); + Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 ); timer = (struct z8036_map *) 0xfffb0000; timer->MASTER_INTR = MICRVAL; timer->CT1_MODE_SPEC = T1MSRVAL; - *((rtems_unsigned16 *)0xfffb0016) = MS_COUNT; /* write countdown value */ -/* - timer->CT1_TIME_CONST_MSB = (MS_COUNT >> 8); - timer->CT1_TIME_CONST_LSB = (MS_COUNT & 0xff); -*/ + *((rtems_unsigned16 *)0xfffb0016) = MS_COUNT; /* write countdown value */ + + /* + * timer->CT1_TIME_CONST_MSB = (MS_COUNT >> 8); + * timer->CT1_TIME_CONST_LSB = (MS_COUNT & 0xff); + */ + timer->MASTER_CFG = MCCRVAL; timer->CT1_CMD_STATUS = T1CSRVAL; -/* - * Enable interrupt via VME interrupt mask register - */ + /* + * Enable interrupt via VME interrupt mask register + */ (*(rtems_unsigned8 *)0xfffb0038) &= 0xfd; - atexit( Clock_exit ); } } +void ReInstall_clock( + rtems_isr_entry clock_isr +) +{ + rtems_unsigned32 isrlevel; + + rtems_interrupt_disable( isrlevel ); + (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); +} + void Clock_exit( void ) { volatile struct z8036_map *timer; @@ -109,3 +132,51 @@ void Clock_exit( void ) /* do not restore old vector */ } } + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} + diff --git a/c/src/lib/libbsp/m68k/mvme136/console/console.c b/c/src/lib/libbsp/m68k/mvme136/console/console.c index 6bfcf84481..e619fc1428 100644 --- a/c/src/lib/libbsp/m68k/mvme136/console/console.c +++ b/c/src/lib/libbsp/m68k/mvme136/console/console.c @@ -14,9 +14,8 @@ #define M136_INIT -#include <rtems.h> -#include "console.h" -#include "bsp.h" +#include <bsp.h> +#include <rtems/libio.h> /* console_initialize * @@ -32,14 +31,24 @@ rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { + rtems_status_code status; + _Write_m681 = ( struct w_m681_info * ) M681ADDR; _Read_m681 = ( struct r_m681_info * ) M681ADDR; - *status = RTEMS_SUCCESSFUL; + + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; } @@ -112,48 +121,102 @@ void outbyte( } /* - * __read -- read bytes from the serial port. Ignore fd, since - * we only have stdin. + * Open entry point */ -int __read( - int fd, - char *buf, - int nbytes +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ - for (i = 0; i < nbytes; i++) { - *(buf + i) = inbyte(); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } /* - * __write -- write bytes to the serial port. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ -int __write( - int fd, - char *buf, - int nbytes +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r'); + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r'); } - outbyte (*(buf + i)); + outbyte( buffer[ count ] ); } - return (nbytes); + return maximum; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } diff --git a/c/src/lib/libbsp/m68k/mvme136/include/bsp.h b/c/src/lib/libbsp/m68k/mvme136/include/bsp.h index 939a09d41e..85d899ee7c 100644 --- a/c/src/lib/libbsp/m68k/mvme136/include/bsp.h +++ b/c/src/lib/libbsp/m68k/mvme136/include/bsp.h @@ -21,6 +21,8 @@ extern "C" { #endif #include <rtems.h> +#include <clockdrv.h> +#include <console.h> #include <iosupp.h> /* @@ -124,6 +126,24 @@ EXTERN volatile struct w_m681_info *_Write_m681; /* M68681 write registers */ extern m68k_isr_entry M68Kvec[]; /* vector table address */ +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* functions */ void bsp_cleanup( void ); diff --git a/c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c b/c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c index 916b495520..5f822855e8 100644 --- a/c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c +++ b/c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c @@ -20,12 +20,18 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> +#include <rtems/libio.h> + #include <libcsupport.h> #include <z8036.h> -#include "stackchk.h" +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON +#include <stackchk.h> +#endif /* * The original table from the application and our copy of it with @@ -37,6 +43,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -46,6 +54,10 @@ void bsp_libc_init() extern int end; rtems_unsigned32 heap_start; +#ifdef RTEMS_DEBUG + rtems_debug_enable( RTEMS_DEBUG_ALL_MASK ); +#endif + heap_start = (rtems_unsigned32) &end; if (heap_start & (CPU_ALIGNMENT-1)) heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1); @@ -53,6 +65,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -70,7 +90,34 @@ void bsp_libc_init() #endif } -int bsp_start( +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} + + +int main( int argc, char **argv, char **environp @@ -79,6 +126,11 @@ int bsp_start( m68k_isr_entry *monitors_vector_table; int index; + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + monitors_vector_table = (m68k_isr_entry *)0; /* 135Bug Vectors are at 0 */ m68k_set_vbr( monitors_vector_table ); @@ -104,7 +156,7 @@ int bsp_start( Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ @@ -147,6 +199,12 @@ int bsp_start( BSP_Configuration.maximum_extensions++; #endif + /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + rtems_initialize_executive( &BSP_Configuration, &Cpu_table ); /* does not return */ diff --git a/c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c b/c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c index 4118b4d360..df0a13d52f 100644 --- a/c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c +++ b/c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c @@ -27,9 +27,8 @@ #include <stdlib.h> -#include <rtems.h> #include <bsp.h> -#include <clockdrv.h> +#include <rtems/libio.h> #define MS_COUNT 1000 /* T2's countdown constant (1 ms) */ #define CLOCK_INT_LEVEL 6 /* T2's interrupt level */ @@ -38,24 +37,33 @@ rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */ rtems_isr_entry Old_ticker; -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval -) -{ - Install_clock( Clock_isr ); -} +void Clock_exit( void ); + +#define CLOCK_VECTOR (VBR0 * 0x10 + 0x9) +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; + -void ReInstall_clock(rtems_isr_entry clock_isr) +/* + * ISR Handler + */ + +rtems_isr Clock_isr(rtems_vector_number vector) { - rtems_unsigned32 isrlevel; + Clock_driver_ticks += 1; + lcsr->timer_cnt_2 = 0; /* clear counter */ + lcsr->intr_clear |= 0x02000000; - rtems_interrupt_disable( isrlevel ); - (void) set_vector( clock_isr, VBR0 * 0x10 + 0x9, 1 ); - rtems_interrupt_enable( isrlevel ); + if ( Clock_isrs == 1 ) { + rtems_clock_tick(); + Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000; + } + else + Clock_isrs -= 1; } void Install_clock(rtems_isr_entry clock_isr ) @@ -66,7 +74,7 @@ void Install_clock(rtems_isr_entry clock_isr ) if ( BSP_Configuration.ticks_per_timeslice ) { Old_ticker = - (rtems_isr_entry) set_vector( clock_isr, VBR0 * 0x10 + 0x9, 1 ); + (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 ); lcsr->vector_base |= MASK_INT; /* unmask VMEchip2 interrupts */ lcsr->to_ctl = 0xE7; /* prescaler to 1 MHz (see Appendix A1) */ lcsr->timer_cmp_2 = MS_COUNT; @@ -79,10 +87,66 @@ void Install_clock(rtems_isr_entry clock_isr ) atexit( Clock_exit ); } +} +void ReInstall_clock(rtems_isr_entry clock_isr) +{ + rtems_unsigned32 isrlevel; + + rtems_interrupt_disable( isrlevel ); + (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); } void Clock_exit( void ) { /* Dummy for now. See other m68k BSP's for code examples */ } + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} + diff --git a/c/src/lib/libbsp/m68k/mvme162/console/console.c b/c/src/lib/libbsp/m68k/mvme162/console/console.c index 0892f5f200..72595f3bce 100644 --- a/c/src/lib/libbsp/m68k/mvme162/console/console.c +++ b/c/src/lib/libbsp/m68k/mvme162/console/console.c @@ -21,10 +21,9 @@ #define M162_INIT -#include <rtems.h> -#include "console.h" -#include "bsp.h" -#include "ringbuf.h" +#include <bsp.h> +#include <rtems/libio.h> +#include <ringbuf.h> Ring_buffer_t Buffer[2]; @@ -54,12 +53,11 @@ rtems_isr C_Receive_ISR(rtems_vector_number vector) rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { int i; + rtems_status_code status; /* * Initialise receiver interrupts on both ports @@ -79,7 +77,34 @@ rtems_device_driver console_initialize( mcchip->gen_control = 2; /* MIEN */ mcchip->SCC_int_ctl = 0x13; /* SCC IEN, IPL3 */ - *status = RTEMS_SUCCESSFUL; + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + status = rtems_io_register_name( + "/dev/tty00", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + status = rtems_io_register_name( + "/dev/tty01", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; } /* @@ -100,7 +125,7 @@ rtems_boolean char_ready(int port, char *ch) * Block on char input */ -char char_wait(int port) +char inbyte(int port) { unsigned char tmp_char; @@ -113,7 +138,7 @@ char char_wait(int port) * XON/XOFF flow control. */ -void char_put(int port, char ch) +void outbyte(int port, char ch) { while (1) { if (ZREAD0(port) & TX_BUFFER_EMPTY) break; @@ -122,45 +147,108 @@ void char_put(int port, char ch) } /* - * Map port A (1) to stdin, stdout, and stderr. - * Map everything else to port B (0). + * Open entry point + */ + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. */ -int __read(int fd, char *buf, int nbytes) +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) { - int i, port; + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; - if ( fd <= 2 ) port = 1; - else port = 0; + buffer = rw_args->buffer; + maximum = rw_args->count; - for (i = 0; i < nbytes; i++) { - *(buf + i) = char_wait(port); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; + if ( minor > 1 ) + return RTEMS_INVALID_NUMBER; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte( minor ); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } /* - * Map port A (1) to stdin, stdout, and stderr. - * Map everything else to port B (0). + * write bytes to the serial port. Stdout and stderr are the same. */ -int __write(int fd, char *buf, int nbytes) +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) { - int i, port; - - if ( fd <= 2 ) port = 1; - else port = 0; - - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - char_put (port, '\r'); + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + if ( minor > 1 ) + return RTEMS_INVALID_NUMBER; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r', minor ); } - char_put (port, *(buf + i)); + outbyte( buffer[ count ], minor ); } - return (nbytes); + return maximum; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } diff --git a/c/src/lib/libbsp/m68k/mvme162/include/bsp.h b/c/src/lib/libbsp/m68k/mvme162/include/bsp.h index b11ac753b8..54e74da532 100644 --- a/c/src/lib/libbsp/m68k/mvme162/include/bsp.h +++ b/c/src/lib/libbsp/m68k/mvme162/include/bsp.h @@ -28,6 +28,8 @@ extern "C" { #endif #include <rtems.h> +#include <clockdrv.h> +#include <console.h> #include <iosupp.h> /* @@ -248,6 +250,24 @@ typedef volatile struct gcsr_regs { #define EXTERN extern #endif +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* miscellaneous stuff assumed to exist */ extern rtems_configuration_table BSP_Configuration; diff --git a/c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c b/c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c index efbb89cb67..973a78a9f4 100644 --- a/c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c +++ b/c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c @@ -27,10 +27,17 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> +#include <rtems/libio.h> + #include <libcsupport.h> -#include <z8036.h> + +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON +#include <stackchk.h> +#endif /* * The original table from the application and our copy of it with @@ -42,6 +49,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -58,6 +67,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -75,7 +92,33 @@ void bsp_libc_init() #endif } -int bsp_start( +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} + +int main( int argc, char **argv, char **environp @@ -84,6 +127,11 @@ int bsp_start( m68k_isr_entry *monitors_vector_table; int index; + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + /* * 162Bug Vectors are at 0xFFE00000 */ @@ -121,7 +169,7 @@ int bsp_start( Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */ + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ @@ -161,6 +209,12 @@ int bsp_start( BSP_Configuration.maximum_extensions++; #endif + /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + BSP_Configuration.work_space_start = (void *) (RAM_END - BSP_Configuration.work_space_size); diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c b/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c index e4e695ad82..efe0225520 100644 --- a/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c +++ b/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c @@ -60,28 +60,25 @@ rtems_device_minor_number rtems_clock_minor; rtems_isr_entry Old_ticker; +void Clock_exit( void ); + + /* - * Reinstall_clock - * - * Install a clock tick handler without reprogramming the chip. This - * is used by the polling shared memory device driver. + * Isr Handler */ -void ReInstall_clock( - rtems_isr_entry clock_isr +rtems_isr Clock_isr( + rtems_vector_number vector ) { - rtems_unsigned32 isrlevel = 0; - - /* - * Disable interrupts and install the clock ISR vector using the - * BSP dependent set_vector routine. In the below example, the clock - * ISR is on vector 4 and is an RTEMS interrupt. - */ - - rtems_interrupt_disable( isrlevel ); - (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); - rtems_interrupt_enable( isrlevel ); +/* + * bump the number of clock driver ticks since initialization + * + * determine if it is time to announce the passing of tick as configured + * to RTEMS through the rtems_clock_tick directive + * + * perform any timer dependent tasks + */ } /* @@ -124,6 +121,30 @@ void Install_clock( } /* + * Reinstall_clock + * + * Install a clock tick handler without reprogramming the chip. This + * is used by the polling shared memory device driver. + */ + +void ReInstall_clock( + rtems_isr_entry clock_isr +) +{ + rtems_unsigned32 isrlevel = 0; + + /* + * Disable interrupts and install the clock ISR vector using the + * BSP dependent set_vector routine. In the below example, the clock + * ISR is on vector 4 and is an RTEMS interrupt. + */ + + rtems_interrupt_disable( isrlevel ); + (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); +} + +/* * Clean up before the application exits */ @@ -149,14 +170,15 @@ rtems_device_driver Clock_initialize( void *pargp ) { - Install_clock((rtems_isr_entry) Clock_isr); - + Install_clock( Clock_isr ); + /* * make major/minor avail to others such as shared memory driver */ + rtems_clock_major = major; - rtems_clock_minor = minor; - + rtems_clock_minor = minor; + return RTEMS_SUCCESSFUL; } diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/console/console.c b/c/src/lib/libbsp/no_cpu/no_bsp/console/console.c index c115e256a3..4b1ca4a0e3 100644 --- a/c/src/lib/libbsp/no_cpu/no_bsp/console/console.c +++ b/c/src/lib/libbsp/no_cpu/no_bsp/console/console.c @@ -14,9 +14,8 @@ #define NO_BSP_INIT -#include <rtems.h> -#include "console.h" -#include "bsp.h" +#include <bsp.h> +#include <rtems/libio.h> /* console_initialize * @@ -32,12 +31,21 @@ rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { - *status = RTEMS_SUCCESSFUL; + rtems_status_code status; + + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; } @@ -110,49 +118,104 @@ void outbyte( outbyte( '\r' ); } + +/* + * Open entry point + */ + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + /* - * __read -- read bytes from the serial port. Ignore fd, since - * we only have stdin. + * Close entry point */ -int __read( - int fd, - char *buf, - int nbytes +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ - for (i = 0; i < nbytes; i++) { - *(buf + i) = inbyte(); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } /* - * __write -- write bytes to the serial port. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ -int __write( - int fd, - char *buf, - int nbytes +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; + + rw_args = (rtems_libio_rw_args_t *) arg; - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r'); + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r'); } - outbyte (*(buf + i)); + outbyte( buffer[ count ] ); } - return (nbytes); + return maximum; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h b/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h index 5bb7c62577..fa09cbb5bf 100644 --- a/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h +++ b/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h @@ -23,6 +23,7 @@ extern "C" { #endif #include <rtems.h> +#include <console.h> #include <clockdrv.h> /* @@ -69,19 +70,23 @@ extern "C" { extern rtems_configuration_table BSP_Configuration; /* - * Console driver init + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry */ - -rtems_device_driver console_initialize( - rtems_device_major_number, rtems_device_minor_number minor, void *); - -#define CONSOLE_DRIVER_TABLE_ENTRY \ - { console_initialize, NULL, NULL, NULL, NULL, NULL } /* * NOTE: Use the standard Clock driver entry */ +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* functions */ void bsp_cleanup( void ); diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c b/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c index 4d3d3a7175..75739aa39b 100644 --- a/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c +++ b/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c @@ -20,10 +20,17 @@ * $Id$ */ -#include <rtems.h> #include <bsp.h> -#include <shm.h> +#include <rtems/libio.h> + #include <libcsupport.h> + +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON +#include <stackchk.h> +#endif /* * The original table from the application and our copy of it with @@ -36,6 +43,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -59,6 +68,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -76,12 +93,43 @@ void bsp_libc_init() #endif } -int bsp_start( +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} + +int main( int argc, char **argv, char **environp ) { + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + /* * Allocate the memory for the RTEMS Work Space. This can come from * a variety of places: hard coded address, malloc'ed from outside @@ -118,6 +166,20 @@ int bsp_start( BSP_Configuration.maximum_extensions++; #endif +#ifdef STACK_CHECKER_ON + /* + * Add 1 extension for stack checker + */ + + BSP_Configuration.maximum_extensions++; +#endif + + /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + /* * Need to "allocate" the memory for the RTEMS Workspace and * tell the RTEMS configuration where it is. This memory is @@ -138,7 +200,7 @@ int bsp_start( Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ diff --git a/c/src/lib/libbsp/powerpc/papyrus/include/bsp.h b/c/src/lib/libbsp/powerpc/papyrus/include/bsp.h index a18ca343bd..58abce6d9f 100644 --- a/c/src/lib/libbsp/powerpc/papyrus/include/bsp.h +++ b/c/src/lib/libbsp/powerpc/papyrus/include/bsp.h @@ -43,6 +43,7 @@ extern "C" { #else #include <rtems.h> +#include <console.h> /* * Define the time limits for RTEMS Test Suite test durations. @@ -94,6 +95,24 @@ extern "C" { extern rtems_configuration_table BSP_Configuration; /* owned by BSP */ extern rtems_cpu_table Cpu_table; /* owned by BSP */ +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* functions */ void bsp_start( void ); diff --git a/c/src/lib/libbsp/powerpc/papyrus/startup/bspstart.c b/c/src/lib/libbsp/powerpc/papyrus/startup/bspstart.c index a018c4cbfb..66ead73dae 100644 --- a/c/src/lib/libbsp/powerpc/papyrus/startup/bspstart.c +++ b/c/src/lib/libbsp/powerpc/papyrus/startup/bspstart.c @@ -37,10 +37,17 @@ * bspstart.c,v 1.2 1995/05/31 16:56:29 joel Exp */ -#include <rtems.h> #include <bsp.h> -#include <shm.h> +#include <rtems/libio.h> + #include <libcsupport.h> + +#include <string.h> +#include <fcntl.h> + +#ifdef STACK_CHECKER_ON +#include <stackchk.h> +#endif /* * The original table from the application and our copy of it with @@ -53,6 +60,8 @@ rtems_configuration_table BSP_Configuration; rtems_cpu_table Cpu_table; +char *rtems_progname; + /* Initialize whatever libc we are using * called from postdriver hook */ @@ -76,6 +85,14 @@ void bsp_libc_init() RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0); /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + + /* * Set up for the libc handling. */ @@ -93,8 +110,43 @@ void bsp_libc_init() #endif } -void bsp_start(void) +/* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +} + +int main( + int argc, + char **argv, + char **environp +) { + if ((argc > 0) && argv && argv[0]) + rtems_progname = argv[0]; + else + rtems_progname = "RTEMS"; + /* * Allocate the memory for the RTEMS Work Space. This can come from * a variety of places: hard coded address, malloc'ed from outside @@ -132,6 +184,12 @@ void bsp_start(void) #endif /* + * Tell libio how many fd's we want and allow it to tweak config + */ + + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); + + /* * Need to "allocate" the memory for the RTEMS Workspace and * tell the RTEMS configuration where it is. This memory is * not malloc'ed. It is just "pulled from the air". @@ -154,7 +212,7 @@ void bsp_start(void) Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */ - Cpu_table.postdriver_hook = NULL; + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ diff --git a/c/src/lib/libbsp/shmdr/init.c b/c/src/lib/libbsp/shmdr/init.c index 435bc9dbec..14eddca0aa 100644 --- a/c/src/lib/libbsp/shmdr/init.c +++ b/c/src/lib/libbsp/shmdr/init.c @@ -3,8 +3,7 @@ * This routine is the shared memory communications initerface * driver initialization routine. * - * Input parameters: - * configuration - address of configuration table + * Input parameters: NONE * * Output parameters: NONE * @@ -33,12 +32,8 @@ rtems_extensions_table MPCI_Shm_extensions; -rtems_mpci_entry Shm_Initialization( - rtems_configuration_table *configuration, - rtems_cpu_table *cpu_configuration, - rtems_multiprocessing_table *mp_configuration +rtems_mpci_entry Shm_Initialization( void ) -) { rtems_unsigned32 i, all_initialized; rtems_unsigned32 interrupt_cause, interrupt_value; @@ -46,6 +41,9 @@ rtems_mpci_entry Shm_Initialization( Shm_Node_status_control *nscb; rtems_unsigned32 extension_id; /* for installation of MPCI_Fatal */ rtems_unsigned32 remaining_memory; +/* XXX these should use "public" methods to set their values.... */ + rtems_configuration_table *configuration = _Configuration_Table; + rtems_multiprocessing_table *mp_configuration = _Configuration_MP_table; Shm_RTEMS_Configuration = configuration; Shm_RTEMS_MP_Configuration = mp_configuration; diff --git a/c/src/lib/libbsp/shmdr/mpci.h b/c/src/lib/libbsp/shmdr/mpci.h index 11638f8cc7..c5646a61d7 100644 --- a/c/src/lib/libbsp/shmdr/mpci.h +++ b/c/src/lib/libbsp/shmdr/mpci.h @@ -15,8 +15,8 @@ * $Id$ */ -#ifndef __MPCI_h -#define __MPCI_h +#ifndef __SHM_MPCI_h +#define __SHM_MPCI_h #ifdef __cplusplus extern "C" { diff --git a/c/src/lib/libbsp/shmdr/shm.h b/c/src/lib/libbsp/shmdr/shm.h index 2122873912..5ccb0aab6b 100644 --- a/c/src/lib/libbsp/shmdr/shm.h +++ b/c/src/lib/libbsp/shmdr/shm.h @@ -493,11 +493,7 @@ rtems_mpci_entry Shm_Get_packet( rtems_packet_prefix ** ); -rtems_mpci_entry Shm_Initialization( - rtems_configuration_table *configuration, - rtems_cpu_table *cpu_configuration, - rtems_multiprocessing_table *mp_configuration -); +rtems_mpci_entry Shm_Initialization( void ); rtems_mpci_entry Shm_Receive_packet( rtems_packet_prefix ** diff --git a/c/src/lib/libbsp/shmdr/shm_driver.h b/c/src/lib/libbsp/shmdr/shm_driver.h index 2122873912..5ccb0aab6b 100644 --- a/c/src/lib/libbsp/shmdr/shm_driver.h +++ b/c/src/lib/libbsp/shmdr/shm_driver.h @@ -493,11 +493,7 @@ rtems_mpci_entry Shm_Get_packet( rtems_packet_prefix ** ); -rtems_mpci_entry Shm_Initialization( - rtems_configuration_table *configuration, - rtems_cpu_table *cpu_configuration, - rtems_multiprocessing_table *mp_configuration -); +rtems_mpci_entry Shm_Initialization( void ); rtems_mpci_entry Shm_Receive_packet( rtems_packet_prefix ** diff --git a/c/src/lib/libbsp/unix/posix/console/console.c b/c/src/lib/libbsp/unix/posix/console/console.c index 07cb033958..61bbe08c78 100644 --- a/c/src/lib/libbsp/unix/posix/console/console.c +++ b/c/src/lib/libbsp/unix/posix/console/console.c @@ -3,6 +3,8 @@ * * These provide UNIX-like read and write calls for the C library. * + * NOTE: For the most part, this is just a space holder. + * * COPYRIGHT (c) 1994 by Division Incorporated * * To anyone who acknowledges that this file is provided "AS IS" @@ -31,6 +33,71 @@ console_initialize(rtems_device_major_number major, void * arg ) { - return RTEMS_SUCCESSFUL; + return 0; +} + + +/* + * Open entry point + */ + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_UNSATISFIED; +} + +/* + * write bytes to the serial port. Stdout and stderr are the same. + */ + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return -1; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/lib/libbsp/unix/posix/include/bsp.h b/c/src/lib/libbsp/unix/posix/include/bsp.h index 3bf43ca0c8..6ebec41276 100644 --- a/c/src/lib/libbsp/unix/posix/include/bsp.h +++ b/c/src/lib/libbsp/unix/posix/include/bsp.h @@ -22,6 +22,7 @@ extern "C" { #include <rtems.h> #include <clockdrv.h> +#include <console.h> #include <iosupp.h> #include <libcsupport.h> #include <signal.h> @@ -80,19 +81,23 @@ extern rtems_configuration_table BSP_Configuration; /* #define INTERRUPT_EXTERNAL_MPCI SIGUSR1 */ /* - * Console driver init + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry */ - -rtems_device_driver console_initialize( - rtems_device_major_number, rtems_device_minor_number minor, void *); - -#define CONSOLE_DRIVER_TABLE_ENTRY \ - { console_initialize, NULL, NULL, NULL, NULL, NULL } /* * NOTE: Use the standard Clock driver entry */ +/* + * How many libio files we want + */ + +#define BSP_LIBIO_MAX_FDS 20 + /* functions */ rtems_isr_entry set_vector(rtems_isr_entry, rtems_vector_number, int); diff --git a/c/src/lib/libbsp/unix/posix/startup/bspstart.c b/c/src/lib/libbsp/unix/posix/startup/bspstart.c index d4279c5818..ed687f7319 100644 --- a/c/src/lib/libbsp/unix/posix/startup/bspstart.c +++ b/c/src/lib/libbsp/unix/posix/startup/bspstart.c @@ -37,6 +37,8 @@ #include <bsp.h> #include <libcsupport.h> +#include <rtems/libio.h> + #ifdef STACK_CHECKER_ON #include <stackchk.h> #endif @@ -112,6 +114,14 @@ bsp_libc_init(void) RTEMS_Malloc_Initialize((void *)heap_start, Heap_size, 1024 * 1024); + /* + * Init the RTEMS libio facility to provide UNIX-like system + * calls for use by newlib (ie: provide __open, __close, etc) + * Uses malloc() to get area for the iops, so must be after malloc init + */ + + rtems_libio_init(); + libc_init(1); } @@ -162,6 +172,34 @@ bsp_pretasking_hook(void) } /* + * After drivers are setup, register some "filenames" + * and open stdin, stdout, stderr files + * + * Newlib will automatically associate the files with these + * (it hardcodes the numbers) + */ + +void +bsp_postdriver_hook(void) +{ +#if 0 + int stdin_fd, stdout_fd, stderr_fd; + + if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1) + rtems_fatal_error_occurred('STD0'); + + if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD1'); + + if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1) + rtems_fatal_error_occurred('STD2'); + + if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2)) + rtems_fatal_error_occurred('STIO'); +#endif +} + +/* * Function: bsp_start * Created: 94/12/6 * @@ -261,7 +299,7 @@ bsp_start(void) Cpu_table.predriver_hook = NULL; - Cpu_table.postdriver_hook = NULL; + Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.idle_task = NULL; /* do not override system IDLE task */ @@ -301,22 +339,28 @@ bsp_start(void) BSP_Configuration.maximum_extensions++; #endif - /* - * Add 1 extension for MPCI_fatal - */ + /* + * Tell libio how many fd's we want and allow it to tweak config + */ - if (BSP_Configuration.User_multiprocessing_table) - BSP_Configuration.maximum_extensions++; + rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS); - CPU_CLICKS_PER_TICK = 1; + /* + * Add 1 extension for MPCI_fatal + */ - /* - * Start most of RTEMS - * main() will start the rest - */ + if (BSP_Configuration.User_multiprocessing_table) + BSP_Configuration.maximum_extensions++; + + CPU_CLICKS_PER_TICK = 1; + + /* + * Start most of RTEMS + * main() will start the rest + */ - bsp_isr_level = rtems_initialize_executive_early( - &BSP_Configuration, - &Cpu_table - ); + bsp_isr_level = rtems_initialize_executive_early( + &BSP_Configuration, + &Cpu_table + ); } diff --git a/c/src/lib/libc/error.c b/c/src/lib/libc/error.c index 8cf46f0565..cfe1858e08 100644 --- a/c/src/lib/libc/error.c +++ b/c/src/lib/libc/error.c @@ -91,8 +91,8 @@ rtems_assoc_t rtems_status_assoc[] = { { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , }, { "directive not implemented", RTEMS_NOT_IMPLEMENTED, }, { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, }, - { "internal multiprocessing only", RTEMS_PROXY_BLOCKING, }, { "could not get enough memory", RTEMS_NO_MEMORY, }, + { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, }, { 0, 0, 0 }, }; @@ -134,7 +134,7 @@ static int rtems_verror( if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ local_errno = errno; - if (_Configuration_Is_multiprocessing()) + if (_System_state_Is_multiprocessing) fprintf(stderr, "[%d] ", _Configuration_MP_table->node); if (rtems_progname && *rtems_progname) diff --git a/c/src/lib/libc/libio.c b/c/src/lib/libc/libio.c index f2046501ce..38e0f83bac 100644 --- a/c/src/lib/libc/libio.c +++ b/c/src/lib/libc/libio.c @@ -14,8 +14,11 @@ #include <rtems/assoc.h> /* assoc.h not included by rtems.h */ #include <fcntl.h> /* O_RDONLY, et.al. */ +#include <sys/fcntl.h> /* O_RDONLY, et.al. */ #if defined(solaris2) #define O_NDELAY O_NONBLOCK +#elif defined(RTEMS_NEWLIB) +#define O_NDELAY _FNBIO #endif #include <errno.h> #include <string.h> /* strcmp */ diff --git a/c/src/lib/libc/newlibc.c b/c/src/lib/libc/newlibc.c index 4493b473da..e041668375 100644 --- a/c/src/lib/libc/newlibc.c +++ b/c/src/lib/libc/newlibc.c @@ -80,11 +80,12 @@ libc_wrapup(void) } -rtems_extension +rtems_boolean libc_create_hook(rtems_tcb *current_task, rtems_tcb *creating_task) { MY_task_set_note(creating_task, LIBC_NOTEPAD, 0); + return TRUE; } /* @@ -231,10 +232,10 @@ libc_init(int reentrant) { memset(&libc_extension, 0, sizeof(libc_extension)); - libc_extension.rtems_task_create = libc_create_hook; - libc_extension.rtems_task_start = libc_start_hook; - libc_extension.task_switch = libc_switch_hook; - libc_extension.rtems_task_delete = libc_delete_hook; + libc_extension.thread_create = libc_create_hook; + libc_extension.thread_start = libc_start_hook; + libc_extension.thread_switch = libc_switch_hook; + libc_extension.thread_delete = libc_delete_hook; rc = rtems_extension_create(rtems_build_name('L', 'I', 'B', 'C'), &libc_extension, &extension_id); diff --git a/c/src/lib/libc/support.c b/c/src/lib/libc/support.c index c4e207df0a..13a2d0c2a5 100644 --- a/c/src/lib/libc/support.c +++ b/c/src/lib/libc/support.c @@ -13,8 +13,7 @@ * */ -#include <rtems/system.h> -#include <rtems/thread.h> +#include <rtems.h> void MY_task_set_note( Thread_Control *the_thread, @@ -22,7 +21,11 @@ void MY_task_set_note( unsigned32 note ) { - the_thread->RTEMS_API->Notepads[ notepad ] = note; + RTEMS_API_Control *api; + + api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; + + api->Notepads[ notepad ] = note; } @@ -31,7 +34,11 @@ unsigned32 MY_task_get_note( unsigned32 notepad ) { - return the_thread->RTEMS_API->Notepads[ notepad ]; + RTEMS_API_Control *api; + + api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; + + return api->Notepads[ notepad ]; } void *MY_CPU_Context_FP_start( diff --git a/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c b/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c index fc17de4cc8..b577f80f1a 100644 --- a/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c +++ b/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c @@ -33,6 +33,7 @@ #include <bsp.h> #include <clockdrv.h> +#include <rtems/libio.h> #include <stdlib.h> /* for atexit() */ @@ -42,39 +43,85 @@ volatile rtems_unsigned32 Clock_driver_ticks; static rtems_unsigned32 pit_value, tick_time; static rtems_boolean auto_restart; -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval -) +void Clock_exit( void ); + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; + +static INLINE rtems_unsigned32 get_itimer(void) { - Install_clock(Clock_isr); -} + register rtems_unsigned32 rc; + asm volatile ("mftblo %0" : "=r" ((rc))); -void -ReInstall_clock(rtems_isr_entry new_clock_isr) + return rc; +} + +/* + * ISR Handler + */ + +rtems_isr +Clock_isr(rtems_vector_number vector) { - rtems_isr_entry previous_isr; - rtems_unsigned32 isrlevel = 0; + if (!auto_restart) + { + rtems_unsigned32 clicks_til_next_interrupt; + rtems_unsigned32 itimer_value; - rtems_interrupt_disable(isrlevel); - - rtems_interrupt_catch(new_clock_isr, PPC_IRQ_PIT, - &previous_isr); + /* + * setup for next interrupt; making sure the new value is reasonably + * in the future.... in case we lost out on an interrupt somehow + */ - rtems_interrupt_enable(isrlevel); -} + itimer_value = get_itimer(); + tick_time += pit_value; -static INLINE rtems_unsigned32 get_itimer(void) -{ - register rtems_unsigned32 rc; + /* + * how far away is next interrupt *really* + * It may be a long time; this subtraction works even if + * Clock_clicks_interrupt < Clock_clicks_low_order via + * the miracle of unsigned math. + */ + clicks_til_next_interrupt = tick_time - itimer_value; - asm volatile ("mftblo %0" : "=r" ((rc))); + /* + * If it is too soon then bump it up. + * This should only happen if CPU_HPPA_CLICKS_PER_TICK is too small. + * But setting it low is useful for debug, so... + */ - return rc; + if (clicks_til_next_interrupt < 400) + { + tick_time = itimer_value + 1000; + clicks_til_next_interrupt = 1000; + /* XXX: count these! this should be rare */ + } + + /* + * If it is too late, that means we missed the interrupt somehow. + * Rather than wait 35-50s for a wrap, we just fudge it here. + */ + + if (clicks_til_next_interrupt > pit_value) + { + tick_time = itimer_value + 1000; + clicks_til_next_interrupt = 1000; + /* XXX: count these! this should never happen :-) */ + } + + asm volatile ("mtpit %0" :: "r" (clicks_til_next_interrupt)); + } + + asm volatile ( "mttsr %0" :: "r" (0x08000000)); + + Clock_driver_ticks++; + + rtems_clock_tick(); } void Install_clock(rtems_isr_entry clock_isr) @@ -131,66 +178,21 @@ void Install_clock(rtems_isr_entry clock_isr) atexit(Clock_exit); } - -rtems_isr -Clock_isr(rtems_vector_number vector) +void +ReInstall_clock(rtems_isr_entry new_clock_isr) { - if (!auto_restart) - { - rtems_unsigned32 clicks_til_next_interrupt; - rtems_unsigned32 itimer_value; - - /* - * setup for next interrupt; making sure the new value is reasonably - * in the future.... in case we lost out on an interrupt somehow - */ - - itimer_value = get_itimer(); - tick_time += pit_value; - - /* - * how far away is next interrupt *really* - * It may be a long time; this subtraction works even if - * Clock_clicks_interrupt < Clock_clicks_low_order via - * the miracle of unsigned math. - */ - clicks_til_next_interrupt = tick_time - itimer_value; - - /* - * If it is too soon then bump it up. - * This should only happen if CPU_HPPA_CLICKS_PER_TICK is too small. - * But setting it low is useful for debug, so... - */ - - if (clicks_til_next_interrupt < 400) - { - tick_time = itimer_value + 1000; - clicks_til_next_interrupt = 1000; - /* XXX: count these! this should be rare */ - } - - /* - * If it is too late, that means we missed the interrupt somehow. - * Rather than wait 35-50s for a wrap, we just fudge it here. - */ - - if (clicks_til_next_interrupt > pit_value) - { - tick_time = itimer_value + 1000; - clicks_til_next_interrupt = 1000; - /* XXX: count these! this should never happen :-) */ - } - - asm volatile ("mtpit %0" :: "r" (clicks_til_next_interrupt)); - } - - asm volatile ( "mttsr %0" :: "r" (0x08000000)); + rtems_isr_entry previous_isr; + rtems_unsigned32 isrlevel = 0; - Clock_driver_ticks++; + rtems_interrupt_disable(isrlevel); + + rtems_interrupt_catch(new_clock_isr, PPC_IRQ_PIT, + &previous_isr); - rtems_clock_tick(); + rtems_interrupt_enable(isrlevel); } + /* * Called via atexit() * Remove the clock interrupt handler by setting handler to NULL @@ -213,3 +215,50 @@ Clock_exit(void) } } +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(PPC_IRQ_PIT); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} + diff --git a/c/src/lib/libcpu/powerpc/ppc403/console/console.c b/c/src/lib/libcpu/powerpc/ppc403/console/console.c index 6a451bb7ec..d7a7bb9bc1 100644 --- a/c/src/lib/libcpu/powerpc/ppc403/console/console.c +++ b/c/src/lib/libcpu/powerpc/ppc403/console/console.c @@ -31,9 +31,8 @@ #define NO_BSP_INIT -#include <rtems.h> -#include "console.h" -#include "bsp.h" +#include <bsp.h> +#include <rtems/libio.h> extern rtems_cpu_table Cpu_table; /* owned by BSP */ @@ -139,11 +138,10 @@ static const pasync port = (pasync)0x40000000; rtems_device_driver console_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *arg, - rtems_id self, - rtems_unsigned32 *status + void *arg ) { + rtems_status_code status; register unsigned tmp; /* Initialise the serial port */ @@ -164,7 +162,16 @@ rtems_device_driver console_initialize( port->SPTC = (TCREnable | TCRIntDisable); port->SPHS = (HSRDsr | HSRCts); - *status = RTEMS_SUCCESSFUL; + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; } @@ -280,48 +287,103 @@ void outbyte( } /* - * __read -- read bytes from the serial port. Ignore fd, since - * we only have stdin. + * Open entry point */ - -int __read( - int fd, - char *buf, - int nbytes + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i = 0; - - for (i = 0; i < nbytes; i++) { - *(buf + i) = inbyte(); - if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { - (*(buf + i++)) = '\n'; - (*(buf + i)) = 0; + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ + +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + char *buffer; + int maximum; + int count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; break; } } - return (i); + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; } - + /* - * __write -- write bytes to the serial port. Ignore fd, since - * stdout and stderr are the same. Since we have no filesystem, - * open will only return an error. + * write bytes to the serial port. Stdout and stderr are the same. */ - -int __write( - int fd, - char *buf, - int nbytes + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) { - int i; - - for (i = 0; i < nbytes; i++) { - if (*(buf + i) == '\n') { - outbyte ('\r'); + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + char *buffer; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte('\r'); } - outbyte (*(buf + i)); + outbyte( buffer[ count ] ); } - return (nbytes); + return maximum; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; } + diff --git a/c/src/lib/libmisc/error/error.c b/c/src/lib/libmisc/error/error.c index 8cf46f0565..cfe1858e08 100644 --- a/c/src/lib/libmisc/error/error.c +++ b/c/src/lib/libmisc/error/error.c @@ -91,8 +91,8 @@ rtems_assoc_t rtems_status_assoc[] = { { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , }, { "directive not implemented", RTEMS_NOT_IMPLEMENTED, }, { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, }, - { "internal multiprocessing only", RTEMS_PROXY_BLOCKING, }, { "could not get enough memory", RTEMS_NO_MEMORY, }, + { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, }, { 0, 0, 0 }, }; @@ -134,7 +134,7 @@ static int rtems_verror( if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ local_errno = errno; - if (_Configuration_Is_multiprocessing()) + if (_System_state_Is_multiprocessing) fprintf(stderr, "[%d] ", _Configuration_MP_table->node); if (rtems_progname && *rtems_progname) diff --git a/c/src/lib/libmisc/monitor/mon-dname.c b/c/src/lib/libmisc/monitor/mon-dname.c index fd10f3e333..b9907eb42b 100644 --- a/c/src/lib/libmisc/monitor/mon-dname.c +++ b/c/src/lib/libmisc/monitor/mon-dname.c @@ -57,7 +57,8 @@ rtems_monitor_dname_next( rtems_driver_name_t *table = object_information; rtems_driver_name_t *np = 0; - for (np = table + n ; n<RTEMS_MAX_DRIVER_NAMES; n++, np++) +/* XXX should we be using _IO_Number_of_devices */ + for (np = table + n ; n<_IO_Number_of_devices; n++, np++) if (np->device_name) goto done; diff --git a/c/src/lib/libmisc/monitor/mon-extension.c b/c/src/lib/libmisc/monitor/mon-extension.c index 48dfb96a2d..230fab9ddf 100644 --- a/c/src/lib/libmisc/monitor/mon-extension.c +++ b/c/src/lib/libmisc/monitor/mon-extension.c @@ -22,20 +22,20 @@ rtems_monitor_extension_canonical( rtems_extensions_table *e = &rtems_extension->Extension.Callouts; rtems_monitor_symbol_canonical_by_value(&canonical_extension->create, - e->rtems_task_create); + e->thread_create); rtems_monitor_symbol_canonical_by_value(&canonical_extension->start, - e->rtems_task_start); + e->thread_start); rtems_monitor_symbol_canonical_by_value(&canonical_extension->restart, - e->rtems_task_restart); + e->thread_restart); rtems_monitor_symbol_canonical_by_value(&canonical_extension->delete, - e->rtems_task_delete); + e->thread_delete); rtems_monitor_symbol_canonical_by_value(&canonical_extension->tswitch, - e->task_switch); + e->thread_switch); rtems_monitor_symbol_canonical_by_value(&canonical_extension->begin, - e->task_begin); + e->thread_begin); rtems_monitor_symbol_canonical_by_value(&canonical_extension->exitted, - e->task_exitted); + e->thread_exitted); rtems_monitor_symbol_canonical_by_value(&canonical_extension->fatal, e->fatal); } diff --git a/c/src/lib/libmisc/monitor/mon-object.c b/c/src/lib/libmisc/monitor/mon-object.c index 619ae5cf79..2f92845586 100644 --- a/c/src/lib/libmisc/monitor/mon-object.c +++ b/c/src/lib/libmisc/monitor/mon-object.c @@ -92,7 +92,10 @@ rtems_monitor_object_info_t rtems_monitor_object_info[] = (rtems_monitor_object_dump_fn) rtems_monitor_driver_dump, }, { RTEMS_OBJECT_DNAME, - (void *) &rtems_driver_name_table[0], + /* XXX now that the driver name table is allocated from the */ + /* XXX Workspace, this does not work */ + (void *) 0, + /* (void *) _IO_Driver_name_table, */ sizeof(rtems_monitor_dname_t), (rtems_monitor_object_next_fn) rtems_monitor_dname_next, (rtems_monitor_object_canonical_fn) rtems_monitor_dname_canonical, diff --git a/c/src/lib/libmisc/monitor/mon-server.c b/c/src/lib/libmisc/monitor/mon-server.c index e3e2da5069..5ff5688c9c 100644 --- a/c/src/lib/libmisc/monitor/mon-server.c +++ b/c/src/lib/libmisc/monitor/mon-server.c @@ -219,7 +219,7 @@ rtems_monitor_server_init( { rtems_status_code status; - if (_Configuration_Is_multiprocessing() && + if (_System_state_Is_multiprocessing && (_Configuration_MP_table->maximum_nodes > 1)) { unsigned32 maximum_nodes = _Configuration_MP_table->maximum_nodes; diff --git a/c/src/lib/libmisc/monitor/mon-task.c b/c/src/lib/libmisc/monitor/mon-task.c index 1f4dee7dee..95b650d429 100644 --- a/c/src/lib/libmisc/monitor/mon-task.c +++ b/c/src/lib/libmisc/monitor/mon-task.c @@ -19,6 +19,9 @@ rtems_monitor_task_canonical( ) { Thread_Control *rtems_thread = (Thread_Control *) thread_void; + RTEMS_API_Control *api; + + api = rtems_thread->API_Extensions[ THREAD_API_RTEMS ]; canonical_task->entry = rtems_thread->Start.entry_point; canonical_task->argument = rtems_thread->Start.numeric_argument; @@ -27,11 +30,18 @@ rtems_monitor_task_canonical( canonical_task->priority = rtems_thread->current_priority; canonical_task->state = rtems_thread->current_state; canonical_task->wait_id = rtems_thread->Wait.id; - canonical_task->events = rtems_thread->RTEMS_API->pending_events; - canonical_task->modes = rtems_thread->current_modes; - canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->RTEMS_API->attribute_set */; - (void) memcpy(canonical_task->notepad, rtems_thread->RTEMS_API->Notepads, sizeof(canonical_task->notepad)); + canonical_task->events = api->pending_events; + +/* XXX modes and attributes only exist in the RTEMS API .. */ +/* XXX not directly in the core thread.. they will have to be derived */ +/* XXX if they are important enough to include anymore. */ + canonical_task->modes = 0; /* XXX FIX ME.... rtems_thread->current_modes; */ + canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->API_Extensions[ THREAD_API_RTEMS ]->attribute_set */; + (void) memcpy(canonical_task->notepad, api ->Notepads, sizeof(canonical_task->notepad)); +/* XXX more to fix */ +/* (void) memcpy(&canonical_task->wait_args, &rtems_thread->Wait.Extra, sizeof(canonical_task->wait_args)); +*/ } diff --git a/c/src/lib/libmisc/stackchk/check.c b/c/src/lib/libmisc/stackchk/check.c index f9f32c5204..c2ee9a0a10 100644 --- a/c/src/lib/libmisc/stackchk/check.c +++ b/c/src/lib/libmisc/stackchk/check.c @@ -18,18 +18,9 @@ * */ -#include <rtems/system.h> -#include <rtems/extension.h> -#include <rtems/fatal.h> -#include <rtems/heap.h> -#include <rtems/stack.h> -#include <rtems/thread.h> -#ifdef XXX_RTEMS_H_FIXED -#include <bsp.h> -#else -#include <rtems/config.h> +#include <rtems.h> + extern rtems_configuration_table BSP_Configuration; -#endif #include <assert.h> #include <stdio.h> @@ -56,6 +47,7 @@ rtems_extensions_table Stack_check_Extension_table = { 0, /* rtems_task_restart */ 0, /* rtems_task_delete */ Stack_check_Switch_extension, /* task_switch */ + 0, /* task_post_switch */ Stack_check_Begin_extension, /* task_begin */ 0, /* task_exitted */ Stack_check_Fatal_extension, /* fatal */ @@ -133,9 +125,13 @@ unsigned32 stack_check_initialized = 0; void Stack_check_Initialize( void ) { - rtems_status_code status; - Objects_Id id_ignored; - unsigned32 *p; + rtems_status_code status; + Objects_Id id_ignored; + unsigned32 *p; + unsigned32 i; + unsigned32 class_index; + Thread_Control *the_thread; + Objects_Information *information; if (stack_check_initialized) return; @@ -171,10 +167,31 @@ void Stack_check_Initialize( void ) * So pretend here that we actually ran create and begin extensions. */ + /* XXX + * + * Technically this has not been done for any task created before this + * happened. So just run through them and fix the situation. + */ +#if 0 if (_Thread_Executing) { Stack_check_Create_extension(_Thread_Executing, _Thread_Executing); } +#endif + +#if 0 + for ( class_index = OBJECTS_CLASSES_FIRST ; + class_index <= OBJECTS_CLASSES_LAST ; + class_index++ ) { + information = _Objects_Information_table[ class_index ]; + if ( information && information->is_thread ) { + for ( i=1 ; i <= information->maximum ; i++ ) { + the_thread = (Thread_Control *)information->local_table[ i ]; + Stack_check_Create_extension( the_thread, the_thread ); + } + } + } +#endif /* * If appropriate, setup the interrupt stack for high water testing @@ -197,13 +214,15 @@ void Stack_check_Initialize( void ) * Stack_check_Create_extension */ -void Stack_check_Create_extension( +boolean Stack_check_Create_extension( Thread_Control *running, Thread_Control *the_thread ) { - if (the_thread && (the_thread != _Thread_Executing)) + if (the_thread /* XXX && (the_thread != _Thread_Executing) */ ) stack_check_dope_stack(&the_thread->Start.Initial_stack); + + return TRUE; } /*PAGE diff --git a/c/src/lib/libmisc/stackchk/internal.h b/c/src/lib/libmisc/stackchk/internal.h index 19c9f5e267..7cecbd6e1a 100644 --- a/c/src/lib/libmisc/stackchk/internal.h +++ b/c/src/lib/libmisc/stackchk/internal.h @@ -50,7 +50,7 @@ typedef struct { * Stack_check_Create_extension */ -void Stack_check_Create_extension( +boolean Stack_check_Create_extension( Thread_Control *running, Thread_Control *the_thread ); diff --git a/c/src/lib/start/i960/start.s b/c/src/lib/start/i960/start.s index 8db45011b1..f9287d2641 100644 --- a/c/src/lib/start/i960/start.s +++ b/c/src/lib/start/i960/start.s @@ -80,7 +80,8 @@ init_frames: */ ldconst 0,g0 ldconst 0,g1 - call _bsp_start + ldconst 0,g2 + call _main ret END_CODE diff --git a/c/src/lib/start/m68k/start.s b/c/src/lib/start/m68k/start.s index 0bbb0a851f..2784b09901 100644 --- a/c/src/lib/start/m68k/start.s +++ b/c/src/lib/start/m68k/start.s @@ -97,7 +97,14 @@ loop: movel #0,a1@+ | to zero out uninitialized movec a0,isp | set interrupt stack #endif - jsr SYM (bsp_start) + + movel #0,a7@- | push environp + movel #0,a7@- | push argv + movel #0,a7@- | push argc + + jsr SYM (main) + addl #12,a7 + #if ( M68K_HAS_SEPARATE_STACKS == 1 ) move.l SYM (initial_isp),a0 movec a0,isp diff --git a/c/src/libchip/shmdr/init.c b/c/src/libchip/shmdr/init.c index 435bc9dbec..14eddca0aa 100644 --- a/c/src/libchip/shmdr/init.c +++ b/c/src/libchip/shmdr/init.c @@ -3,8 +3,7 @@ * This routine is the shared memory communications initerface * driver initialization routine. * - * Input parameters: - * configuration - address of configuration table + * Input parameters: NONE * * Output parameters: NONE * @@ -33,12 +32,8 @@ rtems_extensions_table MPCI_Shm_extensions; -rtems_mpci_entry Shm_Initialization( - rtems_configuration_table *configuration, - rtems_cpu_table *cpu_configuration, - rtems_multiprocessing_table *mp_configuration +rtems_mpci_entry Shm_Initialization( void ) -) { rtems_unsigned32 i, all_initialized; rtems_unsigned32 interrupt_cause, interrupt_value; @@ -46,6 +41,9 @@ rtems_mpci_entry Shm_Initialization( Shm_Node_status_control *nscb; rtems_unsigned32 extension_id; /* for installation of MPCI_Fatal */ rtems_unsigned32 remaining_memory; +/* XXX these should use "public" methods to set their values.... */ + rtems_configuration_table *configuration = _Configuration_Table; + rtems_multiprocessing_table *mp_configuration = _Configuration_MP_table; Shm_RTEMS_Configuration = configuration; Shm_RTEMS_MP_Configuration = mp_configuration; diff --git a/c/src/libchip/shmdr/mpci.h b/c/src/libchip/shmdr/mpci.h index 11638f8cc7..c5646a61d7 100644 --- a/c/src/libchip/shmdr/mpci.h +++ b/c/src/libchip/shmdr/mpci.h @@ -15,8 +15,8 @@ * $Id$ */ -#ifndef __MPCI_h -#define __MPCI_h +#ifndef __SHM_MPCI_h +#define __SHM_MPCI_h #ifdef __cplusplus extern "C" { diff --git a/c/src/libchip/shmdr/shm_driver.h b/c/src/libchip/shmdr/shm_driver.h index 2122873912..5ccb0aab6b 100644 --- a/c/src/libchip/shmdr/shm_driver.h +++ b/c/src/libchip/shmdr/shm_driver.h @@ -493,11 +493,7 @@ rtems_mpci_entry Shm_Get_packet( rtems_packet_prefix ** ); -rtems_mpci_entry Shm_Initialization( - rtems_configuration_table *configuration, - rtems_cpu_table *cpu_configuration, - rtems_multiprocessing_table *mp_configuration -); +rtems_mpci_entry Shm_Initialization( void ); rtems_mpci_entry Shm_Receive_packet( rtems_packet_prefix ** diff --git a/c/src/libmisc/error/error.c b/c/src/libmisc/error/error.c index 8cf46f0565..cfe1858e08 100644 --- a/c/src/libmisc/error/error.c +++ b/c/src/libmisc/error/error.c @@ -91,8 +91,8 @@ rtems_assoc_t rtems_status_assoc[] = { { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , }, { "directive not implemented", RTEMS_NOT_IMPLEMENTED, }, { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, }, - { "internal multiprocessing only", RTEMS_PROXY_BLOCKING, }, { "could not get enough memory", RTEMS_NO_MEMORY, }, + { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, }, { 0, 0, 0 }, }; @@ -134,7 +134,7 @@ static int rtems_verror( if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ local_errno = errno; - if (_Configuration_Is_multiprocessing()) + if (_System_state_Is_multiprocessing) fprintf(stderr, "[%d] ", _Configuration_MP_table->node); if (rtems_progname && *rtems_progname) diff --git a/c/src/libmisc/monitor/mon-dname.c b/c/src/libmisc/monitor/mon-dname.c index fd10f3e333..b9907eb42b 100644 --- a/c/src/libmisc/monitor/mon-dname.c +++ b/c/src/libmisc/monitor/mon-dname.c @@ -57,7 +57,8 @@ rtems_monitor_dname_next( rtems_driver_name_t *table = object_information; rtems_driver_name_t *np = 0; - for (np = table + n ; n<RTEMS_MAX_DRIVER_NAMES; n++, np++) +/* XXX should we be using _IO_Number_of_devices */ + for (np = table + n ; n<_IO_Number_of_devices; n++, np++) if (np->device_name) goto done; diff --git a/c/src/libmisc/monitor/mon-extension.c b/c/src/libmisc/monitor/mon-extension.c index 48dfb96a2d..230fab9ddf 100644 --- a/c/src/libmisc/monitor/mon-extension.c +++ b/c/src/libmisc/monitor/mon-extension.c @@ -22,20 +22,20 @@ rtems_monitor_extension_canonical( rtems_extensions_table *e = &rtems_extension->Extension.Callouts; rtems_monitor_symbol_canonical_by_value(&canonical_extension->create, - e->rtems_task_create); + e->thread_create); rtems_monitor_symbol_canonical_by_value(&canonical_extension->start, - e->rtems_task_start); + e->thread_start); rtems_monitor_symbol_canonical_by_value(&canonical_extension->restart, - e->rtems_task_restart); + e->thread_restart); rtems_monitor_symbol_canonical_by_value(&canonical_extension->delete, - e->rtems_task_delete); + e->thread_delete); rtems_monitor_symbol_canonical_by_value(&canonical_extension->tswitch, - e->task_switch); + e->thread_switch); rtems_monitor_symbol_canonical_by_value(&canonical_extension->begin, - e->task_begin); + e->thread_begin); rtems_monitor_symbol_canonical_by_value(&canonical_extension->exitted, - e->task_exitted); + e->thread_exitted); rtems_monitor_symbol_canonical_by_value(&canonical_extension->fatal, e->fatal); } diff --git a/c/src/libmisc/monitor/mon-object.c b/c/src/libmisc/monitor/mon-object.c index 619ae5cf79..2f92845586 100644 --- a/c/src/libmisc/monitor/mon-object.c +++ b/c/src/libmisc/monitor/mon-object.c @@ -92,7 +92,10 @@ rtems_monitor_object_info_t rtems_monitor_object_info[] = (rtems_monitor_object_dump_fn) rtems_monitor_driver_dump, }, { RTEMS_OBJECT_DNAME, - (void *) &rtems_driver_name_table[0], + /* XXX now that the driver name table is allocated from the */ + /* XXX Workspace, this does not work */ + (void *) 0, + /* (void *) _IO_Driver_name_table, */ sizeof(rtems_monitor_dname_t), (rtems_monitor_object_next_fn) rtems_monitor_dname_next, (rtems_monitor_object_canonical_fn) rtems_monitor_dname_canonical, diff --git a/c/src/libmisc/monitor/mon-server.c b/c/src/libmisc/monitor/mon-server.c index e3e2da5069..5ff5688c9c 100644 --- a/c/src/libmisc/monitor/mon-server.c +++ b/c/src/libmisc/monitor/mon-server.c @@ -219,7 +219,7 @@ rtems_monitor_server_init( { rtems_status_code status; - if (_Configuration_Is_multiprocessing() && + if (_System_state_Is_multiprocessing && (_Configuration_MP_table->maximum_nodes > 1)) { unsigned32 maximum_nodes = _Configuration_MP_table->maximum_nodes; diff --git a/c/src/libmisc/monitor/mon-task.c b/c/src/libmisc/monitor/mon-task.c index 1f4dee7dee..95b650d429 100644 --- a/c/src/libmisc/monitor/mon-task.c +++ b/c/src/libmisc/monitor/mon-task.c @@ -19,6 +19,9 @@ rtems_monitor_task_canonical( ) { Thread_Control *rtems_thread = (Thread_Control *) thread_void; + RTEMS_API_Control *api; + + api = rtems_thread->API_Extensions[ THREAD_API_RTEMS ]; canonical_task->entry = rtems_thread->Start.entry_point; canonical_task->argument = rtems_thread->Start.numeric_argument; @@ -27,11 +30,18 @@ rtems_monitor_task_canonical( canonical_task->priority = rtems_thread->current_priority; canonical_task->state = rtems_thread->current_state; canonical_task->wait_id = rtems_thread->Wait.id; - canonical_task->events = rtems_thread->RTEMS_API->pending_events; - canonical_task->modes = rtems_thread->current_modes; - canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->RTEMS_API->attribute_set */; - (void) memcpy(canonical_task->notepad, rtems_thread->RTEMS_API->Notepads, sizeof(canonical_task->notepad)); + canonical_task->events = api->pending_events; + +/* XXX modes and attributes only exist in the RTEMS API .. */ +/* XXX not directly in the core thread.. they will have to be derived */ +/* XXX if they are important enough to include anymore. */ + canonical_task->modes = 0; /* XXX FIX ME.... rtems_thread->current_modes; */ + canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->API_Extensions[ THREAD_API_RTEMS ]->attribute_set */; + (void) memcpy(canonical_task->notepad, api ->Notepads, sizeof(canonical_task->notepad)); +/* XXX more to fix */ +/* (void) memcpy(&canonical_task->wait_args, &rtems_thread->Wait.Extra, sizeof(canonical_task->wait_args)); +*/ } diff --git a/c/src/libmisc/stackchk/check.c b/c/src/libmisc/stackchk/check.c index f9f32c5204..c2ee9a0a10 100644 --- a/c/src/libmisc/stackchk/check.c +++ b/c/src/libmisc/stackchk/check.c @@ -18,18 +18,9 @@ * */ -#include <rtems/system.h> -#include <rtems/extension.h> -#include <rtems/fatal.h> -#include <rtems/heap.h> -#include <rtems/stack.h> -#include <rtems/thread.h> -#ifdef XXX_RTEMS_H_FIXED -#include <bsp.h> -#else -#include <rtems/config.h> +#include <rtems.h> + extern rtems_configuration_table BSP_Configuration; -#endif #include <assert.h> #include <stdio.h> @@ -56,6 +47,7 @@ rtems_extensions_table Stack_check_Extension_table = { 0, /* rtems_task_restart */ 0, /* rtems_task_delete */ Stack_check_Switch_extension, /* task_switch */ + 0, /* task_post_switch */ Stack_check_Begin_extension, /* task_begin */ 0, /* task_exitted */ Stack_check_Fatal_extension, /* fatal */ @@ -133,9 +125,13 @@ unsigned32 stack_check_initialized = 0; void Stack_check_Initialize( void ) { - rtems_status_code status; - Objects_Id id_ignored; - unsigned32 *p; + rtems_status_code status; + Objects_Id id_ignored; + unsigned32 *p; + unsigned32 i; + unsigned32 class_index; + Thread_Control *the_thread; + Objects_Information *information; if (stack_check_initialized) return; @@ -171,10 +167,31 @@ void Stack_check_Initialize( void ) * So pretend here that we actually ran create and begin extensions. */ + /* XXX + * + * Technically this has not been done for any task created before this + * happened. So just run through them and fix the situation. + */ +#if 0 if (_Thread_Executing) { Stack_check_Create_extension(_Thread_Executing, _Thread_Executing); } +#endif + +#if 0 + for ( class_index = OBJECTS_CLASSES_FIRST ; + class_index <= OBJECTS_CLASSES_LAST ; + class_index++ ) { + information = _Objects_Information_table[ class_index ]; + if ( information && information->is_thread ) { + for ( i=1 ; i <= information->maximum ; i++ ) { + the_thread = (Thread_Control *)information->local_table[ i ]; + Stack_check_Create_extension( the_thread, the_thread ); + } + } + } +#endif /* * If appropriate, setup the interrupt stack for high water testing @@ -197,13 +214,15 @@ void Stack_check_Initialize( void ) * Stack_check_Create_extension */ -void Stack_check_Create_extension( +boolean Stack_check_Create_extension( Thread_Control *running, Thread_Control *the_thread ) { - if (the_thread && (the_thread != _Thread_Executing)) + if (the_thread /* XXX && (the_thread != _Thread_Executing) */ ) stack_check_dope_stack(&the_thread->Start.Initial_stack); + + return TRUE; } /*PAGE diff --git a/c/src/libmisc/stackchk/internal.h b/c/src/libmisc/stackchk/internal.h index 19c9f5e267..7cecbd6e1a 100644 --- a/c/src/libmisc/stackchk/internal.h +++ b/c/src/libmisc/stackchk/internal.h @@ -50,7 +50,7 @@ typedef struct { * Stack_check_Create_extension */ -void Stack_check_Create_extension( +boolean Stack_check_Create_extension( Thread_Control *running, Thread_Control *the_thread ); |