In a 32-bit kernel, it thread.ipcan be one of the following:
1 switch_toret_from_forkret_from_kernel_thread
a call push + jmp.
64- thread.ip . call ( 1 32- ). , call, . ret_from_fork __switch_to ( ):
#define switch_to(prev, next, last) \
asm volatile(SAVE_CONTEXT \
"movq %%rsp,%P[threadrsp](%[prev])\n\t" \
"movq %P[threadrsp](%[next]),%%rsp\n\t" \
"call __switch_to\n\t" \
"movq "__percpu_arg([current_task])",%%rsi\n\t" \
__switch_canary \
"movq %P[thread_info](%%rsi),%%r8\n\t" \
"movq %%rax,%%rdi\n\t" \
"testl %[_tif_fork],%P[ti_flags](%%r8)\n\t" \
"jnz ret_from_fork\n\t" \
RESTORE_CONTEXT \
ret_from_kernel_thread ret_from_fork, entry_64.S:
ENTRY(ret_from_fork)
DEFAULT_FRAME
LOCK ; btr $TIF_FORK,TI_flags(%r8)
pushq_cfi $0x0002
popfq_cfi
call schedule_tail
GET_THREAD_INFO(%rcx)
RESTORE_REST
testl $3, CS-ARGOFFSET(%rsp)
jz 1f