summaryrefslogtreecommitdiffstats
path: root/libgloss/nds32/syscall_extra.h
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/nds32/syscall_extra.h')
-rw-r--r--libgloss/nds32/syscall_extra.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/libgloss/nds32/syscall_extra.h b/libgloss/nds32/syscall_extra.h
index f2ab2d562..73d36b973 100644
--- a/libgloss/nds32/syscall_extra.h
+++ b/libgloss/nds32/syscall_extra.h
@@ -38,4 +38,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define SYS_geterr 6001
+
+/* Define macros that generate assembly output. */
+.macro SYS_WRAPPER name num
+ .text
+ .global \name
+ .type \name, @function
+ .align 2
+\name:
+ /* Make syscall with arg=`\num'.
+ Reture value `-1' stored in $r0 means there is something wrong.
+ If there is something wrong, make syscall to get `SYS_geterr' to get
+ error code to see what exactly happens and store it in errno . */
+ syscall \num /* Make syscall with arg=`\num'. */
+ addi $r1, $r0, 1
+ bnez $r1, 1f /* Branch if success. */
+ syscall SYS_geterr /* There is something wrong. */
+ s.w $r0, errno /* Store error code into errno. */
+ move $r0, -1
+1:
+ ret
+ .size \name, .-\name
+.endm
+
#endif /* _SYSCALL_EXTRA_H */