MrKaktus
User
 Junior Osdever
| Posts: 12 |   | Karma: 1
|
ISR's ;/ - 2005/12/20 03:13
I have remap IRQ, set PIT and then load IDT (which has all selectors set to non present). At end I turn on all Master and Slave IRQ's and NMI. (Code below). And when I'm calling STI there ocurrs 3rd general protection fault ;/. So I don't know what Is wrong ;/. Please help.
; (Inicjacja PIC) ; Przemapowanie IRQ na odpowiednie numery INT
; ICW 1 mov al,0x11 ; Komputer AT/PS-2 z kaskada ukladow out 0x20,al ; |-Master i Slawe. IRQ inicjowane zboczem. out 0xA0,al ;/ Bedzie wyslany bajt ICW4. mov al,0x20 ; ICW 2 out 0x21,al ; |_Ustawiamy nowe numery INT dla IRQ. mov al,0x28 ; | IRQ 0-7 maja numery 0x20-0x27 (32-39) out 0xA1,al ;/ IRQ 8-15 maja numery 0x28-0x2F (40-47) mov al,0x04 ; ICW 3 out 0x21,al ; |_Ustawiamy polaczenie Slave z Master. mov al,0x02 ; | Master ma traktowac IRQ2 jako wywolanie Slave. out 0xA1,al ;/ Slave ma wysylac IRQ2 do Mastera. mov al,0x01 ; ICW 4 out 0x21,al ; |-Tryb pracy zgodny z 8086/88, out 0xA1,al ;/ wysylamy 8bitowy numer INT.
; (Inicjacja PIT) ; Ustawienie generatora 8253/8254 na generowanie ; przerwania IRQ0 z czestotliwoscia 100Hz (99.998Hz)
mov al, 0x34 ;_Wysylamy rozkaz zaprogramowania out 0x43, al ;/ generatora 0, na tryb 2. (00110100b) mov al, 156 ;_Wysyla LSB (156) out 0x40, al ;/ mov al, 46 ;_Wysyla MSB (46) out 0x40, al ;/ [ (46*256)+156=11932 - dzielnik zegara]
; (Inicjacja IDT) ; Zaladowanie do rejestru LIDT adresu tablicy IDT ; i odblokowanie wszystkich linii IRQ oraz NMI.
lidt [IDT_Reg] ; Zaladowanie tablicy IDT
xor al, al ;Odblokowujemy wszystkie IRQ out 0x21, al ;/dla ukladu 8259A Master xor al, al ;Odblokowujemy wszystkie IRQ out 0xA1, al ;/dla ukladu 8259A Slave in al, 0x70 ; and al, 0x7F ; |-Wlaczamy przerwanie NMI out 0x70, al ;/
sti ; Wlaczamy obsluge przerwan
jmp $
. . .
IDT_Tab:
; Na poczatku IDT jest pelne pustych wpisow
%rep 0x40 ; 0x38 dw 0x0000 ; Offset 0-15 dw 0x08 ; Selektor segmentu kodu DPL 0 db 00000000b ; Wyzerowane, Reserved db 00001110b ; NIE-OBECNY , DPL0, 32bit dw 0x0000 ; Offset 16-31 %endrep
IDT_End:
IDT_Reg: dw IDT_End - IDT_Tab - 1 dd IDT_Tab
End of code.
|