source: mainline/uspace/lib/libc/arch/ia32/src/fibril.S@ 8476a8d

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8476a8d was 8476a8d, checked in by Jakub Jermar <jakub@…>, 17 years ago

Fix jmp_buf vs. context structure in comment.

  • Property mode set to 100644
File size: 2.5 KB
Line 
1#
2# Copyright (c) 2001-2004 Jakub Jermar
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29#include <kernel/arch/context_offset.h>
30
31.text
32
33.global context_save
34.global context_restore
35
36
37## Save current CPU context
38#
39# Save CPU context to the context_t variable
40# pointed by the 1st argument. Returns 1 in EAX.
41#
42context_save:
43 movl 0(%esp),%eax # the caller's return %eip
44 movl 4(%esp),%edx # address of the context variable to save context to
45
46 # save registers to the context structure
47 CONTEXT_SAVE_ARCH_CORE %edx %eax
48
49 # Save TLS
50 movl %gs:0, %eax
51 movl %eax, OFFSET_TLS(%edx) # tls -> ctx->tls
52
53 xorl %eax,%eax # context_save returns 1
54 incl %eax
55 ret
56
57
58## Restore saved CPU context
59#
60# Restore CPU context from context_t variable
61# pointed by the 1st argument. Returns 0 in EAX.
62#
63context_restore:
64 movl 4(%esp),%eax # address of the context variable to restore context from
65
66 # restore registers from the context structure
67 CONTEXT_RESTORE_ARCH_CORE %eax %edx
68
69 movl %edx,0(%esp) # ctx->pc -> saver's return %eip
70
71 # Set thread local storage
72 pushl %edx
73 movl OFFSET_TLS(%eax), %edx # Set arg1 to TLS addr
74 movl $1, %eax # Syscall SYS_TLS_SET
75 int $0x30
76 popl %edx
77
78 xorl %eax,%eax # context_restore returns 0
79 ret
Note: See TracBrowser for help on using the repository browser.