More GOS Raw32 updates.
This commit is contained in:
parent
0c854f099f
commit
a68dfd9cbe
1 changed files with 17 additions and 31 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue