:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / ntoskrnl / ke / i386 / stkswitch.S
1 /*
2  *  ReactOS kernel
3  *  Copyright (C) 2000 David Welch <welch@cwcom.net>
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 /*
20  * FILE:            ntoskrnl/ke/i386/tskswitch.S
21  * PURPOSE:         Microkernel thread support
22  * PROGRAMMER:      David Welch (welch@cwcom.net)
23  * UPDATE HISTORY:
24  *                  Created 09/10/00
25  */
26
27 /* INCLUDES ******************************************************************/
28
29 #include <internal/i386/segment.h>
30 #include <internal/ps.h>
31 #include <ddk/i386/tss.h>
32
33 /* FUNCTIONS ****************************************************************/
34
35 /*
36  * FUNCTION:     KeStackSwitchAndRet
37  * PURPOSE:      Switch to a new stack and return from the first frame on
38  *               the new stack which was assumed to a stdcall function with
39  *               8 bytes of arguments and which saved edi, esi and ebx.
40  */
41 .globl _KeStackSwitchAndRet@4
42 _KeStackSwitchAndRet@4:
43         pushl   %ebp
44         movl    %esp, %ebp
45
46         cli
47
48         movl    8(%ebp), %esp
49
50         sti
51
52         popl    %edi
53         popl    %esi
54         popl    %ebx
55
56         popl    %ebp
57         ret     $8
58
59 .globl _KePushAndStackSwitchAndSysRet@8
60 _KePushAndStackSwitchAndSysRet@8:
61         pushl   %ebp
62         movl    %esp, %ebp
63
64         pushl   %ebx
65         pushl   %esi
66         pushl   %edi
67
68         cli
69
70         pushl   8(%ebp)
71
72         movl    %fs:KPCR_CURRENT_THREAD, %ebx
73         movl    %esp, KTHREAD_CALLBACK_STACK(%ebx)
74         movl    12(%ebp), %esp
75
76         sti
77
78         push    $0
79         call    _KeLowerIrql@4
80
81         jmp     KeReturnFromSystemCall
82