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
RevLine 
[e708063]1#
[df4ed85]2# Copyright (c) 2001-2004 Jakub Jermar
[e708063]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
[baac911]29#include <kernel/arch/context_offset.h>
30
[e708063]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
[bc1f1c2]44 movl 4(%esp),%edx # address of the context variable to save context to
[e708063]45
[8476a8d]46 # save registers to the context structure
[baac911]47 CONTEXT_SAVE_ARCH_CORE %edx %eax
[e708063]48
49 # Save TLS
50 movl %gs:0, %eax
[baac911]51 movl %eax, OFFSET_TLS(%edx) # tls -> ctx->tls
[e708063]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:
[bc1f1c2]64 movl 4(%esp),%eax # address of the context variable to restore context from
[baac911]65
[8476a8d]66 # restore registers from the context structure
[baac911]67 CONTEXT_RESTORE_ARCH_CORE %eax %edx
[e708063]68
69 movl %edx,0(%esp) # ctx->pc -> saver's return %eip
[1ee11f4]70
[e708063]71 # Set thread local storage
[6c383b0]72 pushl %edx
[baac911]73 movl OFFSET_TLS(%eax), %edx # Set arg1 to TLS addr
[6c383b0]74 movl $1, %eax # Syscall SYS_TLS_SET
[e708063]75 int $0x30
[6c383b0]76 popl %edx
[e708063]77
78 xorl %eax,%eax # context_restore returns 0
79 ret
Note: See TracBrowser for help on using the repository browser.