| ... | @@ -72,11 +72,17 @@ pub fn syscall6( | ... | @@ -72,11 +72,17 @@ pub fn syscall6( |
| 72 | arg5: usize, | 72 | arg5: usize, |
| 73 | arg6: usize, | 73 | arg6: usize, |
| 74 | ) usize { | 74 | ) usize { |
| | 75 | // The 6th argument is passed via memory as we're out of registers if ebp is |
| | 76 | // used as frame pointer. We push arg6 value on the stack before changing |
| | 77 | // ebp or esp as the compiler may reference it as an offset relative to one |
| | 78 | // of those two registers. |
| 75 | return asm volatile ( | 79 | return asm volatile ( |
| 76 | \\ push %%ebp | 80 | \\ push %[arg6] |
| 77 | \\ mov %[arg6], %%ebp | 81 | \\ push %%ebp |
| 78 | \\ int $0x80 | 82 | \\ mov 4(%%esp), %%ebp |
| 79 | \\ pop %%ebp | 83 | \\ int $0x80 |
| | 84 | \\ pop %%ebp |
| | 85 | \\ add $4, %%esp |
| 80 | : [ret] "={eax}" (-> usize) | 86 | : [ret] "={eax}" (-> usize) |
| 81 | : [number] "{eax}" (number), | 87 | : [number] "{eax}" (number), |
| 82 | [arg1] "{ebx}" (arg1), | 88 | [arg1] "{ebx}" (arg1), |