Changeset 9705ffe
- Timestamp:
- Aug 20, 2020, 11:01:41 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 442b624
- Parents:
- 9b34766
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.c
r9b34766 r9705ffe 10 10 // Created On : Tue Jan 17 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 9 16:37:42 201813 // Update Count : 512 // Last Modified On : Thu Aug 20 18:54:34 2020 13 // Update Count : 30 14 14 // 15 15 … … 109 109 110 110 struct FakeStack { 111 void *fixedRegisters[3]; 112 void *rturn; 113 void *dummyReturn; 114 void *argument[3]; 115 void *padding; 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 116 116 }; 117 117 … … 122 122 123 123 fs->dummyReturn = NULL; 124 fs->argument[0] = main; 125 fs->argument[1] = this; 124 fs->argument[0] = main; // argument to invoke 125 fs->argument[1] = this; // argument to invoke 126 126 fs->rturn = invoke; 127 127 … … 129 129 130 130 struct FakeStack { 131 void *fixedRegisters[5]; 132 void *rturn; 133 void *dummyReturn; 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 134 134 }; 135 135 136 136 cor->context.SP = (char *)stack->base - sizeof( struct FakeStack ); 137 cor->context.FP = NULL; // terminate stack with NULL fp137 cor->context.FP = NULL; // terminate stack with NULL fp 138 138 139 139 struct FakeStack *fs = (struct FakeStack *)cor->context.SP; … … 141 141 fs->dummyReturn = NULL; 142 142 fs->rturn = __cfactx_invoke_stub; 143 fs->fixedRegisters[0] = main; 144 fs->fixedRegisters[1] = this; 143 fs->fixedRegisters[0] = main; // argument to invoke 144 fs->fixedRegisters[1] = this; // argument to invoke 145 145 fs->fixedRegisters[2] = invoke; 146 146 147 #elif defined( __ARM_ARCH )148 # 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)147 #elif defined( __ARM_ARCH_32 ) 148 #warning 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 149 struct FakeStack { 150 float fpRegs[16]; // floating point registers151 void * intRegs[9];// integer/pointer registers152 void * arg[2];// placeholder for this pointer150 float fpRegs[16]; // floating point registers 151 void * intRegs[9]; // integer/pointer registers 152 void * arg[2]; // placeholder for this pointer 153 153 }; 154 154 … … 162 162 fs->arg[1] = invoke; 163 163 164 #elif defined( __ARM_ARCH ) 165 struct FakeStack { 166 void * intRegs[12]; // x19-x30 integer registers 167 double fpRegs[8]; // v8-v15 floating point 168 }; 169 170 cor->context.SP = (char *)stack->base - sizeof( struct FakeStack ); 171 cor->context.FP = NULL; 172 173 struct FakeStack *fs = (struct FakeStack *)cor->context.SP; 174 175 fs->intRegs[0] = main; // argument to invoke x19 => x0 176 fs->intRegs[1] = this; // argument to invoke x20 => x1 177 fs->intRegs[2] = invoke; 178 //for ( intptr_t i = 3; i < 12; i += 1 ) fs->intRegs[i] = (void *)i; 179 fs->intRegs[11] = __cfactx_invoke_stub; // link register x30 => ret moves to pc 180 //for ( int i = 0; i < 8; i += 1 ) fs->fpRegs[i] = i + 12; 164 181 #else 165 182 #error uknown hardware architecture
Note: See TracChangeset
for help on using the changeset viewer.