Functions | |||||
| int | page_fault_handler (dword err_code, dword cr2) | ||||
This is the page-fault handler. Every time a page-fault occurs, this routine must be invoked.
| |||||
| void | floppy_handler () | ||||
| This is the floppy interrupt handler routine. It is invoked every time that a floppy operation successfully completes. | |||||
| void | keyboard_handler () | ||||
| This is the keyboard interrupt handler routine. It is invoked every time a key is pressed or released on the keyboard. | |||||
| void | rs232_handler_port1 () | ||||
| The COM1 interrupt handler. | |||||
| void | rs232_handler_port2 () | ||||
| The COM2 interrupt handler. | |||||
| void | rtl8139_handler () | ||||
| The RTL8139 interrupt handler routine. It is invoked every time that an ethernet packet is received or when a packet has been transmitted. | |||||
| void | syscall_handler (dword *eax, dword *ebp) | ||||
This procedure execute every system call invoked by INT 0x80.
| |||||
|
|
This is the floppy interrupt handler routine. It is invoked every time that a floppy operation successfully completes.
Definition at line 440 of file floppy.c.
|
|
|
This is the keyboard interrupt handler routine. It is invoked every time a key is pressed or released on the keyboard.
Definition at line 145 of file keyboard.c.
00146 {
00147 task_t *p;
00148 int console, count;
00149 // Current console structure.
00150 console_t *curr_cons = get_console_addr( get_curr_console() );
00151 // Key hitten ASCII code.
00152 word code;
00153 // Key hitten keyboard code.
00154 word keypressed = scan_key();
00155
00156 // If CTRL+ALT+Canc => Reboot the system... //
00157 if (ctrl==1 && alt==1 && keypressed==DEL_SCAN) reboot();
00158
00159 if (alt==1) code = with_alt[keypressed];
00160 else if (ctrl==1) code = with_control[keypressed];
00161 else
00162 {
00163 if (curr_cons->caps_lock==0 && shift==0) code = regular[keypressed];
00164 else if (curr_cons->caps_lock==0 && shift==1) code = with_shift[keypressed];
00165 else if (curr_cons->caps_lock==1 && shift==0)
00166 {
00167 code = regular[keypressed];
00168 if (((code&0xFF)>='a') && ((code&0xFF)<='z')) code-='a'-'A';
00169 }
00170 else
00171 {
00172 code = with_shift[keypressed];
00173 if (((code&0xFF)>='A') && ((code&0xFF)<='Z')) code+='a'-'A';
00174 }
00175 if ((curr_cons->num_lock!=shift) && (keypressed>=71 && keypressed<=83))
00176 code = keypad_char[keypressed-71];
00177 }
00178
00179 // Print the char only if it's not released (bit 8 set) //
00180 switch (keypressed)
00181 {
00182 case 42: // LShift
00183 shift=1;
00184 break;
00185
00186 case (42+128):
00187 shift=0;
00188 break;
00189
00190 case 54: // RShift
00191 shift=1;
00192 break;
00193
00194 case (54+128):
00195 shift=0;
00196 break;
00197
00198 case 56: // ALT
00199 alt=1;
00200 break;
00201
00202 case (56+128):
00203 alt=0;
00204 break;
00205
00206 case 29: // CTRL
00207 ctrl=1;
00208 break;
00209
00210 case (29+128):
00211 ctrl=0;
00212 break;
00213
00214 case 58: // CAPS LOCK
00215 curr_cons->caps_lock ^= 1;
00216 update_leds();
00217 break;
00218
00219 case 69: // NUM LOCK
00220 curr_cons->num_lock ^= 1;
00221 update_leds();
00222 break;
00223
00224 case 70: // SCROLL LOCK
00225 curr_cons->scroll_lock ^= 1;
00226 update_leds();
00227 break;
00228
00229 case 0xE1: // PAUSE
00230 // Wait until released... //
00231 while (scan_key() != 0xC5);
00232 break;
00233
00234 default:
00235
00236 // Update keyboard buffer. This is an interrupt //
00237 // handler so we are already in mutual exclusion!!! //
00238
00239 if (!(keypressed & 0x80))
00240 {
00241 if ( (code>=ALT_F1) && (code<=ALT_F10) )
00242 {
00243 // Change console //
00244 console = ((code-ALT_F1) >> 8) + 1;
00245 switch_to_console( console );
00246
00247 // Every task in the selected console
00248 // need to wake-up.
00249 count = count_queue( &keyb_queue );
00250 for ( ; count; --count )
00251 {
00252 p = pick_queue( &keyb_queue );
00253 if ( p->console==console )
00254 {
00255 wakeup_task( p );
00256 rem_queue( &keyb_queue, p );
00257 }
00258 }
00259 return;
00260 }
00261 // A key has been released => update the buffer //
00262 if ( (curr_cons->keyb_buf_count) < KEYB_BUF_DIM )
00263 {
00264 (curr_cons->keyb_buf_count)++;
00265 if ( ++(curr_cons->keyb_buf_write) >= KEYB_BUF_DIM )
00266 curr_cons->keyb_buf_write = 0;
00267 curr_cons->keyb_buffer[curr_cons->keyb_buf_write] = code;
00268 }
00269 else
00270 {
00271 // Buffer full => beep! //
00272 beep();
00273 }
00274 }
00275 break;
00276 }
00277 }
|
|
||||||||||||
|
This is the page-fault handler. Every time a page-fault occurs, this routine must be invoked.
Definition at line 367 of file paging.c.
00368 {
00369 dword phys_addr;
00370
00371 #ifdef PAGE_DEBUG
00372 kprintf("\n\rPAGE_FAULT : %#010x", cr2);
00373 #endif
00374 if( cr2==NULL )
00375 {
00376 // Cannot map the NULL pointer.
00377 return( -1 );
00378 }
00379
00380 // Get a physical free frame.
00381 phys_addr = pop_frame()*PAGE_SIZE;
00382
00383 // If out of memory => return!
00384 if (phys_addr == NULL)
00385 {
00386 set_color(LIGHT_RED);
00387 kprintf("\n\rPage fault handler panic: Out of memory!!!");
00388 set_color(DEFAULT_COLOR);
00389 return(-1);
00390 }
00391
00392 // Get only valid err_code //
00393 err_code &= (P_PRESENT | P_WRITE | P_USER);
00394
00395 // Map page with correct attributes //
00396 if (cr2 >= K_VIR_START)
00397 {
00398 if (!(map_page(cr2, phys_addr, P_PRESENT | P_WRITE)))
00399 {
00400 // Out of memory!!! //
00401 set_color(LIGHT_RED);
00402 kprintf("\n\rPage fault handler panic: Out of memory!!!");
00403 set_color(DEFAULT_COLOR);
00404 return( -1 );
00405 }
00406 }
00407 else
00408 {
00409 if (!(map_page(cr2, phys_addr, P_PRESENT | P_WRITE | P_USER)))
00410 {
00411 // Out of memory!!! //
00412 set_color(LIGHT_RED);
00413 kprintf("\n\rPage fault handler panic: Out of memory!!!");
00414 set_color(DEFAULT_COLOR);
00415 return( -1 );
00416 }
00417 }
00418 // Null the new page.
00419 // memsetl((void *)PAGE_ALIGN(cr2), 0, PAGE_SIZE/sizeof(uint32_t));
00420 fast_clear_page((void *)PAGE_ALIGN(cr2));
00421 return( 0 );
00422 }
|
|
|
The COM1 interrupt handler.
Definition at line 108 of file serial.c.
00109 {
00110 rs232_handler(PORT1);
00111 }
|
|
|
The COM2 interrupt handler.
Definition at line 115 of file serial.c.
00116 {
00117 rs232_handler(PORT2);
00118 }
|
|
|
The RTL8139 interrupt handler routine. It is invoked every time that an ethernet packet is received or when a packet has been transmitted.
Definition at line 626 of file rtl8139.c.
00627 {
00628 uint16_t status;
00629
00630 out16(rtl->iobase + IntrMask, 0);
00631
00632 status = in16(rtl->iobase + IntrStatus);
00633 // Acknowledge all known interrupts //
00634 out16(rtl->iobase + IntrStatus, status & ~(RxFIFOOver | RxOverflow | RxOK));
00635
00636 if (status & (RxOK | RxErr))
00637 rtl8139_handle_rx(rtl);
00638 else
00639 if (status & (TxOK | TxErr))
00640 rtl8139_handle_tx(rtl);
00641 // #ifdef DEBUG
00642 else
00643 kprintf("\n\rRTL8139: unknown interrupt: isr = %#010x\n", status);
00644 // #endif
00645
00646 // Re-enable interrupts from the RTL8139 card //
00647 out16(rtl->iobase + IntrStatus, status & (RxFIFOOver | RxOverflow | RxOK));
00648 out16(rtl->iobase + IntrMask, IntrDefault);
00649 }
|
|
||||||||||||
|
This procedure execute every system call invoked by INT 0x80.
Copy the stack parameters from the stack pointer of the calling procedure (pointed by Definition at line 60 of file syscall.c.
00061 {
00062 // Function pointer.
00063 size_t (*p)() = (void *)syscall_table[*eax].address;
00064 // How many parameters.
00065 int paramcnt = syscall_table[*eax].paramcnt;
00066 // Start of parameters'address.
00067 size_t *args = (size_t *)(*ebp);
00068
00069 register int i;
00070
00071 // Check if the system call id does not exceed the syscall table.
00072 // NOTE: sycall id is 0-based!!!
00073 if ( *eax < SYS_CALL_NR )
00074 {
00075 // Pass the parameters to the system call routine.
00076 for( i=paramcnt; i; --i)
00077 __asm__ __volatile__ ("pushl %0" : : "r"(*(args+i-1)));
00078 // Execute the system call.
00079 // The result will be returned into the task's eax register.
00080 *eax = (*p)();
00081 // Pop elements out of the stack.
00082 __asm__ __volatile__ ("add %0, %%esp" : : "r"(paramcnt*sizeof(size_t)));
00083 }
00084 else
00085 {
00086 // Invalid syscall id! => kill the task.
00087 kprintf("\n\rsyscall: %u", *eax);
00088 error("Invalid system call");
00089 }
00090 }
|
1.2.18