↑ Back to main site.

EPOS

Experimental Protected-mode Operating System

idt.asm
; EPOS
; http://www.atanaslaskov.com/epos/
;
; FILE:         idt.asm
; DESCRIPTION:  Interrupt Description table (IDT), IA32
;
; Notice the IDT presented here static. Any modifications
; are handled by the C code ( see int.c ).
;
; BSD LICENSE
; Copyright (c) 2006, Atanas Laskov
; All rights reserved.
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
;   1. Redistributions of source code must retain the above copyright notice,
;   this list of conditions and the following disclaimer.
;   2. Redistributions in binary form must reproduce the above copyright notice,
;   this list of conditions and the following disclaimer in the documentation
;   and/or other materials provided with the distribution.
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL ATANAS LASKOV BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

global _IDTR
global _IDT_START
global _IDT_END

extern SEL_GDT_CODE
extern SEL_GDT_DATA
extern SEL_GDT_LINEAR
extern SEL_LDT_DATA

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IDT Register
_IDTR: dw _IDT_END-_IDT_START-1
      dd 600h+_IDT_START

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Generic interrupt handler
I_CANBESET:
    ; Store processor registers
    push eax
    push ebx
    push ecx
    push esi
    push edi
    push ebp

    push gs
    push fs
    push ds
    push es

    ; Setup kernel environment
    push eax
    mov ax, SEL_GDT_DATA
    mov ds, ax
    mov fs, ax
    mov ax, SEL_LDT_DATA
    mov es, ax
    mov ax, SEL_GDT_LINEAR
    mov gs, ax
    pop eax

    ; Call the dispatch routine
    push edx
    extern _khandler
    call _khandler
    pop edx

    ; Restore processor registers
    pop es
    pop ds
    pop fs
    pop gs

    pop ebp
    pop edi
    pop esi
    pop ecx
    pop ebx
    pop eax
    pop edx
iret

I_RESERV:
iret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Timer interrupt
I_TIMER:
    ; Store processor registers
    push edx
    push eax
    push ebx
    push ecx
    push esi
    push edi
    push ebp

    push gs
    push fs
    push ds
    push es

    ; Setup kernel environment
    push eax
    mov ax, SEL_GDT_DATA
    mov ds, ax
    mov fs, ax
    mov ax, SEL_LDT_DATA
    mov es, ax
    mov ax, SEL_GDT_LINEAR
    mov gs, ax
    pop eax

    ; Call the scheduler routine
    mov edx, [ss:esp-0*4]
    push edx
    extern _tmirq
    call _tmirq
    pop edx

    ; Restore processor registers
    pop es
    pop ds
    pop fs
    pop gs

    pop ebp
    pop edi
    pop esi
    pop ecx
    pop ebx
    pop eax
    pop edx

    push eax
    mov al, 20h
    out 20h, al
    pop eax
iret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Kernel service interrupt
I_SERVICE:
    ; Store processor registers
    push edx
    push eax
    push ebx
    push ecx
    push esi
    push edi
    push ebp

    push gs
    push fs
    push ds
    push es

    ; Setup kernel environment
    push eax
    mov ax, SEL_GDT_DATA
    mov ds, ax
    mov fs, ax
    mov ax, SEL_LDT_DATA
    mov es, ax
    mov ax, SEL_GDT_LINEAR
    mov gs, ax
    pop eax

    ; Kernel services dispatcher
    push ebx
    push eax
    extern _kservice
    call _kservice
    pop eax
    pop ebx

    ; Restore processor registers
    pop es
    pop ds
    pop fs
    pop gs

    pop ebp
    pop edi
    pop esi
    pop ecx
    pop ebx
    pop eax
    pop edx
iret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Placeholders
I_CANBESET00 equ $
              push edx
              mov edx, 0
              jmp I_CANBESET
I_CANBESET01 equ $
              push edx
              mov edx, 1
              jmp I_CANBESET
I_CANBESET02 equ $
              push edx
              mov edx, 2
              jmp I_CANBESET
I_CANBESET03 equ $
              push edx
              mov edx, 3
              jmp I_CANBESET
I_CANBESET04 equ $
              push edx
              mov edx, 4
              jmp I_CANBESET
