diff --git a/reactos/ReactOS-arm.rbuild b/reactos/ReactOS-arm.rbuild
index 99eab9ab6b0..217416dbf40 100644
--- a/reactos/ReactOS-arm.rbuild
+++ b/reactos/ReactOS-arm.rbuild
@@ -80,7 +80,7 @@
-/directory>
+
diff --git a/reactos/ntoskrnl/ke/arm/trap.s b/reactos/ntoskrnl/ke/arm/trap.s
index e7170cd525a..a4d59608281 100644
--- a/reactos/ntoskrnl/ke/arm/trap.s
+++ b/reactos/ntoskrnl/ke/arm/trap.s
@@ -42,16 +42,22 @@
NESTED_ENTRY KiSoftwareInterruptException
PROLOG_END KiSoftwareInterruptException
-
+
//
- // Save return address
+ // Save the current lr
//
str lr, [sp, #-4]!
+ //
+ // Save the SVC lr and sp
+ //
+ str lr, [sp, #-4]!
+ str sp, [sp, #-4]!
+
//
// Make space for trap frame
//
- sub sp, sp, #(4*17)
+ sub sp, sp, #(4*15)
//
// Save user-mode registers
@@ -77,7 +83,7 @@
//
mov r0, sp
bl KiSoftwareInterruptHandler
-
+
//
// Skip IRQL
//
@@ -391,24 +397,65 @@ IntExit:
//
ldmia r5, {a1-a4}
add r5, r5, #(4* 4)
- //sub r6, r6, #4
//
- // Now copy the other arguments into our stack
//
-CopyLoop:
- cmp r6, #4
- //strne sp, [r5], #4
- //subne r6, r6, #1
- bge .
+ // This code is complete shit.
+ //
+ //
+ //
+ // Save stack address and return address
+ //
+ mov r11, sp
+ mov r10, lr
+
+ //
+ // Check if we have more than 4 arguments
+ //
+ cmp r6, #4
+ ble SysCall
+
+ //
+ // Make space on stack
+ //
+ sub r6, r6, #4
+ sub sp, sp, r6, lsl #2
+
+CopyLoop:
+ //
+ // Copy one parameter
+ //
+ ldr r7, [r5]
+ str r7, [sp]
+ add r5, r5, #4
+ add sp, sp, #4
+
+ //
+ // Keep looping until we've copied them all
+ //
+ cmp sp, r11
+ bne CopyLoop
+
+ //
+ // Set the stack
+ //
+ sub sp, sp, r6, lsl #2
+
//
// Now do the system call
//
+SysCall:
+ mov lr, pc
mov pc, r4
+
+ //
+ // Restore the stack
+ //
+ mov sp, r11
//
- // Should not get here
+ // Get us back
//
- b .
+ mov pc, r10
ENTRY_END KiSystemCall
diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c
index d9d66562431..1e3eadd096c 100644
--- a/reactos/ntoskrnl/ke/arm/trapc.c
+++ b/reactos/ntoskrnl/ke/arm/trapc.c
@@ -476,6 +476,7 @@ KiSystemService(IN PKTHREAD Thread,
//
// Copy them into the kernel stack
//
+ DPRINT1("Argument: %p\n", *Argument);
Arguments[i] = *Argument;
Argument++;
}
@@ -501,17 +502,22 @@ KiSystemService(IN PKTHREAD Thread,
// We were called from the kernel
//
Argument = (PULONG)TrapFrame->SvcSp;
+
+ //
+ // Bias for the values we saved
+ //
+ Argument += 2;
}
//
// Copy the rest
//
- DPRINT1("Stack: %p\n", Argument);
for (i = 4; i < ArgumentCount; i++)
{
//
// Copy into kernel stack
//
+ DPRINT1("Argument: %p\n", *Argument);
Arguments[i] = *Argument;
Argument++;
}
@@ -521,6 +527,7 @@ KiSystemService(IN PKTHREAD Thread,
// Do the system call and save result in EAX
//
TrapFrame->R0 = KiSystemCall(SystemCall, Arguments, ArgumentCount);
+ DPRINT1("Returned: %lx\n", TrapFrame->R0);
}
VOID