Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1152 → Rev 1155

/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);