text: // Copyright (c) 2012-2016, The CryptoNote developers, The Bytecoin developers
  //
  // This file is part of DCRS.
  //
  // DCRS is free software: you can redistribute it and/or modify
  // it under the terms of the GNU Lesser General Public License as published by
  // the Free Software Foundation, either version 3 of the License, or
  // (at your option) any later version.
  //
  // DCRS is distributed in the hope that it will be useful,
  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  // GNU Lesser General Public License for more details.
  //
  // You should have received a copy of the GNU Lesser General Public License
  // along with DCRS.  If not, see <http://www.gnu.org/licenses/>.
  
  #include <string.h>
  #include "Context.h"
  
  void
  makecontext(uctx *ucp, void (*func)(void), intptr_t arg)
  {
    long *sp;
    
    memset(&ucp->uc_mcontext, 0, sizeof ucp->uc_mcontext);
    ucp->uc_mcontext.mc_rdi = (long)arg;
    sp = (long*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/sizeof(long);
    sp -= 1;
    sp = (void*)((uintptr_t)sp - (uintptr_t)sp%16);	/* 16-align for OS X */
    *--sp = 0;	/* return address */
    ucp->uc_mcontext.mc_rip = (long)func;
    ucp->uc_mcontext.mc_rsp = (long)sp;
  }
  
  int
  swapcontext(uctx *oucp, const uctx *ucp)
  {
    if(getcontext(oucp) == 0)
      setcontext(ucp);
    return 0;
  }
  