Hi, I am trying to work in a special configuration where the thread_info is above the stack pointer. The SP though, start from the base stack address + THREAD_SIZE - THREAD_INFO_SECTION_SIZE (that is 128 bytes). The INIT_TSS macro looks like: .esp0 = sizeof(init_stack)-THREAD_INFO_SECTION_SIZE + (long)&init_stack, \ So far it works. When I am trying to move the init_thread_info to the top of the stack the computer restart itself. What I am doing is replacing the union of the init_thread_info with the following structure: -union thread_union { - struct thread_info thread_info; - unsigned long stack[THREAD_SIZE/sizeof(long)]; -}; +struct thread_union { +unsigned stack[(THREAD_SIZE-THREAD_INFO_SECTION_SIZE)/sizeof(long)]; + struct thread_info thread_info; +}; it means that when I am referencing the thread_info it is in offset (THREAD_SIZE-THREAD_INFO_SECTION_SIZE)/sizeof(long) and not the base address as it was when declared with a union. I have changed other relevant places as in fork.c and so, although the computer even doesn't start, I think its related to the init thread. any clues? -- Eliad