Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(674)

Side by Side Diff: sandbox/linux/seccomp-bpf/syscall.cc

Issue 487143003: sandbox: Add Arm64 support for seccomp-BPF (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove IsArchitectureArm64 Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698