From d397ad5154fde6c5a4f4dea9bfc3227022cffe32 Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Fri, 22 May 2020 15:38:59 +0000 Subject: [PATCH] User-land ring buffers. git-svn-id: svn://kolibrios.org@7967 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/heap.inc | 69 ++++++++++++++++++++++++++++++++++ kernel/trunk/core/memory.inc | 20 ++++++---- kernel/trunk/docs/sysfuncs.txt | 19 ++++++++++ 3 files changed, 101 insertions(+), 7 deletions(-) diff --git a/kernel/trunk/core/heap.inc b/kernel/trunk/core/heap.inc index 7184e0b4e4..aa9739f083 100644 --- a/kernel/trunk/core/heap.inc +++ b/kernel/trunk/core/heap.inc @@ -1518,3 +1518,72 @@ proc shmem_close stdcall, name:dword ret endp + + +proc user_ring stdcall, size:dword + +locals + virt_ptr dd ? + phys_ptr dd ? + num_pages dd ? +endl + +; Size must be an exact multiple of pagesize + mov eax, size + test eax, PAGE_SIZE-1 + jnz .exit + +; We must have at least one complete page + shr eax, 12 + jz .exit + mov [num_pages], eax + +; Allocate double the virtual memory + mov eax, [size] + shl eax, 1 + jz .exit + stdcall user_alloc, eax + test eax, eax + jz .exit + mov [virt_ptr], eax + +; Now allocate physical memory + stdcall alloc_pages, [num_pages] + test eax, eax + jz .exit_free_virt + mov [phys_ptr], eax + +; Map first half of virtual memory to physical memory + push ecx esi edi + mov ecx, [num_pages] + mov esi, [virt_ptr] + mov edi, [phys_ptr] + .loop1: + stdcall map_page, esi, edi, PG_UWR + add esi, PAGE_SIZE + add edi, PAGE_SIZE + dec ecx + jnz .loop1 + +; Map second half of virtual memory to same physical memory + mov ecx, [pages] + mov edi, [phys_ptr] + .loop2: + stdcall map_page, esi, edi, PG_UWR + add esi, PAGE_SIZE + add edi, PAGE_SIZE + dec ecx + jnz .loop2 + pop edi esi ecx + + mov eax, [virt_ptr] + ret + + .exit_free_virt: + stdcall user_free, [virt_ptr] + + .exit: + xor eax, eax + ret + +endp \ No newline at end of file diff --git a/kernel/trunk/core/memory.inc b/kernel/trunk/core/memory.inc index bd667fb721..075b53dc2e 100644 --- a/kernel/trunk/core/memory.inc +++ b/kernel/trunk/core/memory.inc @@ -1,6 +1,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; -;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; +;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -78,7 +78,7 @@ proc alloc_pages stdcall, count:dword .find: mov edx, [count] mov edi, ecx -.match: + .match: cmp byte [ecx], 0xFF jne .next dec edx @@ -86,14 +86,14 @@ proc alloc_pages stdcall, count:dword inc ecx cmp ecx, ebx jb .match -.out_of_memory: -.fail: + .out_of_memory: + .fail: xor eax, eax pop edi pop ebx popfd ret -.next: + .next: inc ecx cmp ecx, ebx jb .find @@ -102,7 +102,7 @@ proc alloc_pages stdcall, count:dword popfd xor eax, eax ret -.ok: + .ok: sub ecx, edi inc ecx push esi @@ -1103,7 +1103,7 @@ f68: jbe sys_sheduler cmp ebx, 11 jb undefined_syscall - cmp ebx, 28 + cmp ebx, 29 ja undefined_syscall xor eax, eax jmp dword [f68call+ebx*4-11*4] @@ -1220,6 +1220,11 @@ f68: stdcall kernel_free, ebp ret +.29: + stdcall user_ring, ecx + mov [esp+SYSCALL_STACK._eax], eax + ret + .fail: mov [esp+SYSCALL_STACK._eax], eax ret @@ -1245,6 +1250,7 @@ f68call: ; keep this table closer to main code dd f68.26 ; user_unmap dd f68.27 ; load_file_umode dd f68.28 ; loadFileUnicode + dd f68.29 ; user_ring align 4 proc load_pe_driver stdcall, file:dword, cmdline:dword diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 65914e1546..65eb6f7c35 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -3612,6 +3612,25 @@ Returned value: * edx = size of the loaded file, or zero Remarks: * function loads file and unpacks, if necessary +====================================================================== +======== Function 68, subfunction 29 - allocate ring memory. ========= +====================================================================== +Parameters: + * eax = 68 - function number + * ebx = 29 - subfunction number + * ecx = required size in bytes +Returned value: + * eax = 0 - failed + * eax = pointer to the allocated ring +Remarks: + * The requested size must be an exact multiple of pagesize (4 Kb) + * The function allocates memory in such a way that you can read and + write beyond the size of the allocated memory and will reach the + beginning of the buffer again. + +---------------------- Constants for registers: ---------------------- + eax - SF_SYS_MISC (68) + ebx - SSF_MEM_ALLOC_RING (29) ====================================================================== ====================== Function 69 - debugging. ======================