I_CANBESET05 equ $
              push edx
              mov edx, 5
              jmp I_CANBESET
I_CANBESET06 equ $
              push edx
              mov edx, 6
              jmp I_CANBESET
I_CANBESET07 equ $
              push edx
              mov edx, 7
              jmp I_CANBESET
I_CANBESET08 equ $
              push edx
              mov edx, 8
              jmp I_CANBESET
I_CANBESET09 equ $
              push edx
              mov edx, 9
              jmp I_CANBESET
I_CANBESET10 equ $
              push edx
              mov edx, 10
              jmp I_CANBESET
I_CANBESET11 equ $
              push edx
              mov edx, 11
              jmp I_CANBESET
I_CANBESET12 equ $
              push edx
              mov edx, 12     ;#SS. Needs some additional code ?
              jmp I_CANBESET
I_CANBESET13 equ $
              push edx
              mov edx, 13
              jmp I_CANBESET
I_CANBESET14 equ $
              push edx
              mov edx, 14
              jmp I_CANBESET
I_CANBESET15 equ $
              push edx
              mov edx, 15
              jmp I_CANBESET
I_CANBESET16 equ $
              push edx
              mov edx, 16
              jmp I_CANBESET
I_CANBESET17 equ $
              push edx
              mov edx, 17
              jmp I_CANBESET
I_CANBESET18 equ $
              push edx
              mov edx, 18
              jmp I_CANBESET
I_CANBESET19 equ $
              push edx
              mov edx, 19
              jmp I_CANBESET
I_CANBESET33 equ $
              push edx
              mov edx, 33
              jmp I_CANBESET
I_CANBESET34 equ $
              push edx
              mov edx, 34
              jmp I_CANBESET
I_CANBESET35 equ $
              push edx
              mov edx, 35
              jmp I_CANBESET
I_CANBESET36 equ $
              push edx
              mov edx, 36
              jmp I_CANBESET
I_CANBESET37 equ $
              push edx
              mov edx, 37
              jmp I_CANBESET
I_CANBESET38 equ $
              push edx
              mov edx, 38
              jmp I_CANBESET
I_CANBESET39 equ $
              push edx
              mov edx, 39
              jmp I_CANBESET
I_CANBESET40 equ $
              push edx
              mov edx, 40
              jmp I_CANBESET
I_CANBESET41 equ $
              push edx
              mov edx, 41
              jmp I_CANBESET
I_CANBESET42 equ $
              push edx
              mov edx, 42
              jmp I_CANBESET
I_CANBESET43 equ $
              push edx
              mov edx, 43
              jmp I_CANBESET
I_CANBESET44 equ $
              push edx
              mov edx, 44
              jmp I_CANBESET
I_CANBESET45 equ $
              push edx
              mov edx, 45
              jmp I_CANBESET
I_CANBESET46 equ $
              push edx
              mov edx, 46
              jmp I_CANBESET
I_CANBESET47 equ $
              push edx
              mov edx, 47
              jmp I_CANBESET
             

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Interrupt Descriptor Table
_IDT_START:
    ;------------------------------------------------- errors
    ;
    dw I_CANBESET00 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET01 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET02 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET03 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET04 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET05 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET06 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET07 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET08 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET09 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET10 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET11 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET12 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET13 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET14 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET15 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET16 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET17 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET18 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET19 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16

    ;------------------------------------------------- intel-reserved
    ;
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_RESERV ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16

    ;-------------------------------------------------- hardware IRQs
    ;
    dw I_TIMER      ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET33 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET34 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET35 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET36 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET37 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET38 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET39 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET40 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET41 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET42 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET43 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET44 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET45 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET46 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16
   
    dw I_CANBESET47 ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 8Eh          ; type (32-bit ing 0 interrupt gate)
    dw 0            ; entry point 31:16

    ;--------------------------------------------- kernel services (int 32)
    dw I_SERVICE    ; entry point 15:0
    dw SEL_GDT_CODE ; selector
    db 0            ; word count
    db 0EEh         ; type (32-bit Ring 3 interrupt gate)
    dw 0            ; entry point 31:16
_IDT_END: