浏览代码

Major scary change to fiber implementation - no longer thread based so should be MUCH faster, smaller and more tweakable. Thanks boost.context!

Mark Sibly 9 年之前
父节点
当前提交
e31522eba4
共有 75 个文件被更改,包括 6268 次插入172 次删除
  1. 82 0
      modules/std/fiber/fcontext.monkey2
  2. 10 7
      modules/std/fiber/fiber.monkey2
  3. 88 0
      modules/std/fiber/native/asm/jump_arm64_aapcs_elf_gas.S
  4. 77 0
      modules/std/fiber/native/asm/jump_arm64_aapcs_macho_gas.S
  5. 58 0
      modules/std/fiber/native/asm/jump_arm_aapcs_elf_gas.S
  6. 67 0
      modules/std/fiber/native/asm/jump_arm_aapcs_macho_gas.S
  7. 81 0
      modules/std/fiber/native/asm/jump_arm_aapcs_pe_armasm.asm
  8. 20 0
      modules/std/fiber/native/asm/jump_combined_sysv_macho_gas.S
  9. 105 0
      modules/std/fiber/native/asm/jump_i386_ms_pe_gas.asm
  10. 104 0
      modules/std/fiber/native/asm/jump_i386_ms_pe_masm.asm
  11. 59 0
      modules/std/fiber/native/asm/jump_i386_sysv_elf_gas.S
  12. 54 0
      modules/std/fiber/native/asm/jump_i386_sysv_macho_gas.S
  13. 16 0
      modules/std/fiber/native/asm/jump_i386_x86_64_sysv_macho_gas.S
  14. 86 0
      modules/std/fiber/native/asm/jump_mips32_o32_elf_gas.S
  15. 16 0
      modules/std/fiber/native/asm/jump_ppc32_ppc64_sysv_macho_gas.S
  16. 129 0
      modules/std/fiber/native/asm/jump_ppc32_sysv_elf_gas.S
  17. 125 0
      modules/std/fiber/native/asm/jump_ppc32_sysv_macho_gas.S
  18. 88 0
      modules/std/fiber/native/asm/jump_ppc32_sysv_xcoff_gas.S
  19. 195 0
      modules/std/fiber/native/asm/jump_ppc64_sysv_elf_gas.S
  20. 152 0
      modules/std/fiber/native/asm/jump_ppc64_sysv_macho_gas.S
  21. 84 0
      modules/std/fiber/native/asm/jump_ppc64_sysv_xcoff_gas.S
  22. 140 0
      modules/std/fiber/native/asm/jump_x86_64_ms_pe_gas.asm
  23. 128 0
      modules/std/fiber/native/asm/jump_x86_64_ms_pe_masm.asm
  24. 67 0
      modules/std/fiber/native/asm/jump_x86_64_sysv_elf_gas.S
  25. 62 0
      modules/std/fiber/native/asm/jump_x86_64_sysv_macho_gas.S
  26. 71 0
      modules/std/fiber/native/asm/make_arm64_aapcs_elf_gas.S
  27. 68 0
      modules/std/fiber/native/asm/make_arm64_aapcs_macho_gas.S
  28. 62 0
      modules/std/fiber/native/asm/make_arm_aapcs_elf_gas.S
  29. 57 0
      modules/std/fiber/native/asm/make_arm_aapcs_macho_gas.S
  30. 77 0
      modules/std/fiber/native/asm/make_arm_aapcs_pe_armasm.asm
  31. 20 0
      modules/std/fiber/native/asm/make_combined_sysv_macho_gas.S
  32. 142 0
      modules/std/fiber/native/asm/make_i386_ms_pe_gas.asm
  33. 135 0
      modules/std/fiber/native/asm/make_i386_ms_pe_masm.asm
  34. 94 0
      modules/std/fiber/native/asm/make_i386_sysv_elf_gas.S
  35. 83 0
      modules/std/fiber/native/asm/make_i386_sysv_macho_gas.S
  36. 16 0
      modules/std/fiber/native/asm/make_i386_x86_64_sysv_macho_gas.S
  37. 86 0
      modules/std/fiber/native/asm/make_mips32_o32_elf_gas.S
  38. 16 0
      modules/std/fiber/native/asm/make_ppc32_ppc64_sysv_macho_gas.S
  39. 104 0
      modules/std/fiber/native/asm/make_ppc32_sysv_elf_gas.S
  40. 99 0
      modules/std/fiber/native/asm/make_ppc32_sysv_macho_gas.S
  41. 64 0
      modules/std/fiber/native/asm/make_ppc32_sysv_xcoff_gas.S
  42. 176 0
      modules/std/fiber/native/asm/make_ppc64_sysv_elf_gas.S
  43. 126 0
      modules/std/fiber/native/asm/make_ppc64_sysv_macho_gas.S
  44. 62 0
      modules/std/fiber/native/asm/make_ppc64_sysv_xcoff_gas.S
  45. 123 0
      modules/std/fiber/native/asm/make_x86_64_ms_pe_gas.asm
  46. 109 0
      modules/std/fiber/native/asm/make_x86_64_ms_pe_masm.asm
  47. 62 0
      modules/std/fiber/native/asm/make_x86_64_sysv_elf_gas.S
  48. 58 0
      modules/std/fiber/native/asm/make_x86_64_sysv_macho_gas.S
  49. 87 0
      modules/std/fiber/native/asm/ontop_arm64_aapcs_elf_gas.S
  50. 82 0
      modules/std/fiber/native/asm/ontop_arm64_aapcs_macho_gas.S
  51. 63 0
      modules/std/fiber/native/asm/ontop_arm_aapcs_elf_gas.S
  52. 72 0
      modules/std/fiber/native/asm/ontop_arm_aapcs_macho_gas.S
  53. 86 0
      modules/std/fiber/native/asm/ontop_arm_aapcs_pe_armasm.asm
  54. 20 0
      modules/std/fiber/native/asm/ontop_combined_sysv_macho_gas.S
  55. 113 0
      modules/std/fiber/native/asm/ontop_i386_ms_pe_gas.asm
  56. 112 0
      modules/std/fiber/native/asm/ontop_i386_ms_pe_masm.asm
  57. 61 0
      modules/std/fiber/native/asm/ontop_i386_sysv_elf_gas.S
  58. 56 0
      modules/std/fiber/native/asm/ontop_i386_sysv_macho_gas.S
  59. 16 0
      modules/std/fiber/native/asm/ontop_i386_x86_64_sysv_macho_gas.S
  60. 87 0
      modules/std/fiber/native/asm/ontop_mips32_o32_elf_gas.S
  61. 16 0
      modules/std/fiber/native/asm/ontop_ppc32_ppc64_sysv_macho_gas.S
  62. 129 0
      modules/std/fiber/native/asm/ontop_ppc32_sysv_elf_gas.S
  63. 124 0
      modules/std/fiber/native/asm/ontop_ppc32_sysv_macho_gas.S
  64. 87 0
      modules/std/fiber/native/asm/ontop_ppc32_sysv_xcoff_gas.S
  65. 194 0
      modules/std/fiber/native/asm/ontop_ppc64_sysv_elf_gas.S
  66. 151 0
      modules/std/fiber/native/asm/ontop_ppc64_sysv_macho_gas.S
  67. 83 0
      modules/std/fiber/native/asm/ontop_ppc64_sysv_xcoff_gas.S
  68. 142 0
      modules/std/fiber/native/asm/ontop_x86_64_ms_pe_gas.asm
  69. 130 0
      modules/std/fiber/native/asm/ontop_x86_64_ms_pe_masm.asm
  70. 69 0
      modules/std/fiber/native/asm/ontop_x86_64_sysv_elf_gas.S
  71. 64 0
      modules/std/fiber/native/asm/ontop_x86_64_sysv_macho_gas.S
  72. 51 0
      modules/std/fiber/native/fcontext.cpp
  73. 31 0
      modules/std/fiber/native/fcontext.h
  74. 130 155
      modules/std/fiber/native/fiber.cpp
  75. 9 10
      modules/std/fiber/native/fiber.h

+ 82 - 0
modules/std/fiber/fcontext.monkey2

@@ -0,0 +1,82 @@
+
+#import "native/fcontext.cpp"
+#import "native/fcontext.h"
+
+#if __HOSTOS__="windows"
+	#import "native/asm/make_i386_ms_pe_gas.asm"
+	#import "native/asm/jump_i386_ms_pe_gas.asm"
+	#import "native/asm/ontop_i386_ms_pe_gas.asm"
+#else if __HOSTOS__="macos"
+	#import "native/asm/make_x86_64_sysv_macho_gas.S"
+	#import "native/asm/jump_x86_64_sysv_macho_gas.S"
+	#import "native/asm/ontop_x86_64_sysv_macho_gas.S"
+#else if __HOSTOS__="linux"
+	#import "native/asm/make_x86_64_sysv_elf_gas.S"
+	#import "native/asm/jump_x86_64_sysv_elf_gas.S"
+	#import "native/asm/ontop_x86_64_sysv_elf_gas.S"
+#end
+
+Extern
+
+Alias fcontext_t:Void Ptr
+
+Struct transfer_t
+	Field fcontext:fcontext_t
+	Field data:Void Ptr
+End
+
+Function alloc_fcontext_stack:UByte Ptr( size:ULong )
+
+Function free_fcontext_stack( stack:Void Ptr,size:ULong )
+
+Function jump_fcontext:transfer_t( fcontext:fcontext_t,data:Void Ptr )
+
+Function make_fcontext:fcontext_t( stack:Void Ptr,stack_size:ULong,func:Void( transfer_t ) )
+
+Function ontop_fcontext:transfer_t( fcontext:fcontext_t,vp:Void ptr,func:transfer_t(transfer_t) )
+
+Public
+
+#rem
+Function Test( t:transfer_t )
+
+	Print "Test 1"
+	Print ULong( t.fcontext )
+	
+	t=jump_fcontext( t.fcontext,Null )
+	
+	Print "Test 2"
+	Print ULong( t.fcontext )
+	
+	jump_fcontext( t.fcontext,Null )
+	
+End
+
+Function Test2( fcontext:fcontext_t )
+
+	jump_fcontext( fcontext,Null )
+	
+End
+
+Function Main()
+
+	Local stack:=alloc_fcontext_stack( 65536 )
+	
+	Local fcontext:=make_fcontext( stack+65536,65536,Test )
+
+	fcontext=jump_fcontext( fcontext,Null ).fcontext
+	
+	Test2( fcontext )
+	
+'	fcontext=jump_fcontext( fcontext,Null ).fcontext
+	
+	Return
+	
+	Print "Main"
+	fcontext=jump_fcontext( fcontext,Null ).fcontext
+	Print "Main"
+	
+	Test2( fcontext )
+
+End
+#end

+ 10 - 7
modules/std/fiber/fiber.monkey2

@@ -1,22 +1,25 @@
 
 
 Namespace std.fiber
 Namespace std.fiber
 
 
+#import "fcontext"
+
+#import "native/fcontext.cpp"
 #Import "native/fiber.cpp"
 #Import "native/fiber.cpp"
 #Import "native/fiber.h"
 #Import "native/fiber.h"
 
 
 Extern Private
 Extern Private
 
 
-Function StartFiber:Int( entry:Void() )="bbFiber::StartFiber"
+Function StartFiber:Int( entry:Void() )="bbFiber::startFiber"
 
 
-Function CreateFiber:Int( entry:Void() )="bbFiber::CreateFiber"
+Function CreateFiber:Int( entry:Void() )="bbFiber::createFiber"
 
 
-Function ResumeFiber:Void( fiber:Int )="bbFiber::ResumeFiber"
+Function ResumeFiber:Void( fiber:Int )="bbFiber::resumeFiber"
 
 
-Function TerminateFiber:Void( fiber:Int )="bbFiber::TerminateFiber"
+Function TerminateFiber:Void( fiber:Int )="bbFiber::terminateFiber"
 
 
-Function SuspendCurrentFiber:Void()="bbFiber::SuspendCurrentFiber"
+Function SuspendCurrentFiber:Void()="bbFiber::suspendCurrentFiber"
 
 
-Function GetCurrentFiber:Int()="bbFiber::GetCurrentFiber"
+Function GetCurrentFiber:Int()="bbFiber::getCurrentFiber"
 
 
 Public
 Public
 
 
@@ -48,7 +51,7 @@ Struct Fiber
 	Method New( entry:Void() )
 	Method New( entry:Void() )
 		_fiber=StartFiber( entry )
 		_fiber=StartFiber( entry )
 	End
 	End
-
+	
 	#rem monkeydoc Resumes a suspended fiber.
 	#rem monkeydoc Resumes a suspended fiber.
 	#end	
 	#end	
 	Method Resume()
 	Method Resume()

+ 88 - 0
modules/std/fiber/native/asm/jump_arm64_aapcs_elf_gas.S

