Index: arch/mips32/include/exception.h
===================================================================
--- arch/mips32/include/exception.h	(revision e8194664346da297d4362295839ff6b1fb615c0b)
+++ arch/mips32/include/exception.h	(revision f58af46f91b507488f711011ceb5691c4a7358d3)
@@ -96,5 +96,5 @@
 static inline void istate_set_retaddr(istate_t *istate, __address retaddr)
 {
-	/* TODO */
+	istate->epc = retaddr;
 }
 
Index: arch/mips32/src/asm.S
===================================================================
--- arch/mips32/src/asm.S	(revision e8194664346da297d4362295839ff6b1fb615c0b)
+++ arch/mips32/src/asm.S	(revision f58af46f91b507488f711011ceb5691c4a7358d3)
@@ -67,11 +67,38 @@
 memcpy_from_uspace:
 memcpy_to_uspace:
-	j _memcpy
-	nop
+        srl     $t1,$a2,0x2
+	beqz    $t1,1f
+        move    $t0,$zero
+        move    $a3,$zero
+2:	
+        addu    $v0,$a1,$a3
+        lw      $v1,0($v0)
+        addiu   $t0,$t0,1
+        addu    $v0,$a0,$a3
+        sw      $v1,0($v0)
+        bne     $t0,$t1,2b
+        addiu   $a3,$a3,4
+1:	
+        andi    $a2,$a2,0x3
+        beqz    $a2,3f
+        move    $a3,$zero
+        sll     $v0,$t0,0x2
+        addu    $t1,$a0,$v0
+        addu    $t0,$v0,$a1
+4:	
+        addu    $v0,$t0,$a3
+        lbu     $a0,0($v0)
+        addu    $v1,$t1,$a3
+        addiu   $a3,$a3,1
+        bne     $a3,$a2,4b
+        sb      $a0,0($v1)
+3:	
+        jr      $ra
+        move    $v0,$a1
 
 memcpy_from_uspace_failover_address:
 memcpy_to_uspace_failover_address:
-	j memcpy_from_uspace_failover_address
-	nop
+	jr	$ra
+	move	$v0, $zero
 
 
Index: arch/mips32/src/start.S
===================================================================
--- arch/mips32/src/start.S	(revision e8194664346da297d4362295839ff6b1fb615c0b)
+++ arch/mips32/src/start.S	(revision f58af46f91b507488f711011ceb5691c4a7358d3)
@@ -285,7 +285,6 @@
 	add $sp, $k0, 0
 
+	jal tlb_refill /* tlb_refill(register_space) */
 	add $a0, $sp, 0 
-	jal tlb_refill /* tlb_refill(register_space) */
-	nop
 
 	REGISTERS_LOAD $sp
Index: generic/include/syscall/copy.h
===================================================================
--- generic/include/syscall/copy.h	(revision e8194664346da297d4362295839ff6b1fb615c0b)
+++ generic/include/syscall/copy.h	(revision f58af46f91b507488f711011ceb5691c4a7358d3)
@@ -38,12 +38,12 @@
 extern char memcpy_to_uspace_failover_address;
 
-extern int copy_from_uspace(void *dst, void *uspace_src, size_t size);
-extern int copy_to_uspace(void *dst_uspace, void *src, size_t size);
+extern int copy_from_uspace(void *dst, const void *uspace_src, size_t size);
+extern int copy_to_uspace(void *dst_uspace, const void *src, size_t size);
 
 /*
  * This interface must be implemented by each architecture.
  */
-extern int memcpy_from_uspace(void *dst, void *uspace_src, size_t size);
-extern int memcpy_to_uspace(void *uspace_dst, void *src, size_t size);
+extern int memcpy_from_uspace(void *dst, const void *uspace_src, size_t size);
+extern int memcpy_to_uspace(void *uspace_dst, const void *src, size_t size);
 
 #endif
Index: generic/src/ipc/sysipc.c
===================================================================
--- generic/src/ipc/sysipc.c	(revision e8194664346da297d4362295839ff6b1fb615c0b)
+++ generic/src/ipc/sysipc.c	(revision f58af46f91b507488f711011ceb5691c4a7358d3)
@@ -309,6 +309,8 @@
 	call = ipc_call_alloc(0);
 	rc = copy_from_uspace(&call->data.args, &data->args, sizeof(call->data.args));
-	if (rc != 0)
+	if (rc != 0) {
+		ipc_call_free(call);
 		return (__native) rc;
+	}
 	if (!(res=request_preprocess(call)))
 		ipc_call(phone, call);
Index: generic/src/syscall/copy.c
===================================================================
--- generic/src/syscall/copy.c	(revision e8194664346da297d4362295839ff6b1fb615c0b)
+++ generic/src/syscall/copy.c	(revision f58af46f91b507488f711011ceb5691c4a7358d3)
@@ -55,5 +55,5 @@
  * @return 0 on success or error code from @ref errno.h.
  */
-int copy_from_uspace(void *dst, void *uspace_src, size_t size)
+int copy_from_uspace(void *dst, const void *uspace_src, size_t size)
 {
 	ipl_t ipl;
@@ -96,5 +96,5 @@
  * @return 0 on success or error code from @ref errno.h.
  */
-int copy_to_uspace(void *uspace_dst, void *src, size_t size)
+int copy_to_uspace(void *uspace_dst, const void *src, size_t size)
 {
 	ipl_t ipl;
Index: generic/src/syscall/syscall.c
===================================================================
--- generic/src/syscall/syscall.c	(revision e8194664346da297d4362295839ff6b1fb615c0b)
+++ generic/src/syscall/syscall.c	(revision f58af46f91b507488f711011ceb5691c4a7358d3)
@@ -44,4 +44,5 @@
 #include <synch/futex.h>
 #include <ddi/ddi.h>
+#include <syscall/copy.h>
 
 static __native sys_io(int fd, const void * buf, size_t count) {
@@ -50,4 +51,5 @@
 
 	size_t i;
+	char str[10];
 	
 	for (i = 0; i < count; i++)
