Index: boot/arch/ia64/src/pal_asm.S
===================================================================
--- boot/arch/ia64/src/pal_asm.S	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ boot/arch/ia64/src/pal_asm.S	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -32,11 +32,16 @@
 
 pal_static_call:
-	alloc loc0 = ar.pfs, 7, 5, 0, 0
+	alloc loc0 = ar.pfs, 7, 6, 0, 0
+
+	mov loc1 = psr ;;
+	mov psr.l = r0 ;;
+	srlz.i
+	srlz.d
 	
-	mov loc1 = gp
-	mov loc2 = rp
+	mov loc2 = gp
+	mov loc3 = rp
 	
-	addl loc3 = @gprel(pal_proc), gp
-	
+	addl loc4 = @gprel(pal_proc), gp
+
 	mov r28 = in0
 	mov r29 = in1
@@ -44,12 +49,16 @@
 	mov r31 = in3 ;;
 	
-	ld8 loc3 = [loc3]
-	movl loc4 = 0f ;;
+	ld8 loc4 = [loc4]
+	movl loc5 = 0f ;;
 
-	mov b6 = loc3
-	mov rp = loc4 ;;
+	mov b6 = loc4
+	mov rp = loc5 ;;
 	br.cond.sptk.many b6
 
 0:
+	mov psr.l = loc1 ;;
+	srlz.i
+	srlz.d
+
 	cmp.ne p7,p0 = 0, in4
 	cmp.ne p8,p0 = 0, in5
@@ -60,6 +69,6 @@
 (p9)	st8 [in6] = r11
 	
-	mov gp = loc1
-	mov rp = loc2 ;;
+	mov gp = loc2
+	mov rp = loc3 ;;
 	
 	mov ar.pfs = loc0
Index: boot/arch/ia64/src/sal_asm.S
===================================================================
--- boot/arch/ia64/src/sal_asm.S	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ boot/arch/ia64/src/sal_asm.S	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -29,4 +29,9 @@
 .explicit
 
+#define STACK_SCRATCH_AREA	16
+#define STACK_IN8		(0 + STACK_SCRATCH_AREA)
+#define STACK_IN9		(8 + STACK_SCRATCH_AREA)
+#define STACK_IN10		(16 + STACK_SCRATCH_AREA)
+
 .global sal_call
 
@@ -39,6 +44,8 @@
 #
 sal_call:
-	alloc loc0 = ar.pfs, 11, 5, 8, 0
+	alloc loc0 = ar.pfs, 8, 8, 8, 0
 	
+	adds sp = -STACK_SCRATCH_AREA, sp
+
 	mov loc1 = gp
 	mov loc2 = rp
@@ -57,20 +64,31 @@
 	
 	ld8 loc3 = [loc3]
-	ld8 gp = [loc4] ;;
+	ld8 gp = [loc4]
+
+	adds r14 = STACK_IN8 + STACK_SCRATCH_AREA, sp
+	adds r15 = STACK_IN9 + STACK_SCRATCH_AREA, sp
+	adds r16 = STACK_IN10 + STACK_SCRATCH_AREA, sp ;;
+
+	ld8 loc5 = [r14]
+	ld8 loc6 = [r15]
+	ld8 loc7 = [r16]
 	
 	mov b6 = loc3 ;;
 	br.call.sptk.many rp = b6
 	
-	cmp.ne p7,p0 = 0, in8
-	cmp.ne p8,p0 = 0, in9
-	cmp.ne p9,p0 = 0, in10 ;;
+	cmp.ne p7,p0 = 0, loc5 
+	cmp.ne p8,p0 = 0, loc6 
+	cmp.ne p9,p0 = 0, loc7 ;;
 	
-(p7)	st8 [in8] = r9
-(p8)	st8 [in9] = r10
-(p9)	st8 [in10] = r11
+(p7)	st8 [loc5] = r9
+(p8)	st8 [loc6] = r10
+(p9)	st8 [loc7] = r11
 	
 	mov gp = loc1
-	mov rp = loc2 ;;
+	mov rp = loc2
+
+	adds sp = STACK_SCRATCH_AREA, sp ;;
 	
 	mov ar.pfs = loc0
 	br.ret.sptk.many rp
+
Index: kernel/arch/ia64/include/asm.h
===================================================================
--- kernel/arch/ia64/include/asm.h	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ kernel/arch/ia64/include/asm.h	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -61,4 +61,5 @@
 	asm volatile (
 		"mf\n"
+		"mf.a\n"
 		::: "memory"
 	);
@@ -74,4 +75,5 @@
 	asm volatile (
 		"mf\n"
+		"mf.a\n"
 		::: "memory"
 	);
