/branches/arm/uspace/libc/arch/arm32/include/psthread.h |
---|
38,6 → 38,8 |
#include <types.h> |
#include <align.h> |
#include "thread.h" |
#define STACK_ITEM_SIZE 4 |
/** see <a href="http://www.arm.com/support/faqdev/14269.html">ABI</a> for details */ |
48,7 → 50,7 |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = ((sysarg_t)(ptls)) + sizeof(tcb_t); |
(c)->tls = ((sysarg_t)(ptls)) + sizeof(tcb_t) + ARM_TP_OFFSET; |
typedef struct { |
/branches/arm/uspace/libc/arch/arm32/include/thread.h |
---|
39,6 → 39,8 |
#define THREAD_INITIAL_STACK_PAGES_NO 1 |
#define ARM_TP_OFFSET (-8) |
typedef struct { |
void *pst_data; |
} tcb_t; |
45,7 → 47,8 |
static inline void __tcb_set(tcb_t *tcb) |
{ |
void *tls = (void *)tcb + sizeof(tcb_t); |
void *tls = (void *)tcb; |
tls += sizeof(tcb_t) + ARM_TP_OFFSET; |
asm volatile ( |
"mov r9, %0" |
: |
60,8 → 63,7 |
"mov %0, r9" |
: "=r"(ret) |
); |
ret -= sizeof(tcb_t); |
return (tcb_t *)ret; |
return (tcb_t *)(ret - ARM_TP_OFFSET - sizeof(tcb_t)); |
} |
#endif |