Index: kernel/arch/ia32/include/pm.h
===================================================================
--- kernel/arch/ia32/include/pm.h	(revision 4e9123946062f7d7097c1093320e053821a97485)
+++ kernel/arch/ia32/include/pm.h	(revision f4946ded698ec72fa331f30e4282c8b2430e7639)
@@ -67,6 +67,7 @@
 #define AR_CODE       (3 << 3)
 #define AR_WRITABLE   (1 << 1)
-#define AR_INTERRUPT  (0x0e)
-#define AR_TSS        (0x09)
+#define AR_INTERRUPT  (0xe)
+#define AR_TRAP       (0xf)
+#define AR_TSS        (0x9)
 
 #define DPL_KERNEL  (PL_KERNEL << 5)
Index: kernel/arch/ia32/src/asm.S
===================================================================
--- kernel/arch/ia32/src/asm.S	(revision 4e9123946062f7d7097c1093320e053821a97485)
+++ kernel/arch/ia32/src/asm.S	(revision f4946ded698ec72fa331f30e4282c8b2430e7639)
@@ -313,5 +313,4 @@
 		
 	cld
-	sti
 		
 	/* Call syscall_handler(edx, ecx, ebx, esi, edi, ebp, eax) */
Index: kernel/arch/ia32/src/pm.c
===================================================================
--- kernel/arch/ia32/src/pm.c	(revision 4e9123946062f7d7097c1093320e053821a97485)
+++ kernel/arch/ia32/src/pm.c	(revision f4946ded698ec72fa331f30e4282c8b2430e7639)
@@ -130,12 +130,16 @@
 		d->selector = gdtselector(KTEXT_DES);
 
-		d->access = AR_PRESENT | AR_INTERRUPT;	/* masking interrupt */
-
 		if (i == VECTOR_SYSCALL) {
 			/*
-			 * The syscall interrupt gate must be calleable from
-			 * userland.
+			 * The syscall trap gate must be callable from
+			 * userland. Interrupts will remain enabled.
 			 */
-			d->access |= DPL_USER;
+			d->access = AR_PRESENT | AR_TRAP | DPL_USER;
+		} else {
+			/*
+			 * Other interrupts use interrupt gates which
+			 * disable interrupts.
+			 */
+			d->access = AR_PRESENT | AR_INTERRUPT;
 		}
 	}
