Index: arch/amd64/include/cpu.h
===================================================================
--- arch/amd64/include/cpu.h	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/amd64/include/cpu.h	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -30,4 +30,5 @@
 #define __amd64_CPU_H__
 
+#define RFLAGS_IF       (1 << 9)
 #define RFLAGS_RF       (1 << 16)
 
Index: arch/amd64/src/asm_utils.S
===================================================================
--- arch/amd64/src/asm_utils.S	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/amd64/src/asm_utils.S	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -244,5 +244,10 @@
 	sti
 	movq %r9, %rcx      # Exchange last parameter as a third
+	
+	cmp $2, %r8          # Is this SYS_INT_CONTROL
+	je sys_int_ctrl
+	
 	call syscall_handler
+sys_end:	
 	cli                 # We will be touching stack pointer
 		
@@ -251,4 +256,10 @@
 	movq 0(%rsp), %rsp
 	sysretq
+	
+sys_int_ctrl:
+	mov %rsp, %rsi      # Pointer to flags
+	call ddi_int_control
+	jmp sys_end
+	
 		
 .data
Index: arch/amd64/src/ddi/ddi.c
===================================================================
--- arch/amd64/src/ddi/ddi.c	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/amd64/src/ddi/ddi.c	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -35,4 +35,5 @@
 #include <arch/pm.h>
 #include <errno.h>
+#include <arch/cpu.h>
 
 /** Enable I/O space range for task.
@@ -91,2 +92,16 @@
 	return 0;
 }
+
+/** Enable/disable interrupts form syscall
+ *
+ * @param enable If non-zero, interrupts are enabled, otherwise disabled
+ * @param flags CP0 flags register
+ */
+__native ddi_int_control_arch(__native enable, __native *flags)
+{
+	if (enable)
+		*flags |= RFLAGS_IF;
+	else
+		*flags &= ~RFLAGS_IF;
+	return 0;
+}
Index: arch/amd64/src/mm/page.c
===================================================================
--- arch/amd64/src/mm/page.c	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/amd64/src/mm/page.c	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -169,5 +169,5 @@
 	if (!as_page_fault(page)) {
 		print_info_errcode(n, istate);
-		printf("Page fault address: %Q\n", page);
+		printf("Page fault address: %llX\n", page);
 		panic("page fault\n");
 	}
Index: arch/ia32/include/cpu.h
===================================================================
--- arch/ia32/include/cpu.h	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/ia32/include/cpu.h	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -34,4 +34,5 @@
 #include <arch/asm.h>
 
+#define EFLAGS_IF       (1 << 9)
 #define EFLAGS_RF       (1 << 16)
 
Index: arch/ia32/src/asm.S
===================================================================
--- arch/ia32/src/asm.S	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/ia32/src/asm.S	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -87,5 +87,5 @@
 # and call exc_dispatch().
 #
-#define INTERRUPT_ALIGN 64
+#define INTERRUPT_ALIGN 128
 .macro handler i n
 
@@ -109,5 +109,9 @@
 	
 	sti
+	cmp $2, %edi           # Is this SYS_INT_CONTROL?
+	je sys_int_ctrl
+	
 	call syscall_handler   # syscall_handler(ax,cx,dx,si,di)
+sysc_end:		
 	cli
 	addl $20, %esp         # clean-up of parameters
@@ -120,4 +124,10 @@
 	CLEAR_NT_FLAG
 	iret
+sys_int_ctrl:               # Interrupt control
+	mov %esp, %eax
+	add $44, %eax
+	mov %eax, 4(%esp)   # Pointer to flags - 2nd argument
+	call ddi_int_control
+	jmp sysc_end
 .else	
 	/*
Index: arch/ia32/src/ddi/ddi.c
===================================================================
--- arch/ia32/src/ddi/ddi.c	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/ia32/src/ddi/ddi.c	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -35,4 +35,5 @@
 #include <arch/pm.h>
 #include <errno.h>
+#include <arch/cpu.h>
 
 /** Enable I/O space range for task.
@@ -91,2 +92,16 @@
 	return 0;
 }
+
+/** Enable/disable interrupts form syscall
+ *
+ * @param enable If non-zero, interrupts are enabled, otherwise disabled
+ * @param flags CP0 flags register
+ */
+__native ddi_int_control_arch(__native enable, __native *flags)
+{
+	if (enable)
+		*flags |= EFLAGS_IF;
+	else
+		*flags &= ~EFLAGS_IF;
+	return 0;
+}
Index: arch/mips32/src/ddi/ddi.c
===================================================================
--- arch/mips32/src/ddi/ddi.c	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/mips32/src/ddi/ddi.c	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -31,4 +31,7 @@
 #include <arch/types.h>
 #include <typedefs.h>
+#include <security/cap.h>
+#include <arch.h>
+#include <arch/cp0.h>
 
 /** Enable I/O space range for task.
@@ -46,2 +49,16 @@
 	return 0;
 }
+
+/** Enable/disable interrupts form syscall
+ *
+ * @param enable If non-zero, interrupts are enabled, otherwise disabled
+ * @param flags CP0 flags register
+ */
+__native ddi_int_control_arch(__native enable, __native *flags)
+{
+	if (enable)
+		*flags |= cp0_status_ie_enabled_bit;
+	else
+		*flags &= ~cp0_status_ie_enabled_bit;
+	return 0;
+}
Index: arch/mips32/src/start.S
===================================================================
--- arch/mips32/src/start.S	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ arch/mips32/src/start.S	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -252,8 +252,13 @@
 	mtc0 $t0, $status
 
+	li $t4, 2                   # SYS_INT_CONTROL
+	beq $t4, $v0, sysc_int_control
+	nop
+	
 	# CALL Syscall handler
 	jal syscall_handler
 	sw $v0, SS_ARG4($sp)        # save v0 - arg4 to stack
 
+sysc_exit:	
 	# restore status
 	mfc0 $t0, $status
@@ -276,4 +281,11 @@
 	eret
 	
+sysc_int_control:
+	jal ddi_int_control
+	addi $a1, $sp, SS_STATUS
+	
+	j sysc_exit
+	nop
+	
 tlb_refill_handler:
 	KERNEL_STACK_TO_K0
Index: generic/include/ddi/ddi.h
===================================================================
--- generic/include/ddi/ddi.h	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ generic/include/ddi/ddi.h	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -40,4 +40,6 @@
  * Interface to be implemented by all architectures.
  */
+extern __native ddi_int_control_arch(__native enable, __native *flags);
+extern __native ddi_int_control(__native enable, __native *flags);
 extern int ddi_enable_iospace_arch(task_t *task, __address ioaddr, size_t size);
 
Index: generic/include/security/cap.h
===================================================================
--- generic/include/security/cap.h	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ generic/include/security/cap.h	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -58,4 +58,9 @@
 #define CAP_IO_MANAGER		(1<<2)
 
+/**
+ * CAP_INT_CONTROL allows its holder to disable interrupts
+ */
+#define CAP_INT_CONTROL         (1<<3)
+
 typedef __u32 cap_t;
 
Index: generic/include/syscall/syscall.h
===================================================================
--- generic/include/syscall/syscall.h	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ generic/include/syscall/syscall.h	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -33,4 +33,5 @@
 	SYS_IO = 0,
 	SYS_TLS_SET = 1, /* Hardcoded in AMD64,IA32 uspace - psthread.S */
+	SYS_INT_CONTROL = 2, /* Hardcoded in all SYSCALL handlers */
 	SYS_THREAD_CREATE,
 	SYS_THREAD_EXIT,
Index: generic/src/ddi/ddi.c
===================================================================
--- generic/src/ddi/ddi.c	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ generic/src/ddi/ddi.c	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -195,2 +195,10 @@
 	return (__native) ddi_enable_iospace((task_id_t) arg.task_id, (__address) arg.ioaddr, (size_t) arg.size);
 }
+
+__native ddi_int_control(__native enable, __native *flags)
+{
+	if (! cap_get(TASK) & CAP_INT_CONTROL)
+		return EPERM;
+	return ddi_int_control_arch(enable, flags);
+}
+
Index: generic/src/syscall/syscall.c
===================================================================
--- generic/src/syscall/syscall.c	(revision 68091bdbde5f024c9fe32f6a32b8a6cbd415a620)
+++ generic/src/syscall/syscall.c	(revision c7c0b89b6e6a42abfe99e8cb5d3d5882ffdeac6e)
@@ -65,4 +65,9 @@
 }
 
+static __native sys_int_control(int enable)
+{
+	panic("Not implemented.");
+}
+
 /** Dispatch system call */
 __native syscall_handler(__native a1, __native a2, __native a3,
@@ -78,4 +83,5 @@
 	sys_io,
 	sys_tls_set,
+	sys_int_control,
 	sys_thread_create,
 	sys_thread_exit,
