From 8a496e462e37f78fbbd20009f036623f062ccea1 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 23 Sep 1998 13:20:34 +0000 Subject: Patch from Aleksey (Quality Quorum ): 1. Finally fixes raw interrupts for pc386 2. Makes some minor cleanup in console and startup 3. Makes rtems_termios_dequeue_characters() to return count of outstanding chars - it allows to simplify console isrs a little bit. 4. pc386 uart modified to be friendlier to termios parameter changes, to have minor performance improvement and to take advantage of of above termios modification. --- c/src/exec/libcsupport/include/rtems/libio.h | 2 +- c/src/exec/libcsupport/src/termios.c | 12 ++++-- c/src/lib/include/rtems/libio.h | 2 +- c/src/lib/libbsp/i386/pc386/console/console.c | 53 +++++++++++++++++--------- c/src/lib/libbsp/i386/pc386/console/inch.c | 12 ------ c/src/lib/libbsp/i386/pc386/startup/bspstart.c | 14 +------ c/src/lib/libbsp/i386/pc386/startup/exit.c | 5 ++- c/src/lib/libbsp/i386/shared/irq/idt.c | 9 +---- c/src/lib/libbsp/i386/shared/irq/irq_init.c | 18 ++++++--- c/src/lib/libc/libio.h | 2 +- c/src/lib/libc/termios.c | 12 ++++-- c/src/lib/libcpu/i386/cpu.c | 9 +---- c/src/lib/libcpu/i386/idt.c | 9 +---- cpukit/libcsupport/include/rtems/libio.h | 2 +- cpukit/libcsupport/src/termios.c | 12 ++++-- make/target.cfg.in | 1 + 16 files changed, 88 insertions(+), 86 deletions(-) diff --git a/c/src/exec/libcsupport/include/rtems/libio.h b/c/src/exec/libcsupport/include/rtems/libio.h index 3cc87d1d87..dcdda85aec 100644 --- a/c/src/exec/libcsupport/include/rtems/libio.h +++ b/c/src/exec/libcsupport/include/rtems/libio.h @@ -157,7 +157,7 @@ rtems_status_code rtems_termios_read (void *arg); rtems_status_code rtems_termios_write (void *arg); rtems_status_code rtems_termios_ioctl (void *arg); int rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len); -void rtems_termios_dequeue_characters (void *ttyp, int len); +int rtems_termios_dequeue_characters (void *ttyp, int len); void rtems_termios_reserve_resources( rtems_configuration_table *configuration, rtems_unsigned32 number_of_devices diff --git a/c/src/exec/libcsupport/src/termios.c b/c/src/exec/libcsupport/src/termios.c index f3637d37e3..c2a43c7707 100644 --- a/c/src/exec/libcsupport/src/termios.c +++ b/c/src/exec/libcsupport/src/termios.c @@ -894,9 +894,10 @@ rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len) * device transmit interrupt handler. * The second argument is the number of characters transmitted so far. * This value will always be 1 for devices which generate an interrupt - * for each transmitted character. + * for each transmitted character. + * It returns number of characters left to transmit */ -void +int rtems_termios_dequeue_characters (void *ttyp, int len) { struct rtems_termios_tty *tty = ttyp; @@ -906,13 +907,14 @@ rtems_termios_dequeue_characters (void *ttyp, int len) if (tty->rawOutBufState == rob_wait) rtems_semaphore_release (tty->rawOutBufSemaphore); if ( tty->rawOutBufHead == tty->rawOutBufTail ) - return; + return 0; newTail = (tty->rawOutBufTail + len) % RAW_OUTPUT_BUFFER_SIZE; if (newTail == tty->rawOutBufHead) { /* * Buffer empty */ tty->rawOutBufState = rob_idle; + nToSend = 0; } else { /* @@ -926,4 +928,8 @@ rtems_termios_dequeue_characters (void *ttyp, int len) tty->rawOutBufState = rob_busy; } tty->rawOutBufTail = newTail; + + return nToSend; } + + diff --git a/c/src/lib/include/rtems/libio.h b/c/src/lib/include/rtems/libio.h index 3cc87d1d87..dcdda85aec 100644 --- a/c/src/lib/include/rtems/libio.h +++ b/c/src/lib/include/rtems/libio.h @@ -157,7 +157,7 @@ rtems_status_code rtems_termios_read (void *arg); rtems_status_code rtems_termios_write (void *arg); rtems_status_code rtems_termios_ioctl (void *arg); int rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len); -void rtems_termios_dequeue_characters (void *ttyp, int len); +int rtems_termios_dequeue_characters (void *ttyp, int len); void rtems_termios_reserve_resources( rtems_configuration_table *configuration, rtems_unsigned32 number_of_devices diff --git a/c/src/lib/libbsp/i386/pc386/console/console.c b/c/src/lib/libbsp/i386/pc386/console/console.c index a204283b9d..c6f0c08c0f 100644 --- a/c/src/lib/libbsp/i386/pc386/console/console.c +++ b/c/src/lib/libbsp/i386/pc386/console/console.c @@ -58,27 +58,45 @@ int PC386ConsolePort = PC386_CONSOLE_PORT_CONSOLE; -static int conSetAttr(int minor, const struct termios *); extern BSP_polling_getchar_function_type BSP_poll_char; /*-------------------------------------------------------------------------+ | External Prototypes +--------------------------------------------------------------------------*/ -extern void _IBMPC_keyboard_isr(void); -extern void _IBMPC_keyboard_isr_on(const rtems_irq_connect_data*); -extern void _IBMPC_keyboard_isr_off(const rtems_irq_connect_data*); -extern int _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data*); +extern void _IBMPC_keyboard_isr(void); +extern rtems_boolean _IBMPC_scankey(char *); /* defined in 'inch.c' */ +extern char BSP_wait_polled_input(void); +extern void _IBMPC_initVideo(void); + +static int conSetAttr(int minor, const struct termios *); +static void isr_on(const rtems_irq_connect_data *); +static void isr_off(const rtems_irq_connect_data *); +static int isr_is_on(const rtems_irq_connect_data *); + static rtems_irq_connect_data console_isr_data = {PC_386_KEYBOARD, _IBMPC_keyboard_isr, - _IBMPC_keyboard_isr_on, - _IBMPC_keyboard_isr_off, - _IBMPC_keyboard_isr_is_on}; + isr_on, + isr_off, + isr_is_on}; + +static void +isr_on(const rtems_irq_connect_data *unused) +{ + return; +} +static void +isr_off(const rtems_irq_connect_data *unused) +{ + return; +} -extern rtems_boolean _IBMPC_scankey(char *); /* defined in 'inch.c' */ -extern char BSP_wait_polled_input(void); -extern void _IBMPC_initVideo(void); +static int +isr_is_on(const rtems_irq_connect_data *irq) +{ + return pc386_irq_enabled_at_i8259s(irq->name); +} void console_reserve_resources(rtems_configuration_table *conf) { @@ -203,7 +221,7 @@ console_initialize(rtems_device_major_number major, { printk("Initialized console on port COM2 9600-8-N-1\n\n"); } -#define PRINTK_ON_SERIAL +#define PRINTK_ON_SERIAL #ifdef PRINTK_ON_SERIAL /* * You can remove the follwoing tree lines if you want to have printk @@ -221,9 +239,11 @@ console_initialize(rtems_device_major_number major, static int console_open_count = 0; -static void console_last_close() +static int console_last_close(int major, int minor, void *arg) { pc386_remove_rtems_irq_handler (&console_isr_data); + + return 0; } /*-------------------------------------------------------------------------+ @@ -294,7 +314,7 @@ console_close(rtems_device_major_number major, } else { if (--console_open_count == 0) { - console_last_close(); + console_last_close(major, minor, arg); } } @@ -474,9 +494,4 @@ BSP_output_char_function_type BSP_output_char = BSP_polling_getchar_function_type BSP_poll_char = BSP_wait_polled_input; -void BSP_emergency_output_init() -{ - _IBMPC_initVideo(); -} - diff --git a/c/src/lib/libbsp/i386/pc386/console/inch.c b/c/src/lib/libbsp/i386/pc386/console/inch.c index ee05f3bfa5..6783e79ba0 100644 --- a/c/src/lib/libbsp/i386/pc386/console/inch.c +++ b/c/src/lib/libbsp/i386/pc386/console/inch.c @@ -210,18 +210,6 @@ _IBMPC_scankey(char *outChar) return TRUE; } /* _IBMPC_scankey */ -void _IBMPC_keyboard_isr_on(const rtems_irq_connect_data* unused) -{} -void _IBMPC_keyboard_isr_off(const rtems_irq_connect_data* unused) -{} - -int _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data* irq) -{ - return pc386_irq_enabled_at_i8259s (irq->name); -} - - - /*-------------------------------------------------------------------------+ | Function: _IBMPC_keyboard_isr | Description: Interrupt Service Routine for keyboard (0x01) IRQ. diff --git a/c/src/lib/libbsp/i386/pc386/startup/bspstart.c b/c/src/lib/libbsp/i386/pc386/startup/bspstart.c index 4ec4af9b83..5800cfad6e 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/bspstart.c +++ b/c/src/lib/libbsp/i386/pc386/startup/bspstart.c @@ -36,7 +36,6 @@ #include #include #include -#include /*-------------------------------------------------------------------------+ | Global Variables @@ -64,17 +63,12 @@ extern rtems_configuration_table Configuration; rtems_cpu_table Cpu_table; /* CPU configuration table. */ char *rtems_progname; /* Program name - from main(). */ -extern void debugPollingGetChar(); - /*-------------------------------------------------------------------------+ | External Prototypes +--------------------------------------------------------------------------*/ -extern void _exit(int); /* define in exit.c */ -extern void _IBMPC_initVideo(void); -extern void rtems_irq_mngt_init(); +extern void rtems_irq_mngt_init(void); void bsp_libc_init( void *, unsigned32, int ); void bsp_postdriver_hook(void); -extern void _IBMPC_initVideo(void); /*-------------------------------------------------------------------------+ | Function: bsp_pretasking_hook @@ -108,8 +102,6 @@ void bsp_pretasking_hook(void) *(volatile rtems_unsigned32 *)topAddr = topAddr; } - printk("\n"); - for(i=2; i<=2048; i++) { topAddr = i*1024*1024 - 4; @@ -145,14 +137,12 @@ void bsp_pretasking_hook(void) | Returns: Nothing. +--------------------------------------------------------------------------*/ void bsp_start( void ) - /* Initialize printk channel */ - _IBMPC_initVideo(); { - /* * Calibrate variable for 1ms-loop (see timer.c) */ Calibrate_loop_1ms(); + /* * Initialize printk channel */ diff --git a/c/src/lib/libbsp/i386/pc386/startup/exit.c b/c/src/lib/libbsp/i386/pc386/startup/exit.c index 6e72e4bbd8..a9f11b9be4 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/exit.c +++ b/c/src/lib/libbsp/i386/pc386/startup/exit.c @@ -37,7 +37,7 @@ #include #include -void bsp_cleanup() +void bsp_cleanup(void) { unsigned char ch; static char line[]="EXECUTIVE SHUTDOWN! Any key to reboot..."; @@ -56,3 +56,6 @@ void bsp_cleanup() + + + diff --git a/c/src/lib/libbsp/i386/shared/irq/idt.c b/c/src/lib/libbsp/i386/shared/irq/idt.c index 740516b106..5f44bd0d2b 100644 --- a/c/src/lib/libbsp/i386/shared/irq/idt.c +++ b/c/src/lib/libbsp/i386/shared/irq/idt.c @@ -46,13 +46,6 @@ rtems_raw_irq_hdl get_hdl_from_vector(rtems_vector_offset index) i386_get_info_from_IDTR (&idt_entry_tbl, &limit); - /* Convert limit into number of entries */ - limit = (limit + 1) >> 3; - - if(index >= limit) { - return 0; - } - /* Convert limit into number of entries */ limit = (limit + 1) / sizeof(interrupt_gate_descriptor); @@ -279,7 +272,7 @@ int i386_set_gdt_entry (unsigned short segment_selector, unsigned base, gdt_entry_tbl[segment_selector].present = 1; /* not present */ /* - return 1; + * Now, reload all segment registers so the limit takes effect. */ asm volatile( "movw %%ds,%0 ; movw %0,%%ds diff --git a/c/src/lib/libbsp/i386/shared/irq/irq_init.c b/c/src/lib/libbsp/i386/shared/irq/irq_init.c index 4199d30488..ee6967d8d9 100644 --- a/c/src/lib/libbsp/i386/shared/irq/irq_init.c +++ b/c/src/lib/libbsp/i386/shared/irq/irq_init.c @@ -116,22 +116,30 @@ void rtems_irq_mngt_init() { int i; interrupt_gate_descriptor* idt_entry_tbl; - unsigned limit; + unsigned int limit; unsigned int level; - i386_get_info_from_IDTR (&idt_entry_tbl, &limit); - /* Convert limit into number of entries */ - limit = (limit + 1) / sizeof(interrupt_gate_descriptor); + i386_get_info_from_IDTR(&idt_entry_tbl, &limit); + + /* Convert into number of entries */ + limit = (limit + 1)/sizeof(interrupt_gate_descriptor); + + if(limit != IDT_SIZE) { + printk("IDT table size mismatch !!! System locked\n"); + while(1); + } + _CPU_ISR_Disable(level); /* * Init the complete IDT vector table with defaultRawIrq value */ - for (i = 0; i < limit; i++) { + for (i = 0; i < IDT_SIZE ; i++) { idtHdl[i] = defaultRawIrq; idtHdl[i].idtIndex = i; } + raw_initial_config.idtSize = IDT_SIZE; raw_initial_config.defaultRawEntry = defaultRawIrq; raw_initial_config.rawIrqHdlTbl = idtHdl; diff --git a/c/src/lib/libc/libio.h b/c/src/lib/libc/libio.h index 3cc87d1d87..dcdda85aec 100644 --- a/c/src/lib/libc/libio.h +++ b/c/src/lib/libc/libio.h @@ -157,7 +157,7 @@ rtems_status_code rtems_termios_read (void *arg); rtems_status_code rtems_termios_write (void *arg); rtems_status_code rtems_termios_ioctl (void *arg); int rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len); -void rtems_termios_dequeue_characters (void *ttyp, int len); +int rtems_termios_dequeue_characters (void *ttyp, int len); void rtems_termios_reserve_resources( rtems_configuration_table *configuration, rtems_unsigned32 number_of_devices diff --git a/c/src/lib/libc/termios.c b/c/src/lib/libc/termios.c index f3637d37e3..c2a43c7707 100644 --- a/c/src/lib/libc/termios.c +++ b/c/src/lib/libc/termios.c @@ -894,9 +894,10 @@ rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len) * device transmit interrupt handler. * The second argument is the number of characters transmitted so far. * This value will always be 1 for devices which generate an interrupt - * for each transmitted character. + * for each transmitted character. + * It returns number of characters left to transmit */ -void +int rtems_termios_dequeue_characters (void *ttyp, int len) { struct rtems_termios_tty *tty = ttyp; @@ -906,13 +907,14 @@ rtems_termios_dequeue_characters (void *ttyp, int len) if (tty->rawOutBufState == rob_wait) rtems_semaphore_release (tty->rawOutBufSemaphore); if ( tty->rawOutBufHead == tty->rawOutBufTail ) - return; + return 0; newTail = (tty->rawOutBufTail + len) % RAW_OUTPUT_BUFFER_SIZE; if (newTail == tty->rawOutBufHead) { /* * Buffer empty */ tty->rawOutBufState = rob_idle; + nToSend = 0; } else { /* @@ -926,4 +928,8 @@ rtems_termios_dequeue_characters (void *ttyp, int len) tty->rawOutBufState = rob_busy; } tty->rawOutBufTail = newTail; + + return nToSend; } + + diff --git a/c/src/lib/libcpu/i386/cpu.c b/c/src/lib/libcpu/i386/cpu.c index 740516b106..5f44bd0d2b 100644 --- a/c/src/lib/libcpu/i386/cpu.c +++ b/c/src/lib/libcpu/i386/cpu.c @@ -46,13 +46,6 @@ rtems_raw_irq_hdl get_hdl_from_vector(rtems_vector_offset index) i386_get_info_from_IDTR (&idt_entry_tbl, &limit); - /* Convert limit into number of entries */ - limit = (limit + 1) >> 3; - - if(index >= limit) { - return 0; - } - /* Convert limit into number of entries */ limit = (limit + 1) / sizeof(interrupt_gate_descriptor); @@ -279,7 +272,7 @@ int i386_set_gdt_entry (unsigned short segment_selector, unsigned base, gdt_entry_tbl[segment_selector].present = 1; /* not present */ /* - return 1; + * Now, reload all segment registers so the limit takes effect. */ asm volatile( "movw %%ds,%0 ; movw %0,%%ds diff --git a/c/src/lib/libcpu/i386/idt.c b/c/src/lib/libcpu/i386/idt.c index 740516b106..5f44bd0d2b 100644 --- a/c/src/lib/libcpu/i386/idt.c +++ b/c/src/lib/libcpu/i386/idt.c @@ -46,13 +46,6 @@ rtems_raw_irq_hdl get_hdl_from_vector(rtems_vector_offset index) i386_get_info_from_IDTR (&idt_entry_tbl, &limit); - /* Convert limit into number of entries */ - limit = (limit + 1) >> 3; - - if(index >= limit) { - return 0; - } - /* Convert limit into number of entries */ limit = (limit + 1) / sizeof(interrupt_gate_descriptor); @@ -279,7 +272,7 @@ int i386_set_gdt_entry (unsigned short segment_selector, unsigned base, gdt_entry_tbl[segment_selector].present = 1; /* not present */ /* - return 1; + * Now, reload all segment registers so the limit takes effect. */ asm volatile( "movw %%ds,%0 ; movw %0,%%ds diff --git a/cpukit/libcsupport/include/rtems/libio.h b/cpukit/libcsupport/include/rtems/libio.h index 3cc87d1d87..dcdda85aec 100644 --- a/cpukit/libcsupport/include/rtems/libio.h +++ b/cpukit/libcsupport/include/rtems/libio.h @@ -157,7 +157,7 @@ rtems_status_code rtems_termios_read (void *arg); rtems_status_code rtems_termios_write (void *arg); rtems_status_code rtems_termios_ioctl (void *arg); int rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len); -void rtems_termios_dequeue_characters (void *ttyp, int len); +int rtems_termios_dequeue_characters (void *ttyp, int len); void rtems_termios_reserve_resources( rtems_configuration_table *configuration, rtems_unsigned32 number_of_devices diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c index f3637d37e3..c2a43c7707 100644 --- a/cpukit/libcsupport/src/termios.c +++ b/cpukit/libcsupport/src/termios.c @@ -894,9 +894,10 @@ rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len) * device transmit interrupt handler. * The second argument is the number of characters transmitted so far. * This value will always be 1 for devices which generate an interrupt - * for each transmitted character. + * for each transmitted character. + * It returns number of characters left to transmit */ -void +int rtems_termios_dequeue_characters (void *ttyp, int len) { struct rtems_termios_tty *tty = ttyp; @@ -906,13 +907,14 @@ rtems_termios_dequeue_characters (void *ttyp, int len) if (tty->rawOutBufState == rob_wait) rtems_semaphore_release (tty->rawOutBufSemaphore); if ( tty->rawOutBufHead == tty->rawOutBufTail ) - return; + return 0; newTail = (tty->rawOutBufTail + len) % RAW_OUTPUT_BUFFER_SIZE; if (newTail == tty->rawOutBufHead) { /* * Buffer empty */ tty->rawOutBufState = rob_idle; + nToSend = 0; } else { /* @@ -926,4 +928,8 @@ rtems_termios_dequeue_characters (void *ttyp, int len) tty->rawOutBufState = rob_busy; } tty->rawOutBufTail = newTail; + + return nToSend; } + + diff --git a/make/target.cfg.in b/make/target.cfg.in index 88f369c88e..925804ffae 100644 --- a/make/target.cfg.in +++ b/make/target.cfg.in @@ -39,6 +39,7 @@ RTEMS_CROSS_TARGET=@rtems_cv_prog_cc_cross@ RTEMS_HOST = @RTEMS_HOST@ RTEMS_USE_OWN_PDIR = @RTEMS_USE_OWN_PDIR@ RTEMS_HAS_POSIX_API = @RTEMS_HAS_POSIX_API@ +RTEMS_HAS_POSIX_1H_API = @RTEMS_HAS_POSIX_1H_API@ RTEMS_HAS_NETWORKING = @RTEMS_HAS_NETWORKING@ RTEMS_HAS_CPLUSPLUS = @RTEMS_HAS_CPLUSPLUS@ RTEMS_USE_MACROS = @RTEMS_USE_MACROS@ -- cgit v1.2.3