From 025b91fede939e536c846decc1ab23a0682cbc13 Mon Sep 17 00:00:00 2001 From: "Sergey Semyonov (Serge)" Date: Wed, 28 Mar 2007 18:04:13 +0000 Subject: [PATCH] merged trunk git-svn-id: svn://kolibrios.org@436 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/branches/flat_kernel/core/fpu.inc | 44 ++++++++----- kernel/branches/flat_kernel/core/sched.inc | 7 +++ kernel/branches/flat_kernel/core/sys32.inc | 38 +++++------ kernel/branches/flat_kernel/core/syscall.inc | 46 +++++++------- kernel/branches/flat_kernel/kernel.asm | 66 ++++++++++++++++---- 5 files changed, 132 insertions(+), 69 deletions(-) diff --git a/kernel/branches/flat_kernel/core/fpu.inc b/kernel/branches/flat_kernel/core/fpu.inc index 97409ef548..a3da0e1c07 100644 --- a/kernel/branches/flat_kernel/core/fpu.inc +++ b/kernel/branches/flat_kernel/core/fpu.inc @@ -1,3 +1,9 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init_fpu: clts @@ -52,36 +58,43 @@ fpu_save: mov edi, eax mov ecx, [fpu_owner] - mov eax, [CURRENT_TASK] - cmp ecx, eax + mov esi, [CURRENT_TASK] + cmp ecx, esi jne .save -.copy: - shl eax, 8 - mov esi, [eax+SLOT_BASE+APPDATA.fpu_state] + + call save_context + jmp .exit +.save: + mov [fpu_owner], esi + + shl ecx, 8 + mov eax, [ecx+SLOT_BASE+APPDATA.fpu_state] + + call save_context + + shl esi, 8 + mov esi, [esi+SLOT_BASE+APPDATA.fpu_state] mov ecx, 512/4 cld rep movsd fninit - +.exit: popfd pop edi pop esi pop ecx ret -.save: - mov [fpu_owner], eax - - shl ecx, 8 - mov ecx, [ecx+SLOT_BASE+APPDATA.fpu_state] +align 4 +save_context: bt [cpu_caps], CAPS_SSE jnc .no_SSE - fxsave [ecx] - jmp .copy + fxsave [eax] + ret .no_SSE: - fnsave [ecx] - jmp .copy + fnsave [eax] + ret align 4 fpu_restore: @@ -99,7 +112,6 @@ fpu_restore: jne .copy clts - bt [cpu_caps], CAPS_SSE jnc .no_SSE diff --git a/kernel/branches/flat_kernel/core/sched.inc b/kernel/branches/flat_kernel/core/sched.inc index c529466d73..ef1dcf87b0 100644 --- a/kernel/branches/flat_kernel/core/sched.inc +++ b/kernel/branches/flat_kernel/core/sched.inc @@ -1,3 +1,10 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; +;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; +;; Distributed under terms of the GNU General Public License ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; IRQ0 HANDLER (TIMER INTERRUPT) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/kernel/branches/flat_kernel/core/sys32.inc b/kernel/branches/flat_kernel/core/sys32.inc index b3911196bc..a8b5e0cfc7 100644 --- a/kernel/branches/flat_kernel/core/sys32.inc +++ b/kernel/branches/flat_kernel/core/sys32.inc @@ -1,11 +1,16 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; MenuetOS process management, protected ring3 ;; -;; ;; -;; Distributed under GPL. See file COPYING for details. ;; -;; Copyright 2003 Ville Turjanmaa ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; ;; +;; MenuetOS process management, protected ring3 ;; +;; ;; +;; Distributed under GPL. See file COPYING for details. ;; +;; Copyright 2003 Ville Turjanmaa ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 4 idtreg: @@ -18,23 +23,18 @@ build_interrupt_table: mov esi, sys_int mov ecx, 0x40 @@: - mov eax, [esi] + lodsd mov [edi], ax ; lower part of offset mov [edi+2], word os_code ; segment selector - shr eax, 16 - mov [edi+4], word 10001110b shl 8 ; interrupt descriptor - mov [edi+6], ax - add esi, 4 + mov ax, word 10001110b shl 8 ; type: interrupt gate + mov [edi+4], eax add edi, 8 - dec ecx - jnz @b + loop @b ;mov edi,8*0x40+idts+8 - mov [edi + 0], word (i40 and ((1 shl 16)-1)) - mov [edi + 2], word os_code - mov [edi + 4], word 11101110b*256 - mov [edi + 6], word (i40 shr 16) - + mov dword [edi], (i40 and 0xFFFF) or (os_code shl 16) + mov dword [edi+4], (11101111b shl 8) or (i40 and 0xFFFF0000) + ; type: trap gate ret iglobal diff --git a/kernel/branches/flat_kernel/core/syscall.inc b/kernel/branches/flat_kernel/core/syscall.inc index b68b8e165c..fd02d8ed39 100644 --- a/kernel/branches/flat_kernel/core/syscall.inc +++ b/kernel/branches/flat_kernel/core/syscall.inc @@ -1,3 +1,10 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; SYSTEM CALL ENTRY ;; @@ -6,6 +13,8 @@ align 16 i40: +; diamond, 27.03.2007: handler does not require disabled interrupts +; so interrupts remain enabled when calling int 0x40 pushad cld @@ -22,7 +31,7 @@ i40: mov edi, [esp+28] ; enable interupts - a task switch or an IRQ _CAN_ interrupt i40 handler - sti +; sti push eax and edi,0xff call dword [servetable+edi*4] @@ -38,10 +47,10 @@ i40: ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -uglobal -times 100 db ? -sysenter_stack: -endg +;uglobal +;times 100 db ? +;sysenter_stack: +;endg align 32 SYSENTER_VAR equ 0 @@ -54,19 +63,13 @@ sysenter_entry: ; mov eax, [ss:SLOT_BASE + eax + APPDATA.pl0_stack] ; lea esp, [eax + RING0_STACK_SIZE] ; configure ESP ; mov eax, [ss:sysenter_stack - 4] ; eax - original eax, from app + mov esp, [ss:tss._esp0] - mov esp, [current_slot] - mov esp, [esp + APPDATA.pl0_stack] - add esp, RING0_STACK_SIZE ; configure ESP sti ;------------------ pushad cld - ; mov ax, word app_data - ; mov ds, ax - ; mov es, ax - mov eax, ebx mov ebx, ecx mov ecx, edx @@ -93,8 +96,13 @@ sysenter_entry: align 32 syscall_entry: ; cli syscall clear IF - xchg ecx, [esp] - mov [SYSENTER_VAR + 4], esp + xchg esp, [ss:tss._esp0] + push ecx + lea ecx, [esp+4] + xchg ecx, [ss:tss._esp0] + sti + push ecx + mov ecx, [ecx] ; mov [ss:sysenter_stack - 4], eax ; mov eax, [ss:CURRENT_TASK] @@ -103,11 +111,6 @@ syscall_entry: ; lea esp, [eax + RING0_STACK_SIZE] ; configure ESP ; mov eax, [ss:sysenter_stack - 4] ; eax - original eax, from app - mov esp, [current_slot] - mov esp, [esp + APPDATA.pl0_stack] - add esp, RING0_STACK_SIZE ; configure ESP - - sti ;------------------ pushad cld @@ -131,9 +134,8 @@ syscall_entry: popad ;------------------ - cli - mov esp, [SYSENTER_VAR + 4] - xchg ecx, [esp] + mov ecx, [ss:esp+4] + pop esp sysret iglobal ;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/kernel/branches/flat_kernel/kernel.asm b/kernel/branches/flat_kernel/kernel.asm index c89ae34586..d98fdbd794 100644 --- a/kernel/branches/flat_kernel/kernel.asm +++ b/kernel/branches/flat_kernel/kernel.asm @@ -1,13 +1,54 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; Kolibri OS - based on source code Menuet OS, but not 100% compatible. +;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. +;; PROGRAMMING: +;; Ivan Poddubny +;; Marat Zakiyanov (Mario79) +;; VaStaNi +;; Trans +;; Mihail Semenyako (mike.dld) +;; Sergey Kuzmin (Wildwest) +;; Andrey Halyavin (halyavin) +;; Mihail Lisovin (Mihasik) +;; Andrey Ignatiev (andrew_programmer) +;; NoName +;; Evgeny Grechnikov (Diamond) +;; Iliya Mihailov (Ghost) +;; Sergey Semyonov (Serge) +;; Johnny_B ;; -;; See file COPYING or GNU.TXT for details with these additional details: -;; - All code written in 32 bit x86 assembly language -;; - No external code (eg. bios) at process execution time +;; Data in this file was originally part of MenuetOS project which is +;; distributed under the terms of GNU GPL. It is modified and redistributed as +;; part of KolibriOS project under the terms of GNU GPL. ;; +;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa +;; PROGRAMMING: ;; -;; Compile with last version FASM +;; Ville Mikael Turjanmaa, villemt@itu.jyu.fi +;; - main os coding/design +;; Jan-Michael Brummer, BUZZ2@gmx.de +;; Felix Kaiser, info@felix-kaiser.de +;; Paolo Minazzi, paolo.minazzi@inwind.it +;; quickcode@mail.ru +;; Alexey, kgaz@crosswinds.net +;; Juan M. Caravaca, bitrider@wanadoo.es +;; kristol@nic.fi +;; Mike Hibbett, mikeh@oceanfree.net +;; Lasse Kuusijarvi, kuusijar@lut.fi +;; Jarek Pelczar, jarekp3@wp.pl +;; +;; KolibriOS is distributed in the hope that it will be useful, but WITHOUT ANY +;; WARRANTY. No author or distributor accepts responsibility to anyone for the +;; consequences of using it or for whether it serves any particular purpose or +;; works at all, unless he says so in writing. Refer to the GNU General Public +;; License (the "GPL") for full details. +; +;; Everyone is granted permission to copy, modify and redistribute KolibriOS, +;; but only under the conditions described in the GPL. A copy of this license +;; is supposed to have been given to you along with KolibriOS so you can know +;; your rights and responsibilities. It should be in a file named COPYING. +;; Among other things, the copyright notice and this notice must be preserved +;; on all copies. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -22,12 +63,12 @@ max_processes equ 255 tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4 -os_stack equ os_data_l-gdts ; GDTs -os_code equ os_code_l-gdts -graph_data equ 3+graph_data_l-gdts -tss0 equ tss0_l-gdts -app_code equ 3+app_code_l-gdts -app_data equ 3+app_data_l-gdts +os_stack equ (os_data_l-gdts) ; GDTs +os_code equ (os_code_l-gdts) +graph_data equ (3+graph_data_l-gdts) +tss0 equ (tss0_l-gdts) +app_code equ (3+app_code_l-gdts) +app_data equ (3+app_data_l-gdts) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -338,7 +379,8 @@ high_code: mov eax, os_code wrmsr mov ecx, MSR_SYSENTER_ESP - mov eax, sysenter_stack ; Check it +; mov eax, sysenter_stack ; Check it + xor eax, eax wrmsr mov ecx, MSR_SYSENTER_EIP mov eax, sysenter_entry