@@ -0,0 +1,88 @@
+/*
+            Copyright Edward Nevill + Oliver Kowalke 2015
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.cpu    generic+fp+simd
+.text
+.align  2
+.global jump_fcontext
+.type   jump_fcontext, %function
+jump_fcontext:
+    # prepare stack for GP + FPU
+    sub  sp, sp, #0x70
+
+    # save x19-x30
+    stp  x19, x20, [sp, #0x00]
+    stp  x21, x22, [sp, #0x10]
+    stp  x23, x24, [sp, #0x20]
+    stp  x25, x26, [sp, #0x30]
+    stp  x27, x28, [sp, #0x40]
+    stp  x29, x30, [sp, #0x50]
+
+    # save LR as PC
+    str  x30, [sp, #0x60]
+
+    # store RSP (pointing to context-data) in X0
+    mov  x4, sp
+
+    # restore RSP (pointing to context-data) from X1
+    mov  sp, x0
+
+    # load x19-x30
+    ldp  x19, x20, [sp, #0x00]
+    ldp  x21, x22, [sp, #0x10]
+    ldp  x23, x24, [sp, #0x20]
+    ldp  x25, x26, [sp, #0x30]
+    ldp  x27, x28, [sp, #0x40]
+    ldp  x29, x30, [sp, #0x50]
+
+    # return transfer_t from jump
+    # pass transfer_t as first arg in context function
+    # X0 == FCTX, X1 == DATA
+    mov x0, x4
+
+    # load pc
+    ldr  x4, [sp, #0x60]
+
+    # restore stack from GP + FPU
+    add  sp, sp, #0x70
+
+    ret x4
+.size   jump_fcontext,.-jump_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 77 - 0
modules/std/fiber/native/asm/jump_arm64_aapcs_macho_gas.S

@@ -0,0 +1,77 @@
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _jump_fcontext
+.balign 16
+_jump_fcontext:
+    ; prepare stack for GP + FPU
+    sub  sp, sp, #0x70
+
+    ; save x19-x30
+    stp  x19, x20, [sp, #0x00]
+    stp  x21, x22, [sp, #0x10]
+    stp  x23, x24, [sp, #0x20]
+    stp  x25, x26, [sp, #0x30]
+    stp  x27, x28, [sp, #0x40]
+    stp  fp,  lr,  [sp, #0x50]
+
+    ; save LR as PC
+    str  lr, [sp, #0x60]
+
+    ; store RSP (pointing to context-data) in X0
+    mov  x4, sp
+
+    ; restore RSP (pointing to context-data) from X1
+    mov  sp, x0
+
+    ; load x19-x30
+    ldp  x19, x20, [sp, #0x00]
+    ldp  x21, x22, [sp, #0x10]
+    ldp  x23, x24, [sp, #0x20]
+    ldp  x25, x26, [sp, #0x30]
+    ldp  x27, x28, [sp, #0x40]
+    ldp  fp,  lr,  [sp, #0x50]
+
+    ; return transfer_t from jump
+    ; pass transfer_t as first arg in context function
+    ; X0 == FCTX, X1 == DATA
+    mov x0, x4
+
+    ; load pc
+    ldr  x4, [sp, #0x60]
+
+    ; restore stack from GP + FPU
+    add  sp, sp, #0x70
+
+    ret x4

+ 58 - 0
modules/std/fiber/native/asm/jump_arm_aapcs_elf_gas.S

@@ -0,0 +1,58 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl jump_fcontext
+.align 2
+.type jump_fcontext,%function
+jump_fcontext:
+    @ save LR as PC
+    push {lr}
+    @ save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    @ store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    @ restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    @ restore hidden,V1-V8,LR
+    pop {a4,v1-v8,lr}
+
+    @ return transfer_t from jump
+    str  a1, [a4, #0]
+    str  a3, [a4, #4]
+    @ pass transfer_t as first arg in context function
+    @ A1 == FCTX, A2 == DATA
+    mov  a2, a3
+
+    @ restore PC
+    pop {pc}
+.size jump_fcontext,.-jump_fcontext
+
+@ Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 67 - 0
modules/std/fiber/native/asm/jump_arm_aapcs_macho_gas.S

@@ -0,0 +1,67 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _jump_fcontext
+.align 2
+_jump_fcontext:
+    @ save LR as PC
+    push {lr}
+    @ save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    @ locate TLS to save/restore SjLj handler
+    mrc  p15, 0, v2, c13, c0, #3
+    bic  v2, v2, #3
+
+    @ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
+    ldr  v1, [v2, #8]
+    @ save SjLj handler
+    push  {v1}
+
+    @ store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    @ restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    @ r#estore SjLj handler
+    pop  {v1}
+    @ store SjLj handler in TLS
+    str  v1, [v2, #8]
+
+    @ restore hidden,V1-V8,LR
+    pop {a4,v1-v8,lr}
+
+    @ return transfer_t from jump
+    str  a1, [a4, #0]
+    str  a3, [a4, #4]
+    @ pass transfer_t as first arg in context function
+    @ A1 == FCTX, A2 == DATA
+    mov  a2, a3
+
+    @ restore PC
+    pop {pc}

+ 81 - 0
modules/std/fiber/native/asm/jump_arm_aapcs_pe_armasm.asm

@@ -0,0 +1,81 @@
+;/*
+;            Copyright Oliver Kowalke 2009.
+;   Distributed under the Boost Software License, Version 1.0.
+;      (See accompanying file LICENSE_1_0.txt or copy at
+;          http://www.boost.org/LICENSE_1_0.txt)
+;*/
+
+; *******************************************************
+; *                                                     *
+; *  -------------------------------------------------  *
+; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+; *  -------------------------------------------------  *
+; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+; *  -------------------------------------------------  *
+; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
+; *  -------------------------------------------------  *
+; *  -------------------------------------------------  *
+; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+; *  -------------------------------------------------  *
+; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+; *  -------------------------------------------------  *
+; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
+; *  -------------------------------------------------  *
+; *                                                     *
+; *******************************************************
+
+    AREA |.text|, CODE
+    ALIGN 4
+    EXPORT jump_fcontext
+
+jump_fcontext PROC
+    ; save LR as PC
+    push {lr}
+    ; save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    ; load TIB to save/restore thread size and limit.
+    ; we do not need preserve CPU flag and can use it's arg register
+    mrc     p15, #0, v1, c13, c0, #2
+
+    ; save current stack base
+    ldr  a5, [v1, #0x04]
+    push {a5}
+    ; save current stack limit
+    ldr  a5, [v1, #0x08]
+    push {a5}
+    ; save current deallocation stack
+    ldr  a5, [v1, #0xe0c]
+    push {a5}
+
+    ; store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    ; restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    ; restore deallocation stack
+    pop  {a5}
+    str  a5, [v1, #0xe0c]
+    ; restore stack limit
+    pop  {a5}
+    str  a5, [v1, #0x08]
+    ; restore stack base
+    pop  {a5}
+    str  a5, [v1, #0x04]
+
+    ; restore hidden,V1-V8,LR
+    pop {a4,v1-v8,lr}
+
+    ; return transfer_t from jump
+    str  a1, [a4, #0]
+    str  a3, [a4, #4]
+    ; pass transfer_t as first arg in context function
+    ; A1 == FCTX, A2 == DATA
+    mov  a2, a3
+
+    ; restore PC
+    pop {pc}
+
+    ENDP
+    END

+ 20 - 0
modules/std/fiber/native/asm/jump_combined_sysv_macho_gas.S

@@ -0,0 +1,20 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "jump_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "jump_x86_64_sysv_macho_gas.S"
+#elif defined(__ppc__)
+    #include "jump_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "jump_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 105 - 0
modules/std/fiber/native/asm/jump_i386_ms_pe_gas.asm

@@ -0,0 +1,105 @@
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*************************************************************************************
+*  --------------------------------------------------------------------------------- *
+*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
+*  --------------------------------------------------------------------------------- *
+*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
+*  --------------------------------------------------------------------------------- *
+*  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   | *
+*  --------------------------------------------------------------------------------- *
+*  --------------------------------------------------------------------------------- *
+*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
+*  --------------------------------------------------------------------------------- *
+*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
+*  --------------------------------------------------------------------------------- *
+*  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         | *
+*  --------------------------------------------------------------------------------- *
+*************************************************************************************/
+
+.file	"jump_i386_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	_jump_fcontext
+.def	_jump_fcontext;	.scl	2;	.type	32;	.endef
+_jump_fcontext:
+    pushl  %ebp  /* save EBP */
+    pushl  %ebx  /* save EBX */
+    pushl  %esi  /* save ESI */
+    pushl  %edi  /* save EDI */
+
+    /* load NT_TIB */
+    movl  %fs:(0x18), %edx
+
+    /* load current SEH exception list */
+    movl  (%edx), %eax
+    push  %eax
+
+    /* load current stack base */
+    movl  0x04(%edx), %eax
+    push  %eax
+
+    /* load current stack limit */
+    movl  0x08(%edx), %eax
+    push  %eax
+    
+    /* load current dealloction stack */
+    movl  0xe0c(%edx), %eax
+    push  %eax
+    
+    /* load fiber local storage */
+    movl  0x10(%edx), %eax
+    push  %eax
+
+    /* store ESP (pointing to context-data) in EAX */
+    movl  %esp, %eax
+
+    /* first arg of jump_fcontext() == fcontext to jump to */
+    movl  0x28(%esp), %ecx
+
+    /* restore ESP (pointing to context-data) from EDX */
+    movl  %ecx, %esp
+
+    /* load NT_TIB into ECX */
+    movl  %fs:(0x18), %edx
+
+    /* restore fiber local storage */
+    popl  %ecx
+    movl  %ecx, 0x10(%edx)
+
+    /* restore current deallocation stack */
+    popl  %ecx
+    movl  %ecx, 0xe0c(%edx)
+
+    /* restore current stack limit */
+    popl  %ecx
+    movl  %ecx, 0x08(%edx)
+
+    /* restore current stack base */
+    popl  %ecx
+    movl  %ecx, 0x04(%edx)
+
+    /* restore current SEH exception list */
+    popl  %ecx
+    movl  %ecx, (%edx)
+
+    popl  %edi  /* save EDI */
+    popl  %esi  /* save ESI */
+    popl  %ebx  /* save EBX */
+    popl  %ebp  /* save EBP */
+
+    /* return transfer_t */
+    /* FCTX == EAX, DATA == EDX */
+    movl  0x2c(%eax), %edx
+
+    /* jump to context */
+    ret
+
+.section .drectve
+.ascii " -export:\"jump_fcontext\""

+ 104 - 0
modules/std/fiber/native/asm/jump_i386_ms_pe_masm.asm

@@ -0,0 +1,104 @@
+
+;           Copyright Oliver Kowalke 2009.
+;  Distributed under the Boost Software License, Version 1.0.
+;     (See accompanying file LICENSE_1_0.txt or copy at
+;           http://www.boost.org/LICENSE_1_0.txt)
+
+;  ---------------------------------------------------------------------------------
+;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
+;  ---------------------------------------------------------------------------------
+;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
+;  ---------------------------------------------------------------------------------
+;  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   |
+;  ---------------------------------------------------------------------------------
+;  ---------------------------------------------------------------------------------
+;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
+;  ---------------------------------------------------------------------------------
+;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
+;  ---------------------------------------------------------------------------------
+;  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         |
+;  ---------------------------------------------------------------------------------
+
+.386
+.XMM
+.model flat, c
+.code
+
+jump_fcontext PROC BOOST_CONTEXT_EXPORT
+    push  ebp  ; save EBP 
+    push  ebx  ; save EBX 
+    push  esi  ; save ESI 
+    push  edi  ; save EDI 
+
+    assume  fs:nothing
+    ; load NT_TIB into ECX
+    mov  edx, fs:[018h]
+    assume  fs:error
+
+    ; load current SEH exception list
+    mov  eax, [edx]
+    push  eax
+
+    ; load current stack base
+    mov  eax, [edx+04h]
+    push  eax
+
+    ; load current stack limit
+    mov  eax, [edx+08h]
+    push  eax
+
+    ; load current deallocation stack
+    mov  eax, [edx+0e0ch]
+    push  eax
+
+    ; load fiber local storage
+    mov  eax, [edx+010h]
+    push  eax
+
+    ; store ESP (pointing to context-data) in EAX
+    mov  eax, esp
+
+    ; firstarg of jump_fcontext() == fcontext to jump to
+    mov  ecx, [esp+028h]
+    
+    ; restore ESP (pointing to context-data) from EAX
+    mov  esp, ecx
+
+    assume  fs:nothing
+    ; load NT_TIB into EDX
+    mov  edx, fs:[018h]
+    assume  fs:error
+
+    ; restore fiber local storage
+    pop  ecx
+    mov  [edx+010h], ecx
+
+    ; restore current deallocation stack
+    pop  ecx
+    mov  [edx+0e0ch], ecx
+
+    ; restore current stack limit
+    pop  ecx
+    mov  [edx+08h], ecx
+
+    ; restore current stack base
+    pop  ecx
+    mov  [edx+04h], ecx
+
+    ; restore current SEH exception list
+    pop  ecx
+    mov  [edx], ecx
+
+    pop  edi  ; save EDI 
+    pop  esi  ; save ESI 
+    pop  ebx  ; save EBX 
+    pop  ebp  ; save EBP
+
+    ; return transfer_t
+    ; FCTX == EAX, DATA == EDX
+    mov  edx, [eax+02ch]
+
+    ; jump to context
+    ret
+jump_fcontext ENDP
+END

+ 59 - 0
modules/std/fiber/native/asm/jump_i386_sysv_elf_gas.S

@@ -0,0 +1,59 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*****************************************************************************************
+ *                                                                                       *
+ *  -----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *                                                                                       *
+ *****************************************************************************************/
+
+.text
+.globl jump_fcontext
+.align 2
+.type jump_fcontext,@function
+jump_fcontext:
+    pushl  %ebp  /* save EBP */
+    pushl  %ebx  /* save EBX */
+    pushl  %esi  /* save ESI */
+    pushl  %edi  /* save EDI */
+
+    /* store fcontext_t in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of jump_fcontext() == fcontext to jump to */
+    movl  0x18(%esp), %eax
+
+    /* second arg of jump_fcontext() == data to be transferred */
+    movl  0x1c(%esp), %edx
+
+    /* restore ESP (pointing to context-data) from EAX */
+    movl  %eax, %esp
+
+    /* address of returned transport_t */
+    movl 0x14(%esp), %eax
+    /* return parent fcontext_t */
+    movl  %ecx, (%eax)
+    /* return data */
+    movl %edx, 0x4(%eax)
+
+    popl  %edi  /* restore EDI */
+    popl  %esi  /* restore ESI */
+    popl  %ebx  /* restore EBX */
+    popl  %ebp  /* restore EBP */
+
+    /* jump to context */
+    ret $4
+.size jump_fcontext,.-jump_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 54 - 0
modules/std/fiber/native/asm/jump_i386_sysv_macho_gas.S

@@ -0,0 +1,54 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*****************************************************************************************
+ *                                                                                       *
+ *  -----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *                                                                                       *
+ *****************************************************************************************/
+
+.text
+.globl _jump_fcontext
+.align 2
+_jump_fcontext:
+    pushl  %ebp  /* save EBP */
+    pushl  %ebx  /* save EBX */
+    pushl  %esi  /* save ESI */
+    pushl  %edi  /* save EDI */
+
+    /* store fcontext_t in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of jump_fcontext() == context jumping to */
+    movl  0x18(%esp), %eax
+
+    /* second arg of jump_fcontext() == data to be transferred */
+    movl  0x1c(%esp), %edx
+
+    /* restore ESP (pointing to context-data) from EAX */
+    movl  %eax, %esp
+
+    /* address of returned transport_t */
+    movl 0x14(%esp), %eax
+    /* return parent fcontext_t */
+    movl  %ecx, (%eax)
+    /* return data */
+    movl %edx, 0x4(%eax)
+
+    popl  %edi  /* restore EDI */
+    popl  %esi  /* restore ESI */
+    popl  %ebx  /* restore EBX */
+    popl  %ebp  /* restore EBP */
+
+    /* jump to context */
+    ret $4

+ 16 - 0
modules/std/fiber/native/asm/jump_i386_x86_64_sysv_macho_gas.S

@@ -0,0 +1,16 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "jump_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "jump_x86_64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 86 - 0
modules/std/fiber/native/asm/jump_mips32_o32_elf_gas.S

@@ -0,0 +1,86 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |  FP |hiddn|  RA |  PC |  GP | FCTX| DATA|     |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ * *****************************************************/
+
+.text
+.globl jump_fcontext
+.align 2
+.type jump_fcontext,@function
+.ent jump_fcontext
+jump_fcontext:
+    # reserve space on stack
+    addiu $sp, $sp, -112
+
+    sw  $s0, ($sp)  # save S0
+    sw  $s1, 4($sp)  # save S1
+    sw  $s2, 8($sp)  # save S2
+    sw  $s3, 12($sp)  # save S3
+    sw  $s4, 16($sp)  # save S4
+    sw  $s5, 20($sp)  # save S5
+    sw  $s6, 24($sp)  # save S6
+    sw  $s7, 28($sp)  # save S7
+    sw  $fp, 32($sp)  # save FP
+    sw  $a0, 36($sp)  # save hidden, address of returned transfer_t
+    sw  $ra, 40($sp)  # save RA
+    sw  $ra, 44($sp)  # save RA as PC
+
+    # store SP (pointing to context-data) in A0
+    move  $a0, $sp
+
+    # restore SP (pointing to context-data) from A1
+    move  $sp, $a1
+
+    lw  $s0, ($sp)  # restore S0
+    lw  $s1, 4($sp)  # restore S1
+    lw  $s2, 8($sp)  # restore S2
+    lw  $s3, 12($sp)  # restore S3
+    lw  $s4, 16($sp)  # restore S4
+    lw  $s5, 20($sp)  # restore S5
+    lw  $s6, 24($sp)  # restore S6
+    lw  $s7, 28($sp)  # restore S7
+    lw  $fp, 32($sp)  # restore FP
+    lw  $t0, 36($sp)  # restore hidden, address of returned transfer_t
+    lw  $ra, 40($sp)  # restore RA
+
+    # load PC
+    lw  $t9, 44($sp)
+
+    # adjust stack
+    addiu $sp, $sp, 112
+    
+    # return transfer_t from jump
+    sw  $a0, ($t0)  # fctx of transfer_t
+    sw  $a1, 4($t0) # data of transfer_t
+    # pass transfer_t as first arg in context function
+    # A0 == fctx, A1 == data
+    move  $a1, $a2 
+
+    # jump to context
+    jr  $t9
+.end jump_fcontext
+.size jump_fcontext, .-jump_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 16 - 0
modules/std/fiber/native/asm/jump_ppc32_ppc64_sysv_macho_gas.S

@@ -0,0 +1,16 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__ppc__)
+    #include "jump_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "jump_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 129 - 0
modules/std/fiber/native/asm/jump_ppc32_sysv_elf_gas.S

@@ -0,0 +1,129 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC | FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  | DATA|     |     |     |                       |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl jump_fcontext
+.align 2
+.type jump_fcontext,@function
+jump_fcontext:
+    # reserve space on stack
+    subi  %r1, %r1, 92
+
+    stw  %r13, 0(%r1)  # save R13
+    stw  %r14, 4(%r1)  # save R14
+    stw  %r15, 8(%r1)  # save R15
+    stw  %r16, 12(%r1)  # save R16
+    stw  %r17, 16(%r1)  # save R17
+    stw  %r18, 20(%r1)  # save R18
+    stw  %r19, 24(%r1)  # save R19
+    stw  %r20, 28(%r1)  # save R20
+    stw  %r21, 32(%r1)  # save R21
+    stw  %r22, 36(%r1)  # save R22
+    stw  %r23, 40(%r1)  # save R23
+    stw  %r24, 44(%r1)  # save R24
+    stw  %r25, 48(%r1)  # save R25
+    stw  %r26, 52(%r1)  # save R26
+    stw  %r27, 56(%r1)  # save R27
+    stw  %r28, 60(%r1)  # save R28
+    stw  %r29, 64(%r1)  # save R29
+    stw  %r30, 68(%r1)  # save R30
+    stw  %r31, 72(%r1)  # save R31
+    stw  %r3,  76(%r1)  # save hidden
+
+    # save CR
+    mfcr  %r0
+    stw   %r0, 80(%r1)
+    # save LR
+    mflr  %r0
+    stw   %r0, 84(%r1)
+    # save LR as PC
+    stw   %r0, 88(%r1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  %r6, %r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  %r1, %r4
+
+    lwz  %r13, 0(%r1)  # restore R13
+    lwz  %r14, 4(%r1)  # restore R14
+    lwz  %r15, 8(%r1)  # restore R15
+    lwz  %r16, 12(%r1)  # restore R16
+    lwz  %r17, 16(%r1)  # restore R17
+    lwz  %r18, 20(%r1)  # restore R18
+    lwz  %r19, 24(%r1)  # restore R19
+    lwz  %r20, 28(%r1)  # restore R20
+    lwz  %r21, 32(%r1)  # restore R21
+    lwz  %r22, 36(%r1)  # restore R22
+    lwz  %r23, 40(%r1)  # restore R23
+    lwz  %r24, 44(%r1)  # restore R24
+    lwz  %r25, 48(%r1)  # restore R25
+    lwz  %r26, 52(%r1)  # restore R26
+    lwz  %r27, 56(%r1)  # restore R27
+    lwz  %r28, 60(%r1)  # restore R28
+    lwz  %r29, 64(%r1)  # restore R29
+    lwz  %r30, 68(%r1)  # restore R30
+    lwz  %r31, 72(%r1)  # restore R31
+    lwz  %r3,  76(%r1)  # restore hidden
+
+    # restore CR
+    lwz   %r0, 80(%r1)
+    mtcr  %r0
+    # restore LR
+    lwz   %r0, 84(%r1)
+    mtlr  %r0
+    # load PC
+    lwz   %r0, 88(%r1)
+    # restore CTR
+    mtctr %r0
+
+    # adjust stack
+    addi  %r1, %r1, 92
+
+    # return transfer_t 
+    stw  %r6, 0(%r3)
+    stw  %r5, 4(%r3)
+
+    # jump to context
+    bctr
+.size jump_fcontext, .-jump_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 125 - 0
modules/std/fiber/native/asm/jump_ppc32_sysv_macho_gas.S

@@ -0,0 +1,125 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC | FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  | DATA|     |     |     |                       |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _jump_fcontext
+.align 2
+_jump_fcontext:
+    ; reserve space on stack
+    subi  r1, r1, 92
+
+    stw  r13, 0(r1)  # save R13
+    stw  r14, 4(r1)  # save R14
+    stw  r15, 8(r1)  # save R15
+    stw  r16, 12(r1)  # save R16
+    stw  r17, 16(r1)  # save R17
+    stw  r18, 20(r1)  # save R18
+    stw  r19, 24(r1)  # save R19
+    stw  r20, 28(r1)  # save R20
+    stw  r21, 32(r1)  # save R21
+    stw  r22, 36(r1)  # save R22
+    stw  r23, 40(r1)  # save R23
+    stw  r24, 44(r1)  # save R24
+    stw  r25, 48(r1)  # save R25
+    stw  r26, 52(r1)  # save R26
+    stw  r27, 56(r1)  # save R27
+    stw  r28, 60(r1)  # save R28
+    stw  r29, 64(r1)  # save R29
+    stw  r30, 68(r1)  # save R30
+    stw  r31, 72(r1)  # save R31
+    stw  r3,  76(r1)  # save hidden
+
+    # save CR
+    mfcr  r0
+    stw  r0, 80(r1)
+    # save LR
+    mflr  r0
+    stw  r0, 84(r1)
+    # save LR as PC
+    stw  r0, 88(r1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  r6, r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    lwz  r13, 0(r1)  # restore R13
+    lwz  r14, 4(r1)  # restore R14
+    lwz  r15, 8(r1)  # restore R15
+    lwz  r16, 12(r1)  # restore R16
+    lwz  r17, 16(r1)  # restore R17
+    lwz  r18, 20(r1)  # restore R18
+    lwz  r19, 24(r1)  # restore R19
+    lwz  r20, 28(r1)  # restore R20
+    lwz  r21, 32(r1)  # restore R21
+    lwz  r22, 36(r1)  # restore R22
+    lwz  r23, 40(r1)  # restore R23
+    lwz  r24, 44(r1)  # restore R24
+    lwz  r25, 48(r1)  # restore R25
+    lwz  r26, 52(r1)  # restore R26
+    lwz  r27, 56(r1)  # restore R27
+    lwz  r28, 60(r1)  # restore R28
+    lwz  r29, 64(r1)  # restore R29
+    lwz  r30, 68(r1)  # restore R30
+    lwz  r31, 72(r1)  # restore R31
+    lwz  r3,  76(r1)  # restore hidden
+
+    # restore CR
+    lwz  r0, 80(r1)
+    mtcr  r0
+    # restore LR
+    lwz  r0, 84(r1)
+    mtlr  r0
+
+    # load PC
+    lwz  r0, 88(r1)
+    # restore CTR
+    mtctr  r0
+
+    # adjust stack
+    addi  r1, r1, 92
+
+    # return transfer_t 
+    stw  r6, 0(r3)
+    stw  r5, 4(r3)
+
+    # jump to context
+    bctr

+ 88 - 0
modules/std/fiber/native/asm/jump_ppc32_sysv_xcoff_gas.S

@@ -0,0 +1,88 @@
+.globl .jump_fcontext
+.globl  jump_fcontext[DS]
+.align 2 
+.csect	jump_fcontext[DS]
+jump_fcontext:
+  .long	.jump_fcontext
+.jump_fcontext:
+    # reserve space on stack
+    subi 1, 1, 92
+
+    stw  13, 0(1)  # save R13
+    stw  14, 4(1)  # save R14
+    stw  15, 8(1)  # save R15
+    stw  16, 12(1)  # save R16
+    stw  17, 16(1)  # save R17
+    stw  18, 20(1)  # save R18
+    stw  19, 24(1)  # save R19
+    stw  20, 28(1)  # save R20
+    stw  21, 32(1)  # save R21
+    stw  22, 36(1)  # save R22
+    stw  23, 40(1)  # save R23
+    stw  24, 44(1)  # save R24
+    stw  25, 48(1)  # save R25
+    stw  26, 52(1)  # save R26
+    stw  27, 56(1)  # save R27
+    stw  28, 60(1)  # save R28
+    stw  29, 64(1)  # save R29
+    stw  30, 68(1)  # save R30
+    stw  31, 72(1)  # save R31
+    stw  3,  76(1)  # save hidden
+
+    # save CR
+    mfcr 0
+    stw 0, 80(1)
+    # save LR
+    mflr 0
+    stw 0, 84(1)
+    # save LR as PC
+    stw 0, 88(1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  6, 1
+
+    # restore RSP (pointing to context-data) from R4
+    mr 1, 4
+
+    lwz  13, 0(1)  # restore R13
+    lwz  14, 4(1)  # restore R14
+    lwz  15, 8(1)  # restore R15
+    lwz  16, 12(1)  # restore R16
+    lwz  17, 16(1)  # restore R17
+    lwz  18, 20(1)  # restore R18
+    lwz  19, 24(1)  # restore R19
+    lwz  20, 28(1)  # restore R20
+    lwz  21, 32(1)  # restore R21
+    lwz  22, 36(1)  # restore R22
+    lwz  23, 40(1)  # restore R23
+    lwz  24, 44(1)  # restore R24
+    lwz  25, 48(1)  # restore R25
+    lwz  26, 52(1)  # restore R26
+    lwz  27, 56(1)  # restore R27
+    lwz  28, 60(1)  # restore R28
+    lwz  29, 64(1)  # restore R29
+    lwz  30, 68(1)  # restore R30
+    lwz  31, 72(1)  # restore R31
+    lwz  3,  76(1)  # restore hidden
+
+    # restore CR
+    lwz 0, 80(1)
+    mtcr 0
+    # restore LR
+    lwz 0, 84(1)
+    mtlr 0
+
+    # load PC
+    lwz 0, 88(1)
+    # restore CTR
+    mtctr 0
+
+    # adjust stack
+    addi 1, 1, 92
+
+    # return transfer_t 
+    stw  6, 0(3)
+    stw  5, 4(3)
+
+    # jump to context
+    bctr

+ 195 - 0
modules/std/fiber/native/asm/jump_ppc64_sysv_elf_gas.S

@@ -0,0 +1,195 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.globl jump_fcontext
+#if _CALL_ELF == 2
+	.text
+	.align 2
+jump_fcontext:
+        addis   %r2, %r12, .TOC.-jump_fcontext@ha
+        addi    %r2, %r2, .TOC.-jump_fcontext@l
+        .localentry jump_fcontext, . - jump_fcontext
+#else
+	.section ".opd","aw"
+	.align 3
+jump_fcontext:
+# ifdef _CALL_LINUX
+        .quad   .L.jump_fcontext,.TOC.@tocbase,0
+        .type   jump_fcontext,@function
+        .text
+        .align 2
+.L.jump_fcontext:
+# else
+        .hidden .jump_fcontext
+        .globl  .jump_fcontext
+        .quad   .jump_fcontext,.TOC.@tocbase,0
+        .size   jump_fcontext,24
+        .type   .jump_fcontext,@function
+        .text
+        .align 2
+.jump_fcontext:
+# endif
+#endif
+    # reserve space on stack
+    subi  %r1, %r1, 184
+
+#if _CALL_ELF != 2
+    std  %r2,  0(%r1)  # save TOC
+#endif
+    std  %r14, 8(%r1)  # save R14
+    std  %r15, 16(%r1)  # save R15
+    std  %r16, 24(%r1)  # save R16
+    std  %r17, 32(%r1)  # save R17
+    std  %r18, 40(%r1)  # save R18
+    std  %r19, 48(%r1)  # save R19
+    std  %r20, 56(%r1)  # save R20
+    std  %r21, 64(%r1)  # save R21
+    std  %r22, 72(%r1)  # save R22
+    std  %r23, 80(%r1)  # save R23
+    std  %r24, 88(%r1)  # save R24
+    std  %r25, 96(%r1)  # save R25
+    std  %r26, 104(%r1)  # save R26
+    std  %r27, 112(%r1)  # save R27
+    std  %r29, 120(%r1)  # save R28
+    std  %r29, 128(%r1)  # save R29
+    std  %r30, 136(%r1)  # save R30
+    std  %r31, 144(%r1)  # save R31
+    std  %r3,  152(%r1)  # save hidden
+
+    # save CR
+    mfcr  %r0
+    std   %r0, 160(%r1)
+    # save LR
+    mflr  %r0
+    std   %r0, 168(%r1)
+    # save LR as PC
+    std   %r0, 176(%r1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  %r6, %r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  %r1, %r4
+
+#if _CALL_ELF != 2
+    ld  %r2,  0(%r1)  # restore TOC
+#endif
+    ld  %r14, 8(%r1)  # restore R14
+    ld  %r15, 16(%r1)  # restore R15
+    ld  %r16, 24(%r1)  # restore R16
+    ld  %r17, 32(%r1)  # restore R17
+    ld  %r18, 40(%r1)  # restore R18
+    ld  %r19, 48(%r1)  # restore R19
+    ld  %r20, 56(%r1)  # restore R20
+    ld  %r21, 64(%r1)  # restore R21
+    ld  %r22, 72(%r1)  # restore R22
+    ld  %r23, 80(%r1)  # restore R23
+    ld  %r24, 88(%r1)  # restore R24
+    ld  %r25, 96(%r1)  # restore R25
+    ld  %r26, 104(%r1)  # restore R26
+    ld  %r27, 112(%r1)  # restore R27
+    ld  %r28, 120(%r1)  # restore R28
+    ld  %r29, 128(%r1)  # restore R29
+    ld  %r30, 136(%r1)  # restore R30
+    ld  %r31, 144(%r1)  # restore R31
+    ld  %r3,  152(%r1)  # restore hidden
+
+    # restore CR
+    ld  %r0, 160(%r1)
+    mtcr  %r0
+    # restore LR
+    ld  %r0, 168(%r1)
+    mtlr  %r0
+
+    # load PC
+    ld  %r12, 176(%r1)
+    # restore CTR
+    mtctr  %r12
+
+    # adjust stack
+    addi  %r1, %r1, 184
+
+    # return transfer_t
+    std  %r6, 0(%r3)
+    std  %r5, 8(%r3)
+
+    # jump to context
+    bctr
+#if _CALL_ELF == 2
+	.size jump_fcontext, .-jump_fcontext
+#else
+# ifdef _CALL_LINUX
+	.size .jump_fcontext, .-.L.jump_fcontext
+# else
+	.size .jump_fcontext, .-.jump_fcontext
+# endif
+#endif
+
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 152 - 0
modules/std/fiber/native/asm/jump_ppc64_sysv_macho_gas.S

@@ -0,0 +1,152 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.align 2
+.globl jump_fcontext
+
+_jump_fcontext:
+    ; reserve space on stack
+    subi  r1, r1, 184
+
+    std  %r14, 8(%r1)  ; save R14
+    std  %r15, 16(%r1)  ; save R15
+    std  %r16, 24(%r1)  ; save R16
+    std  %r17, 32(%r1)  ; save R17
+    std  %r18, 40(%r1)  ; save R18
+    std  %r19, 48(%r1)  ; save R19
+    std  %r20, 56(%r1)  ; save R20
+    std  %r21, 64(%r1)  ; save R21
+    std  %r22, 72(%r1)  ; save R22
+    std  %r23, 80(%r1)  ; save R23
+    std  %r24, 88(%r1)  ; save R24
+    std  %r25, 96(%r1)  ; save R25
+    std  %r26, 104(%r1)  ; save R26
+    std  %r27, 112(%r1)  ; save R27
+    std  %r29, 120(%r1)  ; save R28
+    std  %r29, 128(%r1)  ; save R29
+    std  %r30, 136(%r1)  ; save R30
+    std  %r31, 144(%r1)  ; save R31
+    std  %r3,  152(%r1)  ; save hidden
+
+    ; save CR
+    mfcr  r0
+    std  r0, 160(r1)
+    ; save LR
+    mflr  r0
+    std  r0, 168(r1)
+    ; save LR as PC
+    std  r0, 176(r1)
+
+    ; store RSP (pointing to context-data) in R6
+    mr  %r6, %r1
+
+    ; restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    ld  %r14, 8(%r1)  ; restore R14
+    ld  %r15, 16(%r1)  ; restore R15
+    ld  %r16, 24(%r1)  ; restore R16
+    ld  %r17, 32(%r1)  ; restore R17
+    ld  %r18, 40(%r1)  ; restore R18
+    ld  %r19, 48(%r1)  ; restore R19
+    ld  %r20, 56(%r1)  ; restore R20
+    ld  %r21, 64(%r1)  ; restore R21
+    ld  %r22, 72(%r1)  ; restore R22
+    ld  %r23, 80(%r1)  ; restore R23
+    ld  %r24, 88(%r1)  ; restore R24
+    ld  %r25, 96(%r1)  ; restore R25
+    ld  %r26, 104(%r1)  ; restore R26
+    ld  %r27, 112(%r1)  ; restore R27
+    ld  %r28, 120(%r1)  ; restore R28
+    ld  %r29, 128(%r1)  ; restore R29
+    ld  %r30, 136(%r1)  ; restore R30
+    ld  %r31, 144(%r1)  ; restore R31
+    ld  %r3,  152(%r1)  ; restore hidden
+
+    ; restore CR
+    ld  r0, 160(r1)
+    mtcr  r0
+    ; restore LR
+    ld  r0, 168(r1)
+    mtlr  r0
+
+    ; load PC
+    ld  r0, 176(r1)
+    ; restore CTR
+    mtctr  r0
+
+    ; adjust stack
+    addi  r1, r1, 184
+
+    ; return transfer_t
+    std  %r6, 0(%r3)
+    std  %r5, 8(%r3)
+
+    ; jump to context
+    bctr

+ 84 - 0
modules/std/fiber/native/asm/jump_ppc64_sysv_xcoff_gas.S

@@ -0,0 +1,84 @@
+.align 2
+.globl .jump_fcontext
+.jump_fcontext:
+    # reserve space on stack
+    subi  1, 1, 184
+
+    std  13, 0(1)  # save R13
+    std  14, 8(1)  # save R14
+    std  15, 16(1)  # save R15
+    std  16, 24(1)  # save R16
+    std  17, 32(1)  # save R17
+    std  18, 40(1)  # save R18
+    std  19, 48(1)  # save R19
+    std  20, 56(1)  # save R20
+    std  21, 64(1)  # save R21
+    std  22, 72(1)  # save R22
+    std  23, 80(1)  # save R23
+    std  24, 88(1)  # save R24
+    std  25, 96(1)  # save R25
+    std  26, 104(1)  # save R26
+    std  27, 112(1)  # save R27
+    std  29, 120(1)  # save R28
+    std  29, 128(1)  # save R29
+    std  30, 136(1)  # save R30
+    std  31, 144(1)  # save R31
+    std  3,  152(1)  # save hidden
+
+    # save CR
+    mfcr  0
+    std  0, 160(1)
+    # save LR
+    mflr  0
+    std  0, 168(1)
+    # save LR as PC
+    std  0, 176(1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  6, 1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  1, 4
+
+    ld  13, 0(1)  # restore R13
+    ld  14, 8(1)  # restore R14
+    ld  15, 16(1)  # restore R15
+    ld  16, 24(1)  # restore R16
+    ld  17, 32(1)  # restore R17
+    ld  18, 40(1)  # restore R18
+    ld  19, 48(1)  # restore R19
+    ld  20, 56(1)  # restore R20
+    ld  21, 64(1)  # restore R21
+    ld  22, 72(1)  # restore R22
+    ld  23, 80(1)  # restore R23
+    ld  24, 88(1)  # restore R24
+    ld  25, 96(1)  # restore R25
+    ld  26, 104(1)  # restore R26
+    ld  27, 112(1)  # restore R27
+    ld  28, 120(1)  # restore R28
+    ld  29, 128(1)  # restore R29
+    ld  30, 136(1)  # restore R30
+    ld  31, 144(1)  # restore R31
+    ld  3,  152(1)  # restore hidden
+
+    # restore CR
+    ld  0, 160(1)
+    mtcr  0
+    # restore LR
+    ld  0, 168(1)
+    mtlr  0
+
+    # load PC
+    ld  0, 176(1)
+    # restore CTR
+    mtctr  0
+
+    # adjust stack
+    addi  1, 1, 184
+
+    # return transfer_t
+    std  6, 0(3)
+    std  5, 8(3)
+
+    # jump to context
+    bctr

+ 140 - 0
modules/std/fiber/native/asm/jump_x86_64_ms_pe_gas.asm

@@ -0,0 +1,140 @@
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/**************************************************************************************
+ *                                                                                    *
+ * ---------------------------------------------------------------------------------- *
+ * |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
+ * ---------------------------------------------------------------------------------- *
+ * |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |      fbr_strg     |      fc_dealloc    |       limit       |        base       | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        R12        |         R13        |        R14        |        R15        | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        RDI         |       RSI         |        RBX        |        RBP        | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        hidden     |         RIP        |        EXIT       |   parameter area  | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |                       parameter area                       |        FCTX       | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
+ * ---------------------------------------------------------------------------------- *
+ * |       DATA        |                    |                   |                   | *
+ * ---------------------------------------------------------------------------------- *
+ *                                                                                    *
+ * ***********************************************************************************/
+
+.file	"jump_x86_64_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	jump_fcontext
+.def	jump_fcontext;	.scl	2;	.type	32;	.endef
+.seh_proc	jump_fcontext
+jump_fcontext:
+.seh_endprologue
+
+    pushq  %rcx  /* save hidden address of transport_t */
+
+    pushq  %rbp  /* save RBP */
+    pushq  %rbx  /* save RBX */
+    pushq  %rsi  /* save RSI */
+    pushq  %rdi  /* save RDI */
+    pushq  %r15  /* save R15 */
+    pushq  %r14  /* save R14 */
+    pushq  %r13  /* save R13 */
+    pushq  %r12  /* save R12 */
+
+    /* load NT_TIB */
+    movq  %gs:(0x30), %r10
+    /* save current stack base */
+    movq  0x08(%r10), %rax
+    pushq  %rax
+    /* save current stack limit */
+    movq  0x10(%r10), %rax
+    pushq  %rax
+    /* save current deallocation stack */
+    movq  0x1478(%r10), %rax
+    pushq  %rax
+    /* save fiber local storage */
+    movq  0x18(%r10), %rax
+    pushq  %rax
+
+    /* preserve RSP (pointing to context-data) in R9 */
+    movq  %rsp, %r9
+
+    /* restore RSP (pointing to context-data) from RDX */
+    movq  %rdx, %rsp
+
+    /* load NT_TIB */
+    movq  %gs:(0x30), %r10
+    /* restore fiber local storage */
+    popq  %rax
+    movq  %rax, 0x18(%r10)
+    /* restore deallocation stack */
+    popq  %rax
+    movq  %rax, 0x1478(%r10)
+    /* restore stack limit */
+    popq  %rax
+    movq  %rax, 0x10(%r10)
+    /* restore stack base */
+    popq  %rax
+    movq  %rax, 0x8(%r10)
+
+    popq  %r12  /* restore R12 */
+    popq  %r13  /* restore R13 */
+    popq  %r14  /* restore R14 */
+    popq  %r15  /* restore R15 */
+    popq  %rdi  /* restore RDI */
+    popq  %rsi  /* restore RSI */
+    popq  %rbx  /* restore RBX */
+    popq  %rbp  /* restore RBP */
+
+    popq  %rax  /* restore hidden address of transport_t */
+
+    /* restore return-address */
+    popq  %r10
+
+    /* transport_t returned in RAX */
+    /* return parent fcontext_t */
+    movq  %r9, (%rax)
+    /* return data */
+    movq  %r8, 0x8(%rax)
+
+    /* transport_t as 1.arg of context-function */
+    movq  %rax, %rcx
+
+    /* indirect jump to context */
+    jmp  *%r10
+.seh_endproc
+
+.section .drectve
+.ascii " -export:\"jump_fcontext\""

+ 128 - 0
modules/std/fiber/native/asm/jump_x86_64_ms_pe_masm.asm

@@ -0,0 +1,128 @@
+
+;           Copyright Oliver Kowalke 2009.
+;  Distributed under the Boost Software License, Version 1.0.
+;     (See accompanying file LICENSE_1_0.txt or copy at
+;           http://www.boost.org/LICENSE_1_0.txt)
+
+;  ----------------------------------------------------------------------------------
+;  |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   |
+;  ----------------------------------------------------------------------------------
+;  |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  |
+;  ----------------------------------------------------------------------------------
+;  |      fbr_strg     |      fc_dealloc    |       limit       |        base       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   |
+;  ----------------------------------------------------------------------------------
+;  |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  |
+;  ----------------------------------------------------------------------------------
+;  |        R12        |         R13        |        R14        |        R15        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   |
+;  ----------------------------------------------------------------------------------
+;  |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  |
+;  ----------------------------------------------------------------------------------
+;  |        RDI         |       RSI         |        RBX        |        RBP        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   |
+;  ----------------------------------------------------------------------------------
+;  |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  |
+;  ----------------------------------------------------------------------------------
+;  |        hidden     |         RIP        |       EXIT        |   parameter area  |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   |
+;  ----------------------------------------------------------------------------------
+;  |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  |
+;  ----------------------------------------------------------------------------------
+;  |                       parameter area                       |        FCTX       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   |
+;  ----------------------------------------------------------------------------------
+;  |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  |
+;  ----------------------------------------------------------------------------------
+;  |       DATA        |                    |                   |                   |
+;  ----------------------------------------------------------------------------------
+
+.code
+
+jump_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
+    .endprolog
+
+    push  rcx  ; save hidden address of transport_t
+
+    push  rbp  ; save RBP
+    push  rbx  ; save RBX
+    push  rsi  ; save RSI
+    push  rdi  ; save RDI
+    push  r15  ; save R15
+    push  r14  ; save R14
+    push  r13  ; save R13
+    push  r12  ; save R12
+
+    ; load NT_TIB
+    mov  r10,  gs:[030h]
+    ; save current stack base
+    mov  rax,  [r10+08h]
+    push  rax
+    ; save current stack limit
+    mov  rax, [r10+010h]
+    push  rax
+    ; save current deallocation stack
+    mov  rax, [r10+01478h]
+    push  rax
+    ; save fiber local storage
+    mov  rax, [r10+018h]
+    push  rax
+
+    ; preserve RSP (pointing to context-data) in R9
+    mov  r9, rsp
+
+    ; restore RSP (pointing to context-data) from RDX
+    mov  rsp, rdx
+
+    ; load NT_TIB
+    mov  r10, gs:[030h]
+    ; restore fiber local storage
+    pop  rax
+    mov  [r10+018h], rax
+    ; restore deallocation stack
+    pop  rax
+    mov  [r10+01478h], rax
+    ; restore stack limit
+    pop  rax
+    mov  [r10+010h], rax
+    ; restore stack base
+    pop  rax
+    mov  [r10+08h], rax
+
+    pop  r12  ; restore R12
+    pop  r13  ; restore R13
+    pop  r14  ; restore R14
+    pop  r15  ; restore R15
+    pop  rdi  ; restore RDI
+    pop  rsi  ; restore RSI
+    pop  rbx  ; restore RBX
+    pop  rbp  ; restore RBP
+
+    pop  rax  ; restore hidden address of transport_t
+
+    ; restore return-address
+    pop  r10
+
+    ; transport_t returned in RAX
+    ; return parent fcontext_t
+    mov  [rax], r9
+    ; return data
+    mov  [rax+08h], r8
+
+    ; transport_t as 1.arg of context-function
+    mov  rcx,  rax
+
+    ; indirect jump to context
+    jmp  r10
+jump_fcontext ENDP
+END

+ 67 - 0
modules/std/fiber/native/asm/jump_x86_64_sysv_elf_gas.S

@@ -0,0 +1,67 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R12        |         R13       |         R14        |        R15        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl jump_fcontext
+.type jump_fcontext,@function
+.align 16
+jump_fcontext:
+    pushq  %rbp  /* save RBP */
+    pushq  %rbx  /* save RBX */
+    pushq  %r15  /* save R15 */
+    pushq  %r14  /* save R14 */
+    pushq  %r13  /* save R13 */
+    pushq  %r12  /* save R12 */
+
+    /* store RSP (pointing to context-data) in RAX */
+    movq  %rsp, %rax
+
+    /* restore RSP (pointing to context-data) from RDI */
+    movq  %rdi, %rsp
+
+    popq  %r12  /* restrore R12 */
+    popq  %r13  /* restrore R13 */
+    popq  %r14  /* restrore R14 */
+    popq  %r15  /* restrore R15 */
+    popq  %rbx  /* restrore RBX */
+    popq  %rbp  /* restrore RBP */
+
+    /* restore return-address */
+    popq  %r8
+
+    /* return transfer_t from jump */
+    /* RAX == fctx, RDX == data */
+    movq  %rsi, %rdx
+    /* pass transfer_t as first arg in context function */
+    /* RDI == fctx, RSI == data */
+    movq  %rax, %rdi
+
+    /* indirect jump to context */
+    jmp  *%r8
+.size jump_fcontext,.-jump_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 62 - 0
modules/std/fiber/native/asm/jump_x86_64_sysv_macho_gas.S

@@ -0,0 +1,62 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R12        |         R13       |         R14        |        R15        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _jump_fcontext
+.align 8
+_jump_fcontext:
+    pushq  %rbp  /* save RBP */
+    pushq  %rbx  /* save RBX */
+    pushq  %r15  /* save R15 */
+    pushq  %r14  /* save R14 */
+    pushq  %r13  /* save R13 */
+    pushq  %r12  /* save R12 */
+
+    /* store RSP (pointing to context-data) in RAX */
+    movq  %rsp, %rax
+
+    /* restore RSP (pointing to context-data) from RDI */
+    movq  %rdi, %rsp
+
+    popq  %r12  /* restrore R12 */
+    popq  %r13  /* restrore R13 */
+    popq  %r14  /* restrore R14 */
+    popq  %r15  /* restrore R15 */
+    popq  %rbx  /* restrore RBX */
+    popq  %rbp  /* restrore RBP */
+
+    /* restore return-address */
+    popq  %r8
+
+    /* return transfer_t from jump */
+    /* RAX == fctx, RDX == data */
+    movq  %rsi, %rdx
+    /* pass transfer_t as first arg in context function */
+    /* RDI == fctx, RSI == data */
+    movq  %rax, %rdi
+
+    /* indirect jump to context */
+    jmp  *%r8

+ 71 - 0
modules/std/fiber/native/asm/make_arm64_aapcs_elf_gas.S

@@ -0,0 +1,71 @@
+/*
+            Copyright Edward Nevill + Oliver Kowalke 2015
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.cpu    generic+fp+simd
+.text
+.align  2
+.global make_fcontext
+.type   make_fcontext, %function
+make_fcontext:
+    # shift address in x0 (allocated stack) to lower 16 byte boundary
+    and x0, x0, ~0xF
+
+    # reserve space for context-data on context-stack
+    sub  x0, x0, #0x70
+
+    # third arg of make_fcontext() == address of context-function
+    # store address as a PC to jump in
+    str  x2, [x0, #0x60]
+
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns (LR register)
+    adr  x1, finish
+    str  x1, [x0, #0x58]
+
+    ret  x30 // return pointer to context-data (x0)
+
+finish:
+    # exit code is zero
+    mov  x0, #0
+    # exit application
+    bl  _exit
+
+.size   make_fcontext,.-make_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 68 - 0
modules/std/fiber/native/asm/make_arm64_aapcs_macho_gas.S

@@ -0,0 +1,68 @@
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _make_fcontext
+.balign 16
+
+_make_fcontext:
+    ; shift address in x0 (allocated stack) to lower 16 byte boundary
+    and x0, x0, ~0xF
+
+    ; reserve space for context-data on context-stack
+    sub  x0, x0, #0x70
+
+    ; third arg of make_fcontext() == address of context-function
+    ; store address as a PC to jump in
+    str  x2, [x0, #0x60]
+
+    ; compute abs address of label finish
+    ; 0x0c = 3 instructions * size (4) before label 'finish'
+
+    ; TODO: Numeric offset since llvm still does not support labels in ADR. Fix:
+    ;       http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140407/212336.html
+    adr  x1, 0x0c
+
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns (LR register)
+    str  x1, [x0, #0x58]
+
+    ret  lr ; return pointer to context-data (x0)
+
+finish:
+    ; exit code is zero
+    mov  x0, #0
+    ; exit application
+    bl  __exit
+
+

+ 62 - 0
modules/std/fiber/native/asm/make_arm_aapcs_elf_gas.S

@@ -0,0 +1,62 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl make_fcontext
+.align 2
+.type make_fcontext,%function
+make_fcontext:
+    @ shift address in A1 to lower 16 byte boundary
+    bic  a1, a1, #15
+
+    @ reserve space for context-data on context-stack
+    sub  a1, a1, #60
+
+    @ third arg of make_fcontext() == address of context-function
+    str  a3, [a1, #40]
+
+    @ compute address of returned transfer_t
+    add  a2, a1, #44
+    mov  a3, a2
+    str  a3, [a1, #0]
+
+    @ compute abs address of label finish
+    adr  a2, finish
+    @ save address of finish as return-address for context-function
+    @ will be entered after context-function returns
+    str  a2, [a1, #36]
+
+    bx  lr @ return pointer to context-data
+
+finish:
+    @ exit code is zero
+    mov  a1, #0
+    @ exit application
+    bl  _exit@PLT
+.size make_fcontext,.-make_fcontext
+
+@ Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 57 - 0
modules/std/fiber/native/asm/make_arm_aapcs_macho_gas.S

@@ -0,0 +1,57 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _make_fcontext
+.align 2
+_make_fcontext:
+    @ shift address in A1 to lower 16 byte boundary
+    bic  a1, a1, #15
+
+    @ reserve space for context-data on context-stack
+    sub  a1, a1, #64
+
+    @ third arg of make_fcontext() == address of context-function
+    str  a3, [a1, #44]
+
+    @ compute address of returned transfer_t
+    add  a2, a1, #48
+    mov  a3, a2
+    str  a3, [a1, #4]
+
+    @ compute abs address of label finish
+    adr  a2, finish
+    @ save address of finish as return-address for context-function
+    @ will be entered after context-function returns
+    str  a2, [a1, #40]
+
+    bx  lr @ return pointer to context-data
+
+finish:
+    @ exit code is zero
+    mov  a1, #0
+    @ exit application
+    bl  __exit

+ 77 - 0
modules/std/fiber/native/asm/make_arm_aapcs_pe_armasm.asm

@@ -0,0 +1,77 @@
+;/*
+;            Copyright Oliver Kowalke 2009.
+;   Distributed under the Boost Software License, Version 1.0.
+;      (See accompanying file LICENSE_1_0.txt or copy at
+;          http://www.boost.org/LICENSE_1_0.txt)
+;*/
+
+; *******************************************************
+; *                                                     *
+; *  -------------------------------------------------  *
+; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+; *  -------------------------------------------------  *
+; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+; *  -------------------------------------------------  *
+; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
+; *  -------------------------------------------------  *
+; *  -------------------------------------------------  *
+; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+; *  -------------------------------------------------  *
+; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+; *  -------------------------------------------------  *
+; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
+; *  -------------------------------------------------  *
+; *                                                     *
+; *******************************************************
+
+
+    AREA |.text|, CODE
+    ALIGN 4
+    EXPORT make_fcontext
+    IMPORT _exit
+
+make_fcontext PROC
+    ; first arg of make_fcontext() == top of context-stack
+    ; save top of context-stack (base) A4
+    mov  a4, a1
+
+    ; shift address in A1 to lower 16 byte boundary
+    bic  a1, a1, #0x0f
+
+    ; reserve space for context-data on context-stack
+    sub  a1, a1, #0x48
+
+    ; save top address of context_stack as 'base'
+    str  a4, [a1, #0x8]
+    ; second arg of make_fcontext() == size of context-stack
+    ; compute bottom address of context-stack (limit)
+    sub  a4, a4, a2
+    ; save bottom address of context-stack as 'limit'
+    str  a4, [a1, #0x4]
+    ; save bottom address of context-stack as 'dealloction stack'
+    str  a4, [a1, #0x0]
+
+    ; third arg of make_fcontext() == address of context-function
+    str  a3, [a1, #0x34]
+
+    ; compute address of returned transfer_t
+    add  a2, a1, #0x38
+    mov  a3, a2
+    str  a3, [a1, #0xc]
+
+    ; compute abs address of label finish
+    adr  a2, finish
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns
+    str  a2, [a1, #0x30]
+
+    bx  lr ; return pointer to context-data
+
+finish
+    ; exit code is zero
+    mov  a1, #0
+    ; exit application
+    bl  _exit
+
+    ENDP
+    END

+ 20 - 0
modules/std/fiber/native/asm/make_combined_sysv_macho_gas.S

@@ -0,0 +1,20 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "make_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "make_x86_64_sysv_macho_gas.S"
+#elif defined(__ppc__)
+    #include "make_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "make_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 142 - 0
modules/std/fiber/native/asm/make_i386_ms_pe_gas.asm

@@ -0,0 +1,142 @@
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*************************************************************************************
+*  --------------------------------------------------------------------------------- *
+*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
+*  --------------------------------------------------------------------------------- *
+*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
+*  --------------------------------------------------------------------------------- *
+*  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   | *
+*  --------------------------------------------------------------------------------- *
+*  --------------------------------------------------------------------------------- *
+*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
+*  --------------------------------------------------------------------------------- *
+*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
+*  --------------------------------------------------------------------------------- *
+*  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         | *
+*  --------------------------------------------------------------------------------- *
+*************************************************************************************/
+
+.file	"make_i386_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	_make_fcontext
+.def	_make_fcontext;	.scl	2;	.type	32;	.endef
+_make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movl  0x04(%esp), %eax
+
+    /* reserve space for first argument of context-function */
+    /* EAX might already point to a 16byte border */
+    leal  -0x08(%eax), %eax
+
+    /* shift address in EAX to lower 16 byte boundary */
+    andl  $-16, %eax
+
+    /* reserve space for context-data on context-stack */
+    /* size for fc_mxcsr .. EIP + return-address for context-function */
+    /* on context-function entry: (ESP -0x4) % 8 == 0 */
+    /* additional space is required for SEH */
+    leal  -0x48(%eax), %eax
+
+    /* first arg of make_fcontext() == top of context-stack */
+    movl  0x04(%esp), %ecx
+    /* save top address of context stack as 'base' */
+    movl  %ecx, 0xc(%eax)
+    /* second arg of make_fcontext() == size of context-stack */
+    movl  0x08(%esp), %edx
+    /* negate stack size for LEA instruction (== substraction) */
+    negl  %edx
+    /* compute bottom address of context stack (limit) */
+    leal  (%ecx,%edx), %ecx
+    /* save bottom address of context-stack as 'limit' */
+    movl  %ecx, 0x8(%eax)
+    /* save bottom address of context-stack as 'dealloction stack' */
+    movl  %ecx, 0x4(%eax)
+	/* set fiber-storage to zero */
+	xorl  %ecx, %ecx
+    movl  %ecx, (%eax)
+
+    /* third arg of make_fcontext() == address of context-function */
+    /* stored in EBX */
+    movl  0xc(%esp), %ecx
+    movl  %ecx, 0x1c(%eax)
+
+    /* compute abs address of label trampoline */
+    movl  $trampoline, %ecx
+    /* save address of trampoline as return-address for context-function */
+    /* will be entered after calling jump_fcontext() first time */
+    movl  %ecx, 0x24(%eax)
+
+    /* compute abs address of label finish */
+    movl  $finish, %ecx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movl  %ecx, 0x20(%eax)
+
+    /* traverse current seh chain to get the last exception handler installed by Windows */
+    /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */
+    /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */
+    /* at its end by RaiseException all seh andlers are disregarded if not present and the */
+    /* program is aborted */
+    /* load NT_TIB into ECX */
+    movl  %fs:(0x0), %ecx
+
+walk:
+    /* load 'next' member of current SEH into EDX */
+    movl  (%ecx), %edx
+    /* test if 'next' of current SEH is last (== 0xffffffff) */
+    incl  %edx
+    jz  found
+    decl  %edx
+    /* exchange content; ECX contains address of next SEH */
+    xchgl  %ecx, %edx
+    /* inspect next SEH */
+    jmp  walk
+
+found:
+    /* load 'handler' member of SEH == address of last SEH handler installed by Windows */
+    movl  0x04(%ecx), %ecx
+    /* save address in ECX as SEH handler for context */
+    movl  %ecx, 0x38(%eax)
+    /* set ECX to -1 */
+    movl  $0xffffffff, %ecx
+    /* save ECX as next SEH item */
+    movl  %ecx, 0x34(%eax)
+    /* load address of next SEH item */
+    leal  0x34(%eax), %ecx
+    /* save next SEH */
+    movl  %ecx, 0x10(%eax)
+
+    /* return pointer to context-data */
+    ret
+
+trampoline:
+    /* move transport_t for entering context-function */
+    /* FCTX == EAX, DATA == EDX */
+    movl  %eax, (%esp)
+    movl  %edx, 0x4(%esp)
+    /* label finish as return-address */
+    pushl %ebp
+    /* jump to context-function */
+    jmp  *%ebx
+
+finish:
+    /* ESP points to same address as ESP on entry of context function + 0x4 */
+    xorl  %eax, %eax
+    /* exit code is zero */
+    movl  %eax, (%esp)
+    /* exit application */
+    call  __exit
+    hlt
+
+.def	__exit;	.scl	2;	.type	32;	.endef  /* standard C library function */
+
+.section .drectve
+.ascii " -export:\"make_fcontext\""

+ 135 - 0
modules/std/fiber/native/asm/make_i386_ms_pe_masm.asm

@@ -0,0 +1,135 @@
+
+;           Copyright Oliver Kowalke 2009.
+;  Distributed under the Boost Software License, Version 1.0.
+;     (See accompanying file LICENSE_1_0.txt or copy at
+;           http://www.boost.org/LICENSE_1_0.txt)
+
+;  ---------------------------------------------------------------------------------
+;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
+;  ---------------------------------------------------------------------------------
+;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
+;  ---------------------------------------------------------------------------------
+;  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   |
+;  ---------------------------------------------------------------------------------
+;  ---------------------------------------------------------------------------------
+;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
+;  ---------------------------------------------------------------------------------
+;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
+;  ---------------------------------------------------------------------------------
+;  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         |
+;  ---------------------------------------------------------------------------------
+
+.386
+.XMM
+.model flat, c
+; standard C library function
+_exit PROTO, value:SDWORD
+.code
+
+make_fcontext PROC BOOST_CONTEXT_EXPORT
+    ; first arg of make_fcontext() == top of context-stack
+    mov  eax, [esp+04h]
+
+    ; reserve space for first argument of context-function
+    ; EAX might already point to a 16byte border
+    lea  eax, [eax-08h]
+
+    ; shift address in EAX to lower 16 byte boundary
+    and  eax, -16
+
+    ; reserve space for context-data on context-stack
+    ; on context-function entry: (ESP -0x4) % 8 == 0
+    ; additional space is required for SEH
+    lea  eax, [eax-048h]
+
+    ; first arg of make_fcontext() == top of context-stack
+    mov  ecx, [esp+04h]
+    ; save top address of context stack as 'base'
+    mov  [eax+0ch], ecx
+    ; second arg of make_fcontext() == size of context-stack
+    mov  edx, [esp+08h]
+    ; negate stack size for LEA instruction (== substraction)
+    neg  edx
+    ; compute bottom address of context stack (limit)
+    lea  ecx, [ecx+edx]
+    ; save bottom address of context-stack as 'limit'
+    mov  [eax+08h], ecx
+    ; save bottom address of context-stack as 'dealloction stack'
+    mov  [eax+04h], ecx
+	; set fiber-storage to zero
+	xor  ecx, ecx
+    mov  [eax], ecx
+
+    ; third arg of make_fcontext() == address of context-function
+    ; stored in EBX
+    mov  ecx, [esp+0ch]
+    mov  [eax+01ch], ecx
+
+    ; compute abs address of label trampoline
+    mov  ecx, trampoline
+    ; save address of trampoline as return-address for context-function
+    ; will be entered after calling jump_fcontext() first time
+    mov  [eax+024h], ecx
+
+    ; compute abs address of label finish
+    mov  ecx, finish
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns
+    mov  [eax+020h], ecx
+
+    ; traverse current seh chain to get the last exception handler installed by Windows
+    ; note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default
+    ; the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler
+    ; at its end by RaiseException all seh-handlers are disregarded if not present and the
+    ; program is aborted
+    assume  fs:nothing
+    ; load NT_TIB into ECX
+    mov  ecx, fs:[0h]
+    assume  fs:error
+
+walk:
+    ; load 'next' member of current SEH into EDX
+    mov  edx, [ecx]
+    ; test if 'next' of current SEH is last (== 0xffffffff)
+    inc  edx
+    jz  found
+    dec  edx
+    ; exchange content; ECX contains address of next SEH
+    xchg edx, ecx
+    ; inspect next SEH
+    jmp  walk
+
+found:
+    ; load 'handler' member of SEH == address of last SEH handler installed by Windows
+    mov  ecx, [ecx+04h]
+    ; save address in ECX as SEH handler for context
+    mov  [eax+038h], ecx
+    ; set ECX to -1
+    mov  ecx, 0ffffffffh
+    ; save ECX as next SEH item
+    mov  [eax+034h], ecx
+    ; load address of next SEH item
+    lea  ecx, [eax+034h]
+    ; save next SEH
+    mov  [eax+010h], ecx
+
+    ret ; return pointer to context-data
+
+trampoline:
+    ; move transport_t for entering context-function
+    ; FCTX == EAX, DATA == EDX
+    mov  [esp], eax
+    mov  [esp+04h], edx
+    push ebp
+    ; jump to context-function
+    jmp ebx
+
+finish:
+    ; exit code is zero
+    xor  eax, eax
+    mov  [esp], eax
+    ; exit application
+    call  _exit
+    hlt
+make_fcontext ENDP
+END

+ 94 - 0
modules/std/fiber/native/asm/make_i386_sysv_elf_gas.S

@@ -0,0 +1,94 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*****************************************************************************************
+ *                                                                                       *
+ *  -----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *                                                                                       *
+ *****************************************************************************************/
+
+.text
+.globl make_fcontext
+.align 2
+.type make_fcontext,@function
+make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movl  0x4(%esp), %eax
+
+    /* reserve space for first argument of context-function
+       rax might already point to a 16byte border */
+    leal  -0x8(%eax), %eax
+
+    /* shift address in EAX to lower 16 byte boundary */
+    andl  $-16, %eax
+
+    /* reserve space for context-data on context-stack */
+    leal  -0x28(%eax), %eax
+
+    /* third arg of make_fcontext() == address of context-function */
+    /* stored in EBX */
+    movl  0xc(%esp), %ecx
+    movl  %ecx, 0x8(%eax)
+
+    /* return transport_t */
+    /* FCTX == EDI, DATA == ESI */
+    leal  (%eax), %ecx
+    movl  %ecx, 0x14(%eax)
+
+    /* compute abs address of label trampoline */
+    call  1f
+    /* address of trampoline 1 */
+1:  popl  %ecx
+    /* compute abs address of label trampoline */
+    addl  $trampoline-1b, %ecx
+    /* save address of trampoline as return address */
+    /* will be entered after calling jump_fcontext() first time */
+    movl  %ecx, 0x10(%eax)
+
+    /* compute abs address of label finish */
+    call  2f
+    /* address of label 2 */
+2:  popl  %ecx
+    /* compute abs address of label finish */
+    addl  $finish-2b, %ecx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movl  %ecx, 0xc(%eax) 
+
+    ret /* return pointer to context-data */
+
+trampoline:
+    /* move transport_t for entering context-function */
+    movl  %edi, (%esp)
+    movl  %esi, 0x4(%esp)
+    pushl %ebp
+    /* jump to context-function */
+    jmp *%ebx
+
+finish:
+    call  3f
+    /* address of label 3 */
+3:  popl  %ebx
+    /* compute address of GOT and store it in EBX */
+    addl  $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
+
+    /* exit code is zero */
+    xorl  %eax, %eax
+    movl  %eax, (%esp)
+    /* exit application */
+    call  _exit@PLT
+    hlt
+.size make_fcontext,.-make_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 83 - 0
modules/std/fiber/native/asm/make_i386_sysv_macho_gas.S

@@ -0,0 +1,83 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*****************************************************************************************
+ *                                                                                       *
+ *  -----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *                                                                                       *
+ *****************************************************************************************/
+
+.text
+.globl _make_fcontext
+.align 2
+_make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movl  0x4(%esp), %eax
+
+    /* reserve space for first argument of context-function
+       rax might already point to a 16byte border */
+    leal  -0x8(%eax), %eax
+
+    /* shift address in EAX to lower 16 byte boundary */
+    andl  $-16, %eax
+
+    /* reserve space for context-data on context-stack */
+    leal  -0x28(%eax), %eax
+
+    /* thrid arg of make_fcontext() == address of context-function */
+    /* stored in EBX */
+    movl  0xc(%esp), %edx
+    movl  %edx, 0x8(%eax)
+
+    /* return transport_t */
+    /* FCTX == EDI, DATA == ESI */
+    leal  (%eax), %ecx
+    movl  %ecx, 0x14(%eax)
+
+    /* compute abs address of label trampoline */
+    call  1f
+    /* address of trampoline 1 */
+1:  popl  %ecx
+    /* compute abs address of label trampoline */
+    addl  $trampoline-1b, %ecx
+    /* save address of trampoline as return address */
+    /* will be entered after calling jump_fcontext() first time */
+    movl  %ecx, 0x10(%eax)
+
+    /* compute abs address of label finish */
+    call  2f
+    /* address of label 2 */
+2:  popl  %ecx
+    /* compute abs address of label finish */
+    addl  $finish-2b, %ecx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movl  %ecx, 0xc(%eax) 
+
+    ret /* return pointer to context-data */
+
+trampoline:
+    /* move transport_t for entering context-function */
+    movl  %edi, (%esp)
+    movl  %esi, 0x4(%esp)
+    pushl %ebp
+    /* jump to context-function */
+    jmp *%ebx
+
+finish:
+    /* exit code is zero */
+    xorl  %eax, %eax
+    movl  %eax, (%esp)
+    /* exit application */
+    call  __exit
+    hlt

+ 16 - 0
modules/std/fiber/native/asm/make_i386_x86_64_sysv_macho_gas.S

@@ -0,0 +1,16 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "make_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "make_x86_64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 86 - 0
modules/std/fiber/native/asm/make_mips32_o32_elf_gas.S

@@ -0,0 +1,86 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |  FP |hiddn|  RA |  PC |  GP | FCTX| DATA|     |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ * *****************************************************/
+
+.text
+.globl make_fcontext
+.align 2
+.type make_fcontext,@function
+.ent make_fcontext
+make_fcontext:
+#ifdef __PIC__
+.set    noreorder
+.cpload $t9
+.set    reorder
+#endif
+    # first arg of make_fcontext() == top address of context-stack
+    move $v0, $a0
+
+    # shift address in A0 to lower 16 byte boundary
+    move $v1, $v0
+    li $v0, -16 # 0xfffffffffffffff0
+    and $v0, $v1, $v0
+
+    # reserve space for context-data on context-stack
+    # including 48 byte of shadow space (sp % 16 == 0)
+    addiu $v0, $v0, -112
+
+    # third arg of make_fcontext() == address of context-function
+    sw  $a2, 44($v0)
+    # save global pointer in context-data
+    sw  $gp, 48($v0)
+
+    # compute address of returned transfer_t
+    addiu $t0, $v0, 52
+    sw  $t0, 36($v0)
+
+    # compute abs address of label finish
+    la  $t9, finish
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    sw  $t9, 40($v0)
+
+    jr  $ra # return pointer to context-data
+
+finish:
+    lw $gp, 0($sp)
+    # allocate stack space (contains shadow space for subroutines)
+    addiu  $sp, $sp, -32
+    # save return address
+    sw  $ra, 28($sp)
+
+    # restore GP (global pointer)
+#    move  $gp, $s1
+    # exit code is zero
+    move  $a0, $zero
+    # address of exit
+    lw  $t9, %call16(_exit)($gp)
+    # exit application
+    jalr  $t9
+.end make_fcontext
+.size make_fcontext, .-make_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 16 - 0
modules/std/fiber/native/asm/make_ppc32_ppc64_sysv_macho_gas.S

@@ -0,0 +1,16 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__ppc__)
+    #include "make_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "make_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 104 - 0
modules/std/fiber/native/asm/make_ppc32_sysv_elf_gas.S

@@ -0,0 +1,104 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC |bchai|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |linkr| FCTX| DATA|                             |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl make_fcontext
+.align 2
+.type make_fcontext,@function
+make_fcontext:
+    # save return address into R6
+    mflr  %r6
+
+    # first arg of make_fcontext() == top address of context-function
+    # shift address in R3 to lower 16 byte boundary
+    clrrwi  %r3, %r3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  %r3, %r3, 172
+
+    # third arg of make_fcontext() == address of context-function
+    stw  %r5, 88(%r3)
+
+    # set back-chain to zero
+    li   %r0, 0
+    stw  %r0, 92(%r3)
+
+    # compute address of returned transfer_t
+    addi  %r0, %r3, 100
+    mr    %r4, %r0 
+    stw   %r4, 76(%r3) 
+
+    # load LR
+    mflr  %r0
+    # jump to label 1
+    bl  1f
+1:
+    # load LR into R4
+    mflr  %r4
+    # compute abs address of label finish
+    addi  %r4, %r4, finish - 1b
+    # restore LR
+    mtlr  %r0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    stw  %r4, 84(%r3)
+
+    # restore return address from R6
+    mtlr  %r6
+
+    blr  # return pointer to context-data
+
+finish:
+    # save return address into R0
+    mflr  %r0
+    # save return address on stack, set up stack frame
+    stw  %r0, 4(%r1)
+    # allocate stack space, R1 % 16 == 0
+    stwu  %r1, -16(%r1)
+
+    # exit code is zero
+    li  %r3, 0
+    # exit application
+    bl  _exit@plt
+.size make_fcontext, .-make_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 99 - 0
modules/std/fiber/native/asm/make_ppc32_sysv_macho_gas.S

@@ -0,0 +1,99 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC |bchai|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |linkr| FCTX| DATA|                             |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _make_fcontext
+.align 2
+_make_fcontext:
+    ; save return address into R6
+    mflr  r6
+
+    ; first arg of make_fcontext() == top address of context-function
+    ; shift address in R3 to lower 16 byte boundary
+    clrrwi  r3, r3, 4
+
+    ; reserve space for context-data on context-stack
+    ; including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  r3, r3, 172
+
+    ; third arg of make_fcontext() == address of context-function
+    stw  r5, 88(r3)
+
+    ; set back-chain to zero
+    li   r0, 0
+    stw  r0, 92(r3)
+
+    ; compute address of returned transfer_t
+    addi  r0, r3, 100
+    mr    r4, r0 
+    stw   r4, 76(r3) 
+
+    ; load LR
+    mflr  r0
+    ; jump to label 1
+    bl  l1
+l1:
+    ; load LR into R4
+    mflr  r4
+    ; compute abs address of label finish
+    addi  r4, r4, lo16((finish - .)+4)
+    # restore LR
+    mtlr  r0
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns
+    stw  r4, 84(r3)
+
+    ; restore return address from R6
+    mtlr  r6
+
+    blr  ; return pointer to context-data
+
+finish:
+    ; save return address into R0
+    mflr  r0
+    ; save return address on stack, set up stack frame
+    stw  r0, 4(r1)
+    ; allocate stack space, R1 % 16 == 0
+    stwu  r1, -16(r1)
+
+    ; exit code is zero
+    li  r3, 0
+    ; exit application
+    bl  __exit

+ 64 - 0
modules/std/fiber/native/asm/make_ppc32_sysv_xcoff_gas.S

@@ -0,0 +1,64 @@
+	.globl	make_fcontext[DS]
+	.globl .make_fcontext[PR]
+	.align 2 
+	.csect  make_fcontext[DS]
+make_fcontext:
+	.long .make_fcontext[PR]
+	.csect .make_fcontext[PR], 3
+#.make_fcontext:
+    # save return address into R6
+    mflr  6
+
+    # first arg of make_fcontext() == top address of context-function
+    # shift address in R3 to lower 16 byte boundary
+    clrrwi  3, 3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  3, 3, 172
+
+    # third arg of make_fcontext() == address of context-function
+    stw  5, 88(3)
+
+    # set back-chain to zero
+    li   0, 0
+    stw  0, 92(3)
+
+    # compute address of returned transfer_t
+    addi  0, 3, 100
+    mr    4, 0 
+    stw   4, 76(3) 
+
+    # load LR
+    mflr  0
+    # jump to label 1
+    bl  .Label
+.Label:
+    # load LR into R4
+    mflr  4
+    # compute abs address of label .L_finish
+    addi  4, 4, .L_finish - .Label 
+    # restore LR
+    mtlr  0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    stw  4, 84(3)
+
+    # restore return address from R6
+    mtlr  6
+
+    blr  # return pointer to context-data
+
+.L_finish:
+    # save return address into R0
+    mflr  0
+    # save return address on stack, set up stack frame
+    stw  0, 4(1)
+    # allocate stack space, R1 % 16 == 0
+    stwu  1, -16(1)
+
+    # exit code is zero
+    li  3, 0
+    # exit application
+    bl  ._exit
+    nop

+ 176 - 0
modules/std/fiber/native/asm/make_ppc64_sysv_elf_gas.S

@@ -0,0 +1,176 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.globl make_fcontext
+#if _CALL_ELF == 2
+	.text
+	.align 2
+make_fcontext:
+	addis	%r2, %r12, .TOC.-make_fcontext@ha
+	addi	%r2, %r2, .TOC.-make_fcontext@l
+	.localentry make_fcontext, . - make_fcontext
+#else
+	.section ".opd","aw"
+	.align 3
+make_fcontext:
+# ifdef _CALL_LINUX
+	.quad	.L.make_fcontext,.TOC.@tocbase,0
+	.type	make_fcontext,@function
+	.text
+	.align 2
+.L.make_fcontext:
+# else
+	.hidden	.make_fcontext
+	.globl	.make_fcontext
+	.quad	.make_fcontext,.TOC.@tocbase,0
+	.size	make_fcontext,24
+	.type	.make_fcontext,@function
+	.text
+	.align 2
+.make_fcontext:
+# endif
+#endif
+    # save return address into R6
+    mflr  %r6
+
+    # first arg of make_fcontext() == top address of context-stack
+    # shift address in R3 to lower 16 byte boundary
+    clrrdi  %r3, %r3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  %r3, %r3, 248
+
+    # third arg of make_fcontext() == address of context-function
+    # entry point (ELFv2) or descriptor (ELFv1)
+#if _CALL_ELF == 2
+    # save address of context-function entry point
+    std  %r5, 176(%r3)
+#else
+    # save address of context-function entry point
+    ld   %r4, 0(%r5)
+    std  %r4, 176(%r3)
+    # save TOC of context-function
+    ld   %r4, 8(%r5)
+    std  %r4, 0(%r3)
+#endif
+
+    # set back-chain to zero
+    li   %r0, 0
+    std  %r0, 184(%r3)
+
+    # compute address of returned transfer_t
+    addi %r0, %r3, 232
+    mr   %r4, %r0
+    std  %r4, 152(%r3)
+
+    # load LR
+    mflr  %r0
+    # jump to label 1
+    bl  1f
+1:
+    # load LR into R4
+    mflr  %r4
+    # compute abs address of label finish
+    addi  %r4, %r4, finish - 1b
+    # restore LR
+    mtlr  %r0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    std  %r4, 168(%r3)
+
+    # restore return address from R6
+    mtlr  %r6
+
+    blr  # return pointer to context-data
+
+finish:
+    # save return address into R0
+    mflr  %r0
+    # save return address on stack, set up stack frame
+    std  %r0, 8(%r1)
+    # allocate stack space, R1 % 16 == 0
+    stdu  %r1, -32(%r1)
+
+    # exit code is zero
+    li  %r3, 0
+    # exit application
+    bl  _exit
+    nop
+#if _CALL_ELF == 2
+	.size make_fcontext, .-make_fcontext
+#else
+# ifdef _CALL_LINUX
+	.size .make_fcontext, .-.L.make_fcontext
+# else
+	.size .make_fcontext, .-.make_fcontext
+# endif
+#endif
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 126 - 0
modules/std/fiber/native/asm/make_ppc64_sysv_macho_gas.S

@@ -0,0 +1,126 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+
+.text
+.globl _make_fcontext
+_make_fcontext:
+    ; save return address into R6
+    mflr  r6
+
+    ; first arg of make_fcontext() == top address of context-function
+    ; shift address in R3 to lower 16 byte boundary
+    clrrwi  r3, r3, 4
+
+    ; reserve space for context-data on context-stack
+    ; including 64 byte of linkage + parameter area (R1  16 == 0)
+    subi  r3, r3, 248
+
+    ; third arg of make_fcontext() == address of context-function
+    stw  r5, 176(r3)
+
+    ; set back-chain to zero
+    li   %r0, 0
+    std  %r0, 184(%r3)
+
+    ; compute address of returned transfer_t
+    addi %r0, %r3, 232
+    mr   %r4, %r0
+    std  %r4, 152(%r3)
+
+    ; load LR
+    mflr  r0
+    ; jump to label 1
+    bl  l1
+l1:
+    ; load LR into R4
+    mflr  r4
+    ; compute abs address of label finish
+    addi  r4, r4, lo16((finish - .) + 4)
+    ; restore LR
+    mtlr  r0
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns
+    std  r4, 168(r3)
+
+    ; restore return address from R6
+    mtlr  r6
+
+    blr  ; return pointer to context-data
+
+finish:
+    ; save return address into R0
+    mflr  r0
+    ; save return address on stack, set up stack frame
+    stw  r0, 8(r1)
+    ; allocate stack space, R1  16 == 0
+    stwu  r1, -32(r1)
+
+    ; set return value to zero
+    li  r3, 0
+    ; exit application
+    bl  __exit
+    nop

+ 62 - 0
modules/std/fiber/native/asm/make_ppc64_sysv_xcoff_gas.S

@@ -0,0 +1,62 @@
+	.globl	make_fcontext[DS]
+	.globl .make_fcontext[PR]
+	.align 2 
+	.csect .make_fcontext[PR], 3
+	.globl _make_fcontext
+#._make_fcontext:
+    # save return address into R6
+    mflr  6
+
+    # first arg of make_fcontext() == top address of context-function
+    # shift address in R3 to lower 16 byte boundary
+    clrrwi  3, 3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  3, 3, 248
+
+    # third arg of make_fcontext() == address of context-function
+    stw  5, 176(3)
+
+    # set back-chain to zero
+    li   0, 0
+    std  0, 184(3)
+
+    # compute address of returned transfer_t
+    addi 0, 3, 232
+    mr   4, 0
+    std  4, 152(3)
+
+    # load LR
+    mflr  0
+    # jump to label 1
+    bl  .Label
+.Label:
+    # load LR into R4
+    mflr  4
+    # compute abs address of label .L_finish
+    addi  4, 4, .L_finish - .Label
+    # restore LR
+    mtlr  0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    stw  4, 168(3)
+
+    # restore return address from R6
+    mtlr  6
+
+    blr  # return pointer to context-data
+
+.L_finish:
+    # save return address into R0
+    mflr  0
+    # save return address on stack, set up stack frame
+    stw  0, 8(1)
+    # allocate stack space, R1 % 16 == 0
+    stwu  1, -32(1)
+
+    # exit code is zero
+    li  3, 0
+    # exit application
+    bl  ._exit
+    nop

+ 123 - 0
modules/std/fiber/native/asm/make_x86_64_ms_pe_gas.asm

@@ -0,0 +1,123 @@
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/**************************************************************************************
+ *                                                                                    *
+ * ---------------------------------------------------------------------------------- *
+ * |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
+ * ---------------------------------------------------------------------------------- *
+ * |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |      fbr_strg     |      fc_dealloc    |       limit       |        base       | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        R12        |         R13        |        R14        |        R15        | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        RDI         |       RSI         |        RBX        |        RBP        | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        hidden     |         RIP        |        EXIT       |   parameter area  | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |                       parameter area                       |        FCTX       | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
+ * ---------------------------------------------------------------------------------- *
+ * |       DATA        |                    |                   |                   | *
+ * ---------------------------------------------------------------------------------- *
+ *                                                                                    *
+ * ***********************************************************************************/
+
+.file	"make_x86_64_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	make_fcontext
+.def	make_fcontext;	.scl	2;	.type	32;	.endef
+.seh_proc	make_fcontext
+make_fcontext:
+.seh_endprologue
+
+    /* first arg of make_fcontext() == top of context-stack */
+    movq  %rcx, %rax
+
+    /* shift address in RAX to lower 16 byte boundary */
+    /* == pointer to fcontext_t and address of context stack */
+    andq  $-16, %rax
+
+    /* reserve space for context-data on context-stack */
+    /* on context-function entry: (RSP -0x8) % 16 == 0 */
+    leaq  -0xb8(%rax), %rax
+
+    /* third arg of make_fcontext() == address of context-function */
+    movq  %r8, 0x68(%rax)
+
+    /* first arg of make_fcontext() == top of context-stack */
+    /* save top address of context stack as 'base' */
+    movq  %rcx, 0x18(%rax)
+    /* second arg of make_fcontext() == size of context-stack */
+    /* negate stack size for LEA instruction (== substraction) */
+    negq  %rdx
+    /* compute bottom address of context stack (limit) */
+    leaq  (%rcx,%rdx), %rcx
+    /* save bottom address of context stack as 'limit' */
+    movq  %rcx, 0x10(%rax)
+    /* save address of context stack limit as 'dealloction stack' */
+    movq  %rcx, 0x8(%rax)
+	/* set fiber-storage to zero */
+    xorq  %rcx, %rcx
+    movq  %rcx, (%rax)
+
+    /* compute address of transport_t */
+    leaq  0x98(%rax), %rcx
+    /* store address of transport_t in hidden field */
+    movq %rcx, 0x60(%rax)
+
+    /* compute abs address of label finish */
+    leaq  finish(%rip), %rcx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movq  %rcx, 0x70(%rax)
+
+    ret /* return pointer to context-data */
+
+finish:
+    /* 32byte shadow-space for _exit() */
+    andq  $-32, %rsp
+    /* 32byte shadow-space for _exit() are */
+    /* already reserved by make_fcontext() */
+    /* exit code is zero */
+    xorq  %rcx, %rcx
+    /* exit application */
+    call  _exit
+    hlt
+.seh_endproc
+
+.def	_exit;	.scl	2;	.type	32;	.endef  /* standard C library function */
+
+.section .drectve
+.ascii " -export:\"make_fcontext\""

+ 109 - 0
modules/std/fiber/native/asm/make_x86_64_ms_pe_masm.asm

@@ -0,0 +1,109 @@
+
+;           Copyright Oliver Kowalke 2009.
+;  Distributed under the Boost Software License, Version 1.0.
+;     (See accompanying file LICENSE_1_0.txt or copy at
+;           http://www.boost.org/LICENSE_1_0.txt)
+
+;  ----------------------------------------------------------------------------------
+;  |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   |
+;  ----------------------------------------------------------------------------------
+;  |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  |
+;  ----------------------------------------------------------------------------------
+;  |      fbr_strg     |      fc_dealloc    |       limit       |        base       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   |
+;  ----------------------------------------------------------------------------------
+;  |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  |
+;  ----------------------------------------------------------------------------------
+;  |        R12        |         R13        |        R14        |        R15        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   |
+;  ----------------------------------------------------------------------------------
+;  |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  |
+;  ----------------------------------------------------------------------------------
+;  |        RDI         |       RSI         |        RBX        |        RBP        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   |
+;  ----------------------------------------------------------------------------------
+;  |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  |
+;  ----------------------------------------------------------------------------------
+;  |        hidden     |         RIP        |       EXIT        |   parameter area  |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   |
+;  ----------------------------------------------------------------------------------
+;  |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  |
+;  ----------------------------------------------------------------------------------
+;  |                       parameter area                       |        FCTX       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   |
+;  ----------------------------------------------------------------------------------
+;  |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  |
+;  ----------------------------------------------------------------------------------
+;  |       DATA        |                    |                   |                   |
+;  ----------------------------------------------------------------------------------
+
+; standard C library function
+EXTERN  _exit:PROC
+.code
+
+; generate function table entry in .pdata and unwind information in
+make_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
+    ; .xdata for a function's structured exception handling unwind behavior
+    .endprolog
+
+    ; first arg of make_fcontext() == top of context-stack
+    mov  rax, rcx
+
+    ; shift address in RAX to lower 16 byte boundary
+    ; == pointer to fcontext_t and address of context stack
+    and  rax, -16
+
+    ; reserve space for context-data on context-stack
+    ; on context-function entry: (RSP -0x8) % 16 == 0
+    sub  rax, 0b8h
+
+    ; third arg of make_fcontext() == address of context-function
+    mov  [rax+068h], r8
+
+    ; first arg of make_fcontext() == top of context-stack
+    ; save top address of context stack as 'base'
+    mov  [rax+018h], rcx
+    ; second arg of make_fcontext() == size of context-stack
+    ; negate stack size for LEA instruction (== substraction)
+    neg  rdx
+    ; compute bottom address of context stack (limit)
+    lea  rcx, [rcx+rdx]
+    ; save bottom address of context stack as 'limit'
+    mov  [rax+010h], rcx
+    ; save address of context stack limit as 'dealloction stack'
+    mov  [rax+08h], rcx
+	; set fiber-storage to zero
+	xor  rcx, rcx
+    mov  [rax], rcx
+
+    ; compute address of transport_t
+    lea rcx, [rax+098h]
+    ; store address of transport_t in hidden field
+    mov [rax+060h], rcx
+
+    ; compute abs address of label finish
+    lea  rcx, finish
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns
+    mov  [rax+070h], rcx
+
+    ret ; return pointer to context-data
+
+finish:
+    ; exit code is zero
+    xor  rcx, rcx
+    ; exit application
+    call  _exit
+    hlt
+make_fcontext ENDP
+END

+ 62 - 0
modules/std/fiber/native/asm/make_x86_64_sysv_elf_gas.S

@@ -0,0 +1,62 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R12        |         R13       |         R14        |        R15        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl make_fcontext
+.type make_fcontext,@function
+.align 16
+make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movq  %rdi, %rax
+
+    /* shift address in RAX to lower 16 byte boundary */
+    andq  $-16, %rax
+
+    /* reserve space for context-data on context-stack */
+    /* on context-function entry: (RSP -0x8) % 16 == 0 */
+    leaq  -0x40(%rax), %rax
+
+    /* third arg of make_fcontext() == address of context-function */
+    movq  %rdx, 0x30(%rax)
+
+    /* compute abs address of label finish */
+    leaq  finish(%rip), %rcx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movq  %rcx, 0x38(%rax)
+
+    ret /* return pointer to context-data */
+
+finish:
+    /* exit code is zero */
+    xorq  %rdi, %rdi
+    /* exit application */
+    call  _exit@PLT
+    hlt
+.size make_fcontext,.-make_fcontext
+
+/* Mark that we don't need executable stack. */
+.section .note.GNU-stack,"",%progbits

+ 58 - 0
modules/std/fiber/native/asm/make_x86_64_sysv_macho_gas.S

@@ -0,0 +1,58 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R12        |         R13       |         R14        |        R15        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _make_fcontext
+.align 8
+_make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movq  %rdi, %rax
+
+    /* shift address in RAX to lower 16 byte boundary */
+    movabs  $-16,           %r8
+    andq    %r8,            %rax
+
+    /* reserve space for context-data on context-stack */
+    /* on context-function entry: (RSP -0x8) % 16 == 0 */
+    leaq  -0x40(%rax), %rax
+
+    /* third arg of make_fcontext() == address of context-function */
+    movq  %rdx, 0x30(%rax)
+
+    /* compute abs address of label finish */
+    leaq  finish(%rip), %rcx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movq  %rcx, 0x38(%rax)
+
+    ret /* return pointer to context-data */
+
+finish:
+    /* exit code is zero */
+    xorq  %rdi, %rdi
+    /* exit application */
+    call  __exit
+    hlt

+ 87 - 0
modules/std/fiber/native/asm/ontop_arm64_aapcs_elf_gas.S

@@ -0,0 +1,87 @@
+/*
+            Copyright Edward Nevill + Oliver Kowalke 2015
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.cpu    generic+fp+simd
+.text
+.align  2
+.global ontop_fcontext
+.type   ontop_fcontext, %function
+ontop_fcontext:
+    # prepare stack for GP + FPU
+    sub  sp, sp, #0x70
+
+    # save x19-x30
+    stp  x19, x20, [sp, #0x00]
+    stp  x21, x22, [sp, #0x10]
+    stp  x23, x24, [sp, #0x20]
+    stp  x25, x26, [sp, #0x30]
+    stp  x27, x28, [sp, #0x40]
+    stp  x29, x30, [sp, #0x50]
+
+    # save LR as PC
+    str  x30, [sp, #0x60]
+
+    # store RSP (pointing to context-data) in X5
+    mov  x4, sp
+
+    # restore RSP (pointing to context-data) from X1
+    mov  sp, x0
+
+    # load x19-x30
+    ldp  x19, x20, [sp, #0x00]
+    ldp  x21, x22, [sp, #0x10]
+    ldp  x23, x24, [sp, #0x20]
+    ldp  x25, x26, [sp, #0x30]
+    ldp  x27, x28, [sp, #0x40]
+    ldp  x29, x30, [sp, #0x50]
+
+    # return transfer_t from jump
+    # pass transfer_t as first arg in context function
+    # X0 == FCTX, X1 == DATA
+    mov x0, x4
+
+    # skip pc
+    # restore stack from GP + FPU
+    add  sp, sp, #0x70
+
+    # jump to ontop-function
+    ret x2
+.size   ontop_fcontext,.-ontop_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 82 - 0
modules/std/fiber/native/asm/ontop_arm64_aapcs_macho_gas.S

@@ -0,0 +1,82 @@
+/*
+            Copyright Edward Nevill + Oliver Kowalke 2015
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.global _ontop_fcontext
+.balign 16
+_ontop_fcontext:
+    # prepare stack for GP + FPU
+    sub  sp, sp, #0x70
+
+    # save x19-x30
+    stp  x19, x20, [sp, #0x00]
+    stp  x21, x22, [sp, #0x10]
+    stp  x23, x24, [sp, #0x20]
+    stp  x25, x26, [sp, #0x30]
+    stp  x27, x28, [sp, #0x40]
+    stp  x29, x30, [sp, #0x50]
+
+    # save LR as PC
+    str  x30, [sp, #0x60]
+
+    # store RSP (pointing to context-data) in X5
+    mov  x4, sp
+
+    # restore RSP (pointing to context-data) from X1
+    mov  sp, x0
+
+    # load x19-x30
+    ldp  x19, x20, [sp, #0x00]
+    ldp  x21, x22, [sp, #0x10]
+    ldp  x23, x24, [sp, #0x20]
+    ldp  x25, x26, [sp, #0x30]
+    ldp  x27, x28, [sp, #0x40]
+    ldp  x29, x30, [sp, #0x50]
+
+    # return transfer_t from jump
+    # pass transfer_t as first arg in context function
+    # X0 == FCTX, X1 == DATA
+    mov x0, x4
+
+    # skip pc
+    # restore stack from GP + FPU
+    add  sp, sp, #0x70
+
+    # jump to ontop-function
+    ret x2

+ 63 - 0
modules/std/fiber/native/asm/ontop_arm_aapcs_elf_gas.S

@@ -0,0 +1,63 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl ontop_fcontext
+.align 2
+.type ontop_fcontext,%function
+ontop_fcontext:
+    @ save LR as PC
+    push {lr}
+    @ save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    @ store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    @ restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    @ store parent context in A2
+    mov  a2, a1
+
+    @ restore hidden,V1-V8,LR
+    pop {a1,v1-v8,lr}
+
+    @ return transfer_t from jump
+    str  a2, [a1, #0]
+    str  a3, [a1, #4]
+    @ pass transfer_t as first arg in context function
+    @ A1 == hidden, A2 == FCTX, A3 == DATA
+
+    @ skip PC
+    add  sp, sp, #4
+
+    @ jump to ontop-function
+    bx  a4
+.size ontop_fcontext,.-ontop_fcontext
+
+@ Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 72 - 0
modules/std/fiber/native/asm/ontop_arm_aapcs_macho_gas.S

@@ -0,0 +1,72 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _ontop_fcontext
+.align 2
+_ontop_fcontext:
+    @ save LR as PC
+    push {lr}
+    @ save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    @ locate TLS to save/restore SjLj handler
+    mrc  p15, 0, v2, c13, c0, #3
+    bic  v2, v2, #3
+
+    @ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
+    ldr  v1, [v2, #8]
+    @ save SjLj handler
+    push  {v1}
+
+    @ store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    @ restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    @ restore SjLj handler
+    pop  {v1}
+    @ store SjLj handler in TLS
+    str  v1, [v2, #8]
+
+    @ store parent context in A2
+    mov  a2, a1
+
+    @ restore hidden,V1-V8,LR
+    pop {a1,v1-v8,lr}
+
+    @ return transfer_t from jump
+    str  a2, [a1, #0]
+    str  a3, [a1, #4]
+    @ pass transfer_t as first arg in context function
+    @ A1 == hidden, A2 == FCTX, A3 == DATA
+
+    @ skip PC
+    add  sp, sp, #4
+
+    @ jump to ontop-function
+    bx  a4

+ 86 - 0
modules/std/fiber/native/asm/ontop_arm_aapcs_pe_armasm.asm

@@ -0,0 +1,86 @@
+;/*
+;            Copyright Oliver Kowalke 2009.
+;   Distributed under the Boost Software License, Version 1.0.
+;      (See accompanying file LICENSE_1_0.txt or copy at
+;          http://www.boost.org/LICENSE_1_0.txt)
+;*/
+
+; *******************************************************
+; *                                                     *
+; *  -------------------------------------------------  *
+; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+; *  -------------------------------------------------  *
+; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+; *  -------------------------------------------------  *
+; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
+; *  -------------------------------------------------  *
+; *  -------------------------------------------------  *
+; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+; *  -------------------------------------------------  *
+; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+; *  -------------------------------------------------  *
+; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
+; *  -------------------------------------------------  *
+; *                                                     *
+; *******************************************************
+
+    AREA |.text|, CODE
+    ALIGN 4
+    EXPORT ontop_fcontext
+
+ontop_fcontext PROC
+    ; save LR as PC
+    push {lr}
+    ; save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    ; load TIB to save/restore thread size and limit.
+    ; we do not need preserve CPU flag and can use it's arg register
+    mrc     p15, #0, v1, c13, c0, #2
+
+    ; save current stack base
+    ldr  a1, [v1, #0x04]
+    push {a1}
+    ; save current stack limit
+    ldr  a1, [v1, #0x08]
+    push {a1}
+    ; save current deallocation stack
+    ldr  a1, [v1, #0xe0c]
+    push {a1}
+
+    ; store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    ; restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    ; restore stack base
+    pop  {a1}
+    str  a1, [v1, #0x04]
+    ; restore stack limit
+    pop  {a1}
+    str  a1, [v1, #0x08]
+    ; restore deallocation stack
+    pop  {a1}
+    str  a1, [v1, #0xe0c]
+
+    ; store parent context in A2
+    mov  a2, a1
+
+    ; restore hidden,V1-V8,LR
+    pop {a1,v1-v8,lr}
+
+    ; return transfer_t from jump
+    str  a2, [a1, #0]
+    str  a3, [a1, #4]
+    ; pass transfer_t as first arg in context function
+    ; A1 == hidden, A2 == FCTX, A3 == DATA
+
+    ; skip PC
+    add  sp, sp, #4
+
+    ; jump to ontop-function
+    bx  a4
+
+    ENDP
+    END

+ 20 - 0
modules/std/fiber/native/asm/ontop_combined_sysv_macho_gas.S

@@ -0,0 +1,20 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "ontop_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "ontop_x86_64_sysv_macho_gas.S"
+#elif defined(__ppc__)
+    #include "ontop_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "ontop_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 113 - 0
modules/std/fiber/native/asm/ontop_i386_ms_pe_gas.asm

@@ -0,0 +1,113 @@
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*************************************************************************************
+*  --------------------------------------------------------------------------------- *
+*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
+*  --------------------------------------------------------------------------------- *
+*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
+*  --------------------------------------------------------------------------------- *
+*  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   | *
+*  --------------------------------------------------------------------------------- *
+*  --------------------------------------------------------------------------------- *
+*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
+*  --------------------------------------------------------------------------------- *
+*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
+*  --------------------------------------------------------------------------------- *
+*  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         | *
+*  --------------------------------------------------------------------------------- *
+*************************************************************************************/
+
+.file	"ontop_i386_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	_ontop_fcontext
+.def	_ontop_fcontext;	.scl	2;	.type	32;	.endef
+_ontop_fcontext:
+    pushl  %ebp  /* save EBP */
+    pushl  %ebx  /* save EBX */
+    pushl  %esi  /* save ESI */
+    pushl  %edi  /* save EDI */
+
+    /* load NT_TIB */
+    movl  %fs:(0x18), %edx
+
+    /* load current SEH exception list */
+    movl  (%edx), %eax
+    push  %eax
+
+    /* load current stack base */
+    movl  0x04(%edx), %eax
+    push  %eax
+
+    /* load current stack limit */
+    movl  0x08(%edx), %eax
+    push  %eax
+    
+    /* load current dealloction stack */
+    movl  0xe0c(%edx), %eax
+    push  %eax
+    
+    /* load fiber local storage */
+    movl  0x10(%edx), %eax
+    push  %eax
+
+    /* store ESP (pointing to context-data) in EAX */
+    movl  %esp, %ecx
+
+    /* first arg of ontop_fcontext() == fcontext to jump to */
+    movl  0x28(%esp), %eax
+
+	/* pass parent fcontext_t */
+	movl  %ecx, 0x28(%eax)
+
+    /* second arg of ontop_fcontext() == data to be transferred */
+    movl  0x2c(%esp), %ecx
+
+	/* pass data */
+	movl  %ecx, 0x2c(%eax)
+
+    /* third arg of ontop_fcontext() == ontop-function */
+    movl  0x30(%esp), %ecx
+
+    /* restore ESP (pointing to context-data) from EDX */
+    movl  %eax, %esp
+
+    /* load NT_TIB into ECX */
+    movl  %fs:(0x18), %edx
+
+    /* restore fiber local storage */
+    popl  %eax
+    movl  %eax, 0x10(%edx)
+
+    /* restore current deallocation stack */
+    popl  %eax
+    movl  %eax, 0xe0c(%edx)
+
+    /* restore current stack limit */
+    popl  %eax
+    movl  %eax, 0x08(%edx)
+
+    /* restore current stack base */
+    popl  %eax
+    movl  %eax, 0x04(%edx)
+
+    /* restore current SEH exception list */
+    popl  %eax
+    movl  %eax, (%edx)
+
+    popl  %edi  /* save EDI */
+    popl  %esi  /* save ESI */
+    popl  %ebx  /* save EBX */
+    popl  %ebp  /* save EBP */
+
+    /* jump to context */
+    jmp  *%ecx
+
+.section .drectve
+.ascii " -export:\"ontop_fcontext\""

+ 112 - 0
modules/std/fiber/native/asm/ontop_i386_ms_pe_masm.asm

@@ -0,0 +1,112 @@
+
+;           Copyright Oliver Kowalke 2009.
+;  Distributed under the Boost Software License, Version 1.0.
+;     (See accompanying file LICENSE_1_0.txt or copy at
+;           http://www.boost.org/LICENSE_1_0.txt)
+
+;  ---------------------------------------------------------------------------------
+;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
+;  ---------------------------------------------------------------------------------
+;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
+;  ---------------------------------------------------------------------------------
+;  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   |
+;  ---------------------------------------------------------------------------------
+;  ---------------------------------------------------------------------------------
+;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
+;  ---------------------------------------------------------------------------------
+;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
+;  ---------------------------------------------------------------------------------
+;  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         |
+;  ---------------------------------------------------------------------------------
+
+.386
+.XMM
+.model flat, c
+.code
+
+ontop_fcontext PROC BOOST_CONTEXT_EXPORT
+    push  ebp  ; save EBP 
+    push  ebx  ; save EBX 
+    push  esi  ; save ESI 
+    push  edi  ; save EDI 
+
+    assume  fs:nothing
+    ; load NT_TIB into EDX
+    mov  edx, fs:[018h]
+    assume  fs:error
+
+    ; load current SEH exception list
+    mov  eax, [edx]
+    push  eax
+
+    ; load current stack base
+    mov  eax, [edx+04h]
+    push  eax
+
+    ; load current stack limit
+    mov  eax, [edx+08h]
+    push  eax
+
+    ; load current deallocation stack
+    mov  eax, [edx+0e0ch]
+    push  eax
+
+    ; load fiber local storage
+    mov  eax, [edx+010h]
+    push  eax
+
+    ; store ESP (pointing to context-data) in ECX
+    mov  ecx, esp
+
+    ; first arg of ontop_fcontext() == fcontext to jump to
+    mov  eax, [esp+028h]
+
+	; pass parent fcontext_t
+	mov  [eax+028h], ecx
+
+    ; second arg of ontop_fcontext() == data to be transferred
+    mov  ecx, [esp+02ch]
+
+	; pass data
+	mov  [eax+02ch], ecx
+
+    ; third arg of ontop_fcontext() == ontop-function
+    mov  ecx, [esp+030h]
+    
+    ; restore ESP (pointing to context-data) from EAX
+    mov  esp, eax
+
+    assume  fs:nothing
+    ; load NT_TIB into EDX
+    mov  edx, fs:[018h]
+    assume  fs:error
+
+    ; restore fiber local storage
+    pop  eax
+    mov  [edx+010h], eax
+
+    ; restore current deallocation stack
+    pop  eax
+    mov  [edx+0e0ch], eax
+
+    ; restore current stack limit
+    pop  eax
+    mov  [edx+08h], eax
+
+    ; restore current stack base
+    pop  eax
+    mov  [edx+04h], eax
+
+    ; restore current SEH exception list
+    pop  eax
+    mov  [edx], eax
+
+    pop  edi  ; save EDI 
+    pop  esi  ; save ESI 
+    pop  ebx  ; save EBX 
+    pop  ebp  ; save EBP
+
+    ; jump to context
+    jmp ecx
+ontop_fcontext ENDP
+END

+ 61 - 0
modules/std/fiber/native/asm/ontop_i386_sysv_elf_gas.S

@@ -0,0 +1,61 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*****************************************************************************************
+ *                                                                                       *
+ *  -----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *                                                                                       *
+ *****************************************************************************************/
+
+.text
+.globl ontop_fcontext
+.align 2
+.type ontop_fcontext,@function
+ontop_fcontext:
+    pushl  %ebp  /* save EBP */
+    pushl  %ebx  /* save EBX */
+    pushl  %esi  /* save ESI */
+    pushl  %edi  /* save EDI */
+
+    /* store fcontext_t in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of ontop_fcontext() == fcontext to jump to */
+    movl  0x18(%esp), %eax
+
+    /* pass parent fcontext_t */
+    movl  %ecx, 0x18(%eax)
+
+    /* second arg of ontop_fcontext() == data to be transferred */
+    movl  0x1c(%esp), %ecx
+
+    /* pass data */
+    movl %ecx, 0x1c(%eax)
+
+    /* third arg of ontop_fcontext() == ontop-function */
+    movl  0x20(%esp), %ecx
+
+    /* restore ESP (pointing to context-data) from EDX */
+    movl  %eax, %esp
+
+    popl  %edi  /* restore EDI */
+    popl  %esi  /* restore ESI */
+    popl  %ebx  /* restore EBX */
+    popl  %ebp  /* restore EBP */
+
+    /* jump to context */
+    jmp *%ecx
+.size ontop_fcontext,.-ontop_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 56 - 0
modules/std/fiber/native/asm/ontop_i386_sysv_macho_gas.S

@@ -0,0 +1,56 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*****************************************************************************************
+ *                                                                                       *
+ *  -----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
+ *  -----------------------------------------------------------------------------------  *
+ *                                                                                       *
+ *****************************************************************************************/
+
+.text
+.globl _ontop_fcontext
+.align 2
+_ontop_fcontext:
+    pushl  %ebp  /* save EBP */
+    pushl  %ebx  /* save EBX */
+    pushl  %esi  /* save ESI */
+    pushl  %edi  /* save EDI */
+
+    /* store fcontext_t in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of ontop_fcontext() == fcontext to jump to */
+    movl  0x18(%esp), %eax
+
+    /* pass parent fcontext_t */
+    movl  %ecx, 0x18(%eax)
+
+    /* second arg of ontop_fcontext() == data to be transferred */
+    movl  0x1c(%esp), %ecx
+
+    /* pass data */
+    movl %ecx, 0x1c(%eax)
+
+    /* third arg of ontop_fcontext() == ontop-function */
+    movl  0x20(%esp), %ecx
+
+    /* restore ESP (pointing to context-data) from EDX */
+    movl  %eax, %esp
+
+    popl  %edi  /* restore EDI */
+    popl  %esi  /* restore ESI */
+    popl  %ebx  /* restore EBX */
+    popl  %ebp  /* restore EBP */
+
+    /* jump to context */
+    jmp *%ecx

+ 16 - 0
modules/std/fiber/native/asm/ontop_i386_x86_64_sysv_macho_gas.S

@@ -0,0 +1,16 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "ontop_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "ontop_x86_64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 87 - 0
modules/std/fiber/native/asm/ontop_mips32_o32_elf_gas.S

@@ -0,0 +1,87 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |  FP |hiddn|  RA |  PC |  GP | FCTX| DATA|     |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ * *****************************************************/
+
+.text
+.globl ontop_fcontext
+.align 2
+.type ontop_fcontext,@function
+.ent ontop_fcontext
+ontop_fcontext:
+    # reserve space on stack
+    addiu $sp, $sp, -112
+
+    sw  $s0, ($sp)  # save S0
+    sw  $s1, 4($sp)  # save S1
+    sw  $s2, 8($sp)  # save S2
+    sw  $s3, 12($sp)  # save S3
+    sw  $s4, 16($sp)  # save S4
+    sw  $s5, 20($sp)  # save S5
+    sw  $s6, 24($sp)  # save S6
+    sw  $s7, 28($sp)  # save S7
+    sw  $fp, 32($sp)  # save FP
+    sw  $a0, 36($sp)  # save hidden, address of returned transfer_t
+    sw  $ra, 40($sp)  # save RA
+    sw  $ra, 44($sp)  # save RA as PC
+
+    # store SP (pointing to context-data) in A0
+    move  $a0, $sp
+
+    # restore SP (pointing to context-data) from A1
+    move  $sp, $a1
+
+    lw  $s0, ($sp)  # restore S0
+    lw  $s1, 4($sp)  # restore S1
+    lw  $s2, 8($sp)  # restore S2
+    lw  $s3, 12($sp)  # restore S3
+    lw  $s4, 16($sp)  # restore S4
+    lw  $s5, 20($sp)  # restore S5
+    lw  $s6, 24($sp)  # restore S6
+    lw  $s7, 28($sp)  # restore S7
+    lw  $fp, 32($sp)  # restore FP
+    lw  $t0, 36($sp)  # restore hidden, address of returned transfer_t
+    lw  $ra, 40($sp)  # restore RA
+
+    # load PC
+    lw  $t9, 44($sp)
+
+    # adjust stack
+    addiu $sp, $sp, 112
+    
+    # return transfer_t from jump
+    sw  $a0, ($t0)  # fctx of transfer_t
+    sw  $a2, 4($t0) # data of transfer_t
+    # pass transfer_t as first arg in context function
+    # A0 == hidden, A1 == fctx, A2 == data
+    move  $a1, $a0 
+    move  $a0, $t0 
+
+    # jump to context
+    jr  $a3
+.end ontop_fcontext
+.size ontop_fcontext, .-ontop_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 16 - 0
modules/std/fiber/native/asm/ontop_ppc32_ppc64_sysv_macho_gas.S

@@ -0,0 +1,16 @@
+/*
+            Copyright Sergue E. Leontiev 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Stub file for universal binary
+
+#if defined(__ppc__)
+    #include "ontop_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "ontop_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 129 - 0
modules/std/fiber/native/asm/ontop_ppc32_sysv_elf_gas.S

@@ -0,0 +1,129 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC | FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  | DATA|     |     |     |                       |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl ontop_fcontext
+.align 2
+.type ontop_fcontext,@function
+ontop_fcontext:
+    # reserve space on stack
+    subi  %r1, %r1, 92
+
+    stw  %r13, 0(%r1)  # save R13
+    stw  %r14, 4(%r1)  # save R14
+    stw  %r15, 8(%r1)  # save R15
+    stw  %r16, 12(%r1)  # save R16
+    stw  %r17, 16(%r1)  # save R17
+    stw  %r18, 20(%r1)  # save R18
+    stw  %r19, 24(%r1)  # save R19
+    stw  %r20, 28(%r1)  # save R20
+    stw  %r21, 32(%r1)  # save R21
+    stw  %r22, 36(%r1)  # save R22
+    stw  %r23, 40(%r1)  # save R23
+    stw  %r24, 44(%r1)  # save R24
+    stw  %r25, 48(%r1)  # save R25
+    stw  %r26, 52(%r1)  # save R26
+    stw  %r27, 56(%r1)  # save R27
+    stw  %r28, 60(%r1)  # save R28
+    stw  %r29, 64(%r1)  # save R29
+    stw  %r30, 68(%r1)  # save R30
+    stw  %r31, 72(%r1)  # save R31
+    stw  %r3,  76(%r1)  # save hidden
+
+    # save CR
+    mfcr  %r0
+    stw   %r0, 80(%r1)
+    # save LR
+    mflr  %r0
+    stw   %r0, 84(%r1)
+    # save LR as PC
+    stw   %r0, 88(%r1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  %r7, %r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  %r1, %r4
+
+    lwz  %r13, 0(%r1)  # restore R13
+    lwz  %r14, 4(%r1)  # restore R14
+    lwz  %r15, 8(%r1)  # restore R15
+    lwz  %r16, 12(%r1)  # restore R16
+    lwz  %r17, 16(%r1)  # restore R17
+    lwz  %r18, 20(%r1)  # restore R18
+    lwz  %r19, 24(%r1)  # restore R19
+    lwz  %r20, 28(%r1)  # restore R20
+    lwz  %r21, 32(%r1)  # restore R21
+    lwz  %r22, 36(%r1)  # restore R22
+    lwz  %r23, 40(%r1)  # restore R23
+    lwz  %r24, 44(%r1)  # restore R24
+    lwz  %r25, 48(%r1)  # restore R25
+    lwz  %r26, 52(%r1)  # restore R26
+    lwz  %r27, 56(%r1)  # restore R27
+    lwz  %r28, 60(%r1)  # restore R28
+    lwz  %r29, 64(%r1)  # restore R29
+    lwz  %r30, 68(%r1)  # restore R30
+    lwz  %r31, 72(%r1)  # restore R31
+    lwz  %r4,  76(%r1)  # restore hidden
+
+    # restore CR
+    lwz   %r0, 80(%r1)
+    mtcr  %r0
+    # restore LR
+    lwz   %r0, 84(%r1)
+    mtlr  %r0
+    # ignore PC
+
+    # adjust stack
+    addi  %r1, %r1, 92
+
+    # return transfer_t 
+    stw  %r7, 0(%r4)
+    stw  %r5, 4(%r4)
+
+    # restore CTR
+    mtctr %r6
+
+    # jump to ontop-function
+    bctr
+.size ontop_fcontext, .-ontop_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 124 - 0
modules/std/fiber/native/asm/ontop_ppc32_sysv_macho_gas.S

@@ -0,0 +1,124 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC | FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  | DATA|     |     |     |                       |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _ontop_fcontext
+.align 2
+_ontop_fcontext:
+    # reserve space on stack
+    subi  r1, r1, 92
+
+    stw  r13, 0(r1)  # save R13
+    stw  r14, 4(r1)  # save R14
+    stw  r15, 8(r1)  # save R15
+    stw  r16, 12(r1)  # save R16
+    stw  r17, 16(r1)  # save R17
+    stw  r18, 20(r1)  # save R18
+    stw  r19, 24(r1)  # save R19
+    stw  r20, 28(r1)  # save R20
+    stw  r21, 32(r1)  # save R21
+    stw  r22, 36(r1)  # save R22
+    stw  r23, 40(r1)  # save R23
+    stw  r24, 44(r1)  # save R24
+    stw  r25, 48(r1)  # save R25
+    stw  r26, 52(r1)  # save R26
+    stw  r27, 56(r1)  # save R27
+    stw  r28, 60(r1)  # save R28
+    stw  r29, 64(r1)  # save R29
+    stw  r30, 68(r1)  # save R30
+    stw  r31, 72(r1)  # save R31
+    stw  r3,  76(r1)  # save hidden
+
+    # save CR
+    mfcr  r0
+    stw   r0, 80(r1)
+    # save LR
+    mflr  r0
+    stw   r0, 84(r1)
+    # save LR as PC
+    stw   r0, 88(r1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  r7, r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    lwz  r13, 0(r1)  # restore R13
+    lwz  r14, 4(r1)  # restore R14
+    lwz  r15, 8(r1)  # restore R15
+    lwz  r16, 12(r1)  # restore R16
+    lwz  r17, 16(r1)  # restore R17
+    lwz  r18, 20(r1)  # restore R18
+    lwz  r19, 24(r1)  # restore R19
+    lwz  r20, 28(r1)  # restore R20
+    lwz  r21, 32(r1)  # restore R21
+    lwz  r22, 36(r1)  # restore R22
+    lwz  r23, 40(r1)  # restore R23
+    lwz  r24, 44(r1)  # restore R24
+    lwz  r25, 48(r1)  # restore R25
+    lwz  r26, 52(r1)  # restore R26
+    lwz  r27, 56(r1)  # restore R27
+    lwz  r28, 60(r1)  # restore R28
+    lwz  r29, 64(r1)  # restore R29
+    lwz  r30, 68(r1)  # restore R30
+    lwz  r31, 72(r1)  # restore R31
+    lwz  r4,  76(r1)  # restore hidden
+
+    # restore CR
+    lwz   r0, 80(r1)
+    mtcr  r0
+    # restore LR
+    lwz   r0, 84(r1)
+    mtlr  r0
+    # ignore PC
+
+    # adjust stack
+    addi  r1, r1, 92
+
+    # return transfer_t 
+    stw  r7, 0(r4)
+    stw  r5, 4(r4)
+
+    # restore CTR
+    mtctr r6
+
+    # jump to ontop-function
+    bctr

+ 87 - 0
modules/std/fiber/native/asm/ontop_ppc32_sysv_xcoff_gas.S

@@ -0,0 +1,87 @@
+.globl .ontop_fcontext
+.globl  ontop_fcontext[DS]
+.align 2 
+.csect	ontop_fcontext[DS]
+ontop_fcontext:
+  .long	.ontop_fcontext
+.ontop_fcontext:
+    # reserve space on stack
+    subi 1, 1, 92
+
+    stw  13, 0(1)  # save R13
+    stw  14, 4(1)  # save R14
+    stw  15, 8(1)  # save R15
+    stw  16, 12(1)  # save R16
+    stw  17, 16(1)  # save R17
+    stw  18, 20(1)  # save R18
+    stw  19, 24(1)  # save R19
+    stw  20, 28(1)  # save R20
+    stw  21, 32(1)  # save R21
+    stw  22, 36(1)  # save R22
+    stw  23, 40(1)  # save R23
+    stw  24, 44(1)  # save R24
+    stw  25, 48(1)  # save R25
+    stw  26, 52(1)  # save R26
+    stw  27, 56(1)  # save R27
+    stw  28, 60(1)  # save R28
+    stw  29, 64(1)  # save R29
+    stw  30, 68(1)  # save R30
+    stw  31, 72(1)  # save R31
+    stw  3,  76(1)  # save hidden
+
+    # save CR
+    mfcr 0
+    stw 0, 80(1)
+    # save LR
+    mflr 0
+    stw 0, 84(1)
+    # save LR as PC
+    stw 0, 88(1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  7, 1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  1, 4
+
+    lwz  13, 0(1)  # restore R13
+    lwz  14, 4(1)  # restore R14
+    lwz  15, 8(1)  # restore R15
+    lwz  16, 12(1)  # restore R16
+    lwz  17, 16(1)  # restore R17
+    lwz  18, 20(1)  # restore R18
+    lwz  19, 24(1)  # restore R19
+    lwz  20, 28(1)  # restore R20
+    lwz  21, 32(1)  # restore R21
+    lwz  22, 36(1)  # restore R22
+    lwz  23, 40(1)  # restore R23
+    lwz  24, 44(1)  # restore R24
+    lwz  25, 48(1)  # restore R25
+    lwz  26, 52(1)  # restore R26
+    lwz  27, 56(1)  # restore R27
+    lwz  28, 60(1)  # restore R28
+    lwz  29, 64(1)  # restore R29
+    lwz  30, 68(1)  # restore R30
+    lwz  31, 72(1)  # restore R31
+    lwz  4,  76(1)  # restore hidden
+
+    # restore CR
+    lwz 0, 80(1)
+    mtcr 0
+    # restore LR
+    lwz 0, 84(1)
+    mtlr 0
+    # ignore PC
+
+    # adjust stack
+    addi 1, 1, 92
+
+    # return transfer_t 
+    stw  7, 0(3)
+    stw  5, 4(3)
+
+    # restore CTR
+    mtctr 6
+
+    # jump to context
+    bctr

+ 194 - 0
modules/std/fiber/native/asm/ontop_ppc64_sysv_elf_gas.S

@@ -0,0 +1,194 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.globl ontop_fcontext
+#if _CALL_ELF == 2
+	.text
+	.align 2
+ontop_fcontext:
+        addis   %r2, %r12, .TOC.-ontop_fcontext@ha
+        addi    %r2, %r2, .TOC.-ontop_fcontext@l
+        .localentry ontop_fcontext, . - ontop_fcontext
+#else
+	.section ".opd","aw"
+	.align 3
+ontop_fcontext:
+# ifdef _CALL_LINUX
+        .quad   .L.ontop_fcontext,.TOC.@tocbase,0
+        .type   ontop_fcontext,@function
+        .text
+        .align 2
+.L.ontop_fcontext:
+# else
+        .hidden .ontop_fcontext
+        .globl  .ontop_fcontext
+        .quad   .ontop_fcontext,.TOC.@tocbase,0
+        .size   ontop_fcontext,24
+        .type   .ontop_fcontext,@function
+        .text
+        .align 2
+.ontop_fcontext:
+# endif
+#endif
+    # reserve space on stack
+    subi  %r1, %r1, 184
+
+#if _CALL_ELF != 2
+    std  %r2,  0(%r1)  # save TOC
+#endif
+    std  %r14, 8(%r1)  # save R14
+    std  %r15, 16(%r1)  # save R15
+    std  %r16, 24(%r1)  # save R16
+    std  %r17, 32(%r1)  # save R17
+    std  %r18, 40(%r1)  # save R18
+    std  %r19, 48(%r1)  # save R19
+    std  %r20, 56(%r1)  # save R20
+    std  %r21, 64(%r1)  # save R21
+    std  %r22, 72(%r1)  # save R22
+    std  %r23, 80(%r1)  # save R23
+    std  %r24, 88(%r1)  # save R24
+    std  %r25, 96(%r1)  # save R25
+    std  %r26, 104(%r1)  # save R26
+    std  %r27, 112(%r1)  # save R27
+    std  %r29, 120(%r1)  # save R28
+    std  %r29, 128(%r1)  # save R29
+    std  %r30, 136(%r1)  # save R30
+    std  %r31, 144(%r1)  # save R31
+    std  %r3,  152(%r1)  # save hidden
+
+    # save CR
+    mfcr  %r0
+    std   %r0, 160(%r1)
+    # save LR
+    mflr  %r0
+    std   %r0, 168(%r1)
+    # save LR as PC
+    std   %r0, 176(%r1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  %r7, %r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  %r1, %r4
+
+#if _CALL_ELF != 2
+    ld  %r2,  0(%r1)  # restore TOC
+#endif
+    ld  %r14, 8(%r1)  # restore R14
+    ld  %r15, 16(%r1)  # restore R15
+    ld  %r16, 24(%r1)  # restore R16
+    ld  %r17, 32(%r1)  # restore R17
+    ld  %r18, 40(%r1)  # restore R18
+    ld  %r19, 48(%r1)  # restore R19
+    ld  %r20, 56(%r1)  # restore R20
+    ld  %r21, 64(%r1)  # restore R21
+    ld  %r22, 72(%r1)  # restore R22
+    ld  %r23, 80(%r1)  # restore R23
+    ld  %r24, 88(%r1)  # restore R24
+    ld  %r25, 96(%r1)  # restore R25
+    ld  %r26, 104(%r1)  # restore R26
+    ld  %r27, 112(%r1)  # restore R27
+    ld  %r28, 120(%r1)  # restore R28
+    ld  %r29, 128(%r1)  # restore R29
+    ld  %r30, 136(%r1)  # restore R30
+    ld  %r31, 144(%r1)  # restore R31
+    ld  %r4,  152(%r1)  # restore hidden
+
+    # restore CR
+    ld  %r0, 160(%r1)
+    mtcr  %r0
+    # restore LR
+    ld  %r0, 168(%r1)
+    mtlr  %r0
+    # ignore PC
+
+    # adjust stack
+    addi  %r1, %r1, 184
+
+    # return transfer_t
+    std  %r7, 0(%r4)
+    std  %r5, 8(%r4)
+
+    # restore CTR
+    mtctr  %r6
+
+    # jump to context
+    bctr
+#if _CALL_ELF == 2
+	.size ontop_fcontext, .-ontop_fcontext
+#else
+# ifdef _CALL_LINUX
+	.size .ontop_fcontext, .-.L.ontop_fcontext
+# else
+	.size .ontop_fcontext, .-.ontop_fcontext
+# endif
+#endif
+
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 151 - 0
modules/std/fiber/native/asm/ontop_ppc64_sysv_macho_gas.S

@@ -0,0 +1,151 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.align 2
+.globl ontop_fcontext
+
+_ontop_fcontext:
+    ; reserve space on stack
+    subi  r1, r1, 184
+
+    std  %r14, 8(%r1)  ; save R14
+    std  %r15, 16(%r1)  ; save R15
+    std  %r16, 24(%r1)  ; save R16
+    std  %r17, 32(%r1)  ; save R17
+    std  %r18, 40(%r1)  ; save R18
+    std  %r19, 48(%r1)  ; save R19
+    std  %r20, 56(%r1)  ; save R20
+    std  %r21, 64(%r1)  ; save R21
+    std  %r22, 72(%r1)  ; save R22
+    std  %r23, 80(%r1)  ; save R23
+    std  %r24, 88(%r1)  ; save R24
+    std  %r25, 96(%r1)  ; save R25
+    std  %r26, 104(%r1)  ; save R26
+    std  %r27, 112(%r1)  ; save R27
+    std  %r29, 120(%r1)  ; save R28
+    std  %r29, 128(%r1)  ; save R29
+    std  %r30, 136(%r1)  ; save R30
+    std  %r31, 144(%r1)  ; save R31
+    std  %r3,  152(%r1)  ; save hidden
+
+    ; save CR
+    mfcr  r0
+    std  r0, 160(r1)
+    ; save LR
+    mflr  r0
+    std  r0, 168(r1)
+    ; save LR as PC
+    std  r0, 176(r1)
+
+    ; store RSP (pointing to context-data) in R7
+    mr  %r7, %r1
+
+    ; restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    ld  %r14, 8(%r1)  ; restore R14
+    ld  %r15, 16(%r1)  ; restore R15
+    ld  %r16, 24(%r1)  ; restore R16
+    ld  %r17, 32(%r1)  ; restore R17
+    ld  %r18, 40(%r1)  ; restore R18
+    ld  %r19, 48(%r1)  ; restore R19
+    ld  %r20, 56(%r1)  ; restore R20
+    ld  %r21, 64(%r1)  ; restore R21
+    ld  %r22, 72(%r1)  ; restore R22
+    ld  %r23, 80(%r1)  ; restore R23
+    ld  %r24, 88(%r1)  ; restore R24
+    ld  %r25, 96(%r1)  ; restore R25
+    ld  %r26, 104(%r1)  ; restore R26
+    ld  %r27, 112(%r1)  ; restore R27
+    ld  %r28, 120(%r1)  ; restore R28
+    ld  %r29, 128(%r1)  ; restore R29
+    ld  %r30, 136(%r1)  ; restore R30
+    ld  %r31, 144(%r1)  ; restore R31
+    ld  %r4,  152(%r1)  ; restore hidden
+
+    ; restore CR
+    ld  r0, 160(r1)
+    mtcr  r0
+    ; restore LR
+    ld  r0, 168(r1)
+    mtlr  r0
+    ; ignore PC
+
+    ; adjust stack
+    addi  r1, r1, 184
+
+    ; return transfer_t
+    std  %r7, 0(%r4)
+    std  %r5, 8(%r4)
+
+    ; restore CTR
+    mtctr  r6
+
+    ; jump to context
+    bctr

+ 83 - 0
modules/std/fiber/native/asm/ontop_ppc64_sysv_xcoff_gas.S

@@ -0,0 +1,83 @@
+.align 2
+.globl .jump_fcontext
+.jump_fcontext:
+    # reserve space on stack
+    subi  1, 1, 184
+
+    std  13, 0(1)  # save R13
+    std  14, 8(1)  # save R14
+    std  15, 16(1)  # save R15
+    std  16, 24(1)  # save R16
+    std  17, 32(1)  # save R17
+    std  18, 40(1)  # save R18
+    std  19, 48(1)  # save R19
+    std  20, 56(1)  # save R20
+    std  21, 64(1)  # save R21
+    std  22, 72(1)  # save R22
+    std  23, 80(1)  # save R23
+    std  24, 88(1)  # save R24
+    std  25, 96(1)  # save R25
+    std  26, 104(1)  # save R26
+    std  27, 112(1)  # save R27
+    std  29, 120(1)  # save R28
+    std  29, 128(1)  # save R29
+    std  30, 136(1)  # save R30
+    std  31, 144(1)  # save R31
+    std  3,  152(1)  # save hidden
+
+    # save CR
+    mfcr  0
+    std  0, 160(1)
+    # save LR
+    mflr  0
+    std  0, 168(1)
+    # save LR as PC
+    std  0, 176(1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  7, 1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  1, 4
+
+    ld  13, 0(1)  # restore R13
+    ld  14, 8(1)  # restore R14
+    ld  15, 16(1)  # restore R15
+    ld  16, 24(1)  # restore R16
+    ld  17, 32(1)  # restore R17
+    ld  18, 40(1)  # restore R18
+    ld  19, 48(1)  # restore R19
+    ld  20, 56(1)  # restore R20
+    ld  21, 64(1)  # restore R21
+    ld  22, 72(1)  # restore R22
+    ld  23, 80(1)  # restore R23
+    ld  24, 88(1)  # restore R24
+    ld  25, 96(1)  # restore R25
+    ld  26, 104(1)  # restore R26
+    ld  27, 112(1)  # restore R27
+    ld  28, 120(1)  # restore R28
+    ld  29, 128(1)  # restore R29
+    ld  30, 136(1)  # restore R30
+    ld  31, 144(1)  # restore R31
+    ld  4,  152(1)  # restore hidden
+
+    # restore CR
+    ld  0, 160(1)
+    mtcr  0
+    # restore LR
+    ld  0, 168(1)
+    mtlr  0
+    # ignore PC
+
+    # adjust stack
+    addi  1, 1, 184
+
+    # return transfer_t
+    std  7, 0(4)
+    std  5, 8(4)
+
+    # restore CTR
+    mtctr  6
+
+    # jump to context
+    bctr

+ 142 - 0
modules/std/fiber/native/asm/ontop_x86_64_ms_pe_gas.asm

@@ -0,0 +1,142 @@
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/**************************************************************************************
+ *                                                                                    *
+ * ---------------------------------------------------------------------------------- *
+ * |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
+ * ---------------------------------------------------------------------------------- *
+ * |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |      fbr_strg     |      fc_dealloc    |       limit       |        base       | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        R12        |         R13        |        R14        |        R15        | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        RDI         |       RSI         |        RBX        |        RBP        | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |        hidden     |         RIP        |        EXIT       |   parameter area  | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
+ * ---------------------------------------------------------------------------------- *
+ * |                       parameter area                       |        FCTX       | *
+ * ---------------------------------------------------------------------------------- *
+ * ---------------------------------------------------------------------------------- *
+ * |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
+ * ---------------------------------------------------------------------------------- *
+ * |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
+ * ---------------------------------------------------------------------------------- *
+ * |       DATA        |                    |                   |                   | *
+ * ---------------------------------------------------------------------------------- *
+ *                                                                                    *
+ * ***********************************************************************************/
+
+.file	"ontop_x86_64_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	ontop_fcontext
+.def	ontop_fcontext;	.scl	2;	.type	32;	.endef
+.seh_proc	ontop_fcontext
+ontop_fcontext:
+.seh_endprologue
+
+    pushq  %rcx  /* save hidden address of transport_t */
+
+    pushq  %rbp  /* save RBP */
+    pushq  %rbx  /* save RBX */
+    pushq  %rsi  /* save RSI */
+    pushq  %rdi  /* save RDI */
+    pushq  %r15  /* save R15 */
+    pushq  %r14  /* save R14 */
+    pushq  %r13  /* save R13 */
+    pushq  %r12  /* save R12 */
+
+    /* load NT_TIB */
+    movq  %gs:(0x30), %r10
+    /* save current stack base */
+    movq  0x08(%r10), %rax
+    pushq  %rax
+    /* save current stack limit */
+    movq  0x10(%r10), %rax
+    pushq  %rax
+    /* save current deallocation stack */
+    movq  0x1478(%r10), %rax
+    pushq  %rax
+    /* save fiber local storage */
+    movq  0x18(%r10), %rax
+    pushq  %rax
+
+    /* preserve RSP (pointing to context-data) in RCX */
+    movq  %rsp, %rcx
+
+    /* restore RSP (pointing to context-data) from RDX */
+    movq  %rdx, %rsp
+
+    /* load NT_TIB */
+    movq  %gs:(0x30), %r10
+    /* restore fiber local storage */
+    popq  %rax
+    movq  %rax, 0x18(%r10)
+    /* restore deallocation stack */
+    popq  %rax
+    movq  %rax, 0x1478(%r10)
+    /* restore stack limit */
+    popq  %rax
+    movq  %rax, 0x10(%r10)
+    /* restore stack base */
+    popq  %rax
+    movq  %rax, 0x8(%r10)
+
+    popq  %r12  /* restore R12 */
+    popq  %r13  /* restore R13 */
+    popq  %r14  /* restore R14 */
+    popq  %r15  /* restore R15 */
+    popq  %rdi  /* restore RDI */
+    popq  %rsi  /* restore RSI */
+    popq  %rbx  /* restore RBX */
+    popq  %rbp  /* restore RBP */
+
+    popq  %rax  /* restore hidden address of transport_t */
+
+    /* keep return-address on stack */
+
+    /* transport_t returned in RAX */
+    /* return parent fcontext_t */
+    movq  %rcx, (%rax)
+    /* return data */
+    movq  %r8, 0x8(%rax)
+
+    /* transport_t as 1.arg of context-function */
+    /* RCX contains address of returned (hidden) transfer_t */
+    movq  %rax, %rcx
+    /* RDX contains address of passed transfer_t */
+    movq  %rax, %rdx
+
+    /* indirect jump to context */
+    jmp  *%r9
+.seh_endproc
+
+.section .drectve
+.ascii " -export:\"ontop_fcontext\""

+ 130 - 0
modules/std/fiber/native/asm/ontop_x86_64_ms_pe_masm.asm

@@ -0,0 +1,130 @@
+
+;           Copyright Oliver Kowalke 2009.
+;  Distributed under the Boost Software License, Version 1.0.
+;     (See accompanying file LICENSE_1_0.txt or copy at
+;           http://www.boost.org/LICENSE_1_0.txt)
+
+;  ----------------------------------------------------------------------------------
+;  |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   |
+;  ----------------------------------------------------------------------------------
+;  |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  |
+;  ----------------------------------------------------------------------------------
+;  |      fbr_strg     |      fc_dealloc    |       limit       |        base       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   |
+;  ----------------------------------------------------------------------------------
+;  |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  |
+;  ----------------------------------------------------------------------------------
+;  |        R12        |         R13        |        R14        |        R15        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   |
+;  ----------------------------------------------------------------------------------
+;  |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  |
+;  ----------------------------------------------------------------------------------
+;  |        RDI         |       RSI         |        RBX        |        RBP        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   |
+;  ----------------------------------------------------------------------------------
+;  |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  |
+;  ----------------------------------------------------------------------------------
+;  |        hidden     |         RIP        |       EXIT        |   parameter area  |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   |
+;  ----------------------------------------------------------------------------------
+;  |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  |
+;  ----------------------------------------------------------------------------------
+;  |                       parameter area                       |        FCTX       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   |
+;  ----------------------------------------------------------------------------------
+;  |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  |
+;  ----------------------------------------------------------------------------------
+;  |       DATA        |                    |                   |                   |
+;  ----------------------------------------------------------------------------------
+
+.code
+
+ontop_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
+    .endprolog
+
+    push  rcx  ; save hidden address of transport_t
+
+    push  rbp  ; save RBP
+    push  rbx  ; save RBX
+    push  rsi  ; save RSI
+    push  rdi  ; save RDI
+    push  r15  ; save R15
+    push  r14  ; save R14
+    push  r13  ; save R13
+    push  r12  ; save R12
+
+    ; load NT_TIB
+    mov  r10,  gs:[030h]
+    ; save current stack base
+    mov  rax,  [r10+08h]
+    push  rax
+    ; save current stack limit
+    mov  rax, [r10+010h]
+    push  rax
+    ; save current deallocation stack
+    mov  rax, [r10+01478h]
+    push  rax
+    ; save fiber local storage
+    mov  rax, [r10+018h]
+    push  rax
+
+    ; preserve RSP (pointing to context-data) in RCX
+    mov  rcx, rsp
+
+    ; restore RSP (pointing to context-data) from RDX
+    mov  rsp, rdx
+
+    ; load NT_TIB
+    mov  r10, gs:[030h]
+    ; restore fiber local storage
+    pop  rax
+    mov  [r10+018h], rax
+    ; restore deallocation stack
+    pop  rax
+    mov  [r10+01478h], rax
+    ; restore stack limit
+    pop  rax
+    mov  [r10+010h], rax
+    ; restore stack base
+    pop  rax
+    mov  [r10+08h], rax
+
+    pop  r12  ; restore R12
+    pop  r13  ; restore R13
+    pop  r14  ; restore R14
+    pop  r15  ; restore R15
+    pop  rdi  ; restore RDI
+    pop  rsi  ; restore RSI
+    pop  rbx  ; restore RBX
+    pop  rbp  ; restore RBP
+
+    pop  rax  ; restore hidden address of transport_t
+
+    ; keep return-address on stack
+
+    ; transport_t returned in RAX
+    ; return parent fcontext_t
+    mov  [rax], rcx
+    ; return data
+    mov  [rax+08h], r8
+
+    ; transport_t as 1.arg of context-function
+    ; RCX contains address of returned (hidden) transfer_t
+    mov rcx,  rax  
+    ; RDX contains address of passed transfer_t
+    mov rdx,  rax
+
+    ; indirect jump to context
+    jmp  r9
+ontop_fcontext ENDP
+END

+ 69 - 0
modules/std/fiber/native/asm/ontop_x86_64_sysv_elf_gas.S

@@ -0,0 +1,69 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R12        |         R13       |         R14        |        R15        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl ontop_fcontext
+.type ontop_fcontext,@function
+.align 16
+ontop_fcontext:
+    pushq  %rbp  /* save RBP */
+    pushq  %rbx  /* save RBX */
+    pushq  %r15  /* save R15 */
+    pushq  %r14  /* save R14 */
+    pushq  %r13  /* save R13 */
+    pushq  %r12  /* save R12 */
+
+    /* store RSP (pointing to context-data) in RAX */
+    movq  %rsp, %rax
+
+    /* restore RSP (pointing to context-data) from RDI */
+    movq  %rdi, %rsp
+
+    popq  %r12  /* restrore R12 */
+    popq  %r13  /* restrore R13 */
+    popq  %r14  /* restrore R14 */
+    popq  %r15  /* restrore R15 */
+    popq  %rbx  /* restrore RBX */
+    popq  %rbp  /* restrore RBP */
+
+    /* preserve ontop-function in R8 */
+    movq  %rdx, %r8
+
+    /* return transfer_t from jump */
+    /* RAX == fctx, RDX == data */
+    movq  %rsi, %rdx
+    /* pass transfer_t as first arg in context function */
+    /* RDI == fctx, RSI == data */
+    movq  %rax, %rdi
+
+    /* keep return-address on stack */
+
+    /* indirect jump to context */
+    jmp  *%r8
+.size ontop_fcontext,.-ontop_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 64 - 0
modules/std/fiber/native/asm/ontop_x86_64_sysv_macho_gas.S

@@ -0,0 +1,64 @@
+/*
+            Copyright Oliver Kowalke 2009.
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+            http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R12        |         R13       |         R14        |        R15        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _ontop_fcontext
+.align 8
+_ontop_fcontext:
+    pushq  %rbp  /* save RBP */
+    pushq  %rbx  /* save RBX */
+    pushq  %r15  /* save R15 */
+    pushq  %r14  /* save R14 */
+    pushq  %r13  /* save R13 */
+    pushq  %r12  /* save R12 */
+
+    /* store RSP (pointing to context-data) in RAX */
+    movq  %rsp, %rax
+
+    /* restore RSP (pointing to context-data) from RDI */
+    movq  %rdi, %rsp
+
+    popq  %r12  /* restrore R12 */
+    popq  %r13  /* restrore R13 */
+    popq  %r14  /* restrore R14 */
+    popq  %r15  /* restrore R15 */
+    popq  %rbx  /* restrore RBX */
+    popq  %rbp  /* restrore RBP */
+
+    /* preserve ontop-function in R8 */
+    movq  %rdx, %r8
+
+    /* return transfer_t from jump */
+    /* RAX == fctx, RDX == data */
+    movq  %rsi, %rdx
+    /* pass transfer_t as first arg in context function */
+    /* RDI == fctx, RSI == data */
+    movq  %rax, %rdi
+
+    /* keep return-address on stack */
+
+    /* indirect jump to context */
+    jmp  *%r8

+ 51 - 0
modules/std/fiber/native/fcontext.cpp

@@ -0,0 +1,51 @@
+
+#include "fcontext.h"
+
+#if _WIN32
+
+#include <windows.h>
+
+unsigned char *alloc_fcontext_stack( size_t size,bool guard ){
+
+	void *vp=::VirtualAlloc( 0,size,MEM_COMMIT,PAGE_READWRITE );
+	if( !vp ) return 0;
+
+	if( guard ){
+		DWORD old_options;
+		::VirtualProtect( vp,1,PAGE_READWRITE|PAGE_GUARD /*PAGE_NOACCESS*/,&old_options );
+	}
+
+	return (unsigned char*)vp;
+}
+
+void free_fcontext_stack( void *vp,size_t size ){
+
+	::VirtualFree( vp,0,MEM_RELEASE );
+}
+
+#else
+
+#include <sys/mman.h>
+
+unsigned char *alloc_fcontext_stack( size_t size,bool guard ){
+
+#if defined(MAP_ANON)
+	void *vp=::mmap( 0,size,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0 );
+#else
+	void *vp=::mmap( 0,size,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0 );
+#endif
+	if( vp==MAP_FAILED ) return 0;
+
+	if( guard ){
+		::mprotect( vp,1,PROT_NONE );
+	}
+	
+	return (unsigned char*)vp;
+}
+
+void free_fcontext_stack( void *vp,size_t size ){
+   
+	::munmap( vp,size );
+}
+
+#endif

+ 31 - 0
modules/std/fiber/native/fcontext.h

@@ -0,0 +1,31 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BB_FCONTEXT_H
+#define BB_FCONTEXT_H
+
+#include <stdlib.h>		// size_t
+
+typedef void *fcontext_t;
+
+struct transfer_t{
+    fcontext_t fcontext;
+    void *data;
+};
+
+extern "C"{
+
+transfer_t jump_fcontext( fcontext_t fcontext,void *vp );
+fcontext_t make_fcontext( void *sp,size_t size,void (*func)(transfer_t) );
+transfer_t ontop_fcontext( fcontext_t fcontext,void *vp,transfer_t (*func)(transfer_t) );
+
+}
+
+unsigned char *alloc_fcontext_stack( size_t size,bool guard );
+void free_fcontext_stack( void *vp,size_t size );
+
+#endif
+

+ 130 - 155
modules/std/fiber/native/fiber.cpp

@@ -1,223 +1,198 @@
 
 
 #include "fiber.h"
 #include "fiber.h"
+#include "fcontext.h"
 
 
-#include <thread>
-#include <mutex>
-#include <condition_variable>
-
-namespace{
-
-	const int MaxFibers=1024;
-	const int FiberIdMask=MaxFibers-1;
+namespace bbFiber{
 
 
-	struct Semaphore{
+	const int MAX_FIBERS=1024;
 	
 	
-		int count;
-		std::mutex mutex;
-		std::condition_variable cond_var;
-		
-		Semaphore( int count=0 ):count( count ){
-		}
-		
-		void wait(){
-			std::unique_lock<std::mutex> lock( mutex );
-			while( !count ) cond_var.wait( lock );
-			--count;
-		}
-		
-		void signal(){
-			std::unique_lock<std::mutex> lock( mutex );
-			++count;
-			cond_var.notify_one();
-		}
-	};
+	const size_t STACK_SIZE=65536;	//woho
+
+	const size_t STACK_BUF_SIZE=65536;
 	
 	
 	struct Fiber{
 	struct Fiber{
+	
+		Fiber *succ;
 		int id;
 		int id;
+				
+		unsigned char *stack;
 		bbGCFiber *gcFiber;
 		bbGCFiber *gcFiber;
 		bbDBContext *dbContext;
 		bbDBContext *dbContext;
-		Semaphore semaphore;
-		Fiber *canceled;
-	};
-	
-	struct TerminateEx{
+		
+		Entry entry;
+		fcontext_t fcontext;
+		fcontext_t fcontext2;
 	};
 	};
 	
 	
-	Fiber fibers[MaxFibers];
-	bbGCFiber gcFibers[MaxFibers];
-	bbDBContext dbContexts[MaxFibers];
+	Fiber *fibers;
+	Fiber *freeFibers;
+	Fiber *mainFiber;
+	Fiber *currFiber;
 	
 	
-	Fiber *currentFiber;
+	unsigned char *stackBuf,*stackEnd;
 	
 	
-	int readyStack[256];
-	int *readyStackSp=readyStack;
+	unsigned char *allocStack(){
+		
+		if( stackBuf==stackEnd ){
+			stackBuf=alloc_fcontext_stack( STACK_BUF_SIZE,false );
+			stackEnd=stackBuf+STACK_BUF_SIZE;
+		}
+		
+		unsigned char *p=stackBuf;
+		stackBuf+=STACK_SIZE;
+		
+		return p;
+	}
 	
 	
 	void init(){
 	void init(){
-
-		static bool done;
-		if( done ) return;
-		done=true;
-
-		for( int i=1;i<MaxFibers;++i ){
-			fibers[i].id=-i;
+	
+		if( fibers ) return;
+		
+		fibers=new Fiber[MAX_FIBERS];
+		bbGCFiber *gcFibers=new bbGCFiber[MAX_FIBERS];
+		bbDBContext *dbContexts=new bbDBContext[MAX_FIBERS];
+	
+		for( int i=0;i<MAX_FIBERS;++i ){
+			fibers[i].id=i;
+			fibers[i].succ=&fibers[i+1];
+			fibers[i].stack=nullptr;
 			fibers[i].gcFiber=&gcFibers[i];
 			fibers[i].gcFiber=&gcFibers[i];
 			fibers[i].dbContext=&dbContexts[i];
 			fibers[i].dbContext=&dbContexts[i];
+			fibers[i].fcontext=nullptr;
+			fibers[i].fcontext2=nullptr;
 		}
 		}
+		fibers[MAX_FIBERS-1].succ=nullptr;
+		freeFibers=&fibers[1];
 		
 		
-		fibers[0].id=0;
-		fibers[0].gcFiber=bbGC::currentFiber;
-		fibers[0].dbContext=bbDB::currentContext;
+		mainFiber=&fibers[0];
+		mainFiber->gcFiber=bbGC::currentFiber;
+		mainFiber->dbContext=bbDB::currentContext;
 		
 		
-		currentFiber=&fibers[0];
-	}
-	
-	//not too sexy yet..
-	Fiber *allocFiber(){
-		for( int i=1;i<MaxFibers;++i ){
-			if( fibers[i].id>=0 ) continue;
-			Fiber *fiber=&fibers[i];
-			fiber->dbContext->init();
-			fiber->id=(-fiber->id)+MaxFibers;
-			fiber->canceled=nullptr;
-			return fiber;
-		}
-		printf( "Out of fibers!\n" );
-		exit( -1 );
+		currFiber=mainFiber;
 	}
 	}
 	
 	
-	void freeFiber( Fiber *fiber ){
-		fiber->id=-fiber->id;
-	}
+	Fiber *getFiber( int id ){
 	
 	
-	Fiber *getFiber( int fiberid ){
+		if( !fibers ) return nullptr;
 		
 		
-		Fiber *fiber=&fibers[fiberid & FiberIdMask];
+		Fiber *fiber=&fibers[id & (MAX_FIBERS-1)];
 		
 		
-		if( fiber->id!=fiberid ){
-			printf( "Invalid fiber id\n" );fflush( stdout );
-			exit( -1 );
-		}
+		if( fiber->id==id ) return fiber;
 		
 		
-		return fiber;
+		return nullptr;
 	}
 	}
 	
 	
-	void pushReadyStack(){
+	Fiber *allocFiber(){
+	
+		if( !fibers ) init();
 	
 	
-		if( readyStackSp==readyStack+256 ){
-			printf( "Fiber stack overflow\n" );fflush( stdout );
-			exit( -1 );
-		}
-		*readyStackSp++=currentFiber->id;
+		Fiber *fiber=freeFibers;
+		if( !fiber ) return nullptr;
+		
+		if( !fiber->stack ) fiber->stack=allocStack();
+		
+		freeFibers=fiber->succ;
+		
+		fiber->id+=MAX_FIBERS;
+		
+		return fiber;
 	}
 	}
 	
 	
-	Fiber *popReadyStack(){
+	fcontext_t freeFiber( Fiber *fiber ){
 	
 	
-		while( readyStackSp!=readyStack ){
-			Fiber *fiber=getFiber( *--readyStackSp );
-			if( fiber ) return fiber;
-		}
-		printf( "Fiber stack underflow\n" );
-		fflush( stdout );
-		exit( -1 );
+		fcontext_t fcontext=fiber->fcontext2;
+		
+		fiber->id+=MAX_FIBERS;
+		
+		fiber->succ=freeFibers;
+		freeFibers=fiber;
+		
+		return fcontext;
 	}
 	}
 	
 	
-	void switchToFiber( Fiber *fiber ){
+	void setCurrFiber( Fiber *fiber ){
 
 
-		Fiber *current=currentFiber;
-		
-		currentFiber=fiber;
 		bbGC::currentFiber=fiber->gcFiber;
 		bbGC::currentFiber=fiber->gcFiber;
 		bbDB::currentContext=fiber->dbContext;
 		bbDB::currentContext=fiber->dbContext;
-		fiber->semaphore.signal();
+		currFiber=fiber;
+	}
+	
+	void fiberEntry( transfer_t t ){
+	
+		Fiber *fiber=(Fiber*)t.data;
+		
+		fiber->fcontext2=t.fcontext;
+		fiber->dbContext->init();
+		fiber->gcFiber->link();
 		
 		
-		current->semaphore.wait();
-		if( current->canceled ) throw new TerminateEx;
+		setCurrFiber( fiber );
+		
+		fiber->entry();
+		
+		fiber->gcFiber->unlink();
+		
+		jump_fcontext( freeFiber( fiber ),nullptr );
 	}
 	}
-}
-
-namespace bbFiber{
-
-	int CreateFiber( Entry entry ){
-		init();
+	
+	// ***** API *****
 
 
+	int createFiber( Entry entry ){
+	
 		Fiber *fiber=allocFiber();
 		Fiber *fiber=allocFiber();
+		if( !fiber ) return 0;
 		
 		
-		std::thread thread( [=](){
-		
-			fiber->semaphore.wait();
-			
-			Fiber *nextFiber=fiber->canceled;
-			
-			if( !nextFiber ){
-
-				fiber->gcFiber->link();
-				
-				try{
-				
-					entry();
-					
-					nextFiber=popReadyStack();
-					
-				}catch( TerminateEx ){
-				
-					nextFiber=fiber->canceled;
-				}
-				
-				fiber->gcFiber->unlink();
-			}
-			
-			freeFiber( fiber );
-			
-			currentFiber=nextFiber;
-			bbGC::currentFiber=nextFiber->gcFiber;
-			bbDB::currentContext=nextFiber->dbContext;
-			nextFiber->semaphore.signal();
-		} );
-		
-		thread.detach();
+		fiber->entry=entry;
+		fiber->fcontext=make_fcontext( fiber->stack+STACK_SIZE,STACK_SIZE,fiberEntry );
 		
 		
 		return fiber->id;
 		return fiber->id;
 	}
 	}
 	
 	
-	int StartFiber( Entry entry ){
+	void resumeFiber( int id ){
 	
 	
-		int fiberid=CreateFiber( entry );
+		Fiber *fiber=getFiber( id );
+		if( !fiber ){
+			bbDB::error( "Invalid fiber id" );
+			return;
+		}
+		
+		Fiber *curr=currFiber;
 		
 		
-		ResumeFiber( fiberid );
+		fiber->fcontext=jump_fcontext( fiber->fcontext,fiber ).fcontext;
 		
 		
-		return fiberid;
+		setCurrFiber( curr );
 	}
 	}
 	
 	
-	void ResumeFiber( int fiberid ){
+	void suspendCurrentFiber(){
 	
 	
-		Fiber *fiber=getFiber( fiberid );
-		if( !fiber ) return;
+		if( currFiber==mainFiber ){
+			bbDB::error( "Can't suspend main fiber" );
+			return;
+		}
+	
+		Fiber *fiber=currFiber;
 		
 		
-		pushReadyStack();
+		fiber->fcontext2=jump_fcontext( fiber->fcontext2,nullptr ).fcontext;
 		
 		
-		switchToFiber( fiber );
+		setCurrFiber( fiber );
 	}
 	}
 	
 	
-	void TerminateFiber( int fiberid ){
+	int startFiber( bbFunction<void()> entry ){
 	
 	
-		Fiber *fiber=getFiber( fiberid );
-		if( !fiber ) return;
+		int id=createFiber( entry );
 		
 		
-		fiber->canceled=currentFiber;
+		if( id ) resumeFiber( id );
 		
 		
-		switchToFiber( fiber );
+		return id;
 	}
 	}
 	
 	
-	void SuspendCurrentFiber(){
+	void terminateFiber( int id ){
 	
 	
-		Fiber *fiber=popReadyStack();
-		
-		switchToFiber( fiber );
 	}
 	}
 	
 	
-	int GetCurrentFiber(){
-		init();
+	int getCurrentFiber(){
+	
+		if( fibers ) return currFiber->id;
 		
 		
-		return currentFiber->id;
+		return 0;
 	}
 	}
 }
 }

+ 9 - 10
modules/std/fiber/native/fiber.h

@@ -1,25 +1,24 @@
 
 
-#ifndef BB_STD_FIBER_H
-#define BB_STD_FIBER_H
+#ifndef BB_FIBER_H
+#define BB_FIBER_H
 
 
 #include <bbmonkey.h>
 #include <bbmonkey.h>
 
 
 namespace bbFiber{
 namespace bbFiber{
 
 
 	typedef bbFunction<void()> Entry;
 	typedef bbFunction<void()> Entry;
+
+	int startFiber( Entry entry );
 	
 	
-	int  StartFiber( Entry entry );
-	
-	int  CreateFiber( Entry entry );
+	int createFiber( Entry entry );
 	
 	
-	void ResumeFiber( int fiber );
+	void resumeFiber( int fiber );
 	
 	
-	void TerminateFiber( int fiber );
+	void terminateFiber( int fiber );
 	
 	
-	void SuspendCurrentFiber();
+	void suspendCurrentFiber();
 	
 	
-	int  GetCurrentFiber();
+	int getCurrentFiber();
 }
 }
 
 
 #endif
 #endif
-