Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/invoke.c

    rd31bb83 r09f357ec  
    1010// Created On       : Tue Jan 17 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Oct 24 14:35:28 2020
    13 // Update Count     : 32
     12// Last Modified On : Fri Feb  9 16:37:42 2018
     13// Update Count     : 5
    1414//
    1515
     
    2929// Called from the kernel when starting a coroutine or task so must switch back to user mode.
    3030
    31 extern struct $coroutine * __cfactx_cor_finish(void);
    32 extern void __cfactx_cor_leave ( struct $coroutine * );
    33 extern void __cfactx_thrd_leave();
    34 
     31extern void __leave_coroutine ( struct coroutine_desc * );
     32extern struct coroutine_desc * __finish_coroutine(void);
     33extern void __leave_thread_monitor();
    3534extern void disable_interrupts() OPTIONAL_THREAD;
    3635extern void enable_interrupts( __cfaabi_dbg_ctx_param );
    3736
    38 void __cfactx_invoke_coroutine(
     37void CtxInvokeCoroutine(
    3938        void (*main)(void *),
    4039        void *this
    4140) {
    4241        // Finish setting up the coroutine by setting its state
    43         struct $coroutine * cor = __cfactx_cor_finish();
     42        struct coroutine_desc * cor = __finish_coroutine();
    4443
    4544        // Call the main of the coroutine
     
    4746
    4847        //Final suspend, should never return
    49         __cfactx_cor_leave( cor );
     48        __leave_coroutine( cor );
    5049        __cabi_abort( "Resumed dead coroutine" );
    5150}
    5251
    53 static _Unwind_Reason_Code __cfactx_coroutine_unwindstop(
     52static _Unwind_Reason_Code _CtxCoroutine_UnwindStop(
    5453        __attribute((__unused__)) int version,
    5554        _Unwind_Action actions,
     
    6261                // We finished unwinding the coroutine,
    6362                // leave it
    64                 __cfactx_cor_leave( param );
     63                __leave_coroutine( param );
    6564                __cabi_abort( "Resumed dead coroutine" );
    6665        }
     
    7069}
    7170
    72 void __cfactx_coroutine_unwind(struct _Unwind_Exception * storage, struct $coroutine * cor) __attribute__ ((__noreturn__));
    73 void __cfactx_coroutine_unwind(struct _Unwind_Exception * storage, struct $coroutine * cor) {
    74         _Unwind_Reason_Code ret = _Unwind_ForcedUnwind( storage, __cfactx_coroutine_unwindstop, cor );
     71void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct coroutine_desc * cor) __attribute__ ((__noreturn__));
     72void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct coroutine_desc * cor) {
     73        _Unwind_Reason_Code ret = _Unwind_ForcedUnwind( storage, _CtxCoroutine_UnwindStop, cor );
    7574        printf("UNWIND ERROR %d after force unwind\n", ret);
    7675        abort();
    7776}
    7877
    79 void __cfactx_invoke_thread(
     78void CtxInvokeThread(
    8079        void (*main)(void *),
    8180        void *this
     
    9493        // The order of these 4 operations is very important
    9594        //Final suspend, should never return
    96         __cfactx_thrd_leave();
     95        __leave_thread_monitor();
    9796        __cabi_abort( "Resumed dead thread" );
    9897}
    9998
    100 void __cfactx_start(
     99void CtxStart(
    101100        void (*main)(void *),
    102         struct $coroutine * cor,
     101        struct coroutine_desc * cor,
    103102        void *this,
    104103        void (*invoke)(void *)
     
    109108
    110109        struct FakeStack {
    111             void *fixedRegisters[3];                                            // fixed registers ebx, edi, esi (popped on 1st uSwitch, values unimportant)
    112             void *rturn;                                                                        // where to go on return from uSwitch
    113             void *dummyReturn;                                                          // fake return compiler would have pushed on call to uInvoke
    114             void *argument[3];                                                          // for 16-byte ABI, 16-byte alignment starts here
    115             void *padding;                                                                      // padding to force 16-byte alignment, as "base" is 16-byte aligned
     110            void *fixedRegisters[3];              // fixed registers ebx, edi, esi (popped on 1st uSwitch, values unimportant)
     111            void *rturn;                          // where to go on return from uSwitch
     112            void *dummyReturn;                    // fake return compiler would have pushed on call to uInvoke
     113            void *argument[3];                    // for 16-byte ABI, 16-byte alignment starts here
     114            void *padding;                        // padding to force 16-byte alignment, as "base" is 16-byte aligned
    116115        };
    117116
     
    122121
    123122        fs->dummyReturn = NULL;
    124         fs->argument[0] = main;                                                         // argument to invoke
    125         fs->argument[1] = this;                                                         // argument to invoke
     123        fs->argument[0] = main;     // argument to invoke
     124        fs->argument[1] = this;     // argument to invoke
    126125        fs->rturn = invoke;
    127126
     
    129128
    130129        struct FakeStack {
    131                 void *fixedRegisters[5];                                                // fixed registers rbx, r12, r13, r14, r15
    132                 void *rturn;                                                                    // where to go on return from uSwitch
    133                 void *dummyReturn;                                                              // NULL return address to provide proper alignment
     130                void *fixedRegisters[5];            // fixed registers rbx, r12, r13, r14, r15
     131                void *rturn;                        // where to go on return from uSwitch
     132                void *dummyReturn;                  // NULL return address to provide proper alignment
    134133        };
    135134
    136135        cor->context.SP = (char *)stack->base - sizeof( struct FakeStack );
    137         cor->context.FP = NULL;                                                         // terminate stack with NULL fp
     136        cor->context.FP = NULL;         // terminate stack with NULL fp
    138137
    139138        struct FakeStack *fs = (struct FakeStack *)cor->context.SP;
    140139
    141140        fs->dummyReturn = NULL;
    142         fs->rturn = __cfactx_invoke_stub;
    143         fs->fixedRegisters[0] = main;                                           // argument to invoke
    144         fs->fixedRegisters[1] = this;                                           // argument to invoke
     141        fs->rturn = CtxInvokeStub;
     142        fs->fixedRegisters[0] = main;
     143        fs->fixedRegisters[1] = this;
    145144        fs->fixedRegisters[2] = invoke;
    146145
    147 #elif defined( __ARM_ARCH_32 )
    148 #error ARM needs to be upgrade to use two parameters like X86/X64 (A.K.A. : I broke this and do not know how to fix it)
    149         // More details about the error:
    150         // To avoid the thunk problem, I changed the invoke routine to pass the main explicitly
    151         // instead of relying on an assertion. This effectively hoists any required thunk one level
    152         // which was enough to get to global scope in most cases.
    153         // This means that __cfactx_invoke_... now takes two parameters and the FakeStack needs
    154         // to be adjusted as a consequence of that.
    155         // I don't know how to do that for ARM, hence the #error
    156 
     146#elif defined( __ARM_ARCH )
     147#error ARM needs to be upgrade to use to parameters like X86/X64 (A.K.A. : I broke this and do not know how to fix it)
    157148        struct FakeStack {
    158                 float fpRegs[16];                                                               // floating point registers
    159                 void * intRegs[9];                                                              // integer/pointer registers
    160                 void * arg[2];                                                                  // placeholder for this pointer
     149                float fpRegs[16];                       // floating point registers
     150                void *intRegs[9];                       // integer/pointer registers
     151                void *arg[2];                           // placeholder for this pointer
    161152        };
    162153
     
    166157        struct FakeStack *fs = (struct FakeStack *)cor->context.SP;
    167158
    168         fs->intRegs[8] = __cfactx_invoke_stub;
     159        fs->intRegs[8] = CtxInvokeStub;
    169160        fs->arg[0] = this;
    170161        fs->arg[1] = invoke;
    171162
    172 #elif defined( __ARM_ARCH )
    173         struct FakeStack {
    174                 void * intRegs[12];                                                             // x19-x30 integer registers
    175                 double fpRegs[8];                                                               // v8-v15 floating point
    176         };
    177 
    178         cor->context.SP = (char *)stack->base - sizeof( struct FakeStack );
    179         cor->context.FP = NULL;
    180 
    181         struct FakeStack *fs = (struct FakeStack *)cor->context.SP;
    182 
    183         fs->intRegs[0] = main;                                                          // argument to invoke x19 => x0
    184         fs->intRegs[1] = this;                                                          // argument to invoke x20 => x1
    185         fs->intRegs[2] = invoke;
    186         fs->intRegs[11] = __cfactx_invoke_stub;                         // link register x30 => ret moves to pc
    187163#else
    188164        #error uknown hardware architecture
Note: See TracChangeset for help on using the changeset viewer.