aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2013-12-21 13:37:40 +1000
committerinmarket <andrewh@inmarket.com.au>2013-12-21 13:37:40 +1000
commita68dfd9cbef1c91b22910ecd1be7c47d1da879e1 (patch)
treec91137f5ca8882851c8fa8b4e512cfce7a705a19 /src
parent0c854f099faa097fd8d0797b75bef270d0dbaa13 (diff)
downloaduGFX-a68dfd9cbef1c91b22910ecd1be7c47d1da879e1.tar.gz
uGFX-a68dfd9cbef1c91b22910ecd1be7c47d1da879e1.tar.bz2
uGFX-a68dfd9cbef1c91b22910ecd1be7c47d1da879e1.zip
More GOS Raw32 updates.
Diffstat (limited to 'src')
-rw-r--r--src/gos/raw32.c50
1 files changed, 18 insertions, 32 deletions
diff --git a/src/gos/raw32.c b/src/gos/raw32.c
index ced52c4a..63a124ec 100644
--- a/src/gos/raw32.c
+++ b/src/gos/raw32.c
@@ -462,7 +462,6 @@ typedef struct thread {
threadreturn_t (*fn)(void *param); // Thread function
void * param; // Parameter for the thread function
jmp_buf cxt; // The current thread context.
- // size - sizeof(thread) bytes of stack follow here
} thread;
typedef struct threadQ {
@@ -549,45 +548,32 @@ static void _gosThreadsInit(void) {
// Get details of the stack frame outside the function
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;
-
- /* 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;
pin = (char **)pframeinfo[1].cxt;
-
+ diff = pframeinfo[0].localptr - pframeinfo[1].localptr;
+ framebase = pframeinfo[0].localptr;
jmpmask1 = jmpmask2 = 0;
- if (diff) {
- for (i = 0; i < sizeof(jmp_buf)/sizeof(char *); i++, pout++, pin++) {
- if ((size_t)(*pout - *pin) == diff) {
- /* record frame dependency */
- if (i < 32)
- jmpmask1 |= 1 << i;
- else
- jmpmask2 |= 1 << (i-32);
-
- if (stackdirup) {
- if (framebase > *pout) {
- framebase = *pout;
- }
- } else {
- if (framebase < *pout) {
- framebase = *pout;
- }
- }
+ for (i = 0; i < sizeof(jmp_buf)/sizeof(char *); i++, pout++, pin++) {
+ if ((size_t)(*pout - *pin) == diff) {
+ if (i < 32)
+ jmpmask1 |= 1 << i;
+ else
+ jmpmask2 |= 1 << (i-32);
+
+ if (stackdirup) {
+ if (framebase > *pout)
+ framebase = *pout;
+ } else {
+ if (framebase < *pout)
+ framebase = *pout;
}
}
}
+ stackbase = stackdirup ? (pframeinfo[0].localptr - framebase) : (framebase - pframeinfo[0].localptr);
- if (stackdirup) {
- stackbase = pframeinfo[0].localptr - framebase;
- } else {
- stackbase = framebase - pframeinfo[0].localptr;
- }
+ // Clean up
gfxFree(pframeinfo);
}
#endif