From a0e9094c8d6428a100376a28a87b5ca3a8e75a6a Mon Sep 17 00:00:00 2001 From: "Sergey Semyonov (Serge)" Date: Fri, 10 Jan 2014 03:59:17 +0000 Subject: [PATCH] kolibri-process:protect user heap with the mutex git-svn-id: svn://kolibrios.org@4434 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../kolibri-process/boot/bootcode.inc | 50 ++++++++++--- kernel/branches/kolibri-process/core/heap.inc | 73 ++++++++++++++++--- kernel/branches/kolibri-process/kernel.asm | 32 +------- 3 files changed, 104 insertions(+), 51 deletions(-) diff --git a/kernel/branches/kolibri-process/boot/bootcode.inc b/kernel/branches/kolibri-process/boot/bootcode.inc index b569590fc6..d500f3e332 100644 --- a/kernel/branches/kolibri-process/boot/bootcode.inc +++ b/kernel/branches/kolibri-process/boot/bootcode.inc @@ -159,7 +159,7 @@ FirstDataSector dw 0 ; begin of data ; ;========================================================================= -include 'bootvesa.inc' ;Include source for boot vesa +include 'bootvesa.inc' ;Include source for boot vesa if defined extended_primary_loader include 'parsers.inc' end if @@ -649,7 +649,7 @@ end if cmp byte [di+preboot_dma-preboot_device], 1 adc byte [di+preboot_dma-preboot_device], 0 cmp byte [di+preboot_launcher-preboot_device], 1 ; Start LAUNCHER by default - adc byte [di+preboot_launcher-preboot_device], 0 + adc byte [di+preboot_launcher-preboot_device], 0 ; cmp byte [di+preboot_biosdisk-preboot_device], 1 ; adc byte [di+preboot_biosdisk-preboot_device], 0 ;; default value for VRR is OFF @@ -793,7 +793,7 @@ if defined extended_primary_loader _ask_question bdev,'12',preboot_device ; range accepted for answer: 1-2 else _ask_question bdev,'14',preboot_device ; range accepted for answer: 1-4 -end if +end if _setcursor 14,0 .d: @@ -891,7 +891,7 @@ end if push word [es:bp+6] pop word [number_vm] mov word [preboot_graph], bp ;save choose - + jmp .d .change_b: ; b) preboot_biosdisk = use BIOS disks through V86 emulation? @@ -1101,7 +1101,7 @@ end if ; Start the first app (right now it's LAUNCHER) after kernel is loaded? mov al, [preboot_launcher] - mov [es:BOOT_LAUNCHER_START], al ;// 0x901D + mov [es:BOOT_LAUNCHER_START], al ;// 0x901D ; BOOT DEVICE @@ -1148,7 +1148,7 @@ include '../detect/biosmem.inc' ; TODO: !!!! read only first sector and set variables !!!!! ; ... ; TODO: !!! then read flippy image track by track - + mov cx, 0x0001 ; startcyl,startsector .a1: push cx dx @@ -1240,7 +1240,7 @@ include '../detect/biosmem.inc' ; and copy them to extended memory mov si, movedesc mov [si+8*2+3], bh ; from - + mov ax, word [BPB_BytsPerSec] shr ax, 1 ; words per sector mov cx, word [BPB_RsvdSecCnt] @@ -1248,7 +1248,7 @@ include '../detect/biosmem.inc' mul cx push ax ; save to stack count of words in boot+FAT xchg ax, cx - + push es push ds pop es @@ -1274,7 +1274,7 @@ sayerr_memmove: ; TODO: BPB_NumFATs !!!!! add bx, word [BPB_BytsPerSec] ; !!! TODO: may be need multiply by BPB_RsvdSecCnt !!! mov byte [si+8*2+3], bh ; bx - begin of FAT - + mov ax, word [BPB_BytsPerSec] shr ax, 1 ; words per sector mov cx, word [BPB_FATSz16] @@ -1289,12 +1289,12 @@ sayerr_memmove: pop es test ah, ah jnz sayerr_floppy - + mov ax, cx shl ax, 1 and eax, 0ffffh ; ax - count of bytes in FAT add dword [si+8*3+2], eax - + ; reading RootDir ; TODO: BPB_NumFATs add bx, ax @@ -1319,7 +1319,7 @@ sayerr_memmove: pop bx push bx add word [FirstDataSector], bx ; Begin of data region of floppy - + ; read RootDir call conv_abs_to_THS pop ax @@ -1518,3 +1518,29 @@ setgr: gmok2: push ds pop es + + sidt [cs:old_ints_h] + + cli ; disable all irqs + mov al, 255 ; mask all irqs + out 0xa1, al + out 0x21, al + l.5: + in al, 0x64 ; Enable A20 + test al, 2 + jnz l.5 + mov al, 0xD1 + out 0x64, al + l.6: + in al, 0x64 + test al, 2 + jnz l.6 + mov al, 0xDF + out 0x60, al + l.7: + in al, 0x64 + test al, 2 + jnz l.7 + mov al, 0xFF + out 0x64, al + diff --git a/kernel/branches/kolibri-process/core/heap.inc b/kernel/branches/kolibri-process/core/heap.inc index ab4dae1865..cdce1c854f 100644 --- a/kernel/branches/kolibri-process/core/heap.inc +++ b/kernel/branches/kolibri-process/core/heap.inc @@ -558,7 +558,7 @@ restore block_base restore block_size restore block_flags -;;;;;;;;;;;;;; USER ;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;; USER HEAP ;;;;;;;;;;;;;;;;; HEAP_TOP equ 0x80000000 @@ -573,6 +573,9 @@ proc init_heap sub eax, PAGE_SIZE ret @@: + lea ecx, [ebx+PROC.heap_lock] + call mutex_init + mov esi, [ebx+PROC.mem_used] add esi, 4095 and esi, not 4095 @@ -597,11 +600,14 @@ proc user_alloc stdcall, alloc_size:dword push esi push edi + mov ebx, [current_process] + lea ecx, [ebx+PROC.heap_lock] + call mutex_lock + mov ecx, [alloc_size] add ecx, (4095+PAGE_SIZE) and ecx, not 4095 - mov ebx, [current_process] mov esi, dword [ebx+PROC.heap_base] ; heap_base mov edi, dword [ebx+PROC.heap_top] ; heap_top .scan: @@ -643,6 +649,9 @@ proc user_alloc stdcall, alloc_size:dword and ebx, not 0xFFF add [edx+PROC.mem_used], ebx + lea ecx, [edx+PROC.heap_lock] + call mutex_unlock + lea eax, [esi+4096] pop edi @@ -658,6 +667,10 @@ proc user_alloc stdcall, alloc_size:dword add esi, eax jmp .scan .m_exit: + mov ecx, [current_process] + lea ecx, [ecx+PROC.heap_lock] + call mutex_unlock + xor eax, eax pop edi pop esi @@ -673,6 +686,8 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword push edi mov ebx, [current_process] + lea ecx, [ebx+PROC.heap_lock] + call mutex_lock mov edx, [address] and edx, not 0xFFF @@ -697,6 +712,10 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword mov esi, ecx jmp .scan .error: + mov ecx, [current_process] + lea ecx, [ecx+PROC.heap_lock] + call mutex_unlock + xor eax, eax pop edi pop esi @@ -754,6 +773,9 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword and ebx, not 0xFFF add [edx+PROC.mem_used], ebx + lea ecx, [edx+PROC.heap_lock] + call mutex_unlock + mov eax, [address] pop edi @@ -769,10 +791,14 @@ proc user_free stdcall, base:dword mov esi, [base] test esi, esi - jz .exit + jz .fail push ebx + mov ebx, [current_process] + lea ecx, [ebx+PROC.heap_lock] + call mutex_lock + xor ebx, ebx shr esi, 12 mov eax, [page_tabs+(esi-1)*4] @@ -809,6 +835,7 @@ proc user_free stdcall, base:dword push edi mov edx, [current_process] + lea ecx, [edx+PROC.heap_lock] mov esi, dword [edx+PROC.heap_base] mov edi, dword [edx+PROC.heap_top] sub ebx, [edx+PROC.mem_used] @@ -816,19 +843,23 @@ proc user_free stdcall, base:dword mov [edx+PROC.mem_used], ebx call user_normalize pop edi +.exit: + call mutex_unlock + + xor eax, eax pop ebx pop esi ret -.exit: + +.cantfree: + mov ecx, [current_process] + lea ecx, [ecx+PROC.heap_lock] + jmp .exit +.fail: xor eax, eax inc eax pop esi ret -.cantfree: - xor eax, eax - pop ebx - pop esi - ret endp @@ -955,6 +986,13 @@ user_realloc: ret @@: push ecx edx + + push eax + mov ecx, [current_process] + lea ecx, [ecx+PROC.heap_lock] + call mutex_lock + pop eax + lea ecx, [eax - 0x1000] shr ecx, 12 mov edx, [page_tabs+ecx*4] @@ -962,6 +1000,10 @@ user_realloc: jnz @f ; attempt to realloc invalid pointer .ret0: + mov ecx, [current_process] + lea ecx, [ecx+PROC.heap_lock] + call mutex_unlock + pop edx ecx xor eax, eax ret @@ -1051,8 +1093,12 @@ user_realloc: or ebx, FREE_BLOCK mov [page_tabs+ecx*4], ebx .ret: + mov ecx, [current_process] + lea ecx, [ecx+PROC.heap_lock] + call mutex_unlock pop eax edx ecx ret + .realloc_add: ; get some additional memory mov eax, [current_process] @@ -1091,8 +1137,13 @@ user_realloc: mov edx, [current_process] shl ebx, 12 add [edx+PROC.mem_used], ebx + + mov ecx, [current_process] + lea ecx, [ecx+PROC.heap_lock] + call mutex_unlock pop eax edx ecx ret + .cant_inplace: push esi edi mov eax, [current_process] @@ -1169,6 +1220,10 @@ user_realloc: inc esi dec ebx jnz @b + + mov ecx, [current_process] + lea ecx, [ecx+PROC.heap_lock] + call mutex_unlock pop eax edi esi edx ecx ret diff --git a/kernel/branches/kolibri-process/kernel.asm b/kernel/branches/kolibri-process/kernel.asm index 391d609834..b4daba2863 100644 --- a/kernel/branches/kolibri-process/kernel.asm +++ b/kernel/branches/kolibri-process/kernel.asm @@ -177,39 +177,11 @@ include "detect/biosdisk.inc" ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; CR0 Flags - Protected mode and Paging - - mov ecx, CR0_PE + cld ; Enabling 32 bit protected mode - sidt [cs:old_ints_h] - - cli ; disable all irqs - cld - mov al, 255 ; mask all irqs - out 0xa1, al - out 0x21, al - l.5: - in al, 0x64 ; Enable A20 - test al, 2 - jnz l.5 - mov al, 0xD1 - out 0x64, al - l.6: - in al, 0x64 - test al, 2 - jnz l.6 - mov al, 0xDF - out 0x60, al - l.7: - in al, 0x64 - test al, 2 - jnz l.7 - mov al, 0xFF - out 0x64, al - + mov ecx, CR0_PE ; CR0 Flags - Protected mode and Paging lgdt [cs:tmp_gdt] ; Load GDT mov eax, cr0 ; protected mode or eax, ecx