From a0de58a008b1a4109491121fe3b342cb33f68250 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Tue, 15 Sep 2015 11:50:29 +0000 Subject: [PATCH] [BSP] fix x86 bsp compiling issue --- bsp/x86/drivers/board.c | 4 +-- bsp/x86/drivers/console.c | 58 ++---------------------------- bsp/x86/rtconfig.h | 9 ++--- bsp/x86/rtconfig.py | 2 +- libcpu/ia32/hdisr_gcc.S | 7 ++-- libcpu/ia32/interrupt.c | 76 ++++++++++++++++++++++++++++++++------- libcpu/ia32/trap.c | 5 --- 7 files changed, 75 insertions(+), 86 deletions(-) diff --git a/bsp/x86/drivers/board.c b/bsp/x86/drivers/board.c index e3a92fc147..29589b0712 100644 --- a/bsp/x86/drivers/board.c +++ b/bsp/x86/drivers/board.c @@ -23,7 +23,7 @@ */ /*@{*/ -static void rt_timer_handler(int vector) +static void rt_timer_handler(int vector, void* param) { rt_tick_increase(); } @@ -47,7 +47,7 @@ void rt_hw_board_init(void) outb(IO_TIMER1, TIMER_DIV(RT_TICK_PER_SECOND) / 256); /* install interrupt handler */ - rt_hw_interrupt_install(INTTIMER0, rt_timer_handler, RT_NULL); + rt_hw_interrupt_install(INTTIMER0, rt_timer_handler, RT_NULL, "tick"); rt_hw_interrupt_umask(INTTIMER0); #ifdef RT_USING_HOOK diff --git a/bsp/x86/drivers/console.c b/bsp/x86/drivers/console.c index 6bc8b03a9c..53e833cc0a 100644 --- a/bsp/x86/drivers/console.c +++ b/bsp/x86/drivers/console.c @@ -214,19 +214,14 @@ static rt_size_t rt_console_read(rt_device_t dev, rt_off_t pos, void* buffer, rt return (rt_uint32_t)ptr - (rt_uint32_t)buffer; } -static void rt_console_isr(int vector) +static void rt_console_isr(int vector, void* param) { -// rt_kprintf("rt_console_isr\r\n"); -// RT_ASSERT(INTKEYBOARD == vector); -// finsh_notify(); - char c; rt_base_t level; while(1) { c = rt_keyboard_getc(); -// rt_kprintf(" %x", c); if(c == 0) { @@ -285,11 +280,9 @@ static void rt_console_isr(int vector) void rt_hw_console_init(void) { rt_cga_init(); -// rt_serial_init(); - /* install keyboard isr */ - rt_hw_interrupt_install(INTKEYBOARD, rt_console_isr, RT_NULL); + rt_hw_interrupt_install(INTKEYBOARD, rt_console_isr, RT_NULL, "kbd"); rt_hw_interrupt_umask(INTKEYBOARD); console_device.type = RT_Device_Class_Char; @@ -320,8 +313,6 @@ void rt_hw_console_init(void) * the name is change to rt_hw_console_output in the v0.3.0 * */ - -//void rt_console_puts(const char* str) void rt_hw_console_output(const char* str) { while (*str) @@ -330,49 +321,4 @@ void rt_hw_console_output(const char* str) } } -//#define BY2CONS 512 -// -//static struct -//{ -// rt_uint8_t buf[BY2CONS]; -// rt_uint32_t rpos; -// rt_uint32_t wpos; -//} cons; -// -//static void rt_console_intr(char (*proc)(void)) -//{ -// int c; -// -// while ((c = (*proc)()) != -1) -// { -// if (c == 0) -// continue; -// cons.buf[cons.wpos++] = c; -// if (cons.wpos == BY2CONS) -// cons.wpos = 0; -// } -//} - -///** -// * return the next input character from the console,either from serial, -// * or keyboard -// * -// */ -//int rt_console_getc(void) -//{ -// int c; -// -// rt_console_intr(rt_serial_getc); -// rt_console_intr(rt_keyboard_getc); -// -// if (cons.rpos != cons.wpos) -// { -// c = cons.buf[cons.rpos++]; -// if (cons.rpos == BY2CONS) -// cons.rpos = 0; -// return c; -// } -// return 0; -//} - /*@}*/ diff --git a/bsp/x86/rtconfig.h b/bsp/x86/rtconfig.h index 95965fbed2..47c996cc46 100644 --- a/bsp/x86/rtconfig.h +++ b/bsp/x86/rtconfig.h @@ -2,10 +2,6 @@ #ifndef __RTTHREAD_CFG_H__ #define __RTTHREAD_CFG_H__ -#define RT_USING_NEWLIB -//#define RT_USING_PTHREADS -#define RT_USING_DFS_DEVFS - /* RT_NAME_MAX*/ #define RT_NAME_MAX 8 @@ -77,6 +73,9 @@ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION +// #define RT_USING_LIBC +// #define RT_USING_PTHREADS + /* SECTION: device filesystem */ #define RT_USING_DFS @@ -96,6 +95,8 @@ /* the max number of opened files */ #define DFS_FD_MAX 4 +#define RT_USING_DFS_DEVFS + /* SECTION: lwip, a lighwight TCP/IP protocol stack */ //#define RT_USING_LWIP /* LwIP uses RT-Thread Memory Management */ diff --git a/bsp/x86/rtconfig.py b/bsp/x86/rtconfig.py index 83ae8dc9d5..9819969924 100644 --- a/bsp/x86/rtconfig.py +++ b/bsp/x86/rtconfig.py @@ -45,7 +45,7 @@ if PLATFORM == 'gcc': DEVICE = ' -mtune=generic' CFLAGS = DEVICE + ' -Wall' AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread-ia32.map,-cref,-u,_start -T x86_ram.lds' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread-ia32.map,-cref,-u,_start -T x86_ram.lds -nostdlib' CPATH = '' LPATH = '' diff --git a/libcpu/ia32/hdisr_gcc.S b/libcpu/ia32/hdisr_gcc.S index 29f200772f..6f79fe4c2a 100644 --- a/libcpu/ia32/hdisr_gcc.S +++ b/libcpu/ia32/hdisr_gcc.S @@ -60,7 +60,7 @@ HDINTERRUPTFNC(irq15, 15) .type _hdinterrupts,@function .globl rt_interrupt_enter .globl rt_interrupt_leave -.globl isr_table +.globl rt_hw_isr .globl rt_thread_switch_interrupt_flag .globl rt_interrupt_from_thread .globl rt_interrupt_to_thread @@ -81,10 +81,7 @@ _hdinterrupts: movl (%eax), %eax /* vector(eax) = *eax */ pushl %eax /* push argument : int vector */ - shll $0x2, %eax /* each item takes up 4bytes in isr_table. */ - movl $isr_table, %ebx /* ebx = &isr_table[0] */ - addl %eax, %ebx /* eax = &isr_table[vector] */ - call *(%ebx) + call rt_hw_isr add $4, %esp /* restore argument */ call rt_interrupt_leave diff --git a/libcpu/ia32/interrupt.c b/libcpu/ia32/interrupt.c index 01086a6266..4d86d593df 100644 --- a/libcpu/ia32/interrupt.c +++ b/libcpu/ia32/interrupt.c @@ -1,16 +1,27 @@ /* * File : interrupt.c * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006, RT-Thread Development Team + * COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://openlab.rt-thread.com/license/LICENSE + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Change Logs: * Date Author Notes + * 2015/9/15 Bernard Update to new interrupt framework. */ - + #include #include @@ -23,9 +34,12 @@ rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; rt_uint32_t rt_thread_switch_interrupt_flag; /* exception and interrupt handler table */ -rt_isr_handler_t isr_table[MAX_HANDLERS]; +struct rt_irq_desc irq_desc[MAX_HANDLERS]; + rt_uint16_t irq_mask_8259A = 0xFFFF; +void rt_hw_interrupt_handle(int vector, void* param); + /** * @addtogroup I386 */ @@ -64,19 +78,40 @@ void rt_hw_pic_init() rt_thread_switch_interrupt_flag = 0; } -void rt_hw_interrupt_handle(int vector) +void rt_hw_interrupt_handle(int vector, void* param) { rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); } +void rt_hw_isr(int vector) +{ + if (vector < MAX_HANDLERS) + { + irq_desc[vector].handler(vector, irq_desc[vector].param); + } +} + /** * This function initializes interrupt descript table and 8259 interrupt controller * */ void rt_hw_interrupt_init(void) { + int idx; + rt_hw_idt_init(); rt_hw_pic_init(); + + /* init exceptions table */ + for(idx=0; idx < MAX_HANDLERS; idx++) + { + irq_desc[idx].handler = (rt_isr_handler_t)rt_hw_interrupt_handle; + irq_desc[idx].param = RT_NULL; +#ifdef RT_USING_INTERRUPT_INFO + rt_snprintf(irq_desc[idx].name, RT_NAME_MAX - 1, "default"); + irq_desc[idx].counter = 0; +#endif + } } void rt_hw_interrupt_umask(int vector) @@ -93,13 +128,28 @@ void rt_hw_interrupt_mask(int vector) outb(IO_PIC2+1, (char)(irq_mask_8259A >> 8)); } -void rt_hw_interrupt_install(int vector, rt_isr_handler_t new_handler, rt_isr_handler_t *old_handler) +rt_isr_handler_t rt_hw_interrupt_install(int vector, + rt_isr_handler_t handler, + void *param, + char *name) { - if(vector < MAX_HANDLERS) - { - if (*old_handler != RT_NULL) *old_handler = isr_table[vector]; - if (new_handler != RT_NULL) isr_table[vector] = new_handler; - } + rt_isr_handler_t old_handler = RT_NULL; + + if(vector < MAX_HANDLERS) + { + old_handler = irq_desc[vector].handler; + if (handler != RT_NULL) + { + irq_desc[vector].handler = (rt_isr_handler_t)handler; + irq_desc[vector].param = param; +#ifdef RT_USING_INTERRUPT_INFO + rt_snprintf(irq_desc[vector].name, RT_NAME_MAX - 1, "%s", name); + irq_desc[vector].counter = 0; +#endif + } + } + + return old_handler; } rt_base_t rt_hw_interrupt_disable(void) diff --git a/libcpu/ia32/trap.c b/libcpu/ia32/trap.c index 52b9e65ea3..5e9a51d6d2 100644 --- a/libcpu/ia32/trap.c +++ b/libcpu/ia32/trap.c @@ -44,11 +44,6 @@ void rt_hw_idt_init(void) extern void Xdefault; int i, j, func; - for(i=0; i