Index: kernel/arch/amd64/include/cpu.h
===================================================================
--- kernel/arch/amd64/include/cpu.h	(revision 20b8bf334fc016662c4e0addb183ae37eb75ed58)
+++ kernel/arch/amd64/include/cpu.h	(revision 2f60a5290eb6b781b8644febd27bc3c984f97c1b)
@@ -36,6 +36,7 @@
 #define KERN_amd64_CPU_H_
 
-#define RFLAGS_IF       (1 << 9)
-#define RFLAGS_RF       (1 << 16)
+#define RFLAGS_IF	(1 << 9)
+#define RFLAGS_DF	(1 << 10)
+#define RFLAGS_RF	(1 << 16)
 
 #define EFER_MSR_NUM    0xc0000080
Index: kernel/arch/amd64/src/asm_utils.S
===================================================================
--- kernel/arch/amd64/src/asm_utils.S	(revision 20b8bf334fc016662c4e0addb183ae37eb75ed58)
+++ kernel/arch/amd64/src/asm_utils.S	(revision 2f60a5290eb6b781b8644febd27bc3c984f97c1b)
@@ -249,4 +249,5 @@
 
 	save_all_gpr
+	cld
 
 	movq $(\i), %rdi   	# %rdi - first parameter
Index: kernel/arch/amd64/src/boot/boot.S
===================================================================
--- kernel/arch/amd64/src/boot/boot.S	(revision 20b8bf334fc016662c4e0addb183ae37eb75ed58)
+++ kernel/arch/amd64/src/boot/boot.S	(revision 2f60a5290eb6b781b8644febd27bc3c984f97c1b)
@@ -55,4 +55,5 @@
 
 multiboot_image_start:
+	cld
 	movl $START_STACK, %esp			# initialize stack pointer
 	lgdtl bootstrap_gdtr			# initialize Global Descriptor Table register
@@ -127,5 +128,4 @@
 	mov $VESA_INIT_SEGMENT << 4, %edi
 	mov $e_vesa_init - vesa_init, %ecx
-	cld
 	rep movsb
 
@@ -283,5 +283,4 @@
 	movq $AP_BOOT_OFFSET, %rdi
 	movq $_hardcoded_unmapped_size, %rcx
-	cld
 	rep movsb
 	
@@ -557,5 +556,4 @@
 	
 	movw $0x0c00, %ax				# black background, light red foreground
-	cld
 	
 	ploop:
Index: kernel/arch/amd64/src/syscall.c
===================================================================
--- kernel/arch/amd64/src/syscall.c	(revision 20b8bf334fc016662c4e0addb183ae37eb75ed58)
+++ kernel/arch/amd64/src/syscall.c	(revision 2f60a5290eb6b781b8644febd27bc3c984f97c1b)
@@ -63,7 +63,9 @@
 	/* Mask RFLAGS on syscall 
 	 * - disable interrupts, until we exchange the stack register
-	 *   (mask the IE bit)
+	 *   (mask the IF bit)
+	 * - clear DF so that the string instructions operate in
+	 *   the right direction
 	 */
-	write_msr(AMD_MSR_SFMASK, 0x200);
+	write_msr(AMD_MSR_SFMASK, RFLAGS_IF | RFLAGS_DF);
 }
 
Index: kernel/arch/ia32/src/asm.S
===================================================================
--- kernel/arch/ia32/src/asm.S	(revision 20b8bf334fc016662c4e0addb183ae37eb75ed58)
+++ kernel/arch/ia32/src/asm.S	(revision 2f60a5290eb6b781b8644febd27bc3c984f97c1b)
@@ -174,4 +174,5 @@
 	movw %ax, %es
 	
+	cld
 	sti
 	# syscall_handler(edx, ecx, ebx, esi, edi, ebp, eax)
@@ -234,4 +235,6 @@
 	movw %ax, %es
 
+	cld
+
 	pushl %esp          # *istate
 	pushl $(\i)         # intnum
Index: kernel/arch/ia32/src/boot/boot.S
===================================================================
--- kernel/arch/ia32/src/boot/boot.S	(revision 20b8bf334fc016662c4e0addb183ae37eb75ed58)
+++ kernel/arch/ia32/src/boot/boot.S	(revision 2f60a5290eb6b781b8644febd27bc3c984f97c1b)
@@ -51,4 +51,5 @@
 	
 multiboot_image_start:
+	cld
 	movl $START_STACK, %esp			# initialize stack pointer
 	lgdt KA2PA(bootstrap_gdtr)		# initialize Global Descriptor Table register
@@ -86,5 +87,4 @@
 	mov $VESA_INIT_SEGMENT << 4, %edi
 	mov $e_vesa_init - vesa_init, %ecx
-	cld
 	rep movsb
 
@@ -207,5 +207,4 @@
 	movl $AP_BOOT_OFFSET, %edi
 	movl $_hardcoded_unmapped_size, %ecx
-	cld
 	rep movsb
 	
@@ -280,5 +279,4 @@
 	
 	movw $0x0c00, %ax						# black background, light red foreground
-	cld
 	
 	ploop:
