further AMD-kernel tuning:

1)faster syscall bridge for future APIs; 
2)HyperTransport module added (quite raw yet);
4)unrestricted i/o port access;
3)some MeOS rudiments removed. 

git-svn-id: svn://kolibrios.org@1551 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Artem Jerdev (art_zh) 2010-08-03 13:07:43 +00:00
parent 0f036b69ff
commit 24fbc88418
6 changed files with 1024 additions and 1308 deletions

View File

@ -0,0 +1,144 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) 2010 KolibriOS team. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; HT.inc ;; ;;
;; ;;
;; AMD HyperTransport bus control ;;
;; ;;
;; art_zh <artem@jerdev.co.uk> ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 4
;=============================================================================
;
; This code is a part of Kolibri-A and will only work with AMD RS760+ chipsets
;
;=============================================================================
;------------------------------------------
; params: al = nbconfig register#
; returns: eax = register content
;
rs7xx_nbconfig_read_pci:
and eax, 0x0FC ; leave register# only
or eax, 0x80000000 ; bdf = 0:0.0
mov dx, 0x0CF8 ; write to index reg
out dx, eax
add dl, 4
in eax, dx
ret
rs7xx_nbconfig_flush_pci:
mov eax, 0x0B0 ; a scratch reg
mov dx, 0xCF8
out dx, eax
ret
rs7xx_nbconfig_write_pci:
and eax, 0x0FC ; leave register# only
or eax, 0x80000000 ; bdf = 0:0.0
mov dx, 0x0CF8 ; write to index reg
out dx, eax
add dl, 4
mov eax, ebx
out dx, eax
ret
;***************************************************************************
; Function
; rs7xx_pcie_init:
;
; Description
; PCIe extended (memory-mapped) config space detection
;
;***************************************************************************
rs7xx_pcie_init:
; mov al, 0x7C ; NB_IOC_CFG_CNTL
; mov ebx, 0x20000000
; call rs7xx_nbconfig_write_pci
mov al, 0x7C ; NB_IOC_CFG_CNTL
call rs7xx_nbconfig_read_pci
mov ebx, eax
call rs7xx_nbconfig_flush_pci
test ebx, 0x20000000 ; BAR3 locked?
jz .rs7xx_pcie_blocked
mov al, 0x84 ; NB_PCI_ARB
call rs7xx_nbconfig_read_pci
shr eax,16
and ax, 7 ; the Bus range lays here:
jnz @f
mov ax, 8 ; 1=2Mb, 2=4MB, 3=8MB, 4=16MB
@@:
mov [PCIe_bus_range], ax ; 5=32Mb, 6=64MB, 7=128Mb, 8=256Mb
mov cl, al
call rs7xx_nbconfig_flush_pci
dec cl ; <4M ?
jnz @f
inc cl ; one PDE needed anyway
@@:
dec cl
mov ebx, 1
shl ebx, cl
mov [mmio_pcie_cfg_pdes], bx ; 1..64 PDE(s) needed,
shl ebx, 22
mov [mmio_pcie_cfg_lim], ebx ; or 4..256Mb space to map
dec [mmio_pcie_cfg_lim]
mov al, 0x1C ; NB_BAR3_PCIEXP_MMCFG
call rs7xx_nbconfig_read_pci
mov ebx, eax
call rs7xx_nbconfig_flush_pci
mov eax, ebx
and eax, 0xFFE00000 ; valid bits [31..21]
jnz @f ; NB BAR3 may be invisible!
call pci_ext_config ; try to get pcie ecfg address indirectly
@@:
or eax, eax
jz .rs7xx_pcie_fail
mov [mmio_pcie_cfg_addr], eax ; physical address (lower 32 bits)
add [mmio_pcie_cfg_lim], eax
; -- map the whole PCIe config space;
or eax, (PG_SHARED + PG_LARGE + PG_UW) ; by the way, UW is unsafe!
mov ecx, PCIe_CONFIG_SPACE ; linear address
mov ebx, ecx
shr ebx, 20
add ebx, sys_pgdir ; PgDir entry @
xor dx, dx ; PDEs counter
@@:
mov dword[ebx], eax ; map 4 buses
invlpg [ecx] ; next PgDir entry
add bx, 4 ; new PDE
add eax, 0x400000 ; +4M phys.
add ecx, 0x400000 ; +4M lin.
inc dx
cmp dx, [mmio_pcie_cfg_pdes] ; all mapped yet?
jnz @b
.pcie_cfg_mapped:
mov esi, boot_pcie_ok
call boot_log
ret ; <<<<<<<<<<< OK >>>>>>>>>>>
.rs7xx_pcie_fail:
mov esi, boot_rs7xx_fail
call boot_log
ret
.rs7xx_pcie_blocked:
mov esi, boot_rs7xx_blkd
call boot_log
ret

View File

@ -28,12 +28,14 @@ $Revision: 1463 $
; ;
;*************************************************************************** ;***************************************************************************
align 4
mmio_pcie_cfg_addr dd 0x00000000 ; pcie space may be defined here mmio_pcie_cfg_addr dd 0x00000000 ; pcie space may be defined here
mmio_pcie_cfg_lim dd 0x000FFFFF ; upper pcie space address mmio_pcie_cfg_lim dd 0x000FFFFF ; upper pcie space address
mmio_pcie_cfg_pdes dw 0 ; number of PDEs to map the space
PCIe_bus_range dw 0 ; the Bus range: power-of-2 Megabytes
align 4 align 4
pci_ext_config: pci_ext_config:
mov ebx, [mmio_pcie_cfg_addr] mov ebx, [mmio_pcie_cfg_addr]
or ebx,ebx or ebx,ebx
@ -60,7 +62,7 @@ pci_ext_config:
jz .no_pcie_cfg jz .no_pcie_cfg
shl eax, 8 ; bus:[27..20], dev:[19:15] shl eax, 8 ; bus:[27..20], dev:[19:15]
or eax, 0x00007FFC ; fun:[14..12], reg:[11:2] or eax, 0x00007FFC ; fun:[14..12], reg:[11:2]
mov [mmio_pcie_cfg_lim], eax ; mov [mmio_pcie_cfg_lim], eax
mov cl, bl mov cl, bl
mov ax, 0x0002 ; bus = 0, 1dword to read mov ax, 0x0002 ; bus = 0, 1dword to read
call pci_read_reg call pci_read_reg
@ -74,30 +76,14 @@ pci_ext_config:
test eax, 0x000F0000 ; MMIO Base must be bus0-aligned test eax, 0x000F0000 ; MMIO Base must be bus0-aligned
jnz .no_pcie_cfg jnz .no_pcie_cfg
mov [mmio_pcie_cfg_addr], eax mov [mmio_pcie_cfg_addr], eax
add eax, 0x000FFFFC ; add eax, 0x000FFFFC
sub eax,[mmio_pcie_cfg_lim] ; MMIO must cover at least one bus ; sub eax,[mmio_pcie_cfg_lim] ; MMIO must cover at least one bus
ja .no_pcie_cfg ; ja .no_pcie_cfg
; -- it looks like a true PCIe config space; ; -- it looks like a true PCIe config space;
mov eax,[mmio_pcie_cfg_addr] ; physical address
or eax, (PG_SHARED + PG_LARGE + PG_USER)
mov ebx, PCIe_CONFIG_SPACE ; linear address
mov ecx, ebx
shr ebx, 20
add ebx, sys_pgdir ; PgDir entry @
@@:
mov dword[ebx], eax ; map 4 buses
invlpg [ecx]
cmp bl, 4
jz .pcie_cfg_mapped ; fix it later
add bl, 4 ; next PgDir entry
add eax, 0x400000 ; eax += 4M
add ecx, 0x400000
jmp @b
.pcie_cfg_mapped: .pcie_cfg_mapped:
; -- glad to have the extended PCIe config field found
mov esi, boot_pcie_ok mov esi, boot_pcie_ok
call boot_log call boot_log
ret ; <<<<<<<<<<< OK >>>>>>>>>>> ret ; <<<<<<<<<<< OK >>>>>>>>>>>

View File

@ -17,39 +17,40 @@ cross_order:
mov edx, esi mov edx, esi
mov esi, edi mov esi, edi
movzx edi, byte[esp+28 + 4] movzx edi, byte[esp+28 + 4]
sub edi, 53 ; all zeroes before
call dword [servetable+edi*4] call dword [servetable+edi*4]
ret ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; SYSENTER ENTRY ;; ;; SYSENTER ENTRY ;;
;; ;; ;; (not used on AMD systems) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 32 ;align 32
sysenter_entry: ;sysenter_entry:
; Íàñòðàèâàåì ñòåê ; ; Íàñòðàèâàåì ñòåê
mov esp, [ss:tss._esp0] ; mov esp, [ss:tss._esp0]
sti ; sti
push ebp ; save app esp + 4 ; push ebp ; save app esp + 4
mov ebp, [ebp] ; ebp - original ebp ; mov ebp, [ebp] ; ebp - original ebp
;------------------ ; ;------------------
pushad ; pushad
cld ; cld
;
; movzx eax, al
; call dword [servetable2 + eax * 4]
movzx eax, al ; popad
call dword [servetable2 + eax * 4] ; ;------------------
; xchg ecx, [ss:esp] ; â âåðøèí ñòåêà - app ecx, ecx - app esp + 4
popad ; sub ecx, 4
;------------------ ; xchg edx, [ecx] ; edx - return point, & save original edx
xchg ecx, [ss:esp] ; â âåðøèí ñòåêà - app ecx, ecx - app esp + 4 ; push edx
sub ecx, 4 ; mov edx, [ss:esp + 4]
xchg edx, [ecx] ; edx - return point, & save original edx ; mov [ecx + 4], edx ; save original ecx
push edx ; pop edx
mov edx, [ss:esp + 4] ; sysexit
mov [ecx + 4], edx ; save original ecx
pop edx
sysexit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
@ -61,7 +62,7 @@ align 16
i40: i40:
pushad pushad
cld cld
movzx eax, al and eax, 0x07F
call dword [servetable2 + eax * 4] call dword [servetable2 + eax * 4]
popad popad
iretd iretd
@ -73,25 +74,12 @@ i40:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 32 align 32
syscall_entry: syscall_entry:
; cli syscall clear IF ; push ecx
xchg esp, [ss:tss._esp0] sti
push ecx xor eax, 3
lea ecx, [esp+4] call dword [servetable3 + eax * 4]
xchg ecx, [ss:tss._esp0]
sti
push ecx
mov ecx, [ecx]
;------------------
pushad
cld
movzx eax, al ; pop ecx
call dword [servetable2 + eax * 4]
popad
;------------------
mov ecx, [ss:esp+4]
pop esp
sysret sysret
iglobal iglobal
@ -102,59 +90,6 @@ iglobal
align 4 align 4
servetable: servetable:
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd socket ; 53-Socket interface dd socket ; 53-Socket interface
dd 0 dd 0
dd 0 dd 0
@ -246,7 +181,15 @@ iglobal
dd file_system_lfn ; 70-Common file system interface, version 2 dd file_system_lfn ; 70-Common file system interface, version 2
dd syscall_window_settings ; 71-Window settings dd syscall_window_settings ; 71-Window settings
dd sys_sendwindowmsg ; 72-Send window message dd sys_sendwindowmsg ; 72-Send window message
times 255 - ( ($-servetable2) /4 ) dd undefined_syscall times 127 - ( ($-servetable2) /4 ) dd undefined_syscall
dd sys_end ; -1-end application dd sys_end ; -1-end application
align 4
servetable3:
dd paleholder ; 0
dd paleholder ; 1
dd paleholder ; 2
dd sys_end ; last
endg endg

View File

