forked from Imagelibrary/rtems
Update from Eric Valette <valette@crf.canon.fr>:
Here are patches that bring 980911 back to what I think is a correct
version of raw IDT management as well as a correct initialisation
of video console and rtems managed interrupts.
This commit is contained in:
@@ -92,10 +92,8 @@ _start16:
|
|||||||
#else
|
#else
|
||||||
ljmp $PROT_CODE_SEG, $1f # flush prefetch queue, and reload %cs
|
ljmp $PROT_CODE_SEG, $1f # flush prefetch queue, and reload %cs
|
||||||
#endif
|
#endif
|
||||||
1:
|
|
||||||
|
|
||||||
.code32
|
.code32
|
||||||
|
1:
|
||||||
/*---------------------------------------------------------------------+
|
/*---------------------------------------------------------------------+
|
||||||
| load the other segment registers
|
| load the other segment registers
|
||||||
+---------------------------------------------------------------------*/
|
+---------------------------------------------------------------------*/
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
/*-------------------------------------------------------------------------+
|
/*-------------------------------------------------------------------------+
|
||||||
| bspstart.c v1.1 - PC386 BSP - 1997/08/07
|
|
||||||
+--------------------------------------------------------------------------+
|
|
||||||
| This file contains the PC386 BSP startup package. It includes application,
|
| This file contains the PC386 BSP startup package. It includes application,
|
||||||
| board, and monitor specific initialization and configuration. The generic CPU
|
| board, and monitor specific initialization and configuration. The generic CPU
|
||||||
| dependent initialization has been performed before this routine is invoked.
|
| dependent initialization has been performed before this routine is invoked.
|
||||||
@@ -38,12 +36,12 @@
|
|||||||
#include <libcsupport.h>
|
#include <libcsupport.h>
|
||||||
#include <rtems/libio.h>
|
#include <rtems/libio.h>
|
||||||
#include <libcpu/cpuModel.h>
|
#include <libcpu/cpuModel.h>
|
||||||
|
#include <pc386uart.h>
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------+
|
/*-------------------------------------------------------------------------+
|
||||||
| Global Variables
|
| Global Variables
|
||||||
+--------------------------------------------------------------------------*/
|
+--------------------------------------------------------------------------*/
|
||||||
extern rtems_unsigned32 _end; /* End of BSS. Defined in 'linkcmds'. */
|
extern rtems_unsigned32 _end; /* End of BSS. Defined in 'linkcmds'. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Size of heap if it is 0 it will be dynamically defined by memory size,
|
* Size of heap if it is 0 it will be dynamically defined by memory size,
|
||||||
* otherwise the value should be changed by binary patch
|
* otherwise the value should be changed by binary patch
|
||||||
@@ -75,6 +73,7 @@ extern void _exit(int); /* define in exit.c */
|
|||||||
void bsp_libc_init( void *, unsigned32, int );
|
void bsp_libc_init( void *, unsigned32, int );
|
||||||
void bsp_postdriver_hook(void);
|
void bsp_postdriver_hook(void);
|
||||||
extern void rtems_irq_mngt_init();
|
extern void rtems_irq_mngt_init();
|
||||||
|
extern void _IBMPC_initVideo(void);
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------+
|
/*-------------------------------------------------------------------------+
|
||||||
| Function: bsp_pretasking_hook
|
| Function: bsp_pretasking_hook
|
||||||
@@ -151,6 +150,10 @@ void bsp_start( void )
|
|||||||
* Calibrate variable for 1ms-loop (see timer.c)
|
* Calibrate variable for 1ms-loop (see timer.c)
|
||||||
*/
|
*/
|
||||||
Calibrate_loop_1ms();
|
Calibrate_loop_1ms();
|
||||||
|
/*
|
||||||
|
* Initialize printk channel
|
||||||
|
*/
|
||||||
|
_IBMPC_initVideo();
|
||||||
|
|
||||||
rtemsFreeMemStart = (rtems_unsigned32)&_end + _stack_size;
|
rtemsFreeMemStart = (rtems_unsigned32)&_end + _stack_size;
|
||||||
/* set the value of start of free memory. */
|
/* set the value of start of free memory. */
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ typedef char (*BSP_polling_getchar_function_type) (void);
|
|||||||
|
|
||||||
extern BSP_output_char_function_type BSP_output_char;
|
extern BSP_output_char_function_type BSP_output_char;
|
||||||
extern BSP_polling_getchar_function_type BSP_poll_char;
|
extern BSP_polling_getchar_function_type BSP_poll_char;
|
||||||
extern void BSP_emergency_output_init(void);
|
|
||||||
/*
|
/*
|
||||||
* All the function declared as extern after this comment
|
* All the function declared as extern after this comment
|
||||||
* are available for each ix86 BSP by compiling and linking
|
* are available for each ix86 BSP by compiling and linking
|
||||||
|
|||||||
@@ -119,16 +119,18 @@ void rtems_irq_mngt_init()
|
|||||||
unsigned limit;
|
unsigned limit;
|
||||||
unsigned int level;
|
unsigned int level;
|
||||||
|
|
||||||
|
|
||||||
i386_get_info_from_IDTR (&idt_entry_tbl, &limit);
|
i386_get_info_from_IDTR (&idt_entry_tbl, &limit);
|
||||||
|
/* Convert limit into number of entries */
|
||||||
|
limit = (limit + 1) / sizeof(interrupt_gate_descriptor);
|
||||||
|
|
||||||
_CPU_ISR_Disable(level);
|
_CPU_ISR_Disable(level);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Init the complete IDT vector table with defaultRawIrq value
|
* Init the complete IDT vector table with defaultRawIrq value
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < IDT_SIZE; i++) {
|
for (i = 0; i < limit; i++) {
|
||||||
idtHdl[i] = defaultRawIrq;
|
idtHdl[i] = defaultRawIrq;
|
||||||
|
idtHdl[i].idtIndex = i;
|
||||||
}
|
}
|
||||||
raw_initial_config.idtSize = IDT_SIZE;
|
raw_initial_config.idtSize = IDT_SIZE;
|
||||||
raw_initial_config.defaultRawEntry = defaultRawIrq;
|
raw_initial_config.defaultRawEntry = defaultRawIrq;
|
||||||
@@ -138,7 +140,6 @@ void rtems_irq_mngt_init()
|
|||||||
/*
|
/*
|
||||||
* put something here that will show the failure...
|
* put something here that will show the failure...
|
||||||
*/
|
*/
|
||||||
BSP_emergency_output_init();
|
|
||||||
printk("Unable to initialize IDT!!! System locked\n");
|
printk("Unable to initialize IDT!!! System locked\n");
|
||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
@@ -159,7 +160,8 @@ void rtems_irq_mngt_init()
|
|||||||
* re-init the rtemsIrq table
|
* re-init the rtemsIrq table
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < PC_386_IRQ_LINES_NUMBER; i++) {
|
for (i = 0; i < PC_386_IRQ_LINES_NUMBER; i++) {
|
||||||
rtemsIrq[i] = defaultIrq;
|
rtemsIrq[i] = defaultIrq;
|
||||||
|
rtemsIrq[i].name = i;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Init initial Interrupt management config
|
* Init initial Interrupt management config
|
||||||
@@ -169,11 +171,11 @@ void rtems_irq_mngt_init()
|
|||||||
initial_config.irqHdlTbl = rtemsIrq;
|
initial_config.irqHdlTbl = rtemsIrq;
|
||||||
initial_config.irqBase = PC386_ASM_IRQ_VECTOR_BASE;
|
initial_config.irqBase = PC386_ASM_IRQ_VECTOR_BASE;
|
||||||
initial_config.irqPrioTbl = irqPrioTable;
|
initial_config.irqPrioTbl = irqPrioTable;
|
||||||
|
|
||||||
if (!pc386_rtems_irq_mngt_set(&initial_config)) {
|
if (!pc386_rtems_irq_mngt_set(&initial_config)) {
|
||||||
/*
|
/*
|
||||||
* put something here that will show the failure...
|
* put something here that will show the failure...
|
||||||
*/
|
*/
|
||||||
BSP_emergency_output_init();
|
|
||||||
printk("Unable to initialize RTEMS interrupt Management!!! System locked\n");
|
printk("Unable to initialize RTEMS interrupt Management!!! System locked\n");
|
||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
@@ -188,8 +190,6 @@ void rtems_irq_mngt_init()
|
|||||||
*/
|
*/
|
||||||
unsigned tmp;
|
unsigned tmp;
|
||||||
|
|
||||||
BSP_emergency_output_init();
|
|
||||||
|
|
||||||
printk("idt_entry_tbl = %x Interrupt_descriptor_table addr = %x\n",
|
printk("idt_entry_tbl = %x Interrupt_descriptor_table addr = %x\n",
|
||||||
idt_entry_tbl, &Interrupt_descriptor_table);
|
idt_entry_tbl, &Interrupt_descriptor_table);
|
||||||
tmp = (unsigned) get_hdl_from_vector (PC386_ASM_IRQ_VECTOR_BASE + PC_386_PERIODIC_TIMER);
|
tmp = (unsigned) get_hdl_from_vector (PC386_ASM_IRQ_VECTOR_BASE + PC_386_PERIODIC_TIMER);
|
||||||
|
|||||||
Reference in New Issue
Block a user