From 24fbc88418e29a283b188afff88f25c4b0ed16c1 Mon Sep 17 00:00:00 2001 From: "Artem Jerdev (art_zh)" Date: Tue, 3 Aug 2010 13:07:43 +0000 Subject: [PATCH] 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 --- kernel/branches/Kolibri-A/trunk/bus/HT.INC | 144 +++ .../branches/Kolibri-A/trunk/bus/pci/PCIe.inc | 28 +- .../branches/Kolibri-A/trunk/core/syscall.inc | 137 +-- kernel/branches/Kolibri-A/trunk/data32.inc | 940 +++++++++--------- kernel/branches/Kolibri-A/trunk/kernel.asm | 460 +-------- kernel/branches/Kolibri-A/trunk/kernel32.inc | 623 ++++++------ 6 files changed, 1024 insertions(+), 1308 deletions(-) create mode 100644 kernel/branches/Kolibri-A/trunk/bus/HT.INC diff --git a/kernel/branches/Kolibri-A/trunk/bus/HT.INC b/kernel/branches/Kolibri-A/trunk/bus/HT.INC new file mode 100644 index 0000000000..dfed1222f5 --- /dev/null +++ b/kernel/branches/Kolibri-A/trunk/bus/HT.INC @@ -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 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +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 + + + diff --git a/kernel/branches/Kolibri-A/trunk/bus/pci/PCIe.inc b/kernel/branches/Kolibri-A/trunk/bus/pci/PCIe.inc index 358b270ef7..839427f136 100644 --- a/kernel/branches/Kolibri-A/trunk/bus/pci/PCIe.inc +++ b/kernel/branches/Kolibri-A/trunk/bus/pci/PCIe.inc @@ -28,12 +28,14 @@ $Revision: 1463 $ ; ;*************************************************************************** +align 4 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_pdes dw 0 ; number of PDEs to map the space +PCIe_bus_range dw 0 ; the Bus range: power-of-2 Megabytes align 4 - pci_ext_config: mov ebx, [mmio_pcie_cfg_addr] or ebx,ebx @@ -60,7 +62,7 @@ pci_ext_config: jz .no_pcie_cfg shl eax, 8 ; bus:[27..20], dev:[19:15] 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 ax, 0x0002 ; bus = 0, 1dword to read call pci_read_reg @@ -74,30 +76,14 @@ pci_ext_config: test eax, 0x000F0000 ; MMIO Base must be bus0-aligned jnz .no_pcie_cfg mov [mmio_pcie_cfg_addr], eax - add eax, 0x000FFFFC - sub eax,[mmio_pcie_cfg_lim] ; MMIO must cover at least one bus - ja .no_pcie_cfg +; add eax, 0x000FFFFC +; sub eax,[mmio_pcie_cfg_lim] ; MMIO must cover at least one bus +; ja .no_pcie_cfg ; -- 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: -; -- glad to have the extended PCIe config field found mov esi, boot_pcie_ok call boot_log ret ; <<<<<<<<<<< OK >>>>>>>>>>> diff --git a/kernel/branches/Kolibri-A/trunk/core/syscall.inc b/kernel/branches/Kolibri-A/trunk/core/syscall.inc index a62c454d29..4bafe7ebee 100644 --- a/kernel/branches/Kolibri-A/trunk/core/syscall.inc +++ b/kernel/branches/Kolibri-A/trunk/core/syscall.inc @@ -17,39 +17,40 @@ cross_order: mov edx, esi mov esi, edi movzx edi, byte[esp+28 + 4] + sub edi, 53 ; all zeroes before call dword [servetable+edi*4] ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; SYSENTER ENTRY ;; -;; ;; +;; (not used on AMD systems) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -align 32 -sysenter_entry: - ; Настраиваем стек - mov esp, [ss:tss._esp0] - sti - push ebp ; save app esp + 4 - mov ebp, [ebp] ; ebp - original ebp - ;------------------ - pushad - cld +;align 32 +;sysenter_entry: +; ; Настраиваем стек +; mov esp, [ss:tss._esp0] +; sti +; push ebp ; save app esp + 4 +; mov ebp, [ebp] ; ebp - original ebp +; ;------------------ +; pushad +; cld +; +; movzx eax, al +; call dword [servetable2 + eax * 4] - movzx eax, al - call dword [servetable2 + eax * 4] - - popad - ;------------------ - xchg ecx, [ss:esp] ; в вершин стека - app ecx, ecx - app esp + 4 - sub ecx, 4 - xchg edx, [ecx] ; edx - return point, & save original edx - push edx - mov edx, [ss:esp + 4] - mov [ecx + 4], edx ; save original ecx - pop edx - sysexit +; popad +; ;------------------ +; xchg ecx, [ss:esp] ; в вершин стека - app ecx, ecx - app esp + 4 +; sub ecx, 4 +; xchg edx, [ecx] ; edx - return point, & save original edx +; push edx +; mov edx, [ss:esp + 4] +; mov [ecx + 4], edx ; save original ecx +; pop edx +; sysexit ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; @@ -61,7 +62,7 @@ align 16 i40: pushad cld - movzx eax, al + and eax, 0x07F call dword [servetable2 + eax * 4] popad iretd @@ -73,25 +74,12 @@ i40: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 32 syscall_entry: - ; cli syscall clear IF - xchg esp, [ss:tss._esp0] - push ecx - lea ecx, [esp+4] - xchg ecx, [ss:tss._esp0] - sti - push ecx - mov ecx, [ecx] - ;------------------ - pushad - cld +; push ecx + sti + xor eax, 3 + call dword [servetable3 + eax * 4] - movzx eax, al - call dword [servetable2 + eax * 4] - - popad - ;------------------ - mov ecx, [ss:esp+4] - pop esp +; pop ecx sysret iglobal @@ -102,59 +90,6 @@ iglobal align 4 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 0 dd 0 @@ -246,7 +181,15 @@ iglobal dd file_system_lfn ; 70-Common file system interface, version 2 dd syscall_window_settings ; 71-Window settings 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 +align 4 +servetable3: + + dd paleholder ; 0 + dd paleholder ; 1 + dd paleholder ; 2 + dd sys_end ; last + endg diff --git a/kernel/branches/Kolibri-A/trunk/data32.inc b/kernel/branches/Kolibri-A/trunk/data32.inc index 93ffda339c..0724678a90 100644 --- a/kernel/branches/Kolibri-A/trunk/data32.inc +++ b/kernel/branches/Kolibri-A/trunk/data32.inc @@ -1,469 +1,471 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -$Revision$ - - -keymap: - - db '6',27 - db '1234567890-=',8,9 - db 'qwertyuiop[]',13 - db '~asdfghjkl;',39,96,0,'\zxcvbnm,./',0,'45 ' - db '@234567890123',180,178,184,'6',176,'7' - db 179,'8',181,177,183,185,182 - db 'AB?',0,'45 ' - db '@234567890123',180,178,184,'6',176,'7' - db 179,'8',181,177,183,185,182 - db 'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ' - db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - - -keymap_alt: - db ' ',27 - db ' @ $ {[]}\ ',8,9 - db ' ',13 - db ' ',0,' ',0,'4',0,' ' - db ' ',180,178,184,'6',176,'7' - db 179,'8',181,177,183,185,182 - db 'ABCD',255,'FGHIJKLMNOPQRSTUVWXYZ' - db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - - - boot_memdetect db 'Determining amount of memory',0 - boot_fonts db 'Fonts loaded',0 - boot_tss db 'Setting TSSs',0 - boot_cpuid db 'Reading CPUIDs',0 - boot_devices db 'Detecting devices',0 - boot_timer db 'Setting timer',0 - boot_irqs db 'Reprogramming IRQs',0 - boot_setmouse db 'Setting mouse',0 - boot_windefs db 'Setting window defaults',0 - boot_bgr db 'Calculating background',0 - boot_resirqports db 'Reserving IRQs & ports',0 - boot_setrports db 'Setting addresses for IRQs',0 - boot_setostask db 'Setting OS task',0 - boot_allirqs db 'Unmasking all IRQs',0 - boot_tsc db 'Reading TSC',0 - boot_cpufreq db 'CPU frequency is ',' ',' MHz',0 - boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 - boot_pal_vga db 'Setting VGA 640x480 palette',0 - boot_failed db 'Failed to start first app',0 - boot_mtrr db 'Setting MTRR',0 - boot_pcie_ok db 'PCIe config set OK',0 - boot_pcie_fail db 'PCIe config XXX failed XXX',0 -if preboot_blogesc - boot_tasking db 'All set - press ESC to start',0 -end if - -;new_process_loading db 'K : New Process - loading',13,10,0 -;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 - -msg_unresolved db 'unresolved ',0 -msg_module db 'in module ',0 -msg_version db 'incompatible driver version',13,10,0 -msg_www db 'please visit www.kolibrios.org',13,10,0 -msg_CR db 13,10,0 -aSis db 'SIS',0 - -intel_str db "GenuineIntel",0 -AMD_str db "AuthenticAMD",0 - -;szSound db 'SOUND',0 -;szInfinity db 'INFINITY',0 -szHwMouse db 'ATI2D',0 -szPS2MDriver db 'PS2MOUSE',0 -;szCOM_MDriver db 'COM_MOUSE',0 -szUSB db 'USB',0 -szAtiHW db '/rd/1/drivers/ati2d.drv',0 - -szSTART db 'START',0 -szEXPORTS db 'EXPORTS',0 -sz_EXPORTS db '_EXPORTS',0 - -szIMPORTS db 'IMPORTS',0 - -read_firstapp db '/sys/' -firstapp db 'LAUNCHER',0 - -char db '/sys/FONTS/CHAR.MT',0 -char2 db '/sys/FONTS/CHAR2.MT',0 - -bootpath db '/KOLIBRI ' -bootpath2 db 0 -vmode db '/sys/drivers/VMODE.MDR',0 -vrr_m db 'VRR_M',0 -kernel_file db 'KERNEL MNT' - - -align 4 - -shmem_list: - .bk dd shmem_list - .fd dd shmem_list - -dll_list: - .bk dd dll_list - .fd dd dll_list - -MAX_DEFAULT_DLL_ADDR = 0x20000000 -MIN_DEFAULT_DLL_ADDR = 0x10000000 -dll_cur_addr dd MIN_DEFAULT_DLL_ADDR - -; supported videomodes - - -; mike.dld { -db 0 -dd servetable-0x10000 -draw_line dd __sys_draw_line -draw_pointer dd __sys_draw_pointer -;//mike.dld, 2006-08-02 [ -;drawbar dd __sys_drawbar -drawbar dd __sys_drawbar.forced -;//mike.dld, 2006-08-02 ] -putpixel dd __sys_putpixel -; } mike.dld - - -align 4 -keyboard dd 1 -syslang dd 1 - -boot_y dd 10 - -pci_bios_entry dd 0 - dw pci_code_sel - -if __DEBUG__ eq 1 - include_debug_strings -end if - -IncludeIGlobals - -align 16 -gdts: - - dw gdte-$-1 - dd gdts - dw 0 - -; Attention! Do not change the order of the first four selectors. They are used in Fast System Call -; must be : os_code, os_data, app_code, app_data, .... - -int_code_l: -os_code_l: - dw 0xffff - dw 0x0000 - db 0x00 - dw 11011111b *256 +10011010b - db 0x00 - -int_data_l: -os_data_l: - dw 0xffff - dw 0x0000 - db 0x00 - dw 11011111b *256 +10010010b - db 0x00 - -app_code_l: - dw 0xFFFF - dw 0 - db 0 - db cpl3 - dw G32+D32+0xF; - -app_data_l: - dw 0xFFFF - dw 0 - db 0 - db drw3 - dw G32+D32+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 - db 0, 0, 0 - dw 11010000b *256 +10011010b - db 0x00 -apm_code_16: - dw 0x0f - db 0, 0, 0 - dw 10010000b *256 +10011010b - db 0x00 -apm_data_16: - dw 0x0f - db 0, 0, 0 - dw 10010000b *256 +10010010b - db 0x00 -; ----------------------------------------- - -graph_data_l: - - dw 0x7ff - dw 0x0000 - db 0x00 - dw 11010000b *256 +11110010b - db 0x00 -tss0_l: - dw TSS_SIZE-1 - dw tss and 0xFFFF - db (tss shr 16) and 0xFF - db 10001001b - dw (tss shr 16) and 0xFF00 - -tls_data_l: - dw 0x0FFF - dw 0 - db 0 - db drw3 - dw D32 - -endofcode: -gdte: - -align 16 -cur_saved_data rb 4096 -fpu_data: rb 512 - -; device irq owners -irq_owner rd 16 ; process id - -; on irq read ports - -irq00read rd 16 -irq01read rd 16 -irq02read rd 16 -irq03read rd 16 -irq04read rd 16 -irq05read rd 16 -irq06read rd 16 -irq07read rd 16 -irq08read rd 16 -irq09read rd 16 -irq10read rd 16 -irq11read rd 16 -irq12read rd 16 -irq13read rd 16 -irq14read rd 16 -irq15read rd 16 - -irq_tab rd 16 - -mem_block_map rb 512 -mem_block_list rd 64 -large_block_list rd 31 -mem_block_mask rd 2 -large_block_mask rd 1 - -mem_used.fd rd 1 -mem_used.bk rd 1 - -mem_block_arr rd 1 -mem_block_start rd 1 -mem_block_end rd 1 - -heap_mutex rd 1 -heap_size rd 1 -heap_free rd 1 -heap_blocks rd 1 -free_blocks rd 1 - -mst MEM_STATE - -page_start rd 1 -page_end rd 1 -sys_page_map rd 1 -os_stack_seg rd 1 - - -srv.fd rd 1 -srv.bk rd 1 - - -align 16 - -_display display_t - -_WinMapAddress rd 1 -_WinMapSize rd 1 - -def_cursor rd 1 -current_cursor rd 1 -hw_cursor rd 1 -cur_saved_base rd 1 - -cur.lock rd 1 ;1 - lock update, 2- hide -cur.left rd 1 ;cursor clip box -cur.top rd 1 -cur.right rd 1 -cur.bottom rd 1 -cur.w rd 1 -cur.h rd 1 - -ipc_tmp rd 1 -ipc_pdir rd 1 -ipc_ptab rd 1 - -proc_mem_map rd 1 -proc_mem_pdir rd 1 -proc_mem_tab rd 1 - -tmp_task_pdir rd 1 -tmp_task_ptab rd 1 - -default_io_map rd 1 - -LFBSize rd 1 - -stall_mcs rd 1 -current_slot rd 1 - -; status -hd1_status rd 1 ; 0 - free : other - pid -application_table_status rd 1 ; 0 - free : other - pid - -; device addresses -mididp rd 1 -midisp rd 1 - -cdbase rd 1 -cdid rd 1 - -hdbase rd 1 ; for boot 0x1f0 -hdid rd 1 -hdpos rd 1 ; for boot 0x1 -label known_part dword -fat32part rd 1 ; for boot 0x1 -cdpos rd 1 - -;CPUID information -cpu_vendor rd 3 -cpu_sign rd 1 -cpu_info rd 1 -cpu_caps rd 4 - - -pg_data PG_DATA -heap_test rd 1 - -buttontype rd 1 -windowtypechanged rd 1 - -hd_entries rd 1 ;unused ? 0xfe10 - -;* start code - Mario79 - -mouse_active rd 1 -mouse_pause rd 1 -MouseTickCounter rd 1 - -;* end code - Mario79 - -img_background rd 1 -mem_BACKGROUND rd 1 -static_background_data rd 1 - -cache_ide0: -cache_ide0_pointer rd 1 -cache_ide0_size rd 1 ; not use -cache_ide0_data_pointer rd 1 -cache_ide0_system_data_size rd 1 ; not use -cache_ide0_appl_data_size rd 1 ; not use -cache_ide0_system_data rd 1 -cache_ide0_appl_data rd 1 -cache_ide0_system_sad_size rd 1 -cache_ide0_appl_sad_size rd 1 -cache_ide0_search_start rd 1 -cache_ide0_appl_search_start rd 1 - -cache_ide1: -cache_ide1_pointer rd 1 -cache_ide1_size rd 1 ; not use -cache_ide1_data_pointer rd 1 -cache_ide1_system_data_size rd 1 ; not use -cache_ide1_appl_data_size rd 1 ; not use -cache_ide1_system_data rd 1 -cache_ide1_appl_data rd 1 -cache_ide1_system_sad_size rd 1 -cache_ide1_appl_sad_size rd 1 -cache_ide1_search_start rd 1 -cache_ide1_appl_search_start rd 1 - -cache_ide2: -cache_ide2_pointer rd 1 -cache_ide2_size rd 1 ; not use -cache_ide2_data_pointer rd 1 -cache_ide2_system_data_size rd 1 ; not use -cache_ide2_appl_data_size rd 1 ; not use -cache_ide2_system_data rd 1 -cache_ide2_appl_data rd 1 -cache_ide2_system_sad_size rd 1 -cache_ide2_appl_sad_size rd 1 -cache_ide2_search_start rd 1 -cache_ide2_appl_search_start rd 1 - -cache_ide3: -cache_ide3_pointer rd 1 -cache_ide3_size rd 1 ; not use -cache_ide3_data_pointer rd 1 -cache_ide3_system_data_size rd 1 ; not use -cache_ide3_appl_data_size rd 1 ; not use -cache_ide3_system_data rd 1 -cache_ide3_appl_data rd 1 -cache_ide3_system_sad_size rd 1 -cache_ide3_appl_sad_size rd 1 -cache_ide3_search_start rd 1 -cache_ide3_appl_search_start rd 1 - -debug_step_pointer rd 1 -hdd_appl_data rb 1 ; 0 = system cache, 1 - application cache -cd_appl_data rb 1 ; 0 = system cache, 1 - application cache - -lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled -pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled -timer_ticks_enable rb 1 ; for cd driver - -NumBiosDisks rd 1 -BiosDisksData rb 200h -BiosDiskCaches rb 80h*(cache_ide1-cache_ide0) -BiosDiskPartitions rd 80h - -IncludeUGlobals +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +$Revision$ + + +keymap: + + db '6',27 + db '1234567890-=',8,9 + db 'qwertyuiop[]',13 + db '~asdfghjkl;',39,96,0,'\zxcvbnm,./',0,'45 ' + db '@234567890123',180,178,184,'6',176,'7' + db 179,'8',181,177,183,185,182 + db 'AB?',0,'45 ' + db '@234567890123',180,178,184,'6',176,'7' + db 179,'8',181,177,183,185,182 + db 'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ' + db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + + +keymap_alt: + db ' ',27 + db ' @ $ {[]}\ ',8,9 + db ' ',13 + db ' ',0,' ',0,'4',0,' ' + db ' ',180,178,184,'6',176,'7' + db 179,'8',181,177,183,185,182 + db 'ABCD',255,'FGHIJKLMNOPQRSTUVWXYZ' + db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + + + boot_memdetect db 'Determining amount of memory',0 + boot_fonts db 'Fonts loaded',0 + boot_tss db 'Setting TSSs',0 + boot_cpuid db 'Reading CPUIDs',0 + boot_devices db 'Detecting devices',0 + boot_timer db 'Setting timer',0 + boot_irqs db 'Reprogramming IRQs',0 + boot_setmouse db 'Setting mouse',0 + boot_windefs db 'Setting window defaults',0 + boot_bgr db 'Calculating background',0 + boot_resirqports db 'Reserving IRQs & ports',0 +; boot_setrports db 'Setting addresses for IRQs',0 + boot_setostask db 'Setting OS task',0 + boot_allirqs db 'Unmasking all IRQs',0 + boot_tsc db 'Reading TSC',0 + boot_cpufreq db 'CPU frequency is ',' ',' MHz',0 +; boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 +; boot_pal_vga db 'Setting VGA 640x480 palette',0 + boot_failed db 'Failed to start first app',0 + boot_mtrr db 'Setting MTRR',0 + boot_pcie_ok db 'PCIe config set OK',0 + boot_pcie_fail db 'PCIe config XXX failed XXX',0 + boot_rs7xx_fail db 'RS7xx config XXX failed XXX',0 + boot_rs7xx_blkd db 'RS7xx config ---------- FAILED -----------',0 +if preboot_blogesc + boot_tasking db 'All set - press ESC to start',0 +end if + +;new_process_loading db 'K : New Process - loading',13,10,0 +;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 + +msg_unresolved db 'unresolved ',0 +msg_module db 'in module ',0 +msg_version db 'incompatible driver version',13,10,0 +msg_www db 'please visit www.kolibrios.org',13,10,0 +msg_CR db 13,10,0 +aSis db 'SIS',0 + +intel_str db "GenuineIntel",0 +AMD_str db "AuthenticAMD",0 + +;szSound db 'SOUND',0 +;szInfinity db 'INFINITY',0 +szHwMouse db 'ATI2D',0 +szPS2MDriver db 'PS2MOUSE',0 +;szCOM_MDriver db 'COM_MOUSE',0 +szUSB db 'USB',0 +szAtiHW db '/rd/1/drivers/ati2d.drv',0 + +szSTART db 'START',0 +szEXPORTS db 'EXPORTS',0 +sz_EXPORTS db '_EXPORTS',0 + +szIMPORTS db 'IMPORTS',0 + +read_firstapp db '/sys/' +firstapp db 'LAUNCHER',0 + +char db '/sys/FONTS/CHAR.MT',0 +char2 db '/sys/FONTS/CHAR2.MT',0 + +bootpath db '/KOLIBRI ' +bootpath2 db 0 +vmode db '/sys/drivers/VMODE.MDR',0 +vrr_m db 'VRR_M',0 +kernel_file db 'KERNEL MNT' + + +align 4 + +shmem_list: + .bk dd shmem_list + .fd dd shmem_list + +dll_list: + .bk dd dll_list + .fd dd dll_list + +MAX_DEFAULT_DLL_ADDR = 0x20000000 +MIN_DEFAULT_DLL_ADDR = 0x10000000 +dll_cur_addr dd MIN_DEFAULT_DLL_ADDR + +; supported videomodes + + +; mike.dld { +db 0 +dd servetable-0x10000 +draw_line dd __sys_draw_line +draw_pointer dd __sys_draw_pointer +;//mike.dld, 2006-08-02 [ +;drawbar dd __sys_drawbar +drawbar dd __sys_drawbar.forced +;//mike.dld, 2006-08-02 ] +putpixel dd __sys_putpixel +; } mike.dld + + +align 4 +keyboard dd 1 +syslang dd 1 + +boot_y dd 10 + +pci_bios_entry dd 0 + dw pci_code_sel + +if __DEBUG__ eq 1 + include_debug_strings +end if + +IncludeIGlobals + +align 16 +gdts: + + dw gdte-$-1 + dd gdts + dw 0 + +; Attention! Do not change the order of the first four selectors. They are used in Fast System Call +; must be : os_code, os_data, app_code, app_data, .... + +int_code_l: +os_code_l: + dw 0xffff + dw 0x0000 + db 0x00 + dw 11011111b *256 +10011010b + db 0x00 + +int_data_l: +os_data_l: + dw 0xffff + dw 0x0000 + db 0x00 + dw 11011111b *256 +10010010b + db 0x00 + +app_code_l: + dw 0xFFFF + dw 0 + db 0 + db cpl3 + dw G32+D32+0xF; + +app_data_l: + dw 0xFFFF + dw 0 + db 0 + db drw3 + dw G32+D32+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 + db 0, 0, 0 + dw 11010000b *256 +10011010b + db 0x00 +apm_code_16: + dw 0x0f + db 0, 0, 0 + dw 10010000b *256 +10011010b + db 0x00 +apm_data_16: + dw 0x0f + db 0, 0, 0 + dw 10010000b *256 +10010010b + db 0x00 +; ----------------------------------------- + +graph_data_l: + + dw 0x7ff + dw 0x0000 + db 0x00 + dw 11010000b *256 +11110010b + db 0x00 +tss0_l: + dw TSS_SIZE-1 + dw tss and 0xFFFF + db (tss shr 16) and 0xFF + db 10001001b + dw (tss shr 16) and 0xFF00 + +tls_data_l: + dw 0x0FFF + dw 0 + db 0 + db drw3 + dw D32 + +endofcode: +gdte: + +align 16 +cur_saved_data rb 4096 +fpu_data: rb 512 + +; device irq owners +irq_owner rd 16 ; process id + +; on irq read ports + +irq00read rd 16 +irq01read rd 16 +irq02read rd 16 +irq03read rd 16 +irq04read rd 16 +irq05read rd 16 +irq06read rd 16 +irq07read rd 16 +irq08read rd 16 +irq09read rd 16 +irq10read rd 16 +irq11read rd 16 +irq12read rd 16 +irq13read rd 16 +irq14read rd 16 +irq15read rd 16 + +irq_tab rd 16 + +mem_block_map rb 512 +mem_block_list rd 64 +large_block_list rd 31 +mem_block_mask rd 2 +large_block_mask rd 1 + +mem_used.fd rd 1 +mem_used.bk rd 1 + +mem_block_arr rd 1 +mem_block_start rd 1 +mem_block_end rd 1 + +heap_mutex rd 1 +heap_size rd 1 +heap_free rd 1 +heap_blocks rd 1 +free_blocks rd 1 + +mst MEM_STATE + +page_start rd 1 +page_end rd 1 +sys_page_map rd 1 +os_stack_seg rd 1 + + +srv.fd rd 1 +srv.bk rd 1 + + +align 16 + +_display display_t + +_WinMapAddress rd 1 +_WinMapSize rd 1 + +def_cursor rd 1 +current_cursor rd 1 +hw_cursor rd 1 +cur_saved_base rd 1 + +cur.lock rd 1 ;1 - lock update, 2- hide +cur.left rd 1 ;cursor clip box +cur.top rd 1 +cur.right rd 1 +cur.bottom rd 1 +cur.w rd 1 +cur.h rd 1 + +ipc_tmp rd 1 +ipc_pdir rd 1 +ipc_ptab rd 1 + +proc_mem_map rd 1 +proc_mem_pdir rd 1 +proc_mem_tab rd 1 + +tmp_task_pdir rd 1 +tmp_task_ptab rd 1 + +default_io_map rd 1 + +LFBSize rd 1 + +stall_mcs rd 1 +current_slot rd 1 + +; status +hd1_status rd 1 ; 0 - free : other - pid +application_table_status rd 1 ; 0 - free : other - pid + +; device addresses +mididp rd 1 +midisp rd 1 + +cdbase rd 1 +cdid rd 1 + +hdbase rd 1 ; for boot 0x1f0 +hdid rd 1 +hdpos rd 1 ; for boot 0x1 +label known_part dword +fat32part rd 1 ; for boot 0x1 +cdpos rd 1 + +;CPUID information +cpu_vendor rd 3 +cpu_sign rd 1 +cpu_info rd 1 +cpu_caps rd 4 + + +pg_data PG_DATA +heap_test rd 1 + +buttontype rd 1 +windowtypechanged rd 1 + +hd_entries rd 1 ;unused ? 0xfe10 + +;* start code - Mario79 + +mouse_active rd 1 +mouse_pause rd 1 +MouseTickCounter rd 1 + +;* end code - Mario79 + +img_background rd 1 +mem_BACKGROUND rd 1 +static_background_data rd 1 + +cache_ide0: +cache_ide0_pointer rd 1 +cache_ide0_size rd 1 ; not use +cache_ide0_data_pointer rd 1 +cache_ide0_system_data_size rd 1 ; not use +cache_ide0_appl_data_size rd 1 ; not use +cache_ide0_system_data rd 1 +cache_ide0_appl_data rd 1 +cache_ide0_system_sad_size rd 1 +cache_ide0_appl_sad_size rd 1 +cache_ide0_search_start rd 1 +cache_ide0_appl_search_start rd 1 + +cache_ide1: +cache_ide1_pointer rd 1 +cache_ide1_size rd 1 ; not use +cache_ide1_data_pointer rd 1 +cache_ide1_system_data_size rd 1 ; not use +cache_ide1_appl_data_size rd 1 ; not use +cache_ide1_system_data rd 1 +cache_ide1_appl_data rd 1 +cache_ide1_system_sad_size rd 1 +cache_ide1_appl_sad_size rd 1 +cache_ide1_search_start rd 1 +cache_ide1_appl_search_start rd 1 + +cache_ide2: +cache_ide2_pointer rd 1 +cache_ide2_size rd 1 ; not use +cache_ide2_data_pointer rd 1 +cache_ide2_system_data_size rd 1 ; not use +cache_ide2_appl_data_size rd 1 ; not use +cache_ide2_system_data rd 1 +cache_ide2_appl_data rd 1 +cache_ide2_system_sad_size rd 1 +cache_ide2_appl_sad_size rd 1 +cache_ide2_search_start rd 1 +cache_ide2_appl_search_start rd 1 + +cache_ide3: +cache_ide3_pointer rd 1 +cache_ide3_size rd 1 ; not use +cache_ide3_data_pointer rd 1 +cache_ide3_system_data_size rd 1 ; not use +cache_ide3_appl_data_size rd 1 ; not use +cache_ide3_system_data rd 1 +cache_ide3_appl_data rd 1 +cache_ide3_system_sad_size rd 1 +cache_ide3_appl_sad_size rd 1 +cache_ide3_search_start rd 1 +cache_ide3_appl_search_start rd 1 + +debug_step_pointer rd 1 +hdd_appl_data rb 1 ; 0 = system cache, 1 - application cache +cd_appl_data rb 1 ; 0 = system cache, 1 - application cache + +lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled +pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled +timer_ticks_enable rb 1 ; for cd driver + +NumBiosDisks rd 1 +BiosDisksData rb 200h +BiosDiskCaches rb 80h*(cache_ide1-cache_ide0) +BiosDiskPartitions rd 80h + +IncludeUGlobals diff --git a/kernel/branches/Kolibri-A/trunk/kernel.asm b/kernel/branches/Kolibri-A/trunk/kernel.asm index e622abda54..ff4ea8bfc6 100644 --- a/kernel/branches/Kolibri-A/trunk/kernel.asm +++ b/kernel/branches/Kolibri-A/trunk/kernel.asm @@ -313,11 +313,11 @@ high_code: ; init selectors mov ebx,[BOOT_VAR+0x9040] ; offset of APM entry point 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 - ; protected-mode 16-bit code segment + ; protected-mode 16-bit code segment 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 mov [dword apm_code_32 + 2], ax @@ -390,70 +390,56 @@ high_code: mov eax,[BOOT_VAR+0x9018] mov [LFBAddress],eax -;== cmp [SCR_MODE],word 0100000000000000b -; jge setvesa20 -; cmp [SCR_MODE],word 0x13 -; je v20ga32 -; mov [PUTPIXEL],dword Vesa12_putpixel24 ; Vesa 1.2 -; mov [GETPIXEL],dword Vesa12_getpixel24 -; cmp [ScreenBPP],byte 24 -; jz ga24 -; mov [PUTPIXEL],dword Vesa12_putpixel32 -; mov [GETPIXEL],dword Vesa12_getpixel32 -; ga24: -; jmp v20ga24 +;== + cmp [SCR_MODE],word 0100000000000000b + jge setvesa20 + mov eax, 0xDEADBEEF + hlt +; === EGA, VGA & Vesa 1.2 modes not supported === setvesa20: -; mov [PUTPIXEL],dword Vesa20_putpixel24 ; Vesa 2.0 +; mov [PUTPIXEL],dword Vesa20_putpixel24 ; Vesa 2.0 24bpp modes ; mov [GETPIXEL],dword Vesa20_getpixel24 ; cmp [ScreenBPP],byte 24 ; jz v20ga24 v20ga32: mov [PUTPIXEL],dword Vesa20_putpixel32 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 ---------- ; Intel SYSENTER/SYSEXIT (AMD CPU support it too) - bt [cpu_caps], CAPS_SEP - jnc .SEnP ; SysEnter not Present - xor edx, edx - mov ecx, MSR_SYSENTER_CS - mov eax, os_code - wrmsr - mov ecx, MSR_SYSENTER_ESP -; mov eax, sysenter_stack ; Check it - xor eax, eax - wrmsr - mov ecx, MSR_SYSENTER_EIP - mov eax, sysenter_entry - wrmsr +; bt [cpu_caps], CAPS_SEP +; jnc .SEnP ; SysEnter not Present +; xor edx, edx +; mov ecx, MSR_SYSENTER_CS +; mov eax, os_code +; wrmsr +; mov ecx, MSR_SYSENTER_ESP +;; mov eax, sysenter_stack ; Check it +; xor eax, eax +; wrmsr +; mov ecx, MSR_SYSENTER_EIP +; mov eax, sysenter_entry +; wrmsr .SEnP: ; AMD SYSCALL/SYSRET - cmp byte[cpu_vendor], 'A' - jne .noSYSCALL - mov eax, 0x80000001 - cpuid - test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support - jz .noSYSCALL +; cmp byte[cpu_vendor], 'A' +; jne .noSYSCALL +; mov eax, 0x80000001 +; cpuid +; test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support +; jz .noSYSCALL mov ecx, MSR_AMD_EFER rdmsr or eax, 1 ; bit_0 - System Call Extension (SCE) wrmsr - ; !!!! It`s dirty hack, fix it !!! ; Bits of EDX : ; Bit 31–16 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. ; Bit 15–0 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. - ; mov edx, (os_code + 16) * 65536 + os_code - mov edx, 0x1B0008 + mov edx, 0x1B000B ; RING3 task stack will be used for fast syscalls! mov eax, syscall_entry mov ecx, MSR_AMD_STAR @@ -461,7 +447,7 @@ high_code: .noSYSCALL: ; ----------------------------------------- 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 inc eax mov [SLOT_BASE+256+APPDATA.io_map], eax @@ -495,9 +481,10 @@ high_code: ;Add IO access table - bit array of permitted ports mov edi, tss._io_map_0 xor eax, eax - not eax - mov ecx, 8192/4 - rep stosd ; access to 4096*8=65536 ports + mov ecx, 2047 + rep stosd ; access to 65504 ports granted + not eax ; the last 32 ports blocked + stosd mov ax,tss0 ltr ax @@ -694,11 +681,6 @@ end if call boot_log call reserve_irqs_ports -; SET PORTS FOR IRQ HANDLERS - - ;mov esi,boot_setrports - ;call boot_log - ;call setirqreadports ; SET UP OS TASK @@ -845,8 +827,10 @@ end if call set_network_conf no_st_network: - call init_userDMA ; <<<<<<<<< ================ core/memory.inc ======================================== - call pci_ext_config ; <<<<<<<<< bus/pci/pcie.inc + call init_userDMA ; <<<<<<<<< ============== core/memory.inc ================= +; call pci_ext_config ; <<<<<<<<< bus/pci/pcie.inc +;------------------------------------------------------------------------------- + call rs7xx_pcie_init ; <<<<<<<<< bus/ht.inc ; LOAD FIRST APPLICATION cli @@ -1097,59 +1081,12 @@ include "kernel32.inc" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; reserve_irqs_ports: - - 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 - + ; removed ret setirqreadports: - - mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte - 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 + ; removed + ret iglobal process_number dd 0x1 @@ -1185,60 +1122,7 @@ set_variables: align 4 ;input eax=43,bl-byte of output, ecx - number of port sys_outport: - - 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 + and [esp+32],dword 1 ; for backward compatibility: operation failed ret display_number: @@ -3462,269 +3346,25 @@ memmove: ; memory move in bytes align 4 sys_programirq: - - mov eax, [TASK_BASE] - 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 + ; removed + mov dword [esp+32], 1 ; operation failed ret align 4 get_irq_data: - movzx esi, bh ; save number of subfunction, if bh = 1, return data size, otherwise, read data - xor bh, bh - 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 + ; removed + mov dword [esp+32], -1 ret set_io_access_rights: - push edi eax - 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 + ;removed 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: - - 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 + ; removed; always returns 0 xor eax, eax ret diff --git a/kernel/branches/Kolibri-A/trunk/kernel32.inc b/kernel/branches/Kolibri-A/trunk/kernel32.inc index e93b6e4e0f..b5c9dc13cf 100644 --- a/kernel/branches/Kolibri-A/trunk/kernel32.inc +++ b/kernel/branches/Kolibri-A/trunk/kernel32.inc @@ -1,311 +1,312 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; KERNEL32.INC ;; -;; ;; -;; Included 32 bit kernel files for MenuetOS ;; -;; ;; -;; This file is kept separate as it will be easier to ;; -;; maintain and compile with an automated SETUP program ;; -;; in the future. ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -$Revision$ - - -;struc db [a] { common . db a -; if ~used . -; display 'not used db: ',`.,13,10 -; end if } -;struc dw [a] { common . dw a -; if ~used . -; display 'not used dw: ',`.,13,10 -; end if } -;struc dd [a] { common . dd a -; if ~used . -; display 'not used dd: ',`.,13,10 -; end if } -;struc dp [a] { common . dp a -; if ~used . -; display 'not used dp: ',`.,13,10 -; end if } -;struc dq [a] { common . dq a -; if ~used . -; display 'not used dq: ',`.,13,10 -; end if } -;struc dt [a] { common . dt a -; if ~used . -; display 'not used dt: ',`.,13,10 -; end if } - -struc POINT { - .x dd ? - .y dd ? - .sizeof: -} -virtual at 0 - POINT POINT -end virtual - -struc RECT { - .left dd ? - .top dd ? - .right dd ? - .bottom dd ? - .sizeof: -} -virtual at 0 - RECT RECT -end virtual - -struc BOX { - .left dd ? - .top dd ? - .width dd ? - .height dd ? - .sizeof: -} -virtual at 0 - BOX BOX -end virtual - -struc DISPMODE { - .width rw 1 - .height rw 1 - .bpp rw 1 - .freq rw 1 -} - -; constants definition -WSTATE_NORMAL = 00000000b -WSTATE_MAXIMIZED = 00000001b -WSTATE_MINIMIZED = 00000010b -WSTATE_ROLLEDUP = 00000100b - -WSTATE_REDRAW = 00000001b -WSTATE_WNDDRAWN = 00000010b - -WSTYLE_HASCAPTION = 00010000b -WSTYLE_CLIENTRELATIVE = 00100000b - -struc TASKDATA -{ - .event_mask dd ? - .pid dd ? - dw ? - .state db ? - db ? - dw ? - .wnd_number db ? - db ? - .mem_start dd ? - .counter_sum dd ? - .counter_add dd ? - .cpu_usage dd ? -} -virtual at 0 - TASKDATA TASKDATA -end virtual - -TSTATE_RUNNING = 0 -TSTATE_RUN_SUSPENDED = 1 -TSTATE_WAIT_SUSPENDED = 2 -TSTATE_ZOMBIE = 3 -TSTATE_TERMINATING = 4 -TSTATE_WAITING = 5 -TSTATE_FREE = 9 - -; structures definition -struc WDATA { - .box BOX - .cl_workarea dd ? - .cl_titlebar dd ? - .cl_frames dd ? - .reserved db ? - .fl_wstate db ? - .fl_wdrawn db ? - .fl_redraw db ? - .sizeof: -} -virtual at 0 - WDATA WDATA -end virtual -label WDATA.fl_wstyle byte at WDATA.cl_workarea + 3 - -struc APPDATA -{ - .app_name db 11 dup(?) - db 5 dup(?) - - .fpu_state dd ? ;+16 - .ev_count_ dd ? ;unused ;+20 - .exc_handler dd ? ;+24 - .except_mask dd ? ;+28 - .pl0_stack dd ? ;unused ;+32 - .heap_base dd ? ;+36 - .heap_top dd ? ;+40 - .cursor dd ? ;+44 - .fd_ev dd ? ;+48 - .bk_ev dd ? ;+52 - .fd_obj dd ? ;+56 - .bk_obj dd ? ;+60 - .saved_esp dd ? ;+64 - .io_map rd 2 ;+68 - .dbg_state dd ? ;+76 - .cur_dir dd ? ;+80 - .wait_timeout dd ? ;+84 - .saved_esp0 dd ? ;+88 - .wait_begin dd ? ;+92 +++ - .wait_test dd ? ;+96 +++ - .wait_param dd ? ;+100 +++ - .tls_base dd ? ;+104 - .dlls_list_ptr dd ? ;+108 - db 16 dup(?) ;+112 - - .wnd_shape dd ? ;+128 - .wnd_shape_scale dd ? ;+132 - dd ? ;+136 - .mem_size dd ? ;+140 - .saved_box BOX - .ipc_start dd ? - .ipc_size dd ? - .event_mask dd ? - .debugger_slot dd ? - dd ? - .keyboard_mode db ? - db 3 dup(?) - .dir_table dd ? - .dbg_event_mem dd ? - .dbg_regs: - .dbg_regs.dr0 dd ? - .dbg_regs.dr1 dd ? - .dbg_regs.dr2 dd ? - .dbg_regs.dr3 dd ? - .dbg_regs.dr7 dd ? - .wnd_caption dd ? - .wnd_clientbox BOX -} -virtual at 0 - APPDATA APPDATA -end virtual - -;// mike.dld, 2006-29-01 ] - -struc MUTEX -{ - .count rd 1 - .next rd 1 - .prev rd 1 -} - -virtual at 0 - MUTEX MUTEX -end virtual - - -; Core functions -include "core/sync.inc" ; macros for synhronization objects -include "core/sys32.inc" ; process management -include "core/sched.inc" ; process scheduling -include "core/syscall.inc" ; system call -include "core/fpu.inc" ; all fpu/sse support -include "core/memory.inc" -include "core/heap.inc" ; kernel and app heap -include "core/malloc.inc" ; small kernel heap -include "core/taskman.inc" -include "core/dll.inc" -include "core/peload.inc" ; -include "core/exports.inc" -include "core/string.inc" -include "core/v86.inc" ; virtual-8086 manager - -; GUI stuff -include "gui/window.inc" -include "gui/event.inc" -include "gui/font.inc" -include "gui/button.inc" - -; shutdown - -; file system - -include "fs/fs.inc" ; syscall -include "fs/fat32.inc" ; read / write for fat32 filesystem -include "fs/ntfs.inc" ; read / write for ntfs filesystem -include "fs/fat12.inc" ; read / write for fat12 filesystem -include "blkdev/rd.inc" ; ramdisk read /write -include "fs/fs_lfn.inc" ; syscall, version 2 -include "fs/iso9660.inc" ; read for iso9660 filesystem CD -include "fs/ext2.inc" ; read / write for ext2 filesystem - -; sound - -include "sound/playnote.inc" ; player Note for Speaker PC - -; display - -;include "video/vesa12.inc" ; Vesa 1.2 functions -include "video/vesa20.inc" ; Vesa 2.0 functions -include "video/vga.inc" ; VGA 16 color functions -include "video/cursors.inc" ; cursors functions - -; Network Interface & TCPIP Stack - -include "network/stack.inc" - -;include "drivers/uart.inc" - - -; Mouse pointer - -include "gui/mouse.inc" - -; Window skinning - -include "gui/skincode.inc" - -; Pci functions -include "bus/pci/pci32.inc" -include "bus/pci/pcie.inc" - -; Floppy drive controller - -include "blkdev/fdc.inc" -include "blkdev/flp_drv.inc" - -; IDE cache -include "blkdev/ide_cache.inc" - -; HD drive controller -include "blkdev/hd_drv.inc" - -; CD drive controller - -include "blkdev/cdrom.inc" -include "blkdev/cd_drv.inc" - -; Character devices - -include "hid/keyboard.inc" -include "hid/mousedrv.inc" - -; setting date,time,clock and alarm-clock - -include "hid/set_dtc.inc" - -;% -include - -;parser file names -include "fs/parse_fn.inc" - -; work with conf lib -include "core/conf_lib.inc" - -; load external lib -include "core/ext_lib.inc" - -; list of external functions -include "imports.inc" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; KERNEL32.INC ;; +;; ;; +;; Included 32 bit kernel files for MenuetOS ;; +;; ;; +;; This file is kept separate as it will be easier to ;; +;; maintain and compile with an automated SETUP program ;; +;; in the future. ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +$Revision$ + + +;struc db [a] { common . db a +; if ~used . +; display 'not used db: ',`.,13,10 +; end if } +;struc dw [a] { common . dw a +; if ~used . +; display 'not used dw: ',`.,13,10 +; end if } +;struc dd [a] { common . dd a +; if ~used . +; display 'not used dd: ',`.,13,10 +; end if } +;struc dp [a] { common . dp a +; if ~used . +; display 'not used dp: ',`.,13,10 +; end if } +;struc dq [a] { common . dq a +; if ~used . +; display 'not used dq: ',`.,13,10 +; end if } +;struc dt [a] { common . dt a +; if ~used . +; display 'not used dt: ',`.,13,10 +; end if } + +struc POINT { + .x dd ? + .y dd ? + .sizeof: +} +virtual at 0 + POINT POINT +end virtual + +struc RECT { + .left dd ? + .top dd ? + .right dd ? + .bottom dd ? + .sizeof: +} +virtual at 0 + RECT RECT +end virtual + +struc BOX { + .left dd ? + .top dd ? + .width dd ? + .height dd ? + .sizeof: +} +virtual at 0 + BOX BOX +end virtual + +struc DISPMODE { + .width rw 1 + .height rw 1 + .bpp rw 1 + .freq rw 1 +} + +; constants definition +WSTATE_NORMAL = 00000000b +WSTATE_MAXIMIZED = 00000001b +WSTATE_MINIMIZED = 00000010b +WSTATE_ROLLEDUP = 00000100b + +WSTATE_REDRAW = 00000001b +WSTATE_WNDDRAWN = 00000010b + +WSTYLE_HASCAPTION = 00010000b +WSTYLE_CLIENTRELATIVE = 00100000b + +struc TASKDATA +{ + .event_mask dd ? + .pid dd ? + dw ? + .state db ? + db ? + dw ? + .wnd_number db ? + db ? + .mem_start dd ? + .counter_sum dd ? + .counter_add dd ? + .cpu_usage dd ? +} +virtual at 0 + TASKDATA TASKDATA +end virtual + +TSTATE_RUNNING = 0 +TSTATE_RUN_SUSPENDED = 1 +TSTATE_WAIT_SUSPENDED = 2 +TSTATE_ZOMBIE = 3 +TSTATE_TERMINATING = 4 +TSTATE_WAITING = 5 +TSTATE_FREE = 9 + +; structures definition +struc WDATA { + .box BOX + .cl_workarea dd ? + .cl_titlebar dd ? + .cl_frames dd ? + .reserved db ? + .fl_wstate db ? + .fl_wdrawn db ? + .fl_redraw db ? + .sizeof: +} +virtual at 0 + WDATA WDATA +end virtual +label WDATA.fl_wstyle byte at WDATA.cl_workarea + 3 + +struc APPDATA +{ + .app_name db 11 dup(?) + db 5 dup(?) + + .fpu_state dd ? ;+16 + .ev_count_ dd ? ;unused ;+20 + .exc_handler dd ? ;+24 + .except_mask dd ? ;+28 + .pl0_stack dd ? ;unused ;+32 + .heap_base dd ? ;+36 + .heap_top dd ? ;+40 + .cursor dd ? ;+44 + .fd_ev dd ? ;+48 + .bk_ev dd ? ;+52 + .fd_obj dd ? ;+56 + .bk_obj dd ? ;+60 + .saved_esp dd ? ;+64 + .io_map rd 2 ;+68 + .dbg_state dd ? ;+76 + .cur_dir dd ? ;+80 + .wait_timeout dd ? ;+84 + .saved_esp0 dd ? ;+88 + .wait_begin dd ? ;+92 +++ + .wait_test dd ? ;+96 +++ + .wait_param dd ? ;+100 +++ + .tls_base dd ? ;+104 + .dlls_list_ptr dd ? ;+108 + db 16 dup(?) ;+112 + + .wnd_shape dd ? ;+128 + .wnd_shape_scale dd ? ;+132 + dd ? ;+136 + .mem_size dd ? ;+140 + .saved_box BOX + .ipc_start dd ? + .ipc_size dd ? + .event_mask dd ? + .debugger_slot dd ? + dd ? + .keyboard_mode db ? + db 3 dup(?) + .dir_table dd ? + .dbg_event_mem dd ? + .dbg_regs: + .dbg_regs.dr0 dd ? + .dbg_regs.dr1 dd ? + .dbg_regs.dr2 dd ? + .dbg_regs.dr3 dd ? + .dbg_regs.dr7 dd ? + .wnd_caption dd ? + .wnd_clientbox BOX +} +virtual at 0 + APPDATA APPDATA +end virtual + +;// mike.dld, 2006-29-01 ] + +struc MUTEX +{ + .count rd 1 + .next rd 1 + .prev rd 1 +} + +virtual at 0 + MUTEX MUTEX +end virtual + + +; Core functions +include "core/sync.inc" ; macros for synhronization objects +include "core/sys32.inc" ; process management +include "core/sched.inc" ; process scheduling +include "core/syscall.inc" ; system call +include "core/fpu.inc" ; all fpu/sse support +include "core/memory.inc" +include "core/heap.inc" ; kernel and app heap +include "core/malloc.inc" ; small kernel heap +include "core/taskman.inc" +include "core/dll.inc" +include "core/peload.inc" ; +include "core/exports.inc" +include "core/string.inc" +include "core/v86.inc" ; virtual-8086 manager + +; GUI stuff +include "gui/window.inc" +include "gui/event.inc" +include "gui/font.inc" +include "gui/button.inc" + +; shutdown + +; file system + +include "fs/fs.inc" ; syscall +include "fs/fat32.inc" ; read / write for fat32 filesystem +include "fs/ntfs.inc" ; read / write for ntfs filesystem +include "fs/fat12.inc" ; read / write for fat12 filesystem +include "blkdev/rd.inc" ; ramdisk read /write +include "fs/fs_lfn.inc" ; syscall, version 2 +include "fs/iso9660.inc" ; read for iso9660 filesystem CD +include "fs/ext2.inc" ; read / write for ext2 filesystem + +; sound + +include "sound/playnote.inc" ; player Note for Speaker PC + +; display + +;include "video/vesa12.inc" ; Vesa 1.2 functions +include "video/vesa20.inc" ; Vesa 2.0 functions +include "video/vga.inc" ; VGA 16 color functions +include "video/cursors.inc" ; cursors functions + +; Network Interface & TCPIP Stack + +include "network/stack.inc" + +;include "drivers/uart.inc" + + +; Mouse pointer + +include "gui/mouse.inc" + +; Window skinning + +include "gui/skincode.inc" + +; Pci functions +include "bus/pci/pci32.inc" +include "bus/pci/pcie.inc" +include "bus/ht.inc" ; AMD HyperTransport bus control + +; Floppy drive controller + +include "blkdev/fdc.inc" +include "blkdev/flp_drv.inc" + +; IDE cache +include "blkdev/ide_cache.inc" + +; HD drive controller +include "blkdev/hd_drv.inc" + +; CD drive controller + +include "blkdev/cdrom.inc" +include "blkdev/cd_drv.inc" + +; Character devices + +include "hid/keyboard.inc" +include "hid/mousedrv.inc" + +; setting date,time,clock and alarm-clock + +include "hid/set_dtc.inc" + +;% -include + +;parser file names +include "fs/parse_fn.inc" + +; work with conf lib +include "core/conf_lib.inc" + +; load external lib +include "core/ext_lib.inc" + +; list of external functions +include "imports.inc"