More GOS Raw32 updates.

ugfx_release_2.6
inmarket 2013-12-21 13:37:40 +10:00
parent 0c854f099f
commit a68dfd9cbe
1 changed files with 17 additions and 31 deletions

View File

@ -462,7 +462,6 @@ typedef struct thread {
threadreturn_t (*fn)(void *param); // Thread function threadreturn_t (*fn)(void *param); // Thread function
void * param; // Parameter for the thread function void * param; // Parameter for the thread function
jmp_buf cxt; // The current thread context. jmp_buf cxt; // The current thread context.
// size - sizeof(thread) bytes of stack follow here
} thread; } thread;
typedef struct threadQ { typedef struct threadQ {
@ -549,45 +548,32 @@ static void _gosThreadsInit(void) {
// Get details of the stack frame outside the function // Get details of the stack frame outside the function
get_stack_state(); get_stack_state();
/* stack direction */ /* Work out the frame entries to relocate by treating the jump buffer as an array of pointers */
stackdirup = pframeinfo[1].localptr > pframeinfo[0].localptr; stackdirup = pframeinfo[1].localptr > pframeinfo[0].localptr;
/* study the jump buffer */
diff = pframeinfo[0].localptr - pframeinfo[1].localptr;
framebase = pframeinfo[0].localptr;
/* following line views jump buffer as array of long int */
pout = (char **)pframeinfo[0].cxt; pout = (char **)pframeinfo[0].cxt;
pin = (char **)pframeinfo[1].cxt; pin = (char **)pframeinfo[1].cxt;
diff = pframeinfo[0].localptr - pframeinfo[1].localptr;
framebase = pframeinfo[0].localptr;
jmpmask1 = jmpmask2 = 0; jmpmask1 = jmpmask2 = 0;
if (diff) { for (i = 0; i < sizeof(jmp_buf)/sizeof(char *); i++, pout++, pin++) {
for (i = 0; i < sizeof(jmp_buf)/sizeof(char *); i++, pout++, pin++) { if ((size_t)(*pout - *pin) == diff) {
if ((size_t)(*pout - *pin) == diff) { if (i < 32)
/* record frame dependency */ jmpmask1 |= 1 << i;
if (i < 32) else
jmpmask1 |= 1 << i; jmpmask2 |= 1 << (i-32);
else
jmpmask2 |= 1 << (i-32);
if (stackdirup) { if (stackdirup) {
if (framebase > *pout) { if (framebase > *pout)
framebase = *pout; framebase = *pout;
} } else {
} else { if (framebase < *pout)
if (framebase < *pout) { framebase = *pout;
framebase = *pout;
}
}
} }
} }
} }
stackbase = stackdirup ? (pframeinfo[0].localptr - framebase) : (framebase - pframeinfo[0].localptr);
if (stackdirup) { // Clean up
stackbase = pframeinfo[0].localptr - framebase;
} else {
stackbase = framebase - pframeinfo[0].localptr;
}
gfxFree(pframeinfo); gfxFree(pframeinfo);
} }
#endif #endif