[Cbe-oss-dev] [PATCH] libspe2 set errno via second argument of perror assist call

Patrick Mansfield patmans at us.ibm.com
Tue Jun 12 07:10:57 EST 2007


Set errno to the second argument passed to the perror assist call.

At least with a current SPU newlib, if no argument is passed (as the
second argument) we end up with the current stack value as the second
argument, so it might be impossible to ever have the value be less than
4096. So, we could check for bad errno values, but perror already prints
messages for those, and probably has better range checking, so don't
bother trying to check the errno range.

errno is always cleared before calling the callback/assist code, so
without this change, SPU perror always prints "Success". With this
change and no corresponding SPU newlib change, SPU perror will most
likely print "Unknown error <number>".

Using a new opcode would certainly allow us to maintain compatibility with
the current buggy behaviour.

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

Index: quilt-libspe2/spebase/default_c99_handler.c
===================================================================
--- quilt-libspe2.orig/spebase/default_c99_handler.c
+++ quilt-libspe2/spebase/default_c99_handler.c
@@ -1870,20 +1870,26 @@ int default_c99_handler_ferror(char *ls,
 /**
  * default_c99_handler_perror
  * @ls: base pointer to SPE local-store area.
- * @opdata: per C99 call opcode & data.
+ * @opdata: per C99 call opcode & data, plus the value of errno on the SPU
+ * must be passed.
  *
  * SPE C99 library operation, per: ISO/IEC C Standard 9899:1999,
  * implementing:
  *
- *	void perror(const char *s);
+ *  void perror(const char *s);
  */
 int default_c99_handler_perror(char *ls, unsigned long opdata)
 {
-    DECL_1_ARGS();
+    DECL_2_ARGS();
     char *s;
 
     DEBUG_PRINTF("%s\n", __func__);
     s = GET_LS_PTR_NULL(arg0->slot[0]);
+    errno = arg1->slot[0];
+    /*
+     * Older versions did not pass errno, so using older SPU newlib with
+     * current libspe will likely give ouput like "Unknown error 262016".
+     */
     perror(s);
     return 0;
 }



More information about the cbe-oss-dev mailing list