From e5efe832f3725ace1d82dbf7e1181f665f3cb0b7 Mon Sep 17 00:00:00 2001 From: "Sergey Semyonov (Serge)" Date: Wed, 22 Jul 2015 06:58:10 +0000 Subject: [PATCH] kolibri-acpi: update git-svn-id: svn://kolibrios.org@5594 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../branches/Kolibri-acpi/blkdev/cd_drv.inc | 31 +-- kernel/branches/Kolibri-acpi/core/memory.inc | 4 - kernel/branches/Kolibri-acpi/core/taskman.inc | 1 - kernel/branches/Kolibri-acpi/fs/fat.inc | 232 +++++++++++------- kernel/branches/Kolibri-acpi/gui/button.inc | 5 + kernel/branches/Kolibri-acpi/kernel.asm | 4 +- kernel/branches/Kolibri-acpi/network/IPv4.inc | 26 ++ kernel/branches/Kolibri-acpi/network/icmp.inc | 1 + .../branches/Kolibri-acpi/network/socket.inc | 4 +- .../Kolibri-acpi/network/tcp_output.inc | 1 + .../Kolibri-acpi/network/tcp_subr.inc | 2 + kernel/branches/Kolibri-acpi/network/udp.inc | 1 + 12 files changed, 194 insertions(+), 118 deletions(-) diff --git a/kernel/branches/Kolibri-acpi/blkdev/cd_drv.inc b/kernel/branches/Kolibri-acpi/blkdev/cd_drv.inc index fd3da8e2b6..4f3dd31a97 100644 --- a/kernel/branches/Kolibri-acpi/blkdev/cd_drv.inc +++ b/kernel/branches/Kolibri-acpi/blkdev/cd_drv.inc @@ -1132,21 +1132,22 @@ check_ATAPI_device_event: mov [ignore_CD_eject_wait], 0 ret ;----------------------------------------------------------------------------- -iglobal -timer_ATAPI_check dd 0 -ATAPI_IDE0_lock db 0 -ATAPI_IDE1_lock db 0 -ATAPI_IDE2_lock db 0 -ATAPI_IDE3_lock db 0 -ATAPI_IDE4_lock db 0 -ATAPI_IDE5_lock db 0 -ATAPI_IDE6_lock db 0 -ATAPI_IDE7_lock db 0 -ATAPI_IDE8_lock db 0 -ATAPI_IDE9_lock db 0 -ATAPI_IDE10_lock db 0 -ATAPI_IDE11_lock db 0 -ignore_CD_eject_wait db 0 +uglobal +align 4 +timer_ATAPI_check dd ? +ATAPI_IDE0_lock db ? +ATAPI_IDE1_lock db ? +ATAPI_IDE2_lock db ? +ATAPI_IDE3_lock db ? +ATAPI_IDE4_lock db ? +ATAPI_IDE5_lock db ? +ATAPI_IDE6_lock db ? +ATAPI_IDE7_lock db ? +ATAPI_IDE8_lock db ? +ATAPI_IDE9_lock db ? +ATAPI_IDE10_lock db ? +ATAPI_IDE11_lock db ? +ignore_CD_eject_wait db ? endg ;----------------------------------------------------------------------------- ;************************************************* diff --git a/kernel/branches/Kolibri-acpi/core/memory.inc b/kernel/branches/Kolibri-acpi/core/memory.inc index affa85eb30..b668c50646 100644 --- a/kernel/branches/Kolibri-acpi/core/memory.inc +++ b/kernel/branches/Kolibri-acpi/core/memory.inc @@ -1445,7 +1445,3 @@ proc print_mem .done: ret endp - - - - diff --git a/kernel/branches/Kolibri-acpi/core/taskman.inc b/kernel/branches/Kolibri-acpi/core/taskman.inc index 8214862a20..9855df53dd 100644 --- a/kernel/branches/Kolibri-acpi/core/taskman.inc +++ b/kernel/branches/Kolibri-acpi/core/taskman.inc @@ -469,7 +469,6 @@ proc create_process stdcall, app_size:dword,img_base:dword,img_size:dword stdcall kernel_alloc, 0x2000 test eax, eax jz .fail - mov [process], eax lea edi, [eax+PROC.heap_lock] diff --git a/kernel/branches/Kolibri-acpi/fs/fat.inc b/kernel/branches/Kolibri-acpi/fs/fat.inc index 36c6305a21..7beb9fdca8 100644 --- a/kernel/branches/Kolibri-acpi/fs/fat.inc +++ b/kernel/branches/Kolibri-acpi/fs/fat.inc @@ -3,13 +3,12 @@ ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; -;; FAT32.INC ;; -;; ;; ;; FAT functions for KolibriOS ;; ;; ;; ;; Copyright 2002 Paolo Minazzi, paolo.minazzi@inwind.it ;; ;; ;; ;; See file COPYING for details ;; +;; 06.2015 fs_read64 - pathoswithin ;; ;; 04.02.2007 LFN create folder - diamond ;; ;; 08.10.2006 LFN delete file/folder - diamond ;; ;; 20.08.2006 LFN set file size (truncate/extend) - diamond ;; @@ -34,17 +33,15 @@ ;; 30.10.2004 file_read return also dirsize in bytes - ATV ;; ;; 20.10.2004 Makedir/Removedir - ATV ;; ;; 14.10.2004 Partition chain/Fat16 - ATV (thanks drh3xx) ;; -;; 06.9.2004 Fix free space by Mario79 added - MH ;; -;; 24.5.2004 Write back buffer for File_write -VT ;; -;; 20.5.2004 File_read function to work with syscall 58 - VT ;; -;; 30.3.2004 Error parameters at function return - VT ;; -;; 01.5.2002 Bugfix in device write - VT ;; -;; 20.5.2002 Hd status check - VT ;; -;; 29.6.2002 Improved fat32 verification - VT ;; +;; 06.09.2004 Fix free space - Mario79 ;; +;; 24.05.2004 Write back buffer for File_write - VT ;; +;; 20.05.2004 File_read function to work with syscall 58 - VT ;; +;; 30.03.2004 Error parameters at function return - VT ;; +;; 29.06.2002 Improved fat32 verification - VT ;; +;; 20.05.2002 Hd status check - VT ;; +;; 01.05.2002 Bugfix in device write - VT ;; ;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -$Revision: 4273 $ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cache_max equ 1919 ; max. is 1919*512+0x610000=0x6ffe00 @@ -62,11 +59,9 @@ struct FAT PARTITION fs_type db ? fat16_root db 0 ; flag for fat16 rootdir fat_change db 0 ; 1=fat has changed - db ? ; alignment + rb 1 Lock MUTEX ? ; currently operations with one partition - ; can not be executed in parallel since the - ; legacy code is not ready; this mutex guards - ; all operations +; can not be executed in parallel since the legacy code is not ready SECTORS_PER_FAT dd 0x1f3a NUMBER_OF_FATS dd 0x2 SECTORS_PER_CLUSTER dd 0x8 @@ -85,19 +80,16 @@ fatEND dd 0x0FFFFFF8 fatMASK dd 0x0FFFFFFF fatStartScan dd 2 - cluster_tmp dd 0 ; used by analyze_directory ; and analyze_directory_to_write - longname_sec1 dd 0 ; used by analyze_directory to save 2 previous longname_sec2 dd 0 ; directory sectors for delete long filename - fat_in_cache dd -1 ; For FAT16/FAT32, this points to 512-byte buffer for the current sector of FAT. ; For FAT12, the entire FAT structure is read ; and unpacked from 12bit per cluster to word per cluster. -; + ; Note: work with unpacked copy of FAT12 means ; additional memory and additional code for packing/unpacking. ; I'm not sure that the economy justifies the cost, but anyway, @@ -111,19 +103,17 @@ ends uglobal align 4 partition_count dd 0 ; partitions found by set_FAT32_variables - -hd_error dd 0 ; set by wait_for_sector_buffer +hd_error dd 0 hd_setup dd 0 hd_wait_timeout dd 0 - cache_search_start dd 0 ; used by find_empty_slot endg uglobal align 4 - Sector512: ; label for dev_hdcd.inc - buffer: - times 512 db 0 +Sector512: ; label for dev_hdcd.inc +buffer: +rb 512 endg iglobal @@ -1788,14 +1778,12 @@ fat_Read: jnz @f .noaccess: pop edi -.noaccess_2: call fat_unlock or ebx, -1 mov eax, ERROR_ACCESS_DENIED ret - @@: - stdcall hd_find_lfn, [esp+4+4] + stdcall hd_find_lfn, [esp+8] jnc .found pop edi push eax @@ -1803,27 +1791,25 @@ fat_Read: pop eax or ebx, -1 ret - .found: - test byte [edi+11], 0x10; do not allow read directories + test byte [edi+11], 0x10 ; do not allow read directories jnz .noaccess cmp dword [ebx+8], 0 jz @f xor ebx, ebx -.reteof: call fat_unlock mov eax, ERROR_END_OF_FILE pop edi ret @@: + mov edx, [ebx+4] ; file offset mov ecx, [ebx+12] ; size - mov edx, [ebx+16] ; pointer - mov ebx, [ebx+4] ; file offset - push edx + mov ebx, [ebx+16] ; buffer + push ebx push 0 mov eax, [edi+28] - sub eax, ebx - jb .eof + sub eax, edx + jb .fileEnd cmp eax, ecx jae @f mov ecx, eax @@ -1831,87 +1817,145 @@ fat_Read: @@: mov eax, [edi+20-2] mov ax, [edi+26] -; now eax=cluster, ebx=position, ecx=count, edx=buffer for data -.new_cluster: - jecxz .new_sector - cmp eax, 2 - jb .eof - cmp eax, [ebp+FAT.fatRESERVED] - jae .eof - mov [ebp+FAT.cluster_tmp], eax - dec eax - dec eax +; now eax=cluster, ebx=buffer for data, ecx=count, edx=position mov edi, [ebp+FAT.SECTORS_PER_CLUSTER] - imul eax, edi + shl edi, 9 +@@: + cmp eax, 2 + jb .fileEnd + cmp eax, [ebp+FAT.fatRESERVED] + jae .fileEnd + sub edx, edi + jc @f + call get_FAT + jc .noaccess2 + jmp @b +@@: + mov esi, eax + dec eax + dec eax + imul eax, [ebp+FAT.SECTORS_PER_CLUSTER] add eax, [ebp+FAT.DATA_START] -.new_sector: - test ecx, ecx - jz .done - sub ebx, 512 - jae .skip - add ebx, 512 - jnz .force_buf - cmp ecx, 512 - jb .force_buf -; we may read directly to given buffer - push eax ebx - mov ebx, edx - call fs_read32_app - test eax, eax - pop ebx eax - jne .noaccess_1 - add edx, 512 - sub ecx, 512 - jmp .skip -.force_buf: -; we must read sector to temporary buffer and then copy it to destination + add edx, edi + jz .alignedCluster + mov edi, edx + shr edi, 9 + add eax, edi + and edx, 511 + jz .alignedSector +.sectorPiece: push eax ebx lea ebx, [ebp+FAT.buffer] call fs_read32_app test eax, eax mov eax, ebx pop ebx - jne .noaccess_3 - add eax, ebx + jne .noaccess3 + add eax, edx push ecx - add ecx, ebx + add ecx, edx cmp ecx, 512 jbe @f mov ecx, 512 @@: - sub ecx, ebx - mov ebx, edx + sub ecx, edx call memmove - add edx, ecx sub [esp], ecx - pop ecx - pop eax - xor ebx, ebx -.skip: + add ebx, ecx + pop ecx eax + xor edx, edx + inc edi inc eax - dec edi - jnz .new_sector - mov eax, [ebp+FAT.cluster_tmp] + test ecx, ecx + jz .done +.alignedSector: + cmp ecx, 512 + jc .sectorPiece + shl edi, 9 + add ecx, edi + mov edi, [ebp+FAT.SECTORS_PER_CLUSTER] + shl edi, 9 +.alignedCluster: + cmp ecx, 512 + jc .sectorPiece + mov edx, eax + mov eax, esi +@@: + sub ecx, edi + jbe .readEnd call get_FAT - jc .noaccess_1 - - jmp .new_cluster -.noaccess_3: + jc .noaccess4 + cmp eax, 2 + jb .fileEnd2 + cmp eax, [ebp+FAT.fatRESERVED] + jae .fileEnd2 + inc esi + cmp eax, esi + jz @b +.fragmentEnd: + xchg eax, esi + dec eax + dec eax + imul eax, [ebp+FAT.SECTORS_PER_CLUSTER] + add eax, [ebp+FAT.DATA_START] + sub eax, edx +.readFragment: + push ecx + mov ecx, eax + mov eax, edx + xor edx, edx + push eax + call fs_read64_app + add [esp], ecx + shl ecx, 9 + add ebx, ecx + test eax, eax pop eax -.noaccess_1: + jnz .noaccess3 + pop ecx + xor edx, edx + jcxz .done + cmp ecx, 512 + jc .sectorPiece + mov eax, esi + dec eax + dec eax + imul eax, [ebp+FAT.SECTORS_PER_CLUSTER] + add eax, [ebp+FAT.DATA_START] + jmp .alignedCluster +.readEnd: + add ecx, edi + mov edi, ecx + and ecx, 511 + shr edi, 9 + dec eax + dec eax + imul eax, [ebp+FAT.SECTORS_PER_CLUSTER] + add eax, [ebp+FAT.DATA_START] + sub eax, edx + add eax, edi + jmp .readFragment +.noaccess3: pop eax - push ERROR_DEVICE +.noaccess2: + mov byte [esp], ERROR_DEVICE .done: - mov ebx, edx call fat_unlock pop eax edx edi sub ebx, edx ret -.eof: - mov ebx, edx - pop eax edx - sub ebx, edx - jmp .reteof +.fileEnd: + mov byte [esp], ERROR_END_OF_FILE + jmp .done +.noaccess4: + mov byte [esp], ERROR_DEVICE + jmp @f +.fileEnd2: + mov byte [esp], ERROR_END_OF_FILE +@@: + inc esi + xor ecx, ecx + jmp .fragmentEnd ;---------------------------------------------------------------- ; fat_ReadFolder - FAT implementation of reading a folder diff --git a/kernel/branches/Kolibri-acpi/gui/button.inc b/kernel/branches/Kolibri-acpi/gui/button.inc index c320b6b6ea..e4e6fc054d 100644 --- a/kernel/branches/Kolibri-acpi/gui/button.inc +++ b/kernel/branches/Kolibri-acpi/gui/button.inc @@ -112,9 +112,11 @@ syscall_button: ;///// system function 8 ////////////////////////////////////// add ebx, [eax - twdw + WDATA.box.left] add ecx, [eax - twdw + WDATA.box.top] mov eax, ebx + inc eax shl eax, 16 mov ax, bx add ax, word[esp + 16] + dec ax mov ebx, ecx shl ebx, 16 mov bx, cx @@ -128,6 +130,8 @@ syscall_button: ;///// system function 8 ////////////////////////////////////// ; set button height counter @@: mov edx, edi + add ebx, 0x00010001 + dec edx .next_line: call button._.button_dececx @@ -192,6 +196,7 @@ syscall_button: ;///// system function 8 ////////////////////////////////////// mov ecx, esi call button._.incecx ; call [draw_line] + dec ebx call __sys_draw_line ; right border diff --git a/kernel/branches/Kolibri-acpi/kernel.asm b/kernel/branches/Kolibri-acpi/kernel.asm index adef893d58..e68bb8220f 100644 --- a/kernel/branches/Kolibri-acpi/kernel.asm +++ b/kernel/branches/Kolibri-acpi/kernel.asm @@ -1688,8 +1688,8 @@ draw_num_text: mov edi, [esp+64+4] jmp dtext ;----------------------------------------------------------------------------- -iglobal -midi_base dw 0 +uglobal +midi_base dw ? endg ;----------------------------------------------------------------------------- align 4 diff --git a/kernel/branches/Kolibri-acpi/network/IPv4.inc b/kernel/branches/Kolibri-acpi/network/IPv4.inc index b4a9ebcb86..cc267e0318 100644 --- a/kernel/branches/Kolibri-acpi/network/IPv4.inc +++ b/kernel/branches/Kolibri-acpi/network/IPv4.inc @@ -569,6 +569,7 @@ IPv4_find_fragment_slot: ; IPv4_output ; ; IN: eax = Destination IP +; ebx = device ptr (or 0 to let IP layer decide) ; ecx = data length ; edx = Source IP ; di = TTL shl 8 + protocol @@ -863,6 +864,7 @@ IPv4_fragment: ; IPv4_route ; ; IN: eax = Destination IP +; ebx = outgoing device / 0 ; edx = Source IP ; OUT: eax = Destination IP (or gateway IP) ; edx = Source IP @@ -874,6 +876,9 @@ IPv4_fragment: align 4 IPv4_route: ; TODO: return error if no valid route found + test ebx, ebx + jnz .got_device + cmp eax, 0xffffffff je .broadcast @@ -903,6 +908,27 @@ IPv4_route: ; TODO: return error if no valid route found ret + .got_device: +; Validate device ptr and convert to device number + call NET_ptr_to_num4 + cmp edi, -1 + je .fail + + mov edx, [IP_LIST + edi] ; Source IP + +; Check if we should route to gateway or not + mov ebx, [IP_LIST + edi] + and ebx, [SUBNET_LIST + edi] + mov ecx, eax + and ecx, [SUBNET_LIST + edi] + je @f + mov eax, [GATEWAY_LIST + edi] + @@: + ret + + .fail: + ret + ;--------------------------------------------------------------------------- diff --git a/kernel/branches/Kolibri-acpi/network/icmp.inc b/kernel/branches/Kolibri-acpi/network/icmp.inc index 607ecd2b59..27b1c92df8 100644 --- a/kernel/branches/Kolibri-acpi/network/icmp.inc +++ b/kernel/branches/Kolibri-acpi/network/icmp.inc @@ -388,6 +388,7 @@ ICMP_output_raw: mov di, IP_PROTO_ICMP SHL 8 + 128 ; TTL mov edx, [eax + IP_SOCKET.LocalIP] + mov ebx, [eax + IP_SOCKET.device] mov eax, [eax + IP_SOCKET.RemoteIP] call IPv4_output jz .exit diff --git a/kernel/branches/Kolibri-acpi/network/socket.inc b/kernel/branches/Kolibri-acpi/network/socket.inc index dc12cd0b81..8bc5c7ed94 100644 --- a/kernel/branches/Kolibri-acpi/network/socket.inc +++ b/kernel/branches/Kolibri-acpi/network/socket.inc @@ -1160,7 +1160,7 @@ SOCKET_set_opt: cmp dword[edx+8], 0 je .unbind - movzx edx, byte[edx + 9] + movzx edx, byte[edx + 12] cmp edx, NET_DEVICES_MAX ja .invalid @@ -1169,7 +1169,7 @@ SOCKET_set_opt: jz .already mov [eax + SOCKET.device], edx - DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_set_opt: Bound socket %x to device %x\n",eax, edx + DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_set_opt: Bound socket %x to device %x\n", eax, edx mov dword[esp+32], 0 ; success! ret diff --git a/kernel/branches/Kolibri-acpi/network/tcp_output.inc b/kernel/branches/Kolibri-acpi/network/tcp_output.inc index eb788537d0..1cf05cea48 100644 --- a/kernel/branches/Kolibri-acpi/network/tcp_output.inc +++ b/kernel/branches/Kolibri-acpi/network/tcp_output.inc @@ -504,6 +504,7 @@ endl mov ecx, esi mov edx, [eax + IP_SOCKET.LocalIP] ; source ip + mov ebx, [eax + IP_SOCKET.device] mov eax, [eax + IP_SOCKET.RemoteIP] ; dest ip mov di, IP_PROTO_TCP shl 8 + 128 call IPv4_output diff --git a/kernel/branches/Kolibri-acpi/network/tcp_subr.inc b/kernel/branches/Kolibri-acpi/network/tcp_subr.inc index 9c435b1968..c048d2c5eb 100644 --- a/kernel/branches/Kolibri-acpi/network/tcp_subr.inc +++ b/kernel/branches/Kolibri-acpi/network/tcp_subr.inc @@ -287,6 +287,7 @@ TCP_respond: push cx ebx mov eax, [ebx + IP_SOCKET.RemoteIP] mov edx, [ebx + IP_SOCKET.LocalIP] + mov ebx, [ebx + IP_SOCKET.device] mov ecx, sizeof.TCP_header mov di, IP_PROTO_TCP shl 8 + 128 call IPv4_output @@ -372,6 +373,7 @@ TCP_respond_segment: mov eax, [edi] mov ecx, sizeof.TCP_header mov di, IP_PROTO_TCP shl 8 + 128 + xor ebx, ebx ;;; fixme call IPv4_output jz .error pop esi cx diff --git a/kernel/branches/Kolibri-acpi/network/udp.inc b/kernel/branches/Kolibri-acpi/network/udp.inc index 905030440f..89df807f18 100644 --- a/kernel/branches/Kolibri-acpi/network/udp.inc +++ b/kernel/branches/Kolibri-acpi/network/udp.inc @@ -258,6 +258,7 @@ UDP_output: sub esp, 4 ; Data ptr will be placed here push edx esi mov edx, [eax + IP_SOCKET.LocalIP] + mov ebx, [eax + IP_SOCKET.device] mov eax, [eax + IP_SOCKET.RemoteIP] mov di, IP_PROTO_UDP shl 8 + 128 add ecx, sizeof.UDP_header