@@ -87,4 +89,5 @@
 	asm volatile (
 		"mf\n"
+		"mf.a\n"
 		::: "memory"
 	);
@@ -104,4 +107,9 @@
 	else
 		v = *port;
+
+	asm volatile (
+		"mf.a\n"
+		::: "memory"
+	);
 	
 	return v;
@@ -121,4 +129,9 @@
 	else
 		v = *port;
+
+	asm volatile (
+		"mf.a\n"
+		::: "memory"
+	);
 	
 	return v;
@@ -138,4 +151,9 @@
 	else
 		v = *port;
+
+	asm volatile (
+		"mf.a\n"
+		::: "memory"
+	);
 
 	return v;
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ kernel/arch/ia64/src/ia64.c	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -144,5 +144,5 @@
 #endif
 #ifdef MACHINE_i460GX
-	platform = "i460GX";
+	platform = "pc";
 #endif
 	sysinfo_set_item_data("platform", NULL, (void *) platform,
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ kernel/generic/src/ipc/irq.c	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -358,7 +358,4 @@
 	ASSERT(irq->notif_cfg.answerbox == box);
 	
-	/* Free up the pseudo code and associated structures. */
-	code_free(irq->notif_cfg.code);
-	
 	/* Remove the IRQ from the answerbox's list. */
 	list_remove(&irq->notif_cfg.link);
@@ -378,4 +375,7 @@
 	irq_spinlock_unlock(&box->irq_lock, false);
 	irq_spinlock_unlock(&irq_uspace_hash_table_lock, true);
+	
+	/* Free up the pseudo code and associated structures. */
+	code_free(irq->notif_cfg.code);
 	
 	/* Free up the IRQ structure. */
@@ -425,7 +425,4 @@
 		list_remove(&irq->notif_cfg.link);
 		
-		/* Free up the pseudo code and associated structures. */
-		code_free(irq->notif_cfg.code);
-		
 		/*
 		 * We need to drop the IRQ lock now because hash_table_remove()
@@ -439,6 +436,17 @@
 		/* Remove from the hash table. */
 		hash_table_remove(&irq_uspace_hash_table, key, 2);
-		
+
+		/*
+		 * Release both locks so that we can free the pseudo code.
+		 */
+		irq_spinlock_unlock(&box->irq_lock, false);
+		irq_spinlock_unlock(&irq_uspace_hash_table_lock, true);
+
+		code_free(irq->notif_cfg.code);
 		free(irq);
+		
+		/* Reacquire both locks before taking another round. */
+		irq_spinlock_lock(&irq_uspace_hash_table_lock, true);
+		irq_spinlock_lock(&box->irq_lock, false);
 	}
 	
Index: kernel/generic/src/mm/page.c
===================================================================
--- kernel/generic/src/mm/page.c	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ kernel/generic/src/mm/page.c	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -168,9 +168,9 @@
 int page_find_mapping(uintptr_t virt, void **phys)
 {
-	mutex_lock(&AS->lock);
+	page_table_lock(AS, true);
 	
 	pte_t *pte = page_mapping_find(AS, virt, false);
 	if ((!PTE_VALID(pte)) || (!PTE_PRESENT(pte))) {
-		mutex_unlock(&AS->lock);
+		page_table_unlock(AS, true);
 		return ENOENT;
 	}
@@ -179,5 +179,5 @@
 	    (virt - ALIGN_DOWN(virt, PAGE_SIZE));
 	
-	mutex_unlock(&AS->lock);
+	page_table_unlock(AS, true);
 	
 	return EOK;
Index: uspace/drv/bus/usb/uhci/transfer_list.c
===================================================================
--- uspace/drv/bus/usb/uhci/transfer_list.c	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ uspace/drv/bus/usb/uhci/transfer_list.c	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -110,6 +110,6 @@
 	assert(instance);
 	assert(uhci_batch);
-	usb_log_debug2("Queue %s: Adding batch(%p).\n", instance->name,
-	    uhci_batch->usb_batch);
+	usb_log_debug2("Batch %p adding to queue %s.\n",
+	    uhci_batch->usb_batch, instance->name);
 
 	fibril_mutex_lock(&instance->guard);
@@ -139,7 +139,7 @@
 	list_append(&uhci_batch->link, &instance->batch_list);
 
-	usb_log_debug2("Batch %p " USB_TRANSFER_BATCH_FMT " scheduled in queue %s.\n",
-	    uhci_batch, USB_TRANSFER_BATCH_ARGS(*uhci_batch->usb_batch),
-	    instance->name);
+	usb_log_debug2("Batch %p " USB_TRANSFER_BATCH_FMT
+	    " scheduled in queue %s.\n", uhci_batch->usb_batch,
+	    USB_TRANSFER_BATCH_ARGS(*uhci_batch->usb_batch), instance->name);
 	fibril_mutex_unlock(&instance->guard);
 }
@@ -205,6 +205,6 @@
 	assert(fibril_mutex_is_locked(&instance->guard));
 
-	usb_log_debug2("Queue %s: removing batch(%p).\n",
-	    instance->name, uhci_batch->usb_batch);
+	usb_log_debug2("Batch %p removing from queue %s.\n",
+	    uhci_batch->usb_batch, instance->name);
 
 	/* Assume I'm the first */
@@ -228,6 +228,6 @@
 	list_remove(&uhci_batch->link);
 	usb_log_debug2("Batch %p " USB_TRANSFER_BATCH_FMT " removed (%s) "
-	    "from %s, next: %x.\n",
-	    uhci_batch, USB_TRANSFER_BATCH_ARGS(*uhci_batch->usb_batch),
+	    "from %s, next: %x.\n", uhci_batch->usb_batch,
+	    USB_TRANSFER_BATCH_ARGS(*uhci_batch->usb_batch),
 	    qpos, instance->name, uhci_batch->qh->next);
 }
Index: uspace/drv/bus/usb/uhci/uhci_batch.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.c	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ uspace/drv/bus/usb/uhci/uhci_batch.c	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -174,7 +174,7 @@
 			assert(uhci_batch->usb_batch->ep != NULL);
 
-			usb_log_debug("Batch(%p) found error TD(%zu):%"
+			usb_log_debug("Batch %p found error TD(%zu->%p):%"
 			    PRIx32 ".\n", uhci_batch->usb_batch, i,
-			    uhci_batch->tds[i].status);
+			    &uhci_batch->tds[i], uhci_batch->tds[i].status);
 			td_print_status(&uhci_batch->tds[i]);
 
Index: uspace/drv/infrastructure/root/root.c
===================================================================
--- uspace/drv/infrastructure/root/root.c	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ uspace/drv/infrastructure/root/root.c	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -158,6 +158,9 @@
 	if (asprintf(&match_id, PLATFORM_FUN_MATCH_ID_FMT, platform) == -1) {
 		ddf_msg(LVL_ERROR, "Memory allocation failed.");
-		return ENOMEM;
-	}
+		free(platform);
+		return ENOMEM;
+	}
+
+	free(platform);
 
 	/* Add function. */
@@ -169,4 +172,5 @@
 	if (fun == NULL) {
 		ddf_msg(LVL_ERROR, "Error creating function %s", name);
+		free(match_id);
 		return ENOMEM;
 	}
@@ -176,4 +180,5 @@
 		ddf_msg(LVL_ERROR, "Failed adding match IDs to function %s",
 		    name);
+		free(match_id);
 		ddf_fun_destroy(fun);
 		return rc;
@@ -208,5 +213,5 @@
 	 * vital for the system.
 	 */
-	add_virtual_root_fun(dev);
+	(void) add_virtual_root_fun(dev);
 
 	/* Register root device's children. */
Index: uspace/lib/c/arch/ia64/include/ddi.h
===================================================================
--- uspace/lib/c/arch/ia64/include/ddi.h	(revision 09c954ba81b1fc857478c0408ed2e59077744202)
+++ uspace/lib/c/arch/ia64/include/ddi.h	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
@@ -62,4 +62,5 @@
 
 	asm volatile ("mf\n" ::: "memory");
+	asm volatile ("mf.a\n" ::: "memory");
 }
 
@@ -76,4 +77,5 @@
 
 	asm volatile ("mf\n" ::: "memory");
+	asm volatile ("mf.a\n" ::: "memory");
 }
 
@@ -90,4 +92,5 @@
 
 	asm volatile ("mf\n" ::: "memory");
+	asm volatile ("mf.a\n" ::: "memory");
 }
 
@@ -106,4 +109,6 @@
 		v = *port;
 	}
+
+	asm volatile ("mf.a\n" ::: "memory");
 
 	return v;
@@ -125,4 +130,6 @@
 	}
 
+	asm volatile ("mf.a\n" ::: "memory");
+
 	return v;
 }
@@ -134,5 +141,5 @@
 	asm volatile ("mf\n" ::: "memory");
 
-	if (port < (ioport32_t *) port) {
+	if (port < (ioport32_t *) IO_SPACE_BOUNDARY) {
 		uintptr_t prt = (uintptr_t) port;
 
@@ -143,4 +150,6 @@
 	}
 
+	asm volatile ("mf.a\n" ::: "memory");
+
 	return v;
 }
