Changeset a35a3d8 in mainline for uspace/lib/c/arch/ia32/src/fibril.S


Ignore:
Timestamp:
2018-03-12T17:13:46Z (6 years ago)
Author:
GitHub <noreply@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b127e4af
Parents:
f3d47c97
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-12 17:13:46)
git-committer:
GitHub <noreply@…> (2018-03-12 17:13:46)
Message:

Turn context_save/context_restore into standard setjmp/longjmp. (#24)

Turn context_save()/context_restore() into semi-standard __setjmp()/__longjmp().

The original context_* functions are similar to setjmp()/longjmp(), except that the return value is more restricted for the former, and with inverted meaning. This commit adopts the standard return value semantics and acknowledges that these functions are "standard setjmp()/longjmp() with additional implementation-specific properties" by changing the name. The only divergence from the standard is that __longjmp() causes __setjmp() to return its value unchanged, even if it is zero. This is just to avoid extra assembly, and longjmp() checks this in C.

Note that the original use of context_save()/context_restore() to implement context switching in fibril implementation has already been delegated to context_create()/context_swap(), which provide more natural control flow.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/arch/ia32/src/fibril.S

    rf3d47c97 ra35a3d8  
    3535#
    3636# Save CPU context to the context_t variable
    37 # pointed by the 1st argument. Returns 1 in EAX.
     37# pointed by the 1st argument. Returns 0 in EAX.
    3838#
    39 FUNCTION_BEGIN(context_save)
     39FUNCTION_BEGIN(__setjmp)
    4040        movl 0(%esp), %eax  # the caller's return %eip
    4141        movl 4(%esp), %edx  # address of the context variable to save context to
     
    5353        movl %eax, CONTEXT_OFFSET_TLS(%edx)     # tls -> ctx->tls
    5454
    55         xorl %eax, %eax         # context_save returns 1
    56         incl %eax
     55        xorl %eax, %eax         # __setjmp returns 0
    5756        ret
    58 FUNCTION_END(context_save)
     57FUNCTION_END(__setjmp)
    5958
    6059## Restore saved CPU context
    6160#
    6261# Restore CPU context from context_t variable
    63 # pointed by the 1st argument. Returns 0 in EAX.
     62# pointed by the 1st argument. Returns second argument in EAX.
    6463#
    65 FUNCTION_BEGIN(context_restore)
     64FUNCTION_BEGIN(__longjmp)
    6665        movl 4(%esp), %eax  # address of the context variable to restore context from
     66        movl 8(%esp), %ecx  # return value
    6767
    6868        # restore registers from the context structure
     
    8080        movl %edx, %gs:0
    8181
    82         xorl %eax, %eax         # context_restore returns 0
     82        movl %ecx, %eax
    8383        ret
    84 FUNCTION_END(context_restore)
     84FUNCTION_END(__longjmp)
    8585
Note: See TracChangeset for help on using the changeset viewer.