@ -1,469 +1,471 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$ $Revision$
keymap: keymap:
db '6',27 db '6',27
db '1234567890-=',8,9 db '1234567890-=',8,9
db 'qwertyuiop[]',13 db 'qwertyuiop[]',13
db '~asdfghjkl;',39,96,0,'\zxcvbnm,./',0,'45 ' db '~asdfghjkl;',39,96,0,'\zxcvbnm,./',0,'45 '
db '@234567890123',180,178,184,'6',176,'7' db '@234567890123',180,178,184,'6',176,'7'
db 179,'8',181,177,183,185,182 db 179,'8',181,177,183,185,182
db 'AB<D',255,'FGHIJKLMNOPQRSTUVWXYZ' db 'AB<D',255,'FGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
keymap_shift: keymap_shift:
db '6',27 db '6',27
db '!@#$%^&*()_+',8,9 db '!@#$%^&*()_+',8,9
db 'QWERTYUIOP{}',13 db 'QWERTYUIOP{}',13
db '~ASDFGHJKL:"~',0,'|ZXCVBNM<>?',0,'45 ' db '~ASDFGHJKL:"~',0,'|ZXCVBNM<>?',0,'45 '
db '@234567890123',180,178,184,'6',176,'7' db '@234567890123',180,178,184,'6',176,'7'
db 179,'8',181,177,183,185,182 db 179,'8',181,177,183,185,182
db 'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ' db 'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
keymap_alt: keymap_alt:
db ' ',27 db ' ',27
db ' @ $ {[]}\ ',8,9 db ' @ $ {[]}\ ',8,9
db ' ',13 db ' ',13
db ' ',0,' ',0,'4',0,' ' db ' ',0,' ',0,'4',0,' '
db ' ',180,178,184,'6',176,'7' db ' ',180,178,184,'6',176,'7'
db 179,'8',181,177,183,185,182 db 179,'8',181,177,183,185,182
db 'ABCD',255,'FGHIJKLMNOPQRSTUVWXYZ' db 'ABCD',255,'FGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
boot_memdetect db 'Determining amount of memory',0 boot_memdetect db 'Determining amount of memory',0
boot_fonts db 'Fonts loaded',0 boot_fonts db 'Fonts loaded',0
boot_tss db 'Setting TSSs',0 boot_tss db 'Setting TSSs',0
boot_cpuid db 'Reading CPUIDs',0 boot_cpuid db 'Reading CPUIDs',0
boot_devices db 'Detecting devices',0 boot_devices db 'Detecting devices',0
boot_timer db 'Setting timer',0 boot_timer db 'Setting timer',0
boot_irqs db 'Reprogramming IRQs',0 boot_irqs db 'Reprogramming IRQs',0
boot_setmouse db 'Setting mouse',0 boot_setmouse db 'Setting mouse',0
boot_windefs db 'Setting window defaults',0 boot_windefs db 'Setting window defaults',0
boot_bgr db 'Calculating background',0 boot_bgr db 'Calculating background',0
boot_resirqports db 'Reserving IRQs & ports',0 boot_resirqports db 'Reserving IRQs & ports',0
boot_setrports db 'Setting addresses for IRQs',0 ; boot_setrports db 'Setting addresses for IRQs',0
boot_setostask db 'Setting OS task',0 boot_setostask db 'Setting OS task',0
boot_allirqs db 'Unmasking all IRQs',0 boot_allirqs db 'Unmasking all IRQs',0
boot_tsc db 'Reading TSC',0 boot_tsc db 'Reading TSC',0
boot_cpufreq db 'CPU frequency is ',' ',' MHz',0 boot_cpufreq db 'CPU frequency is ',' ',' MHz',0
boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 ; boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0
boot_pal_vga db 'Setting VGA 640x480 palette',0 ; boot_pal_vga db 'Setting VGA 640x480 palette',0
boot_failed db 'Failed to start first app',0 boot_failed db 'Failed to start first app',0
boot_mtrr db 'Setting MTRR',0 boot_mtrr db 'Setting MTRR',0
boot_pcie_ok db 'PCIe config set OK',0 boot_pcie_ok db 'PCIe config set OK',0
boot_pcie_fail db 'PCIe config XXX failed XXX',0 boot_pcie_fail db 'PCIe config XXX failed XXX',0
if preboot_blogesc boot_rs7xx_fail db 'RS7xx config XXX failed XXX',0
boot_tasking db 'All set - press ESC to start',0 boot_rs7xx_blkd db 'RS7xx config ---------- FAILED -----------',0
end if if preboot_blogesc
boot_tasking db 'All set - press ESC to start',0
;new_process_loading db 'K : New Process - loading',13,10,0 end if
;new_process_running db 'K : New Process - done',13,10,0
start_not_enough_memory db 'K : New Process - not enough memory',13,10,0 ;new_process_loading db 'K : New Process - loading',13,10,0
;new_process_running db 'K : New Process - done',13,10,0
msg_unresolved db 'unresolved ',0 start_not_enough_memory db 'K : New Process - not enough memory',13,10,0
msg_module db 'in module ',0
msg_version db 'incompatible driver version',13,10,0 msg_unresolved db 'unresolved ',0
msg_www db 'please visit www.kolibrios.org',13,10,0 msg_module db 'in module ',0
msg_CR db 13,10,0 msg_version db 'incompatible driver version',13,10,0
aSis db 'SIS',0 msg_www db 'please visit www.kolibrios.org',13,10,0
msg_CR db 13,10,0
intel_str db "GenuineIntel",0 aSis db 'SIS',0
AMD_str db "AuthenticAMD",0
intel_str db "GenuineIntel",0
;szSound db 'SOUND',0 AMD_str db "AuthenticAMD",0
;szInfinity db 'INFINITY',0
szHwMouse db 'ATI2D',0 ;szSound db 'SOUND',0
szPS2MDriver db 'PS2MOUSE',0 ;szInfinity db 'INFINITY',0
;szCOM_MDriver db 'COM_MOUSE',0 szHwMouse db 'ATI2D',0
szUSB db 'USB',0 szPS2MDriver db 'PS2MOUSE',0
szAtiHW db '/rd/1/drivers/ati2d.drv',0 ;szCOM_MDriver db 'COM_MOUSE',0
szUSB db 'USB',0
szSTART db 'START',0 szAtiHW db '/rd/1/drivers/ati2d.drv',0
szEXPORTS db 'EXPORTS',0
sz_EXPORTS db '_EXPORTS',0 szSTART db 'START',0
szEXPORTS db 'EXPORTS',0
szIMPORTS db 'IMPORTS',0 sz_EXPORTS db '_EXPORTS',0
read_firstapp db '/sys/' szIMPORTS db 'IMPORTS',0
firstapp db 'LAUNCHER',0
read_firstapp db '/sys/'
char db '/sys/FONTS/CHAR.MT',0 firstapp db 'LAUNCHER',0
char2 db '/sys/FONTS/CHAR2.MT',0
char db '/sys/FONTS/CHAR.MT',0
bootpath db '/KOLIBRI ' char2 db '/sys/FONTS/CHAR2.MT',0
bootpath2 db 0
vmode db '/sys/drivers/VMODE.MDR',0 bootpath db '/KOLIBRI '
vrr_m db 'VRR_M',0 bootpath2 db 0
kernel_file db 'KERNEL MNT' vmode db '/sys/drivers/VMODE.MDR',0
vrr_m db 'VRR_M',0
kernel_file db 'KERNEL MNT'
align 4
shmem_list: align 4
.bk dd shmem_list
.fd dd shmem_list shmem_list:
.bk dd shmem_list
dll_list: .fd dd shmem_list
.bk dd dll_list
.fd dd dll_list dll_list:
.bk dd dll_list
MAX_DEFAULT_DLL_ADDR = 0x20000000 .fd dd dll_list
MIN_DEFAULT_DLL_ADDR = 0x10000000
dll_cur_addr dd MIN_DEFAULT_DLL_ADDR MAX_DEFAULT_DLL_ADDR = 0x20000000
MIN_DEFAULT_DLL_ADDR = 0x10000000
; supported videomodes dll_cur_addr dd MIN_DEFAULT_DLL_ADDR
; supported videomodes
; mike.dld {
db 0
dd servetable-0x10000 ; mike.dld {
draw_line dd __sys_draw_line db 0
draw_pointer dd __sys_draw_pointer dd servetable-0x10000
;//mike.dld, 2006-08-02 [ draw_line dd __sys_draw_line
;drawbar dd __sys_drawbar draw_pointer dd __sys_draw_pointer
drawbar dd __sys_drawbar.forced ;//mike.dld, 2006-08-02 [
;//mike.dld, 2006-08-02 ] ;drawbar dd __sys_drawbar
putpixel dd __sys_putpixel drawbar dd __sys_drawbar.forced
; } mike.dld ;//mike.dld, 2006-08-02 ]
putpixel dd __sys_putpixel
; } mike.dld
align 4
keyboard dd 1
syslang dd 1 align 4
keyboard dd 1
boot_y dd 10 syslang dd 1
pci_bios_entry dd 0 boot_y dd 10
dw pci_code_sel
pci_bios_entry dd 0
if __DEBUG__ eq 1 dw pci_code_sel
include_debug_strings
end if if __DEBUG__ eq 1
include_debug_strings
IncludeIGlobals end if
align 16 IncludeIGlobals
gdts:
align 16
dw gdte-$-1 gdts:
dd gdts
dw 0 dw gdte-$-1
dd gdts
; Attention! Do not change the order of the first four selectors. They are used in Fast System Call dw 0
; must be : os_code, os_data, app_code, app_data, ....
; Attention! Do not change the order of the first four selectors. They are used in Fast System Call
int_code_l: ; must be : os_code, os_data, app_code, app_data, ....
os_code_l:
dw 0xffff int_code_l:
dw 0x0000 os_code_l:
db 0x00 dw 0xffff
dw 11011111b *256 +10011010b dw 0x0000
db 0x00 db 0x00
dw 11011111b *256 +10011010b
int_data_l: db 0x00
os_data_l:
dw 0xffff int_data_l:
dw 0x0000 os_data_l:
db 0x00 dw 0xffff
dw 11011111b *256 +10010010b dw 0x0000
db 0x00 db 0x00
dw 11011111b *256 +10010010b
app_code_l: db 0x00
dw 0xFFFF
dw 0 app_code_l:
db 0 dw 0xFFFF
db cpl3 dw 0
dw G32+D32+0xF; db 0
db cpl3
app_data_l: dw G32+D32+0xF;
dw 0xFFFF
dw 0 app_data_l:
db 0 dw 0xFFFF
db drw3 dw 0
dw G32+D32+0xF; db 0
db drw3
; ------------- PCI BIOS ------------------ dw G32+D32+0xF;
pci_code_32: ; ------------- PCI BIOS ------------------
dw 0 ;lim 0-15
dw 0 ;base 0-15 pci_code_32:
db 0 ;base 16-23 dw 0 ;lim 0-15
db cpl0 ;type dw 0 ;base 0-15
db D32 ;lim 16-19+props db 0 ;base 16-23
db 0 ;base 24-31 db cpl0 ;type
db D32 ;lim 16-19+props
pci_data_32: db 0 ;base 24-31
dw 0 ;lim 0-15
dw 0 ;base 0-15 pci_data_32:
db 0 ;base 16-23 dw 0 ;lim 0-15
db dpl0 ;type dw 0 ;base 0-15
db D32 ;lim 16-19+props db 0 ;base 16-23
db 0 ;base 24-31 db dpl0 ;type
db D32 ;lim 16-19+props
; --------------- APM --------------------- db 0 ;base 24-31
apm_code_32:
dw 0x0f ; limit 64kb ; --------------- APM ---------------------
db 0, 0, 0 apm_code_32:
dw 11010000b *256 +10011010b dw 0x0f ; limit 64kb
db 0x00 db 0, 0, 0
apm_code_16: dw 11010000b *256 +10011010b
dw 0x0f db 0x00
db 0, 0, 0 apm_code_16:
dw 10010000b *256 +10011010b dw 0x0f
db 0x00 db 0, 0, 0
apm_data_16: dw 10010000b *256 +10011010b
dw 0x0f db 0x00
db 0, 0, 0 apm_data_16:
dw 10010000b *256 +10010010b dw 0x0f
db 0x00 db 0, 0, 0
; ----------------------------------------- dw 10010000b *256 +10010010b
db 0x00
graph_data_l: ; -----------------------------------------
dw 0x7ff graph_data_l:
dw 0x0000
db 0x00 dw 0x7ff
dw 11010000b *256 +11110010b dw 0x0000
db 0x00 db 0x00
tss0_l: dw 11010000b *256 +11110010b
dw TSS_SIZE-1 db 0x00
dw tss and 0xFFFF tss0_l:
db (tss shr 16) and 0xFF dw TSS_SIZE-1
db 10001001b dw tss and 0xFFFF
dw (tss shr 16) and 0xFF00 db (tss shr 16) and 0xFF
db 10001001b
tls_data_l: dw (tss shr 16) and 0xFF00
dw 0x0FFF
dw 0 tls_data_l:
db 0 dw 0x0FFF
db drw3 dw 0
dw D32 db 0
db drw3
endofcode: dw D32
gdte:
endofcode:
align 16 gdte:
cur_saved_data rb 4096
fpu_data: rb 512 align 16
cur_saved_data rb 4096
; device irq owners fpu_data: rb 512
irq_owner rd 16 ; process id
; device irq owners
; on irq read ports irq_owner rd 16 ; process id
irq00read rd 16 ; on irq read ports
irq01read rd 16
irq02read rd 16 irq00read rd 16
irq03read rd 16 irq01read rd 16
irq04read rd 16 irq02read rd 16
irq05read rd 16 irq03read rd 16
irq06read rd 16 irq04read rd 16
irq07read rd 16 irq05read rd 16
irq08read rd 16 irq06read rd 16
irq09read rd 16 irq07read rd 16
irq10read rd 16 irq08read rd 16
irq11read rd 16 irq09read rd 16
irq12read rd 16 irq10read rd 16
irq13read rd 16 irq11read rd 16
irq14read rd 16 irq12read rd 16
irq15read rd 16 irq13read rd 16
irq14read rd 16
irq_tab rd 16 irq15read rd 16
mem_block_map rb 512 irq_tab rd 16
mem_block_list rd 64
large_block_list rd 31 mem_block_map rb 512
mem_block_mask rd 2 mem_block_list rd 64
large_block_mask rd 1 large_block_list rd 31
mem_block_mask rd 2
mem_used.fd rd 1 large_block_mask rd 1
mem_used.bk rd 1
mem_used.fd rd 1
mem_block_arr rd 1 mem_used.bk rd 1
mem_block_start rd 1
mem_block_end rd 1 mem_block_arr rd 1
mem_block_start rd 1
heap_mutex rd 1 mem_block_end rd 1
heap_size rd 1
heap_free rd 1 heap_mutex rd 1
heap_blocks rd 1 heap_size rd 1
free_blocks rd 1 heap_free rd 1
heap_blocks rd 1
mst MEM_STATE free_blocks rd 1
page_start rd 1 mst MEM_STATE
page_end rd 1
sys_page_map rd 1 page_start rd 1
os_stack_seg rd 1 page_end rd 1
sys_page_map rd 1
os_stack_seg rd 1
srv.fd rd 1
srv.bk rd 1
srv.fd rd 1
srv.bk rd 1
align 16
_display display_t align 16
_WinMapAddress rd 1 _display display_t
_WinMapSize rd 1
_WinMapAddress rd 1
def_cursor rd 1 _WinMapSize rd 1
current_cursor rd 1
hw_cursor rd 1 def_cursor rd 1
cur_saved_base rd 1 current_cursor rd 1
hw_cursor rd 1
cur.lock rd 1 ;1 - lock update, 2- hide cur_saved_base rd 1
cur.left rd 1 ;cursor clip box
cur.top rd 1 cur.lock rd 1 ;1 - lock update, 2- hide
cur.right rd 1 cur.left rd 1 ;cursor clip box
cur.bottom rd 1 cur.top rd 1
cur.w rd 1 cur.right rd 1
cur.h rd 1 cur.bottom rd 1
cur.w rd 1
ipc_tmp rd 1 cur.h rd 1
ipc_pdir rd 1
ipc_ptab rd 1 ipc_tmp rd 1
ipc_pdir rd 1
proc_mem_map rd 1 ipc_ptab rd 1
proc_mem_pdir rd 1
proc_mem_tab rd 1 proc_mem_map rd 1
proc_mem_pdir rd 1
tmp_task_pdir rd 1 proc_mem_tab rd 1
tmp_task_ptab rd 1
tmp_task_pdir rd 1
default_io_map rd 1 tmp_task_ptab rd 1
LFBSize rd 1 default_io_map rd 1
stall_mcs rd 1 LFBSize rd 1
current_slot rd 1
stall_mcs rd 1
; status current_slot rd 1
hd1_status rd 1 ; 0 - free : other - pid
application_table_status rd 1 ; 0 - free : other - pid ; status
hd1_status rd 1 ; 0 - free : other - pid
; device addresses application_table_status rd 1 ; 0 - free : other - pid
mididp rd 1
midisp rd 1 ; device addresses
mididp rd 1
cdbase rd 1 midisp rd 1
cdid rd 1
cdbase rd 1
hdbase rd 1 ; for boot 0x1f0 cdid rd 1
hdid rd 1
hdpos rd 1 ; for boot 0x1 hdbase rd 1 ; for boot 0x1f0
label known_part dword hdid rd 1
fat32part rd 1 ; for boot 0x1 hdpos rd 1 ; for boot 0x1
cdpos rd 1 label known_part dword
fat32part rd 1 ; for boot 0x1
;CPUID information cdpos rd 1
cpu_vendor rd 3
cpu_sign rd 1 ;CPUID information
cpu_info rd 1 cpu_vendor rd 3
cpu_caps rd 4 cpu_sign rd 1
cpu_info rd 1
cpu_caps rd 4
pg_data PG_DATA
heap_test rd 1
pg_data PG_DATA
buttontype rd 1 heap_test rd 1
windowtypechanged rd 1
buttontype rd 1
hd_entries rd 1 ;unused ? 0xfe10 windowtypechanged rd 1
;* start code - Mario79 hd_entries rd 1 ;unused ? 0xfe10
mouse_active rd 1 ;* start code - Mario79
mouse_pause rd 1
MouseTickCounter rd 1 mouse_active rd 1
mouse_pause rd 1
;* end code - Mario79 MouseTickCounter rd 1
img_background rd 1 ;* end code - Mario79
mem_BACKGROUND rd 1
static_background_data rd 1 img_background rd 1
mem_BACKGROUND rd 1
cache_ide0: static_background_data rd 1
cache_ide0_pointer rd 1
cache_ide0_size rd 1 ; not use cache_ide0:
cache_ide0_data_pointer rd 1 cache_ide0_pointer rd 1
cache_ide0_system_data_size rd 1 ; not use cache_ide0_size rd 1 ; not use
cache_ide0_appl_data_size rd 1 ; not use cache_ide0_data_pointer rd 1
cache_ide0_system_data rd 1 cache_ide0_system_data_size rd 1 ; not use
cache_ide0_appl_data rd 1 cache_ide0_appl_data_size rd 1 ; not use
cache_ide0_system_sad_size rd 1 cache_ide0_system_data rd 1
cache_ide0_appl_sad_size rd 1 cache_ide0_appl_data rd 1
cache_ide0_search_start rd 1 cache_ide0_system_sad_size rd 1
cache_ide0_appl_search_start rd 1 cache_ide0_appl_sad_size rd 1
cache_ide0_search_start rd 1
cache_ide1: cache_ide0_appl_search_start rd 1
cache_ide1_pointer rd 1
cache_ide1_size rd 1 ; not use cache_ide1:
cache_ide1_data_pointer rd 1 cache_ide1_pointer rd 1
cache_ide1_system_data_size rd 1 ; not use cache_ide1_size rd 1 ; not use
cache_ide1_appl_data_size rd 1 ; not use cache_ide1_data_pointer rd 1
cache_ide1_system_data rd 1 cache_ide1_system_data_size rd 1 ; not use
cache_ide1_appl_data rd 1 cache_ide1_appl_data_size rd 1 ; not use
cache_ide1_system_sad_size rd 1 cache_ide1_system_data rd 1
cache_ide1_appl_sad_size rd 1 cache_ide1_appl_data rd 1
cache_ide1_search_start rd 1 cache_ide1_system_sad_size rd 1
cache_ide1_appl_search_start rd 1 cache_ide1_appl_sad_size rd 1
cache_ide1_search_start rd 1
cache_ide2: cache_ide1_appl_search_start rd 1
cache_ide2_pointer rd 1
cache_ide2_size rd 1 ; not use cache_ide2:
cache_ide2_data_pointer rd 1 cache_ide2_pointer rd 1
cache_ide2_system_data_size rd 1 ; not use cache_ide2_size rd 1 ; not use
cache_ide2_appl_data_size rd 1 ; not use cache_ide2_data_pointer rd 1
cache_ide2_system_data rd 1 cache_ide2_system_data_size rd 1 ; not use
cache_ide2_appl_data rd 1 cache_ide2_appl_data_size rd 1 ; not use
cache_ide2_system_sad_size rd 1 cache_ide2_system_data rd 1
cache_ide2_appl_sad_size rd 1 cache_ide2_appl_data rd 1
cache_ide2_search_start rd 1 cache_ide2_system_sad_size rd 1
cache_ide2_appl_search_start rd 1 cache_ide2_appl_sad_size rd 1
cache_ide2_search_start rd 1
cache_ide3: cache_ide2_appl_search_start rd 1
cache_ide3_pointer rd 1
cache_ide3_size rd 1 ; not use cache_ide3:
cache_ide3_data_pointer rd 1 cache_ide3_pointer rd 1
cache_ide3_system_data_size rd 1 ; not use cache_ide3_size rd 1 ; not use
cache_ide3_appl_data_size rd 1 ; not use cache_ide3_data_pointer rd 1
cache_ide3_system_data rd 1 cache_ide3_system_data_size rd 1 ; not use
cache_ide3_appl_data rd 1 cache_ide3_appl_data_size rd 1 ; not use
cache_ide3_system_sad_size rd 1 cache_ide3_system_data rd 1
cache_ide3_appl_sad_size rd 1 cache_ide3_appl_data rd 1
cache_ide3_search_start rd 1 cache_ide3_system_sad_size rd 1
cache_ide3_appl_search_start rd 1 cache_ide3_appl_sad_size rd 1
cache_ide3_search_start rd 1
debug_step_pointer rd 1 cache_ide3_appl_search_start rd 1
hdd_appl_data rb 1 ; 0 = system cache, 1 - application cache
cd_appl_data rb 1 ; 0 = system cache, 1 - application cache debug_step_pointer rd 1
hdd_appl_data rb 1 ; 0 = system cache, 1 - application cache
lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled cd_appl_data rb 1 ; 0 = system cache, 1 - application cache
pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled
timer_ticks_enable rb 1 ; for cd driver lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled
pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled
NumBiosDisks rd 1 timer_ticks_enable rb 1 ; for cd driver
BiosDisksData rb 200h
BiosDiskCaches rb 80h*(cache_ide1-cache_ide0) NumBiosDisks rd 1
BiosDiskPartitions rd 80h BiosDisksData rb 200h
BiosDiskCaches rb 80h*(cache_ide1-cache_ide0)
IncludeUGlobals BiosDiskPartitions rd 80h
IncludeUGlobals

View File

@ -313,11 +313,11 @@ high_code:
; init selectors ; init selectors
mov ebx,[BOOT_VAR+0x9040] ; offset of APM entry point mov ebx,[BOOT_VAR+0x9040] ; offset of APM entry point
movzx eax,word [BOOT_VAR+0x9050] ; real-mode segment base address of movzx eax,word [BOOT_VAR+0x9050] ; real-mode segment base address of
; protected-mode 32-bit code segment ; protected-mode 32-bit code segment
movzx ecx,word [BOOT_VAR+0x9052] ; real-mode segment base address of movzx ecx,word [BOOT_VAR+0x9052] ; real-mode segment base address of
; protected-mode 16-bit code segment ; protected-mode 16-bit code segment
movzx edx,word [BOOT_VAR+0x9054] ; real-mode segment base address of movzx edx,word [BOOT_VAR+0x9054] ; real-mode segment base address of
; protected-mode 16-bit data segment ; protected-mode 16-bit data segment
shl eax, 4 shl eax, 4
mov [dword apm_code_32 + 2], ax mov [dword apm_code_32 + 2], ax
@ -390,70 +390,56 @@ high_code:
mov eax,[BOOT_VAR+0x9018] mov eax,[BOOT_VAR+0x9018]
mov [LFBAddress],eax mov [LFBAddress],eax
;== cmp [SCR_MODE],word 0100000000000000b ;==
; jge setvesa20 cmp [SCR_MODE],word 0100000000000000b
; cmp [SCR_MODE],word 0x13 jge setvesa20
; je v20ga32 mov eax, 0xDEADBEEF
; mov [PUTPIXEL],dword Vesa12_putpixel24 ; Vesa 1.2 hlt
; mov [GETPIXEL],dword Vesa12_getpixel24 ; === EGA, VGA & Vesa 1.2 modes not supported ===
; cmp [ScreenBPP],byte 24
; jz ga24
; mov [PUTPIXEL],dword Vesa12_putpixel32
; mov [GETPIXEL],dword Vesa12_getpixel32
; ga24:
; jmp v20ga24
setvesa20: setvesa20:
; mov [PUTPIXEL],dword Vesa20_putpixel24 ; Vesa 2.0 ; mov [PUTPIXEL],dword Vesa20_putpixel24 ; Vesa 2.0 24bpp modes
; mov [GETPIXEL],dword Vesa20_getpixel24 ; mov [GETPIXEL],dword Vesa20_getpixel24
; cmp [ScreenBPP],byte 24 ; cmp [ScreenBPP],byte 24
; jz v20ga24 ; jz v20ga24
v20ga32: v20ga32:
mov [PUTPIXEL],dword Vesa20_putpixel32 mov [PUTPIXEL],dword Vesa20_putpixel32
mov [GETPIXEL],dword Vesa20_getpixel32 mov [GETPIXEL],dword Vesa20_getpixel32
; v20ga24:
; cmp [SCR_MODE],word 0x12 ; 16 C VGA 640x480
; jne no_mode_0x12
; mov [PUTPIXEL],dword VGA_putpixel
; mov [GETPIXEL],dword Vesa20_getpixel32
no_mode_0x12:
; -------- Fast System Call init ---------- ; -------- Fast System Call init ----------
; Intel SYSENTER/SYSEXIT (AMD CPU support it too) ; Intel SYSENTER/SYSEXIT (AMD CPU support it too)
bt [cpu_caps], CAPS_SEP ; bt [cpu_caps], CAPS_SEP
jnc .SEnP ; SysEnter not Present ; jnc .SEnP ; SysEnter not Present
xor edx, edx ; xor edx, edx
mov ecx, MSR_SYSENTER_CS ; mov ecx, MSR_SYSENTER_CS
mov eax, os_code ; mov eax, os_code
wrmsr ; wrmsr
mov ecx, MSR_SYSENTER_ESP ; mov ecx, MSR_SYSENTER_ESP
; mov eax, sysenter_stack ; Check it ;; mov eax, sysenter_stack ; Check it
xor eax, eax ; xor eax, eax
wrmsr ; wrmsr
mov ecx, MSR_SYSENTER_EIP ; mov ecx, MSR_SYSENTER_EIP
mov eax, sysenter_entry ; mov eax, sysenter_entry
wrmsr ; wrmsr
.SEnP: .SEnP:
; AMD SYSCALL/SYSRET ; AMD SYSCALL/SYSRET
cmp byte[cpu_vendor], 'A' ; cmp byte[cpu_vendor], 'A'
jne .noSYSCALL ; jne .noSYSCALL
mov eax, 0x80000001 ; mov eax, 0x80000001
cpuid ; cpuid
test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support ; test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support
jz .noSYSCALL ; jz .noSYSCALL
mov ecx, MSR_AMD_EFER mov ecx, MSR_AMD_EFER
rdmsr rdmsr
or eax, 1 ; bit_0 - System Call Extension (SCE) or eax, 1 ; bit_0 - System Call Extension (SCE)
wrmsr wrmsr
; !!!! It`s dirty hack, fix it !!!
; Bits of EDX : ; Bits of EDX :
; Bit 3116 During the SYSRET instruction, this field is copied into the CS register ; Bit 3116 During the SYSRET instruction, this field is copied into the CS register
; and the contents of this field, plus 8, are copied into the SS register. ; and the contents of this field, plus 8, are copied into the SS register.
; Bit 150 During the SYSCALL instruction, this field is copied into the CS register ; Bit 150 During the SYSCALL instruction, this field is copied into the CS register
; and the contents of this field, plus 8, are copied into the SS register. ; and the contents of this field, plus 8, are copied into the SS register.
; mov edx, (os_code + 16) * 65536 + os_code mov edx, 0x1B000B ; RING3 task stack will be used for fast syscalls!
mov edx, 0x1B0008
mov eax, syscall_entry mov eax, syscall_entry
mov ecx, MSR_AMD_STAR mov ecx, MSR_AMD_STAR
@ -461,7 +447,7 @@ high_code:
.noSYSCALL: .noSYSCALL:
; ----------------------------------------- ; -----------------------------------------
stdcall alloc_page stdcall alloc_page
stdcall map_page, tss-0xF80, eax, PG_SW stdcall map_page, tss-0xF80, eax, PG_SW ; lower 0xF80 bytes might be used for something
stdcall alloc_page stdcall alloc_page
inc eax inc eax
mov [SLOT_BASE+256+APPDATA.io_map], eax mov [SLOT_BASE+256+APPDATA.io_map], eax
@ -495,9 +481,10 @@ high_code:
;Add IO access table - bit array of permitted ports ;Add IO access table - bit array of permitted ports
mov edi, tss._io_map_0 mov edi, tss._io_map_0
xor eax, eax xor eax, eax
not eax mov ecx, 2047
mov ecx, 8192/4 rep stosd ; access to 65504 ports granted
rep stosd ; access to 4096*8=65536 ports not eax ; the last 32 ports blocked
stosd
mov ax,tss0 mov ax,tss0
ltr ax ltr ax
@ -694,11 +681,6 @@ end if
call boot_log call boot_log
call reserve_irqs_ports call reserve_irqs_ports
; SET PORTS FOR IRQ HANDLERS
;mov esi,boot_setrports
;call boot_log
;call setirqreadports
; SET UP OS TASK ; SET UP OS TASK
@ -845,8 +827,10 @@ end if
call set_network_conf call set_network_conf
no_st_network: no_st_network:
call init_userDMA ; <<<<<<<<< ================ core/memory.inc ======================================== call init_userDMA ; <<<<<<<<< ============== core/memory.inc =================
call pci_ext_config ; <<<<<<<<< bus/pci/pcie.inc ; call pci_ext_config ; <<<<<<<<< bus/pci/pcie.inc
;-------------------------------------------------------------------------------
call rs7xx_pcie_init ; <<<<<<<<< bus/ht.inc
; LOAD FIRST APPLICATION ; LOAD FIRST APPLICATION
cli cli
@ -1097,59 +1081,12 @@ include "kernel32.inc"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
reserve_irqs_ports: reserve_irqs_ports:
; removed
push eax
xor eax,eax
inc eax
mov byte [irq_owner+4*0],al ;1 ; timer
;mov [irq_owner+4*1], 1 ; keyboard
mov byte [irq_owner+4*6],al ;1 ; floppy diskette
mov byte [irq_owner+4*13],al ;1 ; math co-pros
mov byte [irq_owner+4*14],al ;1 ; ide I
mov byte [irq_owner+4*15],al ;1 ; ide II
pop eax
; RESERVE PORTS
push 4
pop dword [RESERVED_PORTS] ;,edi
push 1
pop dword [RESERVED_PORTS+16+0] ;,dword 1
and dword [RESERVED_PORTS+16+4],0 ;,dword 0x0
mov dword [RESERVED_PORTS+16+8],0x2d ;,dword 0x2d
push 1
pop dword [RESERVED_PORTS+32+0] ;,dword 1
push 0x30
pop dword [RESERVED_PORTS+32+4] ;,dword 0x30
push 0x4d
pop dword [RESERVED_PORTS+32+8] ;,dword 0x4d
push 1
pop dword [RESERVED_PORTS+48+0] ;,dword 1
push 0x50
pop dword [RESERVED_PORTS+48+4] ;,dword 0x50
mov dword [RESERVED_PORTS+48+8],0xdf ;,dword 0xdf
push 1
pop dword [RESERVED_PORTS+64+0] ;,dword 1
mov dword [RESERVED_PORTS+64+4],0xe5 ;,dword 0xe5
mov dword [RESERVED_PORTS+64+8],0xff ;,dword 0xff
ret ret
setirqreadports: setirqreadports:
; removed
mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte ret
and dword [irq12read+4],0 ; end of port list
; mov [irq12read+4],dword 0 ; end of port list
;mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte
;mov [irq04read+4],dword 0 ; end of port list
;mov [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte
;mov [irq03read+4],dword 0 ; end of port list
ret
iglobal iglobal
process_number dd 0x1 process_number dd 0x1
@ -1185,60 +1122,7 @@ set_variables:
align 4 align 4
;input eax=43,bl-byte of output, ecx - number of port ;input eax=43,bl-byte of output, ecx - number of port
sys_outport: sys_outport:
and [esp+32],dword 1 ; for backward compatibility: operation failed
mov edi,ecx ; separate flag for read / write
and ecx,65535
mov eax,[RESERVED_PORTS]
test eax,eax
jnz .sopl8
inc eax
mov [esp+32],eax
ret
.sopl8:
mov edx,[TASK_BASE]
mov edx,[edx+0x4]
;and ecx,65535
;cld - set on interrupt 0x40
.sopl1:
mov esi,eax
shl esi,4
add esi,RESERVED_PORTS
cmp edx,[esi+0]
jne .sopl2
cmp ecx,[esi+4]
jb .sopl2
cmp ecx,[esi+8]
jg .sopl2
.sopl3:
test edi,0x80000000 ; read ?
jnz .sopl4
mov eax,ebx
mov dx,cx ; write
out dx,al
and [esp+32],dword 0
ret
.sopl2:
dec eax
jnz .sopl1
inc eax
mov [esp+32],eax
ret
.sopl4:
mov dx,cx ; read
in al,dx
and eax,0xff
and [esp+32],dword 0
mov [esp+20],eax
ret ret
display_number: display_number:
@ -3462,269 +3346,25 @@ memmove: ; memory move in bytes
align 4 align 4
sys_programirq: sys_programirq:
; removed
mov eax, [TASK_BASE] mov dword [esp+32], 1 ; operation failed
add ebx, [eax + TASKDATA.mem_start]
cmp ecx, 16
jae .not_owner
mov edi, [eax + TASKDATA.pid]
cmp edi, [irq_owner + 4 * ecx]
je .spril1
.not_owner:
xor ecx, ecx
inc ecx
jmp .end
.spril1:
shl ecx, 6
mov esi, ebx
lea edi, [irq00read + ecx]
push 16
pop ecx
cld
rep movsd
.end:
mov [esp+32], ecx
ret ret
align 4 align 4
get_irq_data: get_irq_data:
movzx esi, bh ; save number of subfunction, if bh = 1, return data size, otherwise, read data ; removed
xor bh, bh mov dword [esp+32], -1
cmp ebx, 16
jae .not_owner
mov edx, [4 * ebx + irq_owner] ; check for irq owner
mov eax,[TASK_BASE]
cmp edx,[eax+TASKDATA.pid]
je gidril1
.not_owner:
xor edx, edx
dec edx
jmp gid1
gidril1:
shl ebx, 12
lea eax, [ebx + IRQ_SAVE] ; calculate address of the beginning of buffer + 0x0 - data size
mov edx, [eax] ; + 0x4 - data offset
dec esi
jz gid1
test edx, edx ; check if buffer is empty
jz gid1
mov ebx, [eax + 0x4]
mov edi, ecx
mov ecx, 4000 ; buffer size, used frequently
cmp ebx, ecx ; check for the end of buffer, if end of buffer, begin cycle again
jb @f
xor ebx, ebx
@@:
lea esi, [ebx + edx] ; calculate data size and offset
cld
cmp esi, ecx ; if greater than the buffer size, begin cycle again
jbe @f
sub ecx, ebx
sub edx, ecx
lea esi, [eax + ebx + 0x10]
rep movsb
xor ebx, ebx
@@:
lea esi, [eax + ebx + 0x10]
mov ecx, edx
add ebx, edx
rep movsb
mov edx, [eax]
mov [eax], ecx ; set data size to zero
mov [eax + 0x4], ebx ; set data offset
gid1:
mov [esp+32], edx ; eax
ret ret
set_io_access_rights: set_io_access_rights:
push edi eax ;removed
mov edi, tss._io_map_0
; mov ecx,eax
; and ecx,7 ; offset in byte
; shr eax,3 ; number of byte
; add edi,eax
; mov ebx,1
; shl ebx,cl
test ebp,ebp
; cmp ebp,0 ; enable access - ebp = 0
jnz siar1
; not ebx
; and [edi],byte bl
btr [edi], eax
pop eax edi
ret ret
siar1:
bts [edi], eax
; or [edi],byte bl ; disable access - ebp = 1
pop eax edi
ret
;reserve/free group of ports
; * eax = 46 - number function
; * ebx = 0 - reserve, 1 - free
; * ecx = number start arrea of ports
; * edx = number end arrea of ports (include last number of port)
;Return value:
; * eax = 0 - succesful
; * eax = 1 - error
; * The system has reserve this ports:
; 0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (include last number of port).
;destroys eax,ebx, ebp
r_f_port_area: r_f_port_area:
; removed; always returns 0
test ebx, ebx
jnz free_port_area
; je r_port_area
; jmp free_port_area
; r_port_area:
; pushad
cmp ecx,edx ; beginning > end ?
ja rpal1
cmp edx,65536
jae rpal1
mov eax,[RESERVED_PORTS]
test eax,eax ; no reserved areas ?
je rpal2
cmp eax,255 ; max reserved
jae rpal1
rpal3:
mov ebx,eax
shl ebx,4
add ebx,RESERVED_PORTS
cmp ecx,[ebx+8]
ja rpal4
cmp edx,[ebx+4]
jae rpal1
; jb rpal4
; jmp rpal1
rpal4:
dec eax
jnz rpal3
jmp rpal2
rpal1:
; popad
; mov eax,1
xor eax,eax
inc eax
ret
rpal2:
; popad
; enable port access at port IO map
cli
pushad ; start enable io map
cmp edx,65536 ;16384
jae no_unmask_io ; jge
mov eax,ecx
; push ebp
xor ebp,ebp ; enable - eax = port
new_port_access:
; pushad
call set_io_access_rights
; popad
inc eax
cmp eax,edx
jbe new_port_access
; pop ebp
no_unmask_io:
popad ; end enable io map
sti
mov eax,[RESERVED_PORTS]
add eax,1
mov [RESERVED_PORTS],eax
shl eax,4
add eax,RESERVED_PORTS
mov ebx,[TASK_BASE]
mov ebx,[ebx+TASKDATA.pid]
mov [eax],ebx
mov [eax+4],ecx
mov [eax+8],edx
xor eax, eax
ret
free_port_area:
; pushad
mov eax,[RESERVED_PORTS] ; no reserved areas ?
test eax,eax
jz frpal2
mov ebx,[TASK_BASE]
mov ebx,[ebx+TASKDATA.pid]
frpal3:
mov edi,eax
shl edi,4
add edi,RESERVED_PORTS
cmp ebx,[edi]
jne frpal4
cmp ecx,[edi+4]
jne frpal4
cmp edx,[edi+8]
jne frpal4
jmp frpal1
frpal4:
dec eax
jnz frpal3
frpal2:
; popad
inc eax
ret
frpal1:
push ecx
mov ecx,256
sub ecx,eax
shl ecx,4
mov esi,edi
add esi,16
cld
rep movsb
dec dword [RESERVED_PORTS]
;popad
;disable port access at port IO map
; pushad ; start disable io map
pop eax ;start port
cmp edx,65536 ;16384
jge no_mask_io
; mov eax,ecx
xor ebp,ebp
inc ebp
new_port_access_disable:
; pushad
; mov ebp,1 ; disable - eax = port
call set_io_access_rights
; popad
inc eax
cmp eax,edx
jbe new_port_access_disable
no_mask_io:
; popad ; end disable io map
xor eax, eax xor eax, eax
ret ret

View File

@ -1,311 +1,312 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;; KERNEL32.INC ;; ;; KERNEL32.INC ;;
;; ;; ;; ;;
;; Included 32 bit kernel files for MenuetOS ;; ;; Included 32 bit kernel files for MenuetOS ;;
;; ;; ;; ;;
;; This file is kept separate as it will be easier to ;; ;; This file is kept separate as it will be easier to ;;
;; maintain and compile with an automated SETUP program ;; ;; maintain and compile with an automated SETUP program ;;
;; in the future. ;; ;; in the future. ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$ $Revision$
;struc db [a] { common . db a ;struc db [a] { common . db a
; if ~used . ; if ~used .
; display 'not used db: ',`.,13,10 ; display 'not used db: ',`.,13,10
; end if } ; end if }
;struc dw [a] { common . dw a ;struc dw [a] { common . dw a
; if ~used . ; if ~used .
; display 'not used dw: ',`.,13,10 ; display 'not used dw: ',`.,13,10
; end if } ; end if }
;struc dd [a] { common . dd a ;struc dd [a] { common . dd a
; if ~used . ; if ~used .
; display 'not used dd: ',`.,13,10 ; display 'not used dd: ',`.,13,10
; end if } ; end if }
;struc dp [a] { common . dp a ;struc dp [a] { common . dp a
; if ~used . ; if ~used .
; display 'not used dp: ',`.,13,10 ; display 'not used dp: ',`.,13,10
; end if } ; end if }
;struc dq [a] { common . dq a ;struc dq [a] { common . dq a
; if ~used . ; if ~used .
; display 'not used dq: ',`.,13,10 ; display 'not used dq: ',`.,13,10
; end if } ; end if }
;struc dt [a] { common . dt a ;struc dt [a] { common . dt a
; if ~used . ; if ~used .
; display 'not used dt: ',`.,13,10 ; display 'not used dt: ',`.,13,10
; end if } ; end if }
struc POINT { struc POINT {
.x dd ? .x dd ?
.y dd ? .y dd ?
.sizeof: .sizeof:
} }
virtual at 0 virtual at 0
POINT POINT POINT POINT
end virtual end virtual
struc RECT { struc RECT {
.left dd ? .left dd ?
.top dd ? .top dd ?
.right dd ? .right dd ?
.bottom dd ? .bottom dd ?
.sizeof: .sizeof:
} }
virtual at 0 virtual at 0
RECT RECT RECT RECT
end virtual end virtual
struc BOX { struc BOX {
.left dd ? .left dd ?
.top dd ? .top dd ?
.width dd ? .width dd ?
.height dd ? .height dd ?
.sizeof: .sizeof:
} }
virtual at 0 virtual at 0
BOX BOX BOX BOX
end virtual end virtual
struc DISPMODE { struc DISPMODE {
.width rw 1 .width rw 1
.height rw 1 .height rw 1
.bpp rw 1 .bpp rw 1
.freq rw 1 .freq rw 1
} }
; constants definition ; constants definition
WSTATE_NORMAL = 00000000b WSTATE_NORMAL = 00000000b
WSTATE_MAXIMIZED = 00000001b WSTATE_MAXIMIZED = 00000001b
WSTATE_MINIMIZED = 00000010b WSTATE_MINIMIZED = 00000010b
WSTATE_ROLLEDUP = 00000100b WSTATE_ROLLEDUP = 00000100b
WSTATE_REDRAW = 00000001b WSTATE_REDRAW = 00000001b
WSTATE_WNDDRAWN = 00000010b WSTATE_WNDDRAWN = 00000010b
WSTYLE_HASCAPTION = 00010000b WSTYLE_HASCAPTION = 00010000b
WSTYLE_CLIENTRELATIVE = 00100000b WSTYLE_CLIENTRELATIVE = 00100000b
struc TASKDATA struc TASKDATA
{ {
.event_mask dd ? .event_mask dd ?
.pid dd ? .pid dd ?
dw ? dw ?
.state db ? .state db ?
db ? db ?
dw ? dw ?
.wnd_number db ? .wnd_number db ?
db ? db ?
.mem_start dd ? .mem_start dd ?
.counter_sum dd ? .counter_sum dd ?
.counter_add dd ? .counter_add dd ?
.cpu_usage dd ? .cpu_usage dd ?
} }
virtual at 0 virtual at 0
TASKDATA TASKDATA TASKDATA TASKDATA
end virtual end virtual
TSTATE_RUNNING = 0 TSTATE_RUNNING = 0
TSTATE_RUN_SUSPENDED = 1 TSTATE_RUN_SUSPENDED = 1
TSTATE_WAIT_SUSPENDED = 2 TSTATE_WAIT_SUSPENDED = 2
TSTATE_ZOMBIE = 3 TSTATE_ZOMBIE = 3
TSTATE_TERMINATING = 4 TSTATE_TERMINATING = 4
TSTATE_WAITING = 5 TSTATE_WAITING = 5
TSTATE_FREE = 9 TSTATE_FREE = 9
; structures definition ; structures definition
struc WDATA { struc WDATA {
.box BOX .box BOX
.cl_workarea dd ? .cl_workarea dd ?
.cl_titlebar dd ? .cl_titlebar dd ?
.cl_frames dd ? .cl_frames dd ?
.reserved db ? .reserved db ?
.fl_wstate db ? .fl_wstate db ?
.fl_wdrawn db ? .fl_wdrawn db ?
.fl_redraw db ? .fl_redraw db ?
.sizeof: .sizeof:
} }
virtual at 0 virtual at 0
WDATA WDATA WDATA WDATA
end virtual end virtual
label WDATA.fl_wstyle byte at WDATA.cl_workarea + 3 label WDATA.fl_wstyle byte at WDATA.cl_workarea + 3
struc APPDATA struc APPDATA
{ {
.app_name db 11 dup(?) .app_name db 11 dup(?)
db 5 dup(?) db 5 dup(?)
.fpu_state dd ? ;+16 .fpu_state dd ? ;+16
.ev_count_ dd ? ;unused ;+20 .ev_count_ dd ? ;unused ;+20
.exc_handler dd ? ;+24 .exc_handler dd ? ;+24
.except_mask dd ? ;+28 .except_mask dd ? ;+28
.pl0_stack dd ? ;unused ;+32 .pl0_stack dd ? ;unused ;+32
.heap_base dd ? ;+36 .heap_base dd ? ;+36
.heap_top dd ? ;+40 .heap_top dd ? ;+40
.cursor dd ? ;+44 .cursor dd ? ;+44
.fd_ev dd ? ;+48 .fd_ev dd ? ;+48
.bk_ev dd ? ;+52 .bk_ev dd ? ;+52
.fd_obj dd ? ;+56 .fd_obj dd ? ;+56
.bk_obj dd ? ;+60 .bk_obj dd ? ;+60
.saved_esp dd ? ;+64 .saved_esp dd ? ;+64
.io_map rd 2 ;+68 .io_map rd 2 ;+68
.dbg_state dd ? ;+76 .dbg_state dd ? ;+76
.cur_dir dd ? ;+80 .cur_dir dd ? ;+80
.wait_timeout dd ? ;+84 .wait_timeout dd ? ;+84
.saved_esp0 dd ? ;+88 .saved_esp0 dd ? ;+88
.wait_begin dd ? ;+92 +++ .wait_begin dd ? ;+92 +++
.wait_test dd ? ;+96 +++ .wait_test dd ? ;+96 +++
.wait_param dd ? ;+100 +++ .wait_param dd ? ;+100 +++
.tls_base dd ? ;+104 .tls_base dd ? ;+104
.dlls_list_ptr dd ? ;+108 .dlls_list_ptr dd ? ;+108
db 16 dup(?) ;+112 db 16 dup(?) ;+112
.wnd_shape dd ? ;+128 .wnd_shape dd ? ;+128
.wnd_shape_scale dd ? ;+132 .wnd_shape_scale dd ? ;+132
dd ? ;+136 dd ? ;+136
.mem_size dd ? ;+140 .mem_size dd ? ;+140
.saved_box BOX .saved_box BOX
.ipc_start dd ? .ipc_start dd ?
.ipc_size dd ? .ipc_size dd ?
.event_mask dd ? .event_mask dd ?
.debugger_slot dd ? .debugger_slot dd ?
dd ? dd ?
.keyboard_mode db ? .keyboard_mode db ?
db 3 dup(?) db 3 dup(?)
.dir_table dd ? .dir_table dd ?
.dbg_event_mem dd ? .dbg_event_mem dd ?
.dbg_regs: .dbg_regs:
.dbg_regs.dr0 dd ? .dbg_regs.dr0 dd ?
.dbg_regs.dr1 dd ? .dbg_regs.dr1 dd ?
.dbg_regs.dr2 dd ? .dbg_regs.dr2 dd ?
.dbg_regs.dr3 dd ? .dbg_regs.dr3 dd ?
.dbg_regs.dr7 dd ? .dbg_regs.dr7 dd ?
.wnd_caption dd ? .wnd_caption dd ?
.wnd_clientbox BOX .wnd_clientbox BOX
} }
virtual at 0 virtual at 0
APPDATA APPDATA APPDATA APPDATA
end virtual end virtual
;// mike.dld, 2006-29-01 ] ;// mike.dld, 2006-29-01 ]
struc MUTEX struc MUTEX
{ {
.count rd 1 .count rd 1
.next rd 1 .next rd 1
.prev rd 1 .prev rd 1
} }
virtual at 0 virtual at 0
MUTEX MUTEX MUTEX MUTEX
end virtual end virtual
; Core functions ; Core functions
include "core/sync.inc" ; macros for synhronization objects include "core/sync.inc" ; macros for synhronization objects
include "core/sys32.inc" ; process management include "core/sys32.inc" ; process management
include "core/sched.inc" ; process scheduling include "core/sched.inc" ; process scheduling
include "core/syscall.inc" ; system call include "core/syscall.inc" ; system call
include "core/fpu.inc" ; all fpu/sse support include "core/fpu.inc" ; all fpu/sse support
include "core/memory.inc" include "core/memory.inc"
include "core/heap.inc" ; kernel and app heap include "core/heap.inc" ; kernel and app heap
include "core/malloc.inc" ; small kernel heap include "core/malloc.inc" ; small kernel heap
include "core/taskman.inc" include "core/taskman.inc"
include "core/dll.inc" include "core/dll.inc"
include "core/peload.inc" ; include "core/peload.inc" ;
include "core/exports.inc" include "core/exports.inc"
include "core/string.inc" include "core/string.inc"
include "core/v86.inc" ; virtual-8086 manager include "core/v86.inc" ; virtual-8086 manager
; GUI stuff ; GUI stuff
include "gui/window.inc" include "gui/window.inc"
include "gui/event.inc" include "gui/event.inc"
include "gui/font.inc" include "gui/font.inc"
include "gui/button.inc" include "gui/button.inc"
; shutdown ; shutdown
; file system ; file system
include "fs/fs.inc" ; syscall include "fs/fs.inc" ; syscall
include "fs/fat32.inc" ; read / write for fat32 filesystem include "fs/fat32.inc" ; read / write for fat32 filesystem
include "fs/ntfs.inc" ; read / write for ntfs filesystem include "fs/ntfs.inc" ; read / write for ntfs filesystem
include "fs/fat12.inc" ; read / write for fat12 filesystem include "fs/fat12.inc" ; read / write for fat12 filesystem
include "blkdev/rd.inc" ; ramdisk read /write include "blkdev/rd.inc" ; ramdisk read /write
include "fs/fs_lfn.inc" ; syscall, version 2 include "fs/fs_lfn.inc" ; syscall, version 2
include "fs/iso9660.inc" ; read for iso9660 filesystem CD include "fs/iso9660.inc" ; read for iso9660 filesystem CD
include "fs/ext2.inc" ; read / write for ext2 filesystem include "fs/ext2.inc" ; read / write for ext2 filesystem
; sound ; sound
include "sound/playnote.inc" ; player Note for Speaker PC include "sound/playnote.inc" ; player Note for Speaker PC
; display ; display
;include "video/vesa12.inc" ; Vesa 1.2 functions ;include "video/vesa12.inc" ; Vesa 1.2 functions
include "video/vesa20.inc" ; Vesa 2.0 functions include "video/vesa20.inc" ; Vesa 2.0 functions
include "video/vga.inc" ; VGA 16 color functions include "video/vga.inc" ; VGA 16 color functions
include "video/cursors.inc" ; cursors functions include "video/cursors.inc" ; cursors functions
; Network Interface & TCPIP Stack ; Network Interface & TCPIP Stack
include "network/stack.inc" include "network/stack.inc"
;include "drivers/uart.inc" ;include "drivers/uart.inc"
; Mouse pointer ; Mouse pointer
include "gui/mouse.inc" include "gui/mouse.inc"
; Window skinning ; Window skinning
include "gui/skincode.inc" include "gui/skincode.inc"
; Pci functions ; Pci functions
include "bus/pci/pci32.inc" include "bus/pci/pci32.inc"
include "bus/pci/pcie.inc" include "bus/pci/pcie.inc"
include "bus/ht.inc" ; AMD HyperTransport bus control
; Floppy drive controller
; Floppy drive controller
include "blkdev/fdc.inc"
include "blkdev/flp_drv.inc" include "blkdev/fdc.inc"
include "blkdev/flp_drv.inc"
; IDE cache
include "blkdev/ide_cache.inc" ; IDE cache
include "blkdev/ide_cache.inc"
; HD drive controller
include "blkdev/hd_drv.inc" ; HD drive controller
include "blkdev/hd_drv.inc"
; CD drive controller
; CD drive controller
include "blkdev/cdrom.inc"
include "blkdev/cd_drv.inc" include "blkdev/cdrom.inc"
include "blkdev/cd_drv.inc"
; Character devices
; Character devices
include "hid/keyboard.inc"
include "hid/mousedrv.inc" include "hid/keyboard.inc"
include "hid/mousedrv.inc"
; setting date,time,clock and alarm-clock
; setting date,time,clock and alarm-clock
include "hid/set_dtc.inc"
include "hid/set_dtc.inc"
;% -include
;% -include
;parser file names
include "fs/parse_fn.inc" ;parser file names
include "fs/parse_fn.inc"
; work with conf lib
include "core/conf_lib.inc" ; work with conf lib
include "core/conf_lib.inc"
; load external lib
include "core/ext_lib.inc" ; load external lib
include "core/ext_lib.inc"
; list of external functions
include "imports.inc" ; list of external functions
include "imports.inc"