Index: arch/amd64/src/amd64.c
===================================================================
--- arch/amd64/src/amd64.c	(revision 40ca40239dd13e9208afb2d4d3539ec93d198a9c)
+++ arch/amd64/src/amd64.c	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -46,4 +46,5 @@
 #include <panic.h>
 #include <interrupt.h>
+#include <arch/syscall.h>
 
 /** Disable I/O on non-privileged levels
@@ -100,8 +101,7 @@
 	/* Enable No-execute pages */
 	set_efer_flag(AMD_NXE_FLAG);
-	/* Enable SYSCALL/SYSRET */
-	set_efer_flag(AMD_SCE_FLAG);
 	/* Enable FPU */
 	cpu_setup_fpu();
+
 	/* Initialize segmentation */
 	pm_init();
@@ -113,5 +113,4 @@
 	/* Disable alignment check */
 	clean_AM_flag();
-	
 
 	if (config.cpu_active == 1) {
@@ -133,4 +132,7 @@
 		ega_init();	/* video */
 	}
+	/* Setup fast SYSCALL/SYSRET */
+	syscall_setup_cpu();
+
 }
 
Index: arch/amd64/src/asm_utils.S
===================================================================
--- arch/amd64/src/asm_utils.S	(revision 40ca40239dd13e9208afb2d4d3539ec93d198a9c)
+++ arch/amd64/src/asm_utils.S	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -39,4 +39,5 @@
 .text
 .global interrupt_handlers
+.global syscall_entry
 .global panic_printf
 
@@ -189,5 +190,12 @@
 	handler 0 IDT_ITEMS
 h_end:
-	
+
+	
+syscall_entry:
+	# TODO:	Switch to kernel stack
+	call syscall_handler
+	# Switch back
+	sysret
+		
 .data
 .global interrupt_handler_size
Index: arch/amd64/src/pm.c
===================================================================
--- arch/amd64/src/pm.c	(revision 40ca40239dd13e9208afb2d4d3539ec93d198a9c)
+++ arch/amd64/src/pm.c	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -72,4 +72,15 @@
 	  .granularity = 1, 
 	  .base_24_31  = 0 },
+	/* UDATA descriptor */
+	{ .limit_0_15  = 0xffff, 
+	  .base_0_15   = 0, 
+	  .base_16_23  = 0, 
+	  .access      = AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 
+	  .limit_16_19 = 0xf, 
+	  .available   = 0, 
+	  .longmode    = 0, 
+	  .special     = 1, 
+	  .granularity = 1, 
+	  .base_24_31  = 0 },
 	/* UTEXT descriptor */
 	{ .limit_0_15  = 0xffff, 
@@ -81,15 +92,4 @@
 	  .longmode    = 1, 
 	  .special     = 0, 
-	  .granularity = 1, 
-	  .base_24_31  = 0 },
-	/* UDATA descriptor */
-	{ .limit_0_15  = 0xffff, 
-	  .base_0_15   = 0, 
-	  .base_16_23  = 0, 
-	  .access      = AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 
-	  .limit_16_19 = 0xf, 
-	  .available   = 0, 
-	  .longmode    = 0, 
-	  .special     = 1, 
 	  .granularity = 1, 
 	  .base_24_31  = 0 },
Index: arch/amd64/src/syscall.c
===================================================================
--- arch/amd64/src/syscall.c	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
+++ arch/amd64/src/syscall.c	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2006 Ondrej Palkovsky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <syscall/syscall.h>
+#include <arch/syscall.h>
+#include <panic.h>
+#include <arch/cpu.h>
+#include <arch/pm.h>
+#include <arch/asm.h>
+
+#include <print.h>
+
+extern void syscall_entry(void);
+
+/** Enable & setup support for SYSCALL/SYSRET */
+void syscall_setup_cpu(void)
+{
+	/* Enable SYSCALL/SYSRET */
+	set_efer_flag(AMD_SCE_FLAG);
+
+	/* Setup syscall entry address */
+	
+	/* This is _mess_ - the 64-bit CS is argument+16,
+	 * the SS is argument+8. The order is:
+	 * +0(KDATA_DES), +8(UDATA_DES), +16(UTEXT_DES)
+	 */
+	write_msr(AMD_MSR_STAR,
+		  ((__u64)(gdtselector(KDATA_DES) | PL_USER)<<48) \
+		  | ((__u64)(gdtselector(KTEXT_DES) | PL_KERNEL)<<32));
+	write_msr(AMD_MSR_LSTAR, (__u64)syscall_entry);
+	/* Mask RFLAGS on syscall 
+	 * - we do not care what is in the flags field
+	 */
+	write_msr(AMD_MSR_SFMASK, 0);
+}
+
+/** Dispatch system call */
+__native syscall_handler(__native id, __native a1, __native a2, __native a3)
+{
+	if (id < SYSCALL_END)
+		return syscall_table[id](a1,a2,a3);
+	else
+		panic("Undefined syscall %d", id);
+	
+}
