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

Unified Diff: fusl/src/internal/i386/syscall.s

Issue 1573973002: Add a "fork" of musl as //fusl. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « fusl/src/internal/futex.h ('k') | fusl/src/internal/intscan.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: fusl/src/internal/i386/syscall.s
diff --git a/fusl/src/internal/i386/syscall.s b/fusl/src/internal/i386/syscall.s
new file mode 100644
index 0000000000000000000000000000000000000000..0ebf221842159ad2aeda5abc8753f9340abf1014
--- /dev/null
+++ b/fusl/src/internal/i386/syscall.s
@@ -0,0 +1,78 @@
+.hidden __sysinfo
+
+# The calling convention for __vsyscall has the syscall number
+# and 5 args arriving as: eax, edx, ecx, edi, esi, 4(%esp).
+# This ensures that the inline asm in the C code never has to touch
+# ebx or ebp (which are unavailable in PIC and frame-pointer-using
+# code, respectively), and optimizes for size/simplicity in the caller.
+
+.global __vsyscall
+.hidden __vsyscall
+.type __vsyscall,@function
+__vsyscall:
+ push %edi
+ push %ebx
+ mov %edx,%ebx
+ mov %edi,%edx
+ mov 12(%esp),%edi
+ push %eax
+ call 1f
+2: mov %ebx,%edx
+ pop %ebx
+ pop %ebx
+ pop %edi
+ ret
+
+1: mov (%esp),%eax
+ add $[__sysinfo-2b],%eax
+ mov (%eax),%eax
+ test %eax,%eax
+ jz 1f
+ push %eax
+ mov 8(%esp),%eax
+ ret # tail call to kernel vsyscall entry
+1: mov 4(%esp),%eax
+ int $128
+ ret
+
+# The __vsyscall6 entry point is used only for 6-argument syscalls.
+# Instead of passing the 5th argument on the stack, a pointer to the
+# 5th and 6th arguments is passed. This is ugly, but there are no
+# register constraints the inline asm could use that would make it
+# possible to pass two arguments on the stack.
+
+.global __vsyscall6
+.hidden __vsyscall6
+.type __vsyscall6,@function
+__vsyscall6:
+ push %ebp
+ push %eax
+ mov 12(%esp), %ebp
+ mov (%ebp), %eax
+ mov 4(%ebp), %ebp
+ push %eax
+ mov 4(%esp),%eax
+ call __vsyscall
+ pop %ebp
+ pop %ebp
+ pop %ebp
+ ret
+
+.global __syscall
+.hidden __syscall
+.type __syscall,@function
+__syscall:
+ lea 24(%esp),%eax
+ push %esi
+ push %edi
+ push %eax
+ mov 16(%esp),%eax
+ mov 20(%esp),%edx
+ mov 24(%esp),%ecx
+ mov 28(%esp),%edi
+ mov 32(%esp),%esi
+ call __vsyscall6
+ pop %edi
+ pop %edi
+ pop %esi
+ ret
« no previous file with comments | « fusl/src/internal/futex.h ('k') | fusl/src/internal/intscan.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698