Index: sandbox/linux/seccomp-bpf/syscall.cc |
diff --git a/sandbox/linux/seccomp-bpf/syscall.cc b/sandbox/linux/seccomp-bpf/syscall.cc |
index bc6461f11773b245919596162eb4230162be56a4..4d55936189b17761ed71fa14df6752583cdf5cc5 100644 |
--- a/sandbox/linux/seccomp-bpf/syscall.cc |
+++ b/sandbox/linux/seccomp-bpf/syscall.cc |
@@ -190,12 +190,15 @@ asm(// We need to be able to tell the kernel exactly where we made a |
"9:.size SyscallAsm, 9b-SyscallAsm\n" |
#elif defined(__mips__) |
".text\n" |
+ ".option pic2\n" |
".align 4\n" |
+ ".global SyscallAsm\n" |
".type SyscallAsm, @function\n" |
"SyscallAsm:.ent SyscallAsm\n" |
".frame $sp, 40, $ra\n" |
".set push\n" |
".set noreorder\n" |
+ ".cpload $t9\n" |
"addiu $sp, $sp, -40\n" |
"sw $ra, 36($sp)\n" |
// Check if "v0" is negative. If so, do not attempt to make a |
@@ -204,7 +207,11 @@ asm(// We need to be able to tell the kernel exactly where we made a |
// used as a marker that BPF code inspects. |
"bgez $v0, 1f\n" |
" nop\n" |
- "la $v0, 2f\n" |
+ // This is equivalent to "la $v0, 2f". |
+ // LA macro has to be avoided since LLVM-AS has issue with LA in PIC mode |
+ // https://llvm.org/bugs/show_bug.cgi?id=27644 |
+ "lw $v0, %got(2f)($gp)\n" |
+ "addiu $v0, $v0, %lo(2f)\n" |
"b 2f\n" |
" nop\n" |
// On MIPS first four arguments go to registers a0 - a3 and any |
@@ -262,6 +269,10 @@ asm(// We need to be able to tell the kernel exactly where we made a |
extern "C" { |
intptr_t SyscallAsm(intptr_t nr, const intptr_t args[6]); |
} |
+#elif defined(__mips__) |
+extern "C" { |
+intptr_t SyscallAsm(intptr_t nr, const intptr_t args[8]); |
+} |
#endif |
} // namespace |
@@ -395,20 +406,21 @@ intptr_t Syscall::SandboxSyscallRaw(int nr, |
const intptr_t* args, |
intptr_t* err_ret) { |
register intptr_t ret __asm__("v0") = nr; |
+ register intptr_t syscallasm __asm__("t9") = (intptr_t) &SyscallAsm; |
// a3 register becomes non zero on error. |
register intptr_t err_stat __asm__("a3") = 0; |
{ |
register const intptr_t* data __asm__("a0") = args; |
asm volatile( |
- "la $t9, SyscallAsm\n" |
"jalr $t9\n" |
" nop\n" |
: "=r"(ret), "=r"(err_stat) |
: "0"(ret), |
- "r"(data) |
+ "r"(data), |
+ "r"(syscallasm) |
// a2 is in the clober list so inline assembly can not change its |
// value. |
- : "memory", "ra", "t9", "a2"); |
+ : "memory", "ra", "a2"); |
} |
// Set an error status so it can be used outside of this function |