Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 585 → Rev 586

/kernel/trunk/bus/pci/pci32.inc
9,9 → 9,11
;; ;;
;; 32 bit PCI driver code ;;
;; ;;
;; Version 0.3 April 9, 2007 ;;
;; Version 0.2 December 21st, 2002 ;;
;; ;;
;; Author: Victor Prodan, victorprodan@yahoo.com ;;
;; Mihailov Ilia, ghost.nsk@gmail.com ;;
;; Credits: ;;
;; Ralf Brown ;;
;; Mike Hibbett, mikeh@oceanfree.net ;;
108,6 → 110,7
; read a register from the PCI config space into EAX/AX/AL
; IN: ah=bus,device+func=bh,register address=bl
; number of bytes to read (1,2,4) coded into AL, bits 0-1
; (0 - byte, 1 - word, 2 - dword)
;***************************************************************************
 
align 4
238,6 → 241,7
; IN: ah=bus,device+func=bh,register address (dword aligned)=bl,
; value to write in ecx
; number of bytes to write (1,2,4) coded into AL, bits 0-1
; (0 - byte, 1 - word, 2 - dword)
;***************************************************************************
 
align 4
361,3 → 365,118
xor eax,eax
dec eax
ret
 
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
; VendID (2), DevID (2), Revision = 0 (1), Class Code (3), FNum (1), Bus (1)
pci_emu_dat: times 30*10 db 0
 
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
align 4
sys_pcibios:
cmp [pci_access_enabled], 1
jne .unsupported_func
mov edi, [pci_bios_entry]
test edi, edi
jz .emulate_bios
xchg ebx, eax
xchg ecx, eax
xchg edx, eax
xchg esi, eax
mov edi, eax
 
push ds
mov ax, pci_data_sel
mov ds, ax
mov eax, ebp
call pword [cs:pci_bios_entry]
pop ds
 
jmp .return
;-=-=-=-=-=-=-=-=
.emulate_bios:
cmp ebp, 1 ; PCI_FUNCTION_ID
jnz .not_PCI_BIOS_PRESENT
mov edx, 'PCI '
xor ah, ah
mov al, [OS_BASE+0x2F0000 + 0x9020]
mov bx, [OS_BASE+0x2F0000 + 0x9022]
mov cl, [OS_BASE+0x2F0000 + 0x9021]
jmp .return
 
.not_PCI_BIOS_PRESENT:
cmp ebp, 2 ; FIND_PCI_DEVICE
jne .not_FIND_PCI_DEVICE
mov esi, pci_emu_dat
..nxt: cmp [esi], cx
jne ..no
cmp [esi + 2], bx
jne ..no
dec dx
jns ..no
mov bx, [esi + 4]
xor ah, ah
jmp .return
..no: cmp word[esi], 0
je ..dev_not_found
add esi, 10
jmp ..nxt
..dev_not_found:
mov ah, 0x86 ; DEVICE_NOT_FOUND
jmp .return
 
.not_FIND_PCI_DEVICE:
cmp ebp, 3 ; FIND_PCI_CLASS_CODE
jne .not_FIND_PCI_CLASS_CODE
mov esi, pci_emu_dat
shl ebx, 8
..nxt2: cmp [esi], ebx
jne ..no2
mov bx, [esi]
xor ah, ah
jmp .return
..no2: cmp dword[esi], 0
je ..dev_not_found2
add esi, 10
jmp ..nxt2
..dev_not_found2:
mov ah, 0x86 ; DEVICE_NOT_FOUND
jmp .return
 
.not_FIND_PCI_CLASS_CODE:
cmp ebp, 8 ; READ_CONFIG_*
jb .not_READ_CONFIG
cmp ebp, 0x0A
ja .not_READ_CONFIG
mov ebx, esi
mov bh, al
mov edx, ebp
mov al, dl
call pci_read_reg
mov ecx, eax
xor ah, ah ; SUCCESSFUL
jmp .return
.not_READ_CONFIG:
cmp ebp, 0x0B ; WRITE_CONFIG_*
jb .not_WRITE_CONFIG
cmp ebp, 0x0D
ja .not_WRITE_CONFIG
mov ecx, ebx
mov ebx, esi
mov bh, al
mov edx, ebp
inc edx
mov al, dl
call pci_write_reg
xor ah, ah ; SUCCESSFUL
jmp .return
.not_WRITE_CONFIG:
.unsupported_func:
mov ah, 0x81 ; FUNC_NOT_SUPPORTED
.return:mov dword[esp + 8 ], edi
mov dword[esp + 12], esi
mov dword[esp + 24], ebx
mov dword[esp + 28], edx
mov dword[esp + 32], ecx
mov dword[esp + 36], eax
ret
/kernel/trunk/const.inc
6,6 → 6,7
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
dpl0 equ 10010000b ; data read dpl0
drw0 equ 10010010b ; data read/write dpl0
drw3 equ 11110010b ; data read/write dpl3
cpl0 equ 10011010b ; code read dpl0
/kernel/trunk/core/syscall.inc
196,7 → 196,7
dd user_events ; 54-User events
dd sound_interface ; 55-Sound interface
dd undefined_syscall ; 56-reserved
dd undefined_syscall ; 57-reserved
dd sys_pcibios ; 57-reserved
dd file_system ; 58-Common file system interface
dd undefined_syscall ; 59-reserved
dd sys_IPC ; 60-Inter Process Communication
/kernel/trunk/data16.inc
4,7 → 4,7
flm db 0
preboot_lfb db 0
preboot_bootlog db 0
 
boot_drive db 0
bx_from_load: dw 'r1' ; ñòðóêòóðà äëÿ õðàíåíèÿ ïàðàìåòðîâ- îòêóäà ãàøðóçèëèñü, áåðåòñÿ íèæå èç bx ; {SPraid}[13.03.2007]
; a,b,c,d - âèí÷åñòåðû, r - ðàì äèñê
; # äèñêà... ñèìâîë, à íå áàéò. '1', à íå 1
/kernel/trunk/data32.inc
117,6 → 117,8
 
boot_y dd 10
 
pci_bios_entry dd 0
dw pci_code_sel
 
if __DEBUG__ eq 1
include_debug_strings
164,6 → 166,24
db drw3
dw G32+D32+(new_app_base shr 16)+0xF;
 
; ------------- PCI BIOS ------------------
 
pci_code_32:
dw 0 ;lim 0-15
dw 0 ;base 0-15
db 0 ;base 16-23
db cpl0 ;type
db D32 ;lim 16-19+props
db 0 ;base 24-31
 
pci_data_32:
dw 0 ;lim 0-15
dw 0 ;base 0-15
db 0 ;base 16-23
db dpl0 ;type
db D32 ;lim 16-19+props
db 0 ;base 24-31
 
; --------------- APM ---------------------
apm_code_32:
dw 0x0f ; limit 64kb
/kernel/trunk/docs/sysfuncr.txt
2917,6 → 2917,18
¤® ª®­æ  ¯à®¨£à뢠­¨ï.
 
======================================================================
============================ ”ã­ªæ¨ï 57 ==============================
====================== ‚맮¢ á¥à¢¨á®¢ PCIBIOS ========================
======================================================================
 à ¬¥âàë:
* eax = 57
* ebp = ᮮ⢥âáâ¢ã¥â ॣ¨áâàã al ¯® ᯥæ¨ä¨ª æ¨¨ PCIBIOS
* ®áâ «ì­ë¥ ॣ¨áâàë ¯® ᯥæ¨ä¨ª æ¨¨ PCIBIOS
‚®§¢à é ¥¬ë¥ §­ ç¥­¨ï:
* CF ­¥ ®¯à¥¤¥«ñ­
* ®áâ «ì­ë¥ ॣ¨áâàë ¯® ᯥæ¨ä¨ª æ¨¨ PCIBIOS
 
======================================================================
============== ”ã­ªæ¨ï 58 - à ¡®â  á ä ©«®¢®© á¨á⥬®©. ==============
======================================================================
 à ¬¥âàë:
/kernel/trunk/init.inc
160,6 → 160,69
endp
 
align 4
 
init_BIOS32:
mov edi, 0xE0000
.pcibios_nxt:
cmp dword[edi], '_32_' ; "magic" word
je .BIOS32_found
.pcibios_nxt2:
add edi, 0x10
cmp edi, 0xFFFF0
je .BIOS32_not_found
jmp .pcibios_nxt
.BIOS32_found: ; magic word found, check control summ
 
movzx ecx, byte[edi + 9]
shl ecx, 4
mov esi, edi
xor eax, eax
cld ; paranoia
@@: lodsb
add ah, al
loop @b
jnz .pcibios_nxt2 ; control summ must be zero
; BIOS32 service found !
mov ebp, [edi + 4]
mov [bios32_entry], ebp
; check PCI BIOS present
mov eax, '$PCI'
xor ebx, ebx
push cs ; special for 'ret far' from BIOS
call ebp
test al, al
jnz .PCI_BIOS32_not_found
 
; çäåñü ñîçäàþòñÿ äèñêðèïòîðû äëÿ PCI BIOS
 
add ebx, OS_BASE
dec ecx
mov [(pci_code_32-OS_BASE)], cx ;limit 0-15
mov [(pci_data_32-OS_BASE)], cx ;limit 0-15
 
mov [(pci_code_32-OS_BASE)+2], bx ;base 0-15
mov [(pci_data_32-OS_BASE)+2], bx ;base 0-15
 
shr ebx, 16
mov [(pci_code_32-OS_BASE)+4], bl ;base 16-23
mov [(pci_data_32-OS_BASE)+4], bl ;base 16-23
 
shr ecx, 16
and cl, 0x0F
mov ch, bh
add cx, D32
mov [(pci_code_32-OS_BASE)+6], cx ;lim 16-19 &
mov [(pci_data_32-OS_BASE)+6], cx ;base 24-31
 
mov [(pci_bios_entry-OS_BASE)], edx
; jmp .end
.PCI_BIOS32_not_found:
; çäåñü äîëæíà çàïîëíÿòñÿ pci_emu_dat
.BIOS32_not_found:
.end:
 
 
align 4
proc test_cpu
locals
cpu_type dd ?
/kernel/trunk/kernel.asm
74,6 → 74,8
tss0 equ (tss0_l-gdts)
app_code equ (3+app_code_l-gdts)
app_data equ (3+app_data_l-gdts)
pci_code_sel equ (pci_code_32-gdts)
pci_data_sel equ (pci_data_32-gdts)
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
237,6 → 239,7
call test_cpu
bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc
 
call init_BIOS32
; MEMORY MODEL
call mem_test
call init_mem
255,7 → 258,9
jmp pword os_code:high_code
 
align 4
bios32_entry dd ?
tmp_page_tabs dd ?
 
use16
org $-0x10000
include "boot/shutdown.inc" ; shutdown or restart