Index: kernel/arch/amd64/src/proc/scheduler.c
===================================================================
--- kernel/arch/amd64/src/proc/scheduler.c	(revision df4ed852a2d1b242f9bdce0a873009a2cb77cec7)
+++ kernel/arch/amd64/src/proc/scheduler.c	(revision 7e956eb53e39a5b6b5da0e92b2e789a596d7fc45)
@@ -57,10 +57,12 @@
 void before_thread_runs_arch(void)
 {
-	CPU->arch.tss->rsp0 = (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE-SP_DELTA];
+	CPU->arch.tss->rsp0 =
+	    (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA];
 
-	/* Syscall support - write address of thread stack pointer to 
-	 * hidden part of gs */
+	/*
+	 * Syscall support.
+	 */
 	swapgs();
-	write_msr(AMD_MSR_GS, (uint64_t)&THREAD->kstack);
+	write_msr(AMD_MSR_GS, (uintptr_t)THREAD->arch.syscall_rsp);
 	swapgs();
 
@@ -72,6 +74,5 @@
 	if (CPU->id < BKPOINTS_MAX)
 		breakpoint_add(&((the_t *) THREAD->kstack)->as, 
-			       BKPOINT_WRITE | BKPOINT_CHECK_ZERO,
-			       CPU->id);
+		    BKPOINT_WRITE | BKPOINT_CHECK_ZERO, CPU->id);
 #endif
 }
Index: kernel/arch/amd64/src/proc/thread.c
===================================================================
--- kernel/arch/amd64/src/proc/thread.c	(revision df4ed852a2d1b242f9bdce0a873009a2cb77cec7)
+++ kernel/arch/amd64/src/proc/thread.c	(revision 7e956eb53e39a5b6b5da0e92b2e789a596d7fc45)
@@ -42,4 +42,10 @@
 {
 	t->arch.tls = 0;
+	t->arch.syscall_rsp[SYSCALL_USTACK_RSP] = 0;
+	/*
+	 * Kernel RSP can be precalculated at thread creation time.
+	 */
+	t->arch.syscall_rsp[SYSCALL_KSTACK_RSP] =
+	    (uintptr_t)&t->kstack[PAGE_SIZE - sizeof(uint64_t)];
 }
 
