[Cbe-oss-dev] [PATCH] libspe2 add assist calls for sched_yield, umask, utime and utimes

Patrick Mansfield patmans at us.ibm.com
Tue Jun 19 09:24:15 EST 2007


Add assist calls for:

	int sched_yield(void)
	mode_t umask(mode_t mask)
	int utime(const char *filename, const struct utimbuf *buf)
	int utimes(const char *filename, const struct timeval times[2])

Signed-off-by: Patrick Mansfield <patmans at us.ibm.com>

Index: quilt-libspe2/spebase/default_posix1_handler.c
===================================================================
--- quilt-libspe2.orig/spebase/default_posix1_handler.c
+++ quilt-libspe2/spebase/default_posix1_handler.c
@@ -37,6 +37,7 @@
 #include <stdint.h>
 #include <pthread.h>
 #include <dirent.h>
+#include <utime.h>
 
 #include "default_posix1_handler.h"
 #include "handler_utils.h"
@@ -151,6 +152,10 @@ enum {
 	SPE_POSIX1_REWINDDIR,
 	SPE_POSIX1_SEEKDIR,
 	SPE_POSIX1_TELLDIR,
+	SPE_POSIX1_SCHED_YIELD,
+	SPE_POSIX1_UMASK,
+	SPE_POSIX1_UTIME,
+	SPE_POSIX1_UTIMES,
 	SPE_POSIX1_LAST_OPCODE,
 };
 #define SPE_POSIX1_NR_OPCODES	\
@@ -1959,6 +1964,96 @@ int default_posix1_handler_telldir(char 
     return 0;
 }
 
+/**
+ * default_posix1_handler_sched_yield
+ * @ls: base pointer to local store area.
+ * @opdata: POSIX.1 call opcode & data
+ *
+ * Implement:
+ *      int sched_yield(void)
+ */
+int default_posix1_handler_sched_yield(char *ls, unsigned long opdata)
+{
+    DECL_0_ARGS();
+    DECL_RET();
+    /*
+     * The kernel will call spu_yield internally, so do nothing here.
+     */
+    DEBUG_PRINTF("%s\n", __func__);
+    PUT_LS_RC(0, 0, 0, 0);
+    return 0;
+}
+
+/**
+ * default_posix1_handler_umask
+ * @ls: base pointer to local store area.
+ * @opdata: POSIX.1 call opcode & data
+ *
+ * Implement:
+ *      mode_t umask(mode_t mask)
+ */
+int default_posix1_handler_umask(char *ls, unsigned long opdata)
+{
+    DECL_1_ARGS();
+    DECL_RET();
+    mode_t mask;
+    int rc;
+
+    DEBUG_PRINTF("%s\n", __func__);
+    mask = arg0->slot[0];
+    rc = umask(mask);
+    PUT_LS_RC(rc, 0, 0, errno);
+    return 0;
+}
+
+/**
+ * default_posix1_handler_utime
+ * @ls: base pointer to local store area.
+ * @opdata: POSIX.1 call opcode & data.
+ *
+ * Implement:
+ *     int utime(const char *filename, const struct utimbuf *buf)
+ */
+int default_posix1_handler_utime(char *ls, unsigned long opdata)
+{
+    DECL_2_ARGS();
+    DECL_RET();
+    char *filename;
+    struct utimbuf *buf;
+    int rc;
+
+    DEBUG_PRINTF("%s\n", __func__);
+    filename = GET_LS_PTR(arg0->slot[0]);
+    buf = GET_LS_PTR(arg1->slot[0]);
+    rc = utime(filename, buf);
+    PUT_LS_RC(rc, 0, 0, errno);
+    return 0;
+}
+
+/**
+ * default_posix1_handler_utimes
+ * @ls: base pointer to local store area.
+ * @opdata: POSIX.1 call opcode & data.
+ *
+ * Implement:
+ *     int utimes(const char *filename, const struct timeval times[2])
+ */
+int default_posix1_handler_utimes(char *ls, unsigned long opdata)
+{
+    DECL_2_ARGS();
+    DECL_RET();
+    char *filename;
+    struct timeval *times; /* XXX is this correct? */
+    int rc;
+
+    DEBUG_PRINTF("%s\n", __func__);
+    filename = GET_LS_PTR(arg0->slot[0]);
+    times = GET_LS_PTR(arg1->slot[0]);
+    rc = utimes(filename, times);
+    PUT_LS_RC(rc, 0, 0, errno);
+    return 0;
+}
+
 int (*default_posix1_funcs[SPE_POSIX1_NR_OPCODES]) (char *, unsigned long) = {
 	[SPE_POSIX1_UNUSED]		= NULL,
 	[SPE_POSIX1_ADJTIMEX]		= default_posix1_handler_adjtimex,
@@ -2021,6 +2116,10 @@ int (*default_posix1_funcs[SPE_POSIX1_NR
 	[SPE_POSIX1_REWINDDIR]		= default_posix1_handler_rewinddir,
 	[SPE_POSIX1_SEEKDIR]		= default_posix1_handler_seekdir,
 	[SPE_POSIX1_TELLDIR]		= default_posix1_handler_telldir,
+	[SPE_POSIX1_SCHED_YIELD]	= default_posix1_handler_sched_yield,
+	[SPE_POSIX1_UMASK]		= default_posix1_handler_umask,
+	[SPE_POSIX1_UTIME]		= default_posix1_handler_utime,
+	[SPE_POSIX1_UTIMES]		= default_posix1_handler_utimes,
 };
 
 /**
Index: quilt-libspe2/spebase/default_posix1_handler.h
===================================================================
--- quilt-libspe2.orig/spebase/default_posix1_handler.h
+++ quilt-libspe2/spebase/default_posix1_handler.h
@@ -83,5 +83,9 @@ extern int default_posix1_handler_readdi
 extern int default_posix1_handler_rewinddir(char *ls, unsigned long args);
 extern int default_posix1_handler_seekdir(char *ls, unsigned long args);
 extern int default_posix1_handler_telldir(char *ls, unsigned long args);
+extern int default_posix1_handler_sched_yield(char *ls, unsigned long args);
+extern int default_posix1_handler_umask(char *ls, unsigned long args);
+extern int default_posix1_handler_utime(char *ls, unsigned long args);
+extern int default_posix1_handler_utimes(char *ls, unsigned long args);
 
 #endif /* __DEFAULT_POSIX1_HANDLER_H__ */



More information about the cbe-oss-dev mailing list