// Copyright 2019 The Marl Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #if defined(__i386__) #define MARL_BUILD_ASM 1 #include "osfiber_asm_x86.h" // void marl_fiber_swap(marl_fiber_context* from, const marl_fiber_context* to) // esp+4: from // esp+8: to .text .global marl_fiber_swap .align 4 marl_fiber_swap: // Save context 'from' movl 4(%esp), %eax // Store callee-preserved registers movl %ebx, MARL_REG_EBX(%eax) movl %ebp, MARL_REG_EBP(%eax) movl %esi, MARL_REG_ESI(%eax) movl %edi, MARL_REG_EDI(%eax) movl (%esp), %ecx /* call stores the return address on the stack before jumping */ movl %ecx, MARL_REG_EIP(%eax) lea 4(%esp), %ecx /* skip the pushed return address */ movl %ecx, MARL_REG_ESP(%eax) // Load context 'to' movl 8(%esp), %ecx // Load callee-preserved registers movl MARL_REG_EBX(%ecx), %ebx movl MARL_REG_EBP(%ecx), %ebp movl MARL_REG_ESI(%ecx), %esi movl MARL_REG_EDI(%ecx), %edi // Load stack pointer movl MARL_REG_ESP(%ecx), %esp // Load instruction pointer, and jump movl MARL_REG_EIP(%ecx), %ecx jmp *%ecx #endif // defined(__i386__)