/uspace/trunk/libc/generic/psthread.c |
---|
34,6 → 34,11 |
#include <stdio.h> |
#include <kernel/arch/faddr.h> |
#ifndef PSTHREAD_INITIAL_STACK_PAGES_NO |
#define PSTHREAD_INITIAL_STACK_PAGES_NO 1 |
#endif |
static LIST_INITIALIZE(ready_list); |
static void psthread_exit(void) __attribute__ ((noinline)); |
165,7 → 170,7 |
__free_tls(tcb); |
return 0; |
} |
pt->stack = (char *) malloc(getpagesize()); |
pt->stack = (char *) malloc(PSTHREAD_INITIAL_STACK_PAGES_NO*getpagesize()); |
if (!pt->stack) { |
__free_tls(tcb); |
179,7 → 184,7 |
pt->waiter = NULL; |
context_save(&pt->ctx); |
context_set(&pt->ctx, FADDR(psthread_main), pt->stack, getpagesize(), |
context_set(&pt->ctx, FADDR(psthread_main), pt->stack, PSTHREAD_INITIAL_STACK_PAGES_NO*getpagesize(), |
tcb); |
list_append(&pt->link, &ready_list); |
/uspace/trunk/libc/arch/ia64/include/psthread.h |
---|
41,6 → 41,10 |
#define PFM_MASK (~0x3fffffffff) |
#define PSTHREAD_INITIAL_STACK_PAGES_NO 2 |
#define PSTHREAD_INITIAL_STACK_DIVISION 2 /*Stack is divided into two equal parts (for clasic stack and register stack)*/ |
#ifdef context_set |
#undef context_set |
#endif |
48,9 → 52,9 |
#define context_set(c, _pc, stack, size, tls) \ |
do { \ |
(c)->pc = (uint64_t) _pc; \ |
(c)->bsp = (uint64_t) stack; \ |
(c)->bsp = ((uint64_t) stack) + size / PSTHREAD_INITIAL_STACK_DIVISION; \ |
(c)->ar_pfs &= PFM_MASK; \ |
(c)->sp = ((uint64_t) stack) + ALIGN_UP((size), STACK_ALIGNMENT) - SP_DELTA; \ |
(c)->sp = ((uint64_t) stack) + ALIGN_UP((size / PSTHREAD_INITIAL_STACK_DIVISION), STACK_ALIGNMENT) - SP_DELTA; \ |
(c)->tp = (uint64_t) tls; \ |
} while (0); |