LAPIC timer interrupt test

git-svn-id: svn://kolibrios.org@3531 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Artem Jerdev (art_zh) 2013-05-23 17:29:52 +00:00
parent 4d079770dc
commit 55496cc735
5 changed files with 678 additions and 631 deletions

View File

@ -158,7 +158,7 @@ fusion_pcie_init:
create_mmio_pte: create_mmio_pte:
mov ecx, mmio_pte ; physical address mov ecx, mmio_pte ; physical address
or ecx, (PG_NOCACHE + PG_SHARED) or ecx, (PG_NOCACHE + PG_SHARED + PG_SW)
mov ebx, FUSION_MMIO ; linear address mov ebx, FUSION_MMIO ; linear address
shr ebx, 20 shr ebx, 20
add ebx, (sys_pgdir - OS_BASE) ; PgDir entry @ add ebx, (sys_pgdir - OS_BASE) ; PgDir entry @
@ -169,7 +169,7 @@ create_mmio_pte:
mov ecx, 0x01B ; APIC BAR mov ecx, 0x01B ; APIC BAR
rdmsr rdmsr
and eax, 0xFFFFF000 ; physical address and eax, 0xFFFFF000 ; physical address
or eax, (PG_NOCACHE + PG_SHARED) or eax, (PG_NOCACHE + PG_SHARED + PG_SW)
mov dword[mmio_pte + 0], eax mov dword[mmio_pte + 0], eax
ret ; <<< OK >>> ret ; <<< OK >>>
@ -298,4 +298,26 @@ sys_rdmsr:
pop edx ecx pop edx ecx
ret ret
apic_timer_reset:
xor eax, eax
mov [apic_data+0], eax
mov ebx, LAPIC_BAR+ 0x320
mov eax, [ebx]
and eax, 0xFFFEFF00
or eax, 0x0000003F ; int vector + norestart
mov [ebx], eax
mov dword[apic_data + 8], 100000000
ret
apic_timer_int:
push eax
inc dword [apic_data + 0]
mov eax, [apic_data + 8]
mov dword [LAPIC_BAR + 0x380], eax ; load APICTIC
mov dword [LAPIC_BAR + 0x0B0], 0 ; end of interrupt
; mov dword [LAPIC_BAR + 0x420], 0x3F ; end of interrupt
pop eax
iretd

View File

@ -273,6 +273,7 @@ FONT_I equ (OS_BASE+0x005E600)
TMP_STACK_TOP equ 0x006C000 TMP_STACK_TOP equ 0x006C000
apic_data equ (OS_BASE+0x006D000)
mmio_pte equ 0x006E000 mmio_pte equ 0x006E000
sys_pgdir equ (OS_BASE+0x006F000) sys_pgdir equ (OS_BASE+0x006F000)

View File

@ -48,7 +48,8 @@ iglobal
dd irq_serv.irq_5, p_irq6, irq_serv.irq_7 dd irq_serv.irq_5, p_irq6, irq_serv.irq_7
dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10 dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
dd irq_serv.irq_11, irq_serv.irq_12, irqD,p_irq14,p_irq15 dd irq_serv.irq_11, irq_serv.irq_12, irqD,p_irq14,p_irq15
times 16 dd unknown_interrupt ;int_0x30..int_0x3F times 15 dd unknown_interrupt ;int_0x30..int_0x3F
dd apic_timer_int
;int_0x40 gate trap (for directly copied) ;int_0x40 gate trap (for directly copied)
dw i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16 dw i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16

View File

@ -21,13 +21,25 @@ FindHDD:
mov [ChannelNumber],1 mov [ChannelNumber],1
mov [DiskNumber],0 mov [DiskNumber],0
call FindHDD_3 call FindHDD_3
; mov ax,[Sector512+176]
; mov [DRIVE_DATA+6],ax
; mov ax,[Sector512+126]
; mov [DRIVE_DATA+8],ax
; mov ax,[Sector512+128]
; mov [DRIVE_DATA+8],ax
mov [DiskNumber],1 mov [DiskNumber],1
call FindHDD_3 call FindHDD_3
; mov al,[Sector512+176]
; mov [DRIVE_DATA+7],al
inc [ChannelNumber] inc [ChannelNumber]
mov [DiskNumber],0 mov [DiskNumber],0
call FindHDD_3 call FindHDD_3
; mov al,[Sector512+176]
; mov [DRIVE_DATA+8],al
mov [DiskNumber],1 mov [DiskNumber],1
call FindHDD_1 call FindHDD_1
; mov al,[Sector512+176]
; mov [DRIVE_DATA+9],al
jmp EndFindHDD jmp EndFindHDD
@ -44,10 +56,10 @@ FindHDD_1:
FindHDD_2: FindHDD_2:
call DeviceReset call DeviceReset
cmp [DevErrorCode],0 cmp [DevErrorCode],0
jne FindHDD_2_2 ;; jne FindHDD_2_2
; call ReadCD_ID ; call ReadCD_ID
; cmp [DevErrorCode],0 ; cmp [DevErrorCode],0
; jne FindHDD_2_2 jne FindHDD_2_2
inc byte [DRIVE_DATA+1] inc byte [DRIVE_DATA+1]
inc byte [DRIVE_DATA+1] inc byte [DRIVE_DATA+1]
FindHDD_2_2: FindHDD_2_2:
@ -99,6 +111,8 @@ ReadHDD_ID:
test AL,08h ;состояние сигнала DRQ test AL,08h ;состояние сигнала DRQ
jz @@WaitCompleet jz @@WaitCompleet
; Принять блок данных от контроллера ; Принять блок данных от контроллера
; mov AX,DS
; mov ES,AX
mov EDI,Sector512 ;offset Sector512 mov EDI,Sector512 ;offset Sector512
mov DX,[ATABasePortAddr] ;регистр данных mov DX,[ATABasePortAddr] ;регистр данных
mov CX,256 ;число считываемых слов mov CX,256 ;число считываемых слов
@ -187,10 +201,17 @@ SendCommandToHDD:
; Ожидать, пока диск не будет готов ; Ожидать, пока диск не будет готов
inc DX inc DX
mov ecx,0xfff mov ecx,0xfff
; mov eax,[timer_ticks]
; mov [TickCounter_1],eax
@@WaitHDReady: @@WaitHDReady:
; Проверить время ожидани ; Проверить время ожидани
dec ecx dec ecx
; cmp ecx,0
jz @@Err1 jz @@Err1
; mov eax,[timer_ticks]
; sub eax,[TickCounter_1]
; cmp eax,300 ;îæèäàòü 300 òèêîâ
; ja @@Err1 ;îøèáêà òàéì-àóòà
; Прочитать регистр состояни ; Прочитать регистр состояни
in AL,DX in AL,DX
; Проверить состояние сигнала BSY ; Проверить состояние сигнала BSY
@ -249,7 +270,6 @@ SendCommandToHDD:
; Завершение работы программы ; Завершение работы программы
ret ret
if 0
;************************************************* ;*************************************************
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI * ;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI *
;* Входные параметры передаются через глобальные * ;* Входные параметры передаются через глобальные *
@ -279,6 +299,7 @@ ReadCD_ID:
@@WaitCompleet_1: @@WaitCompleet_1:
; Проверить врем ; Проверить врем
dec ecx dec ecx
; cmp ecx,0
jz @@Error1_1 ;ошибка тайм-аута jz @@Error1_1 ;ошибка тайм-аута
; Проверить готовность ; Проверить готовность
in AL,DX in AL,DX
@ -289,6 +310,8 @@ ReadCD_ID:
test AL,08h ;состояние сигнала DRQ test AL,08h ;состояние сигнала DRQ
jz @@WaitCompleet_1 jz @@WaitCompleet_1
; Принять блок данных от контроллера ; Принять блок данных от контроллера
; mov AX,DS
; mov ES,AX
mov EDI,Sector512 ;offset Sector512 mov EDI,Sector512 ;offset Sector512
mov DX,[ATABasePortAddr] ;порт 1x0h mov DX,[ATABasePortAddr] ;порт 1x0h
mov CX,256 ;число считываемых слов mov CX,256 ;число считываемых слов
@ -303,8 +326,6 @@ ReadCD_ID:
@@End_1: @@End_1:
ret ret
end if
;************************************************* ;*************************************************
;* СБРОС УСТРОЙСТВА * ;* СБРОС УСТРОЙСТВА *
;* Входные параметры передаются через глобальные * ;* Входные параметры передаются через глобальные *

View File

@ -712,6 +712,8 @@ include 'detect/disks.inc'
; mov esi, boot_uDMA_ok ; mov esi, boot_uDMA_ok
; call boot_log ; call boot_log
call apic_timer_reset
; LOAD FIRST APPLICATION ; LOAD FIRST APPLICATION
cli cli
if 0 if 0