Index: arch/amd64/Makefile.inc
===================================================================
--- arch/amd64/Makefile.inc	(revision 40ca40239dd13e9208afb2d4d3539ec93d198a9c)
+++ arch/amd64/Makefile.inc	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -100,5 +100,6 @@
 	arch/$(ARCH)/src/cpu/cpu.c \
 	arch/$(ARCH)/src/proc/scheduler.c \
-	arch/$(ARCH)/src/userspace.c
+	arch/$(ARCH)/src/userspace.c \
+	arch/$(ARCH)/src/syscall.c
 
 ifeq ($(CONFIG_SMP),y)
Index: arch/amd64/include/asm.h
===================================================================
--- arch/amd64/include/asm.h	(revision 40ca40239dd13e9208afb2d4d3539ec93d198a9c)
+++ arch/amd64/include/asm.h	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -189,4 +189,24 @@
 }
 
+/** Write to MSR */
+static inline void write_msr(__u32 msr, __u64 value)
+{
+	__asm__ volatile (
+		"wrmsr;" : : "c" (msr), 
+		"a" ((__u32)(value)),
+		"d" ((__u32)(value >> 32))
+		);
+}
+
+static inline __native read_msr(__u32 msr)
+{
+	__u32 ax, dx;
+
+	__asm__ volatile (
+		"rdmsr;" : "=a"(ax), "=d"(dx) : "c" (msr)
+		);
+	return ((__u64)dx << 32) | ax;
+}
+
 
 /** Enable local APIC
Index: arch/amd64/include/cpu.h
===================================================================
--- arch/amd64/include/cpu.h	(revision 40ca40239dd13e9208afb2d4d3539ec93d198a9c)
+++ arch/amd64/include/cpu.h	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -38,4 +38,9 @@
 #define AMD_NXE_FLAG    11
 
+/* MSR registers */
+#define AMD_MSR_STAR    0xc0000081
+#define AMD_MSR_LSTAR   0xc0000082
+#define AMD_MSR_SFMASK  0xc0000084
+
 #ifndef __ASM__
 
Index: arch/amd64/include/pm.h
===================================================================
--- arch/amd64/include/pm.h	(revision 40ca40239dd13e9208afb2d4d3539ec93d198a9c)
+++ arch/amd64/include/pm.h	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -40,9 +40,11 @@
 
 #define NULL_DES	0
+/* Warning: Do not reorder next items, unless you look into syscall.c!!! */
 #define KTEXT_DES	1
 #define	KDATA_DES	2
-#define UTEXT_DES	3
-#define UDATA_DES	4
+#define UDATA_DES	3
+#define UTEXT_DES	4
 #define KTEXT32_DES     5
+/* EndOfWarning */
 #define TSS_DES		6
 
Index: arch/amd64/include/syscall.h
===================================================================
--- arch/amd64/include/syscall.h	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
+++ arch/amd64/include/syscall.h	(revision dd4d6b00d0c3e88b7dd79f5e3fcc541f04c5289e)
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+#ifndef __amd64_SYSCALL_H__
+#define __amd64_SYSCALL_H__
+
+#include <arch/types.h>
+
+extern __native syscall_handler(__native id, __native a1, __native a2, __native a3);
+extern void syscall_setup_cpu(void);
+
+#endif
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);
+	
+}
