|
@@ -22,8 +22,24 @@
|
|
|
|
|
|
|
|
|
* an error number into errno. */
|
|
|
-int attribute_hidden __syscall_error(int err_no)
|
|
|
+
|
|
|
+
|
|
|
+ * calling convention ... The advantage is that this is the same
|
|
|
+ * size as the previous __syscall_error() but all the .S functions
|
|
|
+ * need just one instruction.
|
|
|
+ *
|
|
|
+ * Local .S files have to set %eax to the negative errno value
|
|
|
+ * and then jump to this function. The neglected return to caller
|
|
|
+ * and return value of -1 is taken care of here so we don't have to
|
|
|
+ * worry about it in the .S functions.
|
|
|
+ *
|
|
|
+ * We have to stash the errno from %eax in a local stack var because
|
|
|
+ * __set_errno will prob call a function thus clobbering %eax on us.
|
|
|
+ */
|
|
|
+void attribute_hidden __syscall_error(void)
|
|
|
{
|
|
|
- __set_errno(err_no);
|
|
|
- return -1;
|
|
|
+ register int eax asm("%eax");
|
|
|
+ int stack = -eax;
|
|
|
+ __set_errno(stack);
|
|
|
+ eax = -1;
|
|
|
}
|