Changeset 67a2288 in rtems
- Timestamp:
- 07/23/98 22:02:34 (25 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- dbaf51a
- Parents:
- 73452854
- Files:
-
- 14 added
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile.in
r73452854 r67a2288 32 32 include $(RTEMS_ROOT)/make/main.cfg 33 33 34 MTARGETS = all install $(TARGET_VARIANTS) $(TARGET_VARIANTS:%=%_all) \34 MTARGETS = pre_install_src all install $(TARGET_VARIANTS) $(TARGET_VARIANTS:%=%_all) \ 35 35 $(TARGET_VARIANTS:%=%_install) $(TARGET_VARIANTS:%=%_tests) \ 36 36 clean_wrapup distclean clean_dirs clean_tools tests clean depend -
c/Makefile.in
r73452854 r67a2288 50 50 # Make all/install must include 'env' 51 51 # if something is added to TARGET_VARIANTS, then account for it here 52 all: env 52 make_src_makefiles: Makefile.in Makefile 53 find . -name Makefile -exec grep -q ^preinstall {} \; -print > make_src_makefiles 54 55 pre_install_src: env make_src_makefiles 56 cd build-tools/scripts; $(MAKE) 57 CURRDIR=`pwd`; \ 58 for i in `cat make_src_makefiles` ; do \ 59 DIR=`dirname $$i`; \ 60 cd $$DIR; \ 61 $(MAKE) preinstall; \ 62 cd $$CURRDIR; \ 63 done 64 all: pre_install_src env 53 65 debug: env 54 66 profile: env -
c/src/exec/score/cpu/i386/cpu.c
r73452854 r67a2288 77 77 } 78 78 79 /*PAGE80 *81 * _CPU_ISR_install_raw_handler82 */83 84 #if __GO32__85 #include <go32.h>86 #include <dpmi.h>87 #endif /* __GO32__ */88 89 void _CPU_ISR_install_raw_handler(90 unsigned32 vector,91 proc_ptr new_handler,92 proc_ptr *old_handler93 )94 {95 #if __GO32__96 _go32_dpmi_seginfo handler_info;97 98 /* get the address of the old handler */99 _go32_dpmi_get_protected_mode_interrupt_vector( vector, &handler_info);100 101 /* Notice how we're failing to save the pm_segment portion of the */102 /* structure here? That means we might crash the system if we */103 /* try to restore the ISR. Can't fix this until i386_isr is */104 /* redefined. XXX [BHC]. */105 *old_handler = (proc_ptr *) handler_info.pm_offset;106 107 handler_info.pm_offset = (u_long) new_handler;108 handler_info.pm_selector = _go32_my_cs();109 110 /* install the IDT entry */111 _go32_dpmi_set_protected_mode_interrupt_vector( vector, &handler_info );112 #else113 i386_IDT_slot idt;114 unsigned32 handler;115 116 *old_handler = 0; /* XXX not supported */117 118 handler = (unsigned32) new_handler;119 120 /* build the IDT entry */121 idt.offset_0_15 = handler & 0xffff;122 idt.segment_selector = i386_get_cs();123 idt.reserved = 0x00;124 idt.p_dpl = 0x8e; /* present, ISR */125 idt.offset_16_31 = handler >> 16;126 127 /* install the IDT entry */128 i386_Install_idt(129 (unsigned32) &idt,130 _CPU_Table.interrupt_table_segment,131 (unsigned32) _CPU_Table.interrupt_table_offset + (8 * vector)132 );133 #endif134 }135 136 /*PAGE137 *138 * _CPU_ISR_install_vector139 *140 * This kernel routine installs the RTEMS handler for the141 * specified vector.142 *143 * Input parameters:144 * vector - interrupt vector number145 * old_handler - former ISR for this vector number146 * new_handler - replacement ISR for this vector number147 *148 * Output parameters: NONE149 *150 */151 152 void _ISR_Handler_0(), _ISR_Handler_1();153 154 #define PER_ISR_ENTRY \155 (((unsigned32) _ISR_Handler_1 - (unsigned32) _ISR_Handler_0))156 157 #define _Interrupt_Handler_entry( _vector ) \158 (((unsigned32)_ISR_Handler_0) + ((_vector) * PER_ISR_ENTRY))159 160 void _CPU_ISR_install_vector(161 unsigned32 vector,162 proc_ptr new_handler,163 proc_ptr *old_handler164 )165 {166 proc_ptr ignored;167 unsigned32 unique_handler;168 169 *old_handler = _ISR_Vector_table[ vector ];170 171 /* calculate the unique entry point for this vector */172 unique_handler = _Interrupt_Handler_entry( vector );173 174 _CPU_ISR_install_raw_handler( vector, (void *)unique_handler, &ignored );175 176 _ISR_Vector_table[ vector ] = new_handler;177 } -
c/src/exec/score/cpu/i386/cpu.h
r73452854 r67a2288 23 23 24 24 #include <rtems/score/i386.h> /* pick up machine definitions */ 25 #include <libcpu/cpu.h> 26 25 27 #ifndef ASM 26 28 #include <rtems/score/i386types.h> -
c/src/exec/score/cpu/i386/cpu_asm.s
r73452854 r67a2288 553 553 554 554 #ifndef __GO32__ 555 /*PAGE556 *557 * void i386_Install_idt(558 * unsigned32 source_offset,559 * unsigned16 destination_segment,560 * unsigned32 destination_offset561 * );562 */563 564 .p2align 2565 PUBLIC (i386_Install_idt)566 567 .set INSTALL_IDT_SAVED_REGS, 8568 569 .set SOURCE_OFFSET_ARG, INSTALL_IDT_SAVED_REGS + 4570 .set DESTINATION_SEGMENT_ARG, INSTALL_IDT_SAVED_REGS + 8571 .set DESTINATION_OFFSET_ARG, INSTALL_IDT_SAVED_REGS + 12572 573 SYM (i386_Install_idt):574 push esi575 push edi576 577 movl SOURCE_OFFSET_ARG(esp),esi578 movl DESTINATION_OFFSET_ARG(esp),edi579 580 pushf # save flags581 cli # DISABLE INTERRUPTS!!!582 583 movw DESTINATION_SEGMENT_ARG+4(esp),ax584 push es # save es585 movw ax,es586 movsl # copy 1st half of IDT entry587 movsl # copy 2nd half of IDT entry588 pop es # restore es589 590 popf # ENABLE INTERRUPTS!!!591 592 pop edi593 pop esi594 ret595 555 596 556 /* -
c/src/exec/score/cpu/i386/i386.h
r73452854 r67a2288 100 100 101 101 /* 102 * Structure which makes it easier to deal with LxDT and SxDT instructions.103 */104 105 typedef struct {106 unsigned short limit;107 unsigned short physical_address[ 2 ];108 } i386_DTR_load_save_format;109 110 /* See Chapter 5 - Memory Management in i386 manual */111 112 typedef struct {113 unsigned short limit_0_15;114 unsigned short base_0_15;115 unsigned char base_16_23;116 unsigned char type_dt_dpl_p;117 unsigned char limit_16_19_granularity;118 unsigned char base_24_31;119 } i386_GDT_slot;120 121 /* See Chapter 9 - Exceptions and Interrupts in i386 manual122 *123 * NOTE: This is the IDT entry for interrupt gates ONLY.124 */125 126 typedef struct {127 unsigned short offset_0_15;128 unsigned short segment_selector;129 unsigned char reserved;130 unsigned char p_dpl;131 unsigned short offset_16_31;132 } i386_IDT_slot;133 134 /*135 * Interrupt Level Macros136 */137 138 #define i386_disable_interrupts( _level ) \139 { \140 _level = 0; /* avoids warnings */ \141 asm volatile ( "pushf ; \142 cli ; \143 pop %0" \144 : "=r" ((_level)) : "0" ((_level)) \145 ); \146 }147 148 #define i386_enable_interrupts( _level ) \149 { \150 asm volatile ( "push %0 ; \151 popf" \152 : "=r" ((_level)) : "0" ((_level)) \153 ); \154 }155 156 #define i386_flash_interrupts( _level ) \157 { \158 asm volatile ( "push %0 ; \159 popf ; \160 cli" \161 : "=r" ((_level)) : "0" ((_level)) \162 ); \163 }164 165 #define i386_get_interrupt_level( _level ) \166 do { \167 register unsigned32 _eflags = 0; \168 \169 asm volatile ( "pushf ; \170 pop %0" \171 : "=r" ((_eflags)) : "0" ((_eflags)) \172 ); \173 \174 _level = (_eflags & 0x0200) ? 0 : 1; \175 } while (0)176 177 /*178 102 * The following routine swaps the endian format of an unsigned int. 179 103 * It must be static so it can be referenced indirectly. … … 207 131 208 132 /* 209 * Segment Access Routines210 *211 * NOTE: Unfortunately, these are still static inlines even when the212 * "macro" implementation of the generic code is used.213 */214 215 static inline unsigned short i386_get_cs()216 {217 register unsigned short segment = 0;218 219 asm volatile ( "movw %%cs,%0" : "=r" (segment) : "0" (segment) );220 221 return segment;222 }223 224 static inline unsigned short i386_get_ds()225 {226 register unsigned short segment = 0;227 228 asm volatile ( "movw %%ds,%0" : "=r" (segment) : "0" (segment) );229 230 return segment;231 }232 233 static inline unsigned short i386_get_es()234 {235 register unsigned short segment = 0;236 237 asm volatile ( "movw %%es,%0" : "=r" (segment) : "0" (segment) );238 239 return segment;240 }241 242 static inline unsigned short i386_get_ss()243 {244 register unsigned short segment = 0;245 246 asm volatile ( "movw %%ss,%0" : "=r" (segment) : "0" (segment) );247 248 return segment;249 }250 251 static inline unsigned short i386_get_fs()252 {253 register unsigned short segment = 0;254 255 asm volatile ( "movw %%fs,%0" : "=r" (segment) : "0" (segment) );256 257 return segment;258 }259 260 static inline unsigned short i386_get_gs()261 {262 register unsigned short segment = 0;263 264 asm volatile ( "movw %%gs,%0" : "=r" (segment) : "0" (segment) );265 266 return segment;267 }268 269 /*270 133 * IO Port Access Routines 271 134 */ … … 328 191 } 329 192 330 /*331 * Descriptor Table helper routines332 */333 334 335 #define i386_get_GDTR( _gdtr_address ) \336 { \337 void *_gdtr = (_gdtr_address); \338 \339 asm volatile( "sgdt (%0)" : "=r" (_gdtr) : "0" (_gdtr) ); \340 }341 342 #define i386_get_GDT_slot( _gdtr_base, _segment, _slot_address ) \343 { \344 register unsigned int _gdt_slot = (_gdtr_base) + (_segment); \345 register volatile void *_slot = (_slot_address); \346 register unsigned int _temporary = 0; \347 \348 asm volatile( "movl %%gs:(%0),%1 ; \349 movl %1,(%2) ; \350 movl %%gs:4(%0),%1 ; \351 movl %1,4(%2)" \352 : "=r" (_gdt_slot), "=r" (_temporary), "=r" (_slot) \353 : "0" (_gdt_slot), "1" (_temporary), "2" (_slot) \354 ); \355 }356 357 #define i386_set_GDT_slot( _gdtr_base, _segment, _slot_address ) \358 { \359 register unsigned int _gdt_slot = (_gdtr_base) + (_segment); \360 register volatile void *_slot = (_slot_address); \361 register unsigned int _temporary = 0; \362 \363 asm volatile( "movl (%2),%1 ; \364 movl %1,%%gs:(%0) ; \365 movl 4(%2),%1 ; \366 movl %1,%%gs:4(%0) \367 " \368 : "=r" (_gdt_slot), "=r" (_temporary), "=r" (_slot) \369 : "0" (_gdt_slot), "1" (_temporary), "2" (_slot) \370 ); \371 }372 373 static inline void i386_set_segment(374 unsigned short segment,375 unsigned int base,376 unsigned int limit377 )378 {379 i386_DTR_load_save_format gdtr;380 volatile i386_GDT_slot Gdt_slot;381 volatile i386_GDT_slot *gdt_slot = &Gdt_slot;382 unsigned short tmp_segment = 0;383 unsigned int limit_adjusted;384 385 /* load physical address of the GDT */386 387 i386_get_GDTR( &gdtr );388 389 gdt_slot->type_dt_dpl_p = 0x92; /* present, dpl=0, */390 /* application=1, */391 /* type=data read/write */392 gdt_slot->limit_16_19_granularity = 0x40; /* 32 bit segment */393 394 limit_adjusted = limit;395 if ( limit > 4095 ) {396 gdt_slot->limit_16_19_granularity |= 0x80; /* set granularity bit */397 limit_adjusted /= 4096;398 }399 400 gdt_slot->limit_16_19_granularity |= (limit_adjusted >> 16) & 0xff;401 gdt_slot->limit_0_15 = limit_adjusted & 0xffff;402 403 gdt_slot->base_0_15 = base & 0xffff;404 gdt_slot->base_16_23 = (base >> 16) & 0xff;405 gdt_slot->base_24_31 = (base >> 24);406 407 i386_set_GDT_slot(408 gdtr.physical_address[0] + (gdtr.physical_address[1] << 16),409 segment,410 gdt_slot411 );412 413 /* Now, reload all segment registers so the limit takes effect. */414 415 asm volatile( "movw %%ds,%0 ; movw %0,%%ds416 movw %%es,%0 ; movw %0,%%es417 movw %%fs,%0 ; movw %0,%%fs418 movw %%gs,%0 ; movw %0,%%gs419 movw %%ss,%0 ; movw %0,%%ss"420 : "=r" (tmp_segment)421 : "0" (tmp_segment)422 );423 424 }425 193 426 194 /* routines */ … … 448 216 ); 449 217 450 /*451 * i386_Install_idt452 *453 * This routine installs an IDT entry.454 */455 456 void i386_Install_idt(457 unsigned int source_offset,458 unsigned short destination_segment,459 unsigned int destination_offset460 );461 218 462 219 /* … … 485 242 #define inport_long( _port, _value ) i386_inport_long( _port, _value ) 486 243 487 /* complicated static inline functions */488 489 #define get_GDTR( _gdtr_address ) \490 i386_get_GDTR( _gdtr_address )491 492 #define get_GDT_slot( _gdtr_base, _segment, _slot_address ) \493 i386_get_GDT_slot( _gdtr_base, _segment, _slot_address )494 495 #define set_GDT_slot( _gdtr_base, _segment, _slot_address ) \496 i386_set_GDT_slot( _gdtr_base, _segment, _slot_address )497 498 #define set_segment( _segment, _base, _limit ) \499 i386_set_segment( _segment, _base, _limit )500 501 244 502 245 #ifdef __cplusplus -
c/src/lib/libbsp/i386/Makefile.in
r73452854 r67a2288 13 13 14 14 # Descend into the $(RTEMS_BSP_FAMILY) directory 15 SUB_DIRS= $(RTEMS_BSP_FAMILY)15 SUB_DIRS=shared $(RTEMS_BSP_FAMILY) -
c/src/lib/libbsp/i386/pc386/clock/ckinit.c
r73452854 r67a2288 40 40 41 41 /*-------------------------------------------------------------------------+ 42 | Constants43 +--------------------------------------------------------------------------*/44 #define CLOCK_IRQ 0x00 /* Clock IRQ. */45 46 /*-------------------------------------------------------------------------+47 42 | Macros 48 43 +--------------------------------------------------------------------------*/ … … 68 63 /*-------------------------------------------------------------------------+ 69 64 | Function: clockIsr 70 | Description: Interrupt Service Routine for clock (0 8h) interruption.65 | Description: Interrupt Service Routine for clock (0h) interruption. 71 66 | Global Variables: Clock_driver_ticks, Clock_isrs. 72 67 | Arguments: vector - standard RTEMS argument - see documentation. 73 68 | Returns: standard return value - see documentation. 74 69 +--------------------------------------------------------------------------*/ 75 static rtems_isr 76 clockIsr(rtems_vector_number vector) 70 static void clockIsr() 77 71 { 78 72 /*-------------------------------------------------------------------------+ … … 99 93 Clock_isrs--; 100 94 101 PC386_ackIrq(vector - PC386_IRQ_VECTOR_BASE);102 95 } /* clockIsr */ 103 104 96 105 97 /*-------------------------------------------------------------------------+ … … 111 103 | Returns: Nothing. 112 104 +--------------------------------------------------------------------------*/ 113 void Clock_exit(void)105 void clockOff(const rtems_irq_connect_data* unused) 114 106 { 115 107 if (BSP_Configuration.ticks_per_timeslice) … … 130 122 | Returns: Nothing. 131 123 +--------------------------------------------------------------------------*/ 132 void 133 Install_clock(rtems_isr_entry isr) 124 static void clockOn(const rtems_irq_connect_data* unused) 134 125 { 135 126 rtems_unsigned32 microseconds_per_isr; 136 127 137 rtems_status_code status;138 139 128 #if 0 140 129 /* Initialize clock from on-board real time clock. This breaks the */ … … 176 165 rtems_unsigned32 count = US_TO_TICK(microseconds_per_isr); 177 166 178 status = PC386_installRtemsIrqHandler(CLOCK_IRQ, isr);179 180 if (status != RTEMS_SUCCESSFUL)181 {182 printk("Error installing clock interrupt handler!\n");183 rtems_fatal_error_occurred(status);184 }185 186 167 outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); 187 168 outport_byte(TIMER_CNTR0, count >> 0 & 0xff); … … 189 170 } 190 171 191 atexit(Clock_exit); 192 } /* Install_clock */ 193 172 } 173 174 int clockIsOn(const rtems_irq_connect_data* unused) 175 { 176 return ((i8259s_cache & 0x1) == 0); 177 } 178 179 static rtems_irq_connect_data clockIrqData = {PC_386_PERIODIC_TIMER, 180 clockIsr, 181 clockOn, 182 clockOff, 183 clockIsOn}; 184 185 194 186 195 187 /*-------------------------------------------------------------------------+ … … 203 195 void *pargp) 204 196 { 205 Install_clock(clockIsr); /* Install the interrupt handler */ 206 197 198 if (!pc386_install_rtems_irq_handler (&clockIrqData)) { 199 printk("Unable to initialize system clock\n"); 200 rtems_fatal_error_occurred(1); 201 } 207 202 /* make major/minor avail to others such as shared memory driver */ 208 203 … … 213 208 } /* Clock_initialize */ 214 209 215 210 216 211 /*-------------------------------------------------------------------------+ 217 212 | Console device driver CONTROL entry point … … 232 227 233 228 if (args->command == rtems_build_name('I', 'S', 'R', ' ')) 234 clockIsr( PC386_IRQ_VECTOR_BASE + CLOCK_IRQ);229 clockIsr(); 235 230 else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) 236 231 { 237 rtems_status_code status; 238 239 status = PC386_installRtemsIrqHandler(CLOCK_IRQ, clockIsr); 240 241 if (status != RTEMS_SUCCESSFUL) 242 { 232 if (!pc386_install_rtems_irq_handler (&clockIrqData)) { 243 233 printk("Error installing clock interrupt handler!\n"); 244 rtems_fatal_error_occurred( status);234 rtems_fatal_error_occurred(1); 245 235 } 246 236 } … … 250 240 } /* Clock_control */ 251 241 242 void Clock_exit() 243 { 244 pc386_remove_rtems_irq_handler (&clockIrqData); 245 } 252 246 253 247 /*-------------------------------------------------------------------------+ -
c/src/lib/libbsp/i386/pc386/console/console.c
r73452854 r67a2288 47 47 48 48 /*-------------------------------------------------------------------------+ 49 | Constants50 +--------------------------------------------------------------------------*/51 #define KEYBOARD_IRQ 0x01 /* Keyboard IRQ. */52 53 54 /*-------------------------------------------------------------------------+55 49 | External Prototypes 56 50 +--------------------------------------------------------------------------*/ 57 extern rtems_isr _IBMPC_keyboard_isr(rtems_vector_number); 58 /* keyboard (IRQ 0x01) Interrupt Service Routine (defined in 'inch.c') */ 51 extern void _IBMPC_keyboard_isr(void); 52 extern void _IBMPC_keyboard_isr_on(const rtems_irq_connect_data*); 53 extern void _IBMPC_keyboard_isr_off(const rtems_irq_connect_data*); 54 extern int _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data*); 55 56 static rtems_irq_connect_data console_isr_data = {PC_386_KEYBOARD, 57 _IBMPC_keyboard_isr, 58 _IBMPC_keyboard_isr_on, 59 _IBMPC_keyboard_isr_off, 60 _IBMPC_keyboard_isr_is_on}; 61 59 62 60 63 extern rtems_boolean _IBMPC_scankey(char *); /* defined in 'inch.c' */ … … 165 168 166 169 /* Install keyboard interrupt handler */ 167 status = PC386_installRtemsIrqHandler(KEYBOARD_IRQ, _IBMPC_keyboard_isr);168 169 if (status != RTEMS_SUCCESSFUL)170 status = pc386_install_rtems_irq_handler(&console_isr_data); 171 172 if (!status) 170 173 { 171 174 printk("Error installing keyboard interrupt handler!\n"); … … 199 202 if(PC386ConsolePort == PC386_UART_COM1) 200 203 { 201 status = PC386_installRtemsIrqHandler(PC386_UART_COM1_IRQ, 202 PC386_uart_termios_isr_com1); 204 console_isr_data.name = PC386_UART_COM1_IRQ; 205 console_isr_data.hdl = PC386_uart_termios_isr_com1; 206 203 207 } 204 208 else 205 209 { 206 210 assert(PC386ConsolePort == PC386_UART_COM2); 207 208 status = PC386_installRtemsIrqHandler(PC386_UART_COM2_IRQ, 209 PC386_uart_termios_isr_com2); 210 } 211 console_isr_data.name = PC386_UART_COM2_IRQ; 212 console_isr_data.hdl = PC386_uart_termios_isr_com2; 213 } 214 215 status =pc386_install_rtems_irq_handler(&console_isr_data); 211 216 /* 212 217 * Register the device … … 292 297 void *arg) 293 298 { 299 rtems_device_driver res = RTEMS_SUCCESSFUL; 300 294 301 if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE) 295 302 { 296 return rtems_termios_close (arg); 297 } 298 299 return RTEMS_SUCCESSFUL; 303 res = rtems_termios_close (arg); 304 } 305 pc386_remove_rtems_irq_handler (&console_isr_data); 306 307 return res; 300 308 } /* console_close */ 301 309 -
c/src/lib/libbsp/i386/pc386/console/inch.c
r73452854 r67a2288 211 211 } /* _IBMPC_scankey */ 212 212 213 void _IBMPC_keyboard_isr_on(const rtems_irq_connect_data* unused) 214 {} 215 void _IBMPC_keyboard_isr_off(const rtems_irq_connect_data* unused) 216 {} 217 218 int _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data* irq) 219 { 220 return pc386_irq_enabled_at_i8259s (irq->name); 221 } 222 223 213 224 214 225 /*-------------------------------------------------------------------------+ … … 219 230 | Returns: standard return value - see documentation. 220 231 +--------------------------------------------------------------------------*/ 221 rtems_isr 222 _IBMPC_keyboard_isr(rtems_vector_number vector) 232 void _IBMPC_keyboard_isr() 223 233 { 224 234 if (_IBMPC_scankey(&kbd_buffer[kbd_last])) … … 232 242 } 233 243 } 234 235 PC386_ackIrq(vector - PC386_IRQ_VECTOR_BASE); /* Mark interrupt as handled. */236 244 } /* _IBMPC_keyboard_isr */ 237 245 … … 281 289 return c; 282 290 } /* _IBMPC_inch */ 291 292 293 /* 294 * Routine that can be used before interrupt management is initialized. 295 */ 296 297 char 298 debugPollingGetChar(void) 299 { 300 char c; 301 while (!_IBMPC_scankey(&c)) 302 continue; 303 304 return c; 305 } 283 306 284 307 /*-------------------------------------------------------------------------+ -
c/src/lib/libbsp/i386/pc386/include/Makefile.in
r73452854 r67a2288 9 9 PROJECT_ROOT = @PROJECT_ROOT@ 10 10 11 H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h $(srcdir)/ irq.h \12 $(srcdir)/crt.h$(srcdir)/pc386uart.h $(srcdir)/pcibios.h11 H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h $(srcdir)/crt.h \ 12 $(srcdir)/pc386uart.h $(srcdir)/pcibios.h 13 13 14 14 # -
c/src/lib/libbsp/i386/pc386/include/bsp.h
r73452854 r67a2288 52 52 #include <console.h> 53 53 #include <clockdrv.h> 54 54 #include <libcpu/cpu.h> 55 55 56 /*-------------------------------------------------------------------------+ 56 57 | Constants … … 134 135 | External Variables. 135 136 +--------------------------------------------------------------------------*/ 136 extern i386_IDT_slot Interrupt_descriptor_table[]; 137 extern i386_GDT_slot Global_descriptor_table []; 137 #define IDT_SIZE 256 138 #define GDT_SIZE 3 139 140 extern interrupt_gate_descriptor Interrupt_descriptor_table[IDT_SIZE]; 141 extern segment_descriptors Global_descriptor_table [GDT_SIZE]; 138 142 139 143 extern rtems_configuration_table BSP_Configuration; -
c/src/lib/libbsp/i386/pc386/start/start.s
r73452854 r67a2288 105 105 addl $4, esp 106 106 107 /*call debugPollingGetChar */ 107 call debugPollingGetChar 108 108 109 #endif 109 110 -
c/src/lib/libbsp/i386/pc386/startup/Makefile.in
r73452854 r67a2288 12 12 13 13 # C source names, if any, go here -- minus the .c 14 C_PIECES=bspclean bsplibc bsppost bspstart exit irq main sbrk14 C_PIECES=bspclean bsplibc bsppost bspstart exit irq irq_init main sbrk 15 15 C_FILES=$(C_PIECES:%=%.c) 16 16 C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) … … 19 19 20 20 # Assembly source names, if any, go here -- minus the .s 21 S_PIECES=ldsegs 21 S_PIECES=ldsegs irq_asm 22 22 S_FILES=$(S_PIECES:%=%.s) 23 23 S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o) … … 51 51 CLOBBER_ADDITIONS += 52 52 53 IMPORT_SRC=$(srcdir)/../../shared/irq/irq.c \ 54 $(srcdir)/../../shared/irq/irq_init.c $(srcdir)/../../shared/irq/irq_asm.s 55 56 preinstall: 57 ${CP} ${IMPORT_SRC} . 58 53 59 ${PGM}: ${SRCS} ${OBJS} 54 60 $(make-rel) -
c/src/lib/libbsp/i386/pc386/startup/bspstart.c
r73452854 r67a2288 66 66 void bsp_libc_init( void *, unsigned32, int ); 67 67 void bsp_postdriver_hook(void); 68 68 extern void rtems_irq_mngt_init(); 69 69 70 /*-------------------------------------------------------------------------+ 70 71 | Function: bsp_pretasking_hook … … 130 131 131 132 /* 133 * Init trems_interrupt_management 134 */ 135 rtems_irq_mngt_init(); 136 137 /* 132 138 * The following information is very useful when debugging. 133 139 */ -
c/src/lib/libbsp/i386/pc386/startup/ldsegs.s
r73452854 r67a2288 46 46 | CODE section 47 47 +----------------------------------------------------------------------------*/ 48 48 EXTERN (rtems_i8259_masks) 49 49 50 BEGIN_CODE 50 51 51 52 EXTERN (_establish_stack) 52 53 EXTERN (Timer_exit) 53 EXTERN ( Clock_exit)54 EXTERN (clockOff) 54 55 55 56 .p2align 4 … … 96 97 movw ax, gs 97 98 98 /* Set default interrupt handler */99 movl $0, ecx100 movl $Interrupt_descriptor_table, eax101 movl $_default_int_handler, ebx102 movl ebx, edx103 sarl $16, edx104 loop:105 movw bx, (eax)106 movw $0x8, 2(eax)107 movw $0x8e00, 4(eax)108 movw dx, 8(eax)109 addl $8, eax110 addl $1, ecx111 cmpl $255, ecx112 jle loop113 114 115 116 117 99 /*---------------------------------------------------------------------+ 118 100 | Now we have to reprogram the interrupts :-(. We put them right after … … 158 140 call SYM(delay) 159 141 142 movw $0xFFFB, SYM(i8259s_cache) /* set up same values in cache */ 143 160 144 jmp SYM (_establish_stack) # return to the bsp entry code 161 145 … … 186 170 .p2align 4 187 171 188 PUBLIC (_default_int_handler)189 SYM (_default_int_handler):190 iret191 192 172 /*---------------------------------------------------------------------------+ 193 173 | GDT itself -
c/src/lib/libbsp/i386/pc386/timer/timer.c
r73452854 r67a2288 44 44 | Constants 45 45 +--------------------------------------------------------------------------*/ 46 #define TIMER_IRQ 0x00 /* Timer IRQ. */47 46 #define AVG_OVERHEAD 0 /* 0.1 microseconds to start/stop timer. */ 48 47 #define LEAST_VALID 1 /* Don't trust a value lower than this. */ … … 53 52 volatile rtems_unsigned32 Ttimer_val; 54 53 rtems_boolean Timer_driver_Find_average_overhead = TRUE; 54 55 /*-------------------------------------------------------------------------+ 56 | External Prototypes 57 +--------------------------------------------------------------------------*/ 58 extern void timerisr(); 59 /* timer (int 08h) Interrupt Service Routine (defined in 'timerisr.s') */ 60 extern int clockIsOn(const rtems_irq_connect_data*); 55 61 56 62 /*-------------------------------------------------------------------------+ … … 87 93 Timer_exit(void) 88 94 { 89 PC386_disableIrq(TIMER_IRQ);90 95 } /* Timer_exit */ 91 96 … … 108 113 109 114 atexit(Timer_exit); /* Try not to hose the system at exit. */ 110 PC386_enableIrq(TIMER_IRQ);111 /* Disable the programmable timer so ticks don't interfere. */112 115 } 113 116 Ttimer_val = rdtsc(); /* read starting time */ … … 144 147 #define US_PER_ISR 250 /* Number of micro-seconds per timer interruption */ 145 148 146 /*-------------------------------------------------------------------------+147 | External Prototypes148 +--------------------------------------------------------------------------*/149 extern rtems_isr timerisr(rtems_vector_number);150 /* timer (int 08h) Interrupt Service Routine (defined in 'timerisr.s') */151 149 152 150 /*-------------------------------------------------------------------------+ … … 159 157 +--------------------------------------------------------------------------*/ 160 158 void 159 timerOff(const rtems_raw_irq_connect_data* used) 160 { 161 /* 162 * disable interrrupt at i8259 level 163 */ 164 pc386_irq_disable_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE); 165 /* reset timer mode to standard (DOS) value */ 166 outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); 167 outport_byte(TIMER_CNTR0, 0); 168 outport_byte(TIMER_CNTR0, 0); 169 } /* Timer_exit */ 170 171 172 void timerOn(const rtems_raw_irq_connect_data* used) 173 { 174 /* load timer for US_PER_ISR microsecond period */ 175 outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); 176 outport_byte(TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 0 & 0xff); 177 outport_byte(TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 8 & 0xff); 178 /* 179 * disable interrrupt at i8259 level 180 */ 181 pc386_irq_enable_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE); 182 } 183 184 static rtems_raw_irq_connect_data timer_raw_irq_data = { 185 PC_386_PERIODIC_TIMER + PC386_IRQ_VECTOR_BASE, 186 timerisr, 187 timerOn, 188 timerOff, 189 clockIsOn 190 }; 191 192 /*-------------------------------------------------------------------------+ 193 | Function: Timer_exit 194 | Description: Timer cleanup routine at RTEMS exit. NOTE: This routine is 195 | not really necessary, since there will be a reset at exit. 196 | Global Variables: None. 197 | Arguments: None. 198 | Returns: Nothing. 199 +--------------------------------------------------------------------------*/ 200 void 161 201 Timer_exit(void) 162 202 { 163 /* reset timer mode to standard (DOS) value */ 164 outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); 165 outport_byte(TIMER_CNTR0, 0); 166 outport_byte(TIMER_CNTR0, 0); 203 i386_delete_idt_entry (&timer_raw_irq_data); 167 204 } /* Timer_exit */ 168 169 205 170 206 /*-------------------------------------------------------------------------+ … … 185 221 186 222 atexit(Timer_exit); /* Try not to hose the system at exit. */ 187 188 /* install a raw interrupt handler for timer */ 189 PC386_installRawIrqHandler(TIMER_IRQ, timerisr); 190 191 /* load timer for US_PER_ISR microsecond period */ 192 outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); 193 outport_byte(TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 0 & 0xff); 194 outport_byte(TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 8 & 0xff); 223 if (!i386_set_idt_entry (&timer_raw_irq_data)) { 224 printk("raw handler connexion failed\n"); 225 rtems_fatal_error_occurred(1); 226 } 195 227 } 196 228 /* wait for ISR to be called at least once */ -
c/src/lib/wrapup/Makefile.in
r73452854 r67a2288 17 17 18 18 SRCS=$(wildcard $(PROJECT_RELEASE)/lib/libbsp$(LIB_VARIANT).a) \ 19 $(PROJECT_RELEASE)/lib/libcpu$(LIB_VARIANT).a \ 19 20 $(PROJECT_RELEASE)/lib/librtems$(LIB_VARIANT).a \ 20 21 $(wildcard $(PROJECT_RELEASE)/lib/libposix$(LIB_VARIANT).a) \ -
c/src/wrapup/Makefile.in
r73452854 r67a2288 17 17 18 18 SRCS=$(wildcard $(PROJECT_RELEASE)/lib/libbsp$(LIB_VARIANT).a) \ 19 $(PROJECT_RELEASE)/lib/libcpu$(LIB_VARIANT).a \ 19 20 $(PROJECT_RELEASE)/lib/librtems$(LIB_VARIANT).a \ 20 21 $(wildcard $(PROJECT_RELEASE)/lib/libposix$(LIB_VARIANT).a) \ -
configure
r73452854 r67a2288 3013 3013 3014 3014 3015 3016 echo $ac_n "checking for Makefile.in in c/src/lib/libbsp/${bspcpudir}shared""... $ac_c" 1>&6 3017 echo "configure:3018: checking for Makefile.in in c/src/lib/libbsp/${bspcpudir}shared" >&5 3018 if test -d $srcdir/c/src/lib/libbsp/${bspcpudir}shared; then 3019 rtems_av_save_dir=`pwd`; 3020 cd $srcdir; 3021 rtems_av_tmp=`find c/src/lib/libbsp/${bspcpudir}shared -name "Makefile.in" -print | sed "s/Makefile\.in/%/" | sort | sed "s/%/Makefile/"` 3022 makefiles="$makefiles $rtems_av_tmp"; 3023 cd $rtems_av_save_dir; 3024 echo "$ac_t""done" 1>&6 3025 else 3026 echo "$ac_t""no" 1>&6 3027 fi 3028 3029 3015 3030 fi 3016 3031 else … … 3023 3038 3024 3039 echo $ac_n "checking for Makefile.in in c/src/lib/libcpu/$target_cpu""... $ac_c" 1>&6 3025 echo "configure:30 26: checking for Makefile.in in c/src/lib/libcpu/$target_cpu" >&53040 echo "configure:3041: checking for Makefile.in in c/src/lib/libcpu/$target_cpu" >&5 3026 3041 if test -d $srcdir/c/src/lib/libcpu/$target_cpu; then 3027 3042 rtems_av_save_dir=`pwd`; … … 3040 3055 3041 3056 echo $ac_n "checking for Makefile.in in c/src/lib/start/$target_cpu""... $ac_c" 1>&6 3042 echo "configure:30 43: checking for Makefile.in in c/src/lib/start/$target_cpu" >&53057 echo "configure:3058: checking for Makefile.in in c/src/lib/start/$target_cpu" >&5 3043 3058 if test -d $srcdir/c/src/lib/start/$target_cpu; then 3044 3059 rtems_av_save_dir=`pwd`; … … 3082 3097 # If the tests are enabled, then find all the test suite Makefiles 3083 3098 echo $ac_n "checking if the test suites are enabled? ""... $ac_c" 1>&6 3084 echo "configure:3 085: checking if the test suites are enabled? " >&53099 echo "configure:3100: checking if the test suites are enabled? " >&5 3085 3100 tests_enabled=yes 3086 3101 # Check whether --enable-tests or --disable-tests was given. … … 3101 3116 3102 3117 echo $ac_n "checking for Makefile.in in c/src/tests/tools/$target_cpu""... $ac_c" 1>&6 3103 echo "configure:31 04: checking for Makefile.in in c/src/tests/tools/$target_cpu" >&53118 echo "configure:3119: checking for Makefile.in in c/src/tests/tools/$target_cpu" >&5 3104 3119 if test -d $srcdir/c/src/tests/tools/$target_cpu; then 3105 3120 rtems_av_save_dir=`pwd`; … … 3118 3133 3119 3134 echo $ac_n "checking for Makefile.in in c/src/tests/libtests""... $ac_c" 1>&6 3120 echo "configure:31 21: checking for Makefile.in in c/src/tests/libtests" >&53135 echo "configure:3136: checking for Makefile.in in c/src/tests/libtests" >&5 3121 3136 if test -d $srcdir/c/src/tests/libtests; then 3122 3137 rtems_av_save_dir=`pwd`; … … 3133 3148 3134 3149 echo $ac_n "checking for Makefile.in in c/src/tests/sptests""... $ac_c" 1>&6 3135 echo "configure:31 36: checking for Makefile.in in c/src/tests/sptests" >&53150 echo "configure:3151: checking for Makefile.in in c/src/tests/sptests" >&5 3136 3151 if test -d $srcdir/c/src/tests/sptests; then 3137 3152 rtems_av_save_dir=`pwd`; … … 3148 3163 3149 3164 echo $ac_n "checking for Makefile.in in c/src/tests/tmtests""... $ac_c" 1>&6 3150 echo "configure:31 51: checking for Makefile.in in c/src/tests/tmtests" >&53165 echo "configure:3166: checking for Makefile.in in c/src/tests/tmtests" >&5 3151 3166 if test -d $srcdir/c/src/tests/tmtests; then 3152 3167 rtems_av_save_dir=`pwd`; … … 3163 3178 3164 3179 echo $ac_n "checking for Makefile.in in c/src/tests/mptests""... $ac_c" 1>&6 3165 echo "configure:31 66: checking for Makefile.in in c/src/tests/mptests" >&53180 echo "configure:3181: checking for Makefile.in in c/src/tests/mptests" >&5 3166 3181 if test -d $srcdir/c/src/tests/mptests; then 3167 3182 rtems_av_save_dir=`pwd`; … … 3179 3194 3180 3195 echo $ac_n "checking for Makefile.in in c/src/tests/psxtests""... $ac_c" 1>&6 3181 echo "configure:31 82: checking for Makefile.in in c/src/tests/psxtests" >&53196 echo "configure:3197: checking for Makefile.in in c/src/tests/psxtests" >&5 3182 3197 if test -d $srcdir/c/src/tests/psxtests; then 3183 3198 rtems_av_save_dir=`pwd`; … … 3197 3212 # If the HWAPI is enabled, the find the HWAPI Makefiles 3198 3213 echo $ac_n "checking if the HWAPI is enabled? ""... $ac_c" 1>&6 3199 echo "configure:32 00: checking if the HWAPI is enabled? " >&53214 echo "configure:3215: checking if the HWAPI is enabled? " >&5 3200 3215 # Check whether --enable-hwapi or --disable-hwapi was given. 3201 3216 if test "${enable_hwapi+set}" = set; then … … 3208 3223 3209 3224 echo $ac_n "checking for Makefile.in in c/src/lib/libhwapi/analog""... $ac_c" 1>&6 3210 echo "configure:32 11: checking for Makefile.in in c/src/lib/libhwapi/analog" >&53225 echo "configure:3226: checking for Makefile.in in c/src/lib/libhwapi/analog" >&5 3211 3226 if test -d $srcdir/c/src/lib/libhwapi/analog; then 3212 3227 rtems_av_save_dir=`pwd`; … … 3223 3238 3224 3239 echo $ac_n "checking for Makefile.in in c/src/lib/libhwapi/discrete""... $ac_c" 1>&6 3225 echo "configure:32 26: checking for Makefile.in in c/src/lib/libhwapi/discrete" >&53240 echo "configure:3241: checking for Makefile.in in c/src/lib/libhwapi/discrete" >&5 3226 3241 if test -d $srcdir/c/src/lib/libhwapi/discrete; then 3227 3242 rtems_av_save_dir=`pwd`; … … 3238 3253 3239 3254 echo $ac_n "checking for Makefile.in in c/src/lib/libhwapi/drivers""... $ac_c" 1>&6 3240 echo "configure:32 41: checking for Makefile.in in c/src/lib/libhwapi/drivers" >&53255 echo "configure:3256: checking for Makefile.in in c/src/lib/libhwapi/drivers" >&5 3241 3256 if test -d $srcdir/c/src/lib/libhwapi/drivers; then 3242 3257 rtems_av_save_dir=`pwd`; … … 3253 3268 3254 3269 echo $ac_n "checking for Makefile.in in c/src/lib/libhwapi/non_volatile_memory""... $ac_c" 1>&6 3255 echo "configure:32 56: checking for Makefile.in in c/src/lib/libhwapi/non_volatile_memory" >&53270 echo "configure:3271: checking for Makefile.in in c/src/lib/libhwapi/non_volatile_memory" >&5 3256 3271 if test -d $srcdir/c/src/lib/libhwapi/non_volatile_memory; then 3257 3272 rtems_av_save_dir=`pwd`; … … 3268 3283 3269 3284 echo $ac_n "checking for Makefile.in in c/src/lib/libhwapi/serial""... $ac_c" 1>&6 3270 echo "configure:32 71: checking for Makefile.in in c/src/lib/libhwapi/serial" >&53285 echo "configure:3286: checking for Makefile.in in c/src/lib/libhwapi/serial" >&5 3271 3286 if test -d $srcdir/c/src/lib/libhwapi/serial; then 3272 3287 rtems_av_save_dir=`pwd`; … … 3283 3298 3284 3299 echo $ac_n "checking for Makefile.in in c/src/lib/libhwapi/support""... $ac_c" 1>&6 3285 echo "configure:3 286: checking for Makefile.in in c/src/lib/libhwapi/support" >&53300 echo "configure:3301: checking for Makefile.in in c/src/lib/libhwapi/support" >&5 3286 3301 if test -d $srcdir/c/src/lib/libhwapi/support; then 3287 3302 rtems_av_save_dir=`pwd`; … … 3298 3313 3299 3314 echo $ac_n "checking for Makefile.in in c/src/lib/libhwapi/wrapup""... $ac_c" 1>&6 3300 echo "configure:33 01: checking for Makefile.in in c/src/lib/libhwapi/wrapup" >&53315 echo "configure:3316: checking for Makefile.in in c/src/lib/libhwapi/wrapup" >&5 3301 3316 if test -d $srcdir/c/src/lib/libhwapi/wrapup; then 3302 3317 rtems_av_save_dir=`pwd`; … … 3343 3358 3344 3359 echo $ac_n "checking for Makefile.in in c/build-tools""... $ac_c" 1>&6 3345 echo "configure:33 46: checking for Makefile.in in c/build-tools" >&53360 echo "configure:3361: checking for Makefile.in in c/build-tools" >&5 3346 3361 if test -d $srcdir/c/build-tools; then 3347 3362 rtems_av_save_dir=`pwd`; … … 3358 3373 3359 3374 echo $ac_n "checking for Makefile.in in make""... $ac_c" 1>&6 3360 echo "configure:33 61: checking for Makefile.in in make" >&53375 echo "configure:3376: checking for Makefile.in in make" >&5 3361 3376 if test -d $srcdir/make; then 3362 3377 rtems_av_save_dir=`pwd`; … … 3373 3388 3374 3389 echo $ac_n "checking for Makefile.in in c/src/lib/libmisc""... $ac_c" 1>&6 3375 echo "configure:33 76: checking for Makefile.in in c/src/lib/libmisc" >&53390 echo "configure:3391: checking for Makefile.in in c/src/lib/libmisc" >&5 3376 3391 if test -d $srcdir/c/src/lib/libmisc; then 3377 3392 rtems_av_save_dir=`pwd`; … … 3388 3403 3389 3404 echo $ac_n "checking for Makefile.in in c/src/tests/samples""... $ac_c" 1>&6 3390 echo "configure:3 391: checking for Makefile.in in c/src/tests/samples" >&53405 echo "configure:3406: checking for Makefile.in in c/src/tests/samples" >&5 3391 3406 if test -d $srcdir/c/src/tests/samples; then 3392 3407 rtems_av_save_dir=`pwd`; -
configure.in
r73452854 r67a2288 330 330 bspdirs="$bspdirs $bspdir" 331 331 RTEMS_CHECK_MAKEFILE(c/src/lib/libbsp/$bspcpudir$bspdir) 332 RTEMS_CHECK_MAKEFILE(c/src/lib/libbsp/${bspcpudir}shared) 332 333 fi 333 334 else -
cpukit/score/cpu/i386/cpu.c
r73452854 r67a2288 77 77 } 78 78 79 /*PAGE80 *81 * _CPU_ISR_install_raw_handler82 */83 84 #if __GO32__85 #include <go32.h>86 #include <dpmi.h>87 #endif /* __GO32__ */88 89 void _CPU_ISR_install_raw_handler(90 unsigned32 vector,91 proc_ptr new_handler,92 proc_ptr *old_handler93 )94 {95 #if __GO32__96 _go32_dpmi_seginfo handler_info;97 98 /* get the address of the old handler */99 _go32_dpmi_get_protected_mode_interrupt_vector( vector, &handler_info);100 101 /* Notice how we're failing to save the pm_segment portion of the */102 /* structure here? That means we might crash the system if we */103 /* try to restore the ISR. Can't fix this until i386_isr is */104 /* redefined. XXX [BHC]. */105 *old_handler = (proc_ptr *) handler_info.pm_offset;106 107 handler_info.pm_offset = (u_long) new_handler;108 handler_info.pm_selector = _go32_my_cs();109 110 /* install the IDT entry */111 _go32_dpmi_set_protected_mode_interrupt_vector( vector, &handler_info );112 #else113 i386_IDT_slot idt;114 unsigned32 handler;115 116 *old_handler = 0; /* XXX not supported */117 118 handler = (unsigned32) new_handler;119 120 /* build the IDT entry */121 idt.offset_0_15 = handler & 0xffff;122 idt.segment_selector = i386_get_cs();123 idt.reserved = 0x00;124 idt.p_dpl = 0x8e; /* present, ISR */125 idt.offset_16_31 = handler >> 16;126 127 /* install the IDT entry */128 i386_Install_idt(129 (unsigned32) &idt,130 _CPU_Table.interrupt_table_segment,131 (unsigned32) _CPU_Table.interrupt_table_offset + (8 * vector)132 );133 #endif134 }135 136 /*PAGE137 *138 * _CPU_ISR_install_vector139 *140 * This kernel routine installs the RTEMS handler for the141 * specified vector.142 *143 * Input parameters:144 * vector - interrupt vector number145 * old_handler - former ISR for this vector number146 * new_handler - replacement ISR for this vector number147 *148 * Output parameters: NONE149 *150 */151 152 void _ISR_Handler_0(), _ISR_Handler_1();153 154 #define PER_ISR_ENTRY \155 (((unsigned32) _ISR_Handler_1 - (unsigned32) _ISR_Handler_0))156 157 #define _Interrupt_Handler_entry( _vector ) \158 (((unsigned32)_ISR_Handler_0) + ((_vector) * PER_ISR_ENTRY))159 160 void _CPU_ISR_install_vector(161 unsigned32 vector,162 proc_ptr new_handler,163 proc_ptr *old_handler164 )165 {166 proc_ptr ignored;167 unsigned32 unique_handler;168 169 *old_handler = _ISR_Vector_table[ vector ];170 171 /* calculate the unique entry point for this vector */172 unique_handler = _Interrupt_Handler_entry( vector );173 174 _CPU_ISR_install_raw_handler( vector, (void *)unique_handler, &ignored );175 176 _ISR_Vector_table[ vector ] = new_handler;177 }
Note: See TracChangeset
for help on using the changeset viewer.