Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "sandbox/linux/seccomp-bpf/syscall.h" | 5 #include "sandbox/linux/seccomp-bpf/syscall.h" |
| 6 | 6 |
| 7 #include <asm/unistd.h> | 7 #include <asm/unistd.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 218 // Enter the kernel | 218 // Enter the kernel |
| 219 "syscall\n" | 219 "syscall\n" |
| 220 // This is our "magic" return address that the BPF filter sees. | 220 // This is our "magic" return address that the BPF filter sees. |
| 221 // Restore the return address from the stack. | 221 // Restore the return address from the stack. |
| 222 "2:lw $ra, 36($sp)\n" | 222 "2:lw $ra, 36($sp)\n" |
| 223 "jr $ra\n" | 223 "jr $ra\n" |
| 224 " addiu $sp, $sp, 40\n" | 224 " addiu $sp, $sp, 40\n" |
| 225 ".set pop\n" | 225 ".set pop\n" |
| 226 ".end SyscallAsm\n" | 226 ".end SyscallAsm\n" |
| 227 ".size SyscallAsm,.-SyscallAsm\n" | 227 ".size SyscallAsm,.-SyscallAsm\n" |
| 228 #elif defined(__aarch64__) | |
|
jln (very slow on Chromium)
2014/08/21 19:04:53
I did not review this yet.
| |
| 229 ".text\n" | |
| 230 ".align 2\n" | |
| 231 ".type SyscallAsm, %function\n" | |
| 232 "SyscallAsm:\n" | |
| 233 ".cfi_startproc\n" | |
| 234 "cmp x0, #0\n" | |
| 235 "b.ge 1f\n" | |
| 236 "adr x0,2f\n" | |
| 237 "b 2f\n" | |
| 238 "1:ldr x5, [x6, #40]\n" | |
| 239 "ldr x4, [x6, #32]\n" | |
| 240 "ldr x3, [x6, #24]\n" | |
| 241 "ldr x2, [x6, #16]\n" | |
| 242 "ldr x1, [x6, #8]\n" | |
| 243 "mov x8, x0\n" | |
| 244 "ldr x0, [x6, #0]\n" | |
| 245 // Enter the kernel | |
| 246 "svc 0\n" | |
| 247 "2:ret\n" | |
| 248 ".cfi_endproc\n" | |
| 249 ".size SyscallAsm, .-SyscallAsm\n" | |
| 228 #endif | 250 #endif |
| 229 ); // asm | 251 ); // asm |
| 230 | 252 |
| 231 } // namespace | 253 } // namespace |
| 232 | 254 |
| 233 intptr_t Syscall::InvalidCall() { | 255 intptr_t Syscall::InvalidCall() { |
| 234 // Explicitly pass eight zero arguments just in case. | 256 // Explicitly pass eight zero arguments just in case. |
| 235 return Call(kInvalidSyscallNumber, 0, 0, 0, 0, 0, 0, 0, 0); | 257 return Call(kInvalidSyscallNumber, 0, 0, 0, 0, 0, 0, 0, 0); |
| 236 } | 258 } |
| 237 | 259 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 #elif defined(__mips__) | 356 #elif defined(__mips__) |
| 335 int err_status; | 357 int err_status; |
| 336 intptr_t ret = Syscall::SandboxSyscallRaw(nr, args, &err_status); | 358 intptr_t ret = Syscall::SandboxSyscallRaw(nr, args, &err_status); |
| 337 | 359 |
| 338 if (err_status) { | 360 if (err_status) { |
| 339 // On error, MIPS returns errno from syscall instead of -errno. | 361 // On error, MIPS returns errno from syscall instead of -errno. |
| 340 // The purpose of this negation is for SandboxSyscall() to behave | 362 // The purpose of this negation is for SandboxSyscall() to behave |
| 341 // more like it would on other architectures. | 363 // more like it would on other architectures. |
| 342 ret = -ret; | 364 ret = -ret; |
| 343 } | 365 } |
| 366 #elif defined(__aarch64__) | |
| 367 intptr_t ret; | |
| 368 { | |
| 369 register intptr_t inout __asm__("x0") = nr; | |
| 370 register const intptr_t* data __asm__("x6") = args; | |
| 371 asm volatile("bl SyscallAsm\n" | |
| 372 : "=r"(inout) | |
| 373 : "0"(inout), "r"(data) | |
| 374 : "memory", "x1", "x2", "x3", "x4", "x5", "x8", "x30"); | |
| 375 ret = inout; | |
| 376 } | |
| 377 | |
| 344 #else | 378 #else |
| 345 #error "Unimplemented architecture" | 379 #error "Unimplemented architecture" |
| 346 #endif | 380 #endif |
| 347 return ret; | 381 return ret; |
| 348 } | 382 } |
| 349 | 383 |
| 350 void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) { | 384 void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) { |
| 351 #if defined(__mips__) | 385 #if defined(__mips__) |
| 352 // Mips ABI states that on error a3 CPU register has non zero value and if | 386 // Mips ABI states that on error a3 CPU register has non zero value and if |
| 353 // there is no error, it should be zero. | 387 // there is no error, it should be zero. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 } | 419 } |
| 386 | 420 |
| 387 // Set an error status so it can be used outside of this function | 421 // Set an error status so it can be used outside of this function |
| 388 *err_ret = err_stat; | 422 *err_ret = err_stat; |
| 389 | 423 |
| 390 return ret; | 424 return ret; |
| 391 } | 425 } |
| 392 #endif // defined(__mips__) | 426 #endif // defined(__mips__) |
| 393 | 427 |
| 394 } // namespace sandbox | 428 } // namespace sandbox |
| OLD | NEW |