libspe-1.0.1 release
Arnd Bergmann
arnd at arndb.de
Sat Nov 26 01:42:59 EST 2005
This is the latest version of libspe, which is now required
for use with spu-gdb. The changes since version 1.0 are
- add hooks for gdb to find debug info
- fix building for 64 bit (excludes c99 handlers currently)
- add a small test case suite for basic functionality testing
Arnd <><
PS: Jordi, please upload the rpms to the bsc.es site. I think we should
also have the source tarball on the same page as the source rpm.
diff -u -rN --exclude=CVS libspe-1.0/Makefile libspe-1.0.1/Makefile
--- libspe-1.0/Makefile 2005-11-04 15:48:28.000000000 +0000
+++ libspe-1.0.1/Makefile 2005-11-25 13:29:58.000000000 +0000
@@ -43,7 +43,7 @@
INSTALL_DIR := ${INSTALL} -d -m 755
MAJOR_VERSION := 1
-MINOR_VERSION := 0
+MINOR_VERSION := 0.1
libspe_SO := libspe.so.${MAJOR_VERSION}.${MINOR_VERSION}
libspe_SONAME := libspe.so.${MAJOR_VERSION}
@@ -135,7 +135,7 @@
clean:
rm -f $(libspe_SO) libspe.a $(libspe_OBJS) *~ tags elfspe elfspe-register
- rm -f $(FULLNAME)
+ rm -f elfspe.o $(TARBALL) $(FULLNAME)
make -C tests clean
.PHONY: all clean tests tags
diff -u -rN --exclude=CVS libspe-1.0/default_c99_handler.c libspe-1.0.1/default_c99_handler.c
--- libspe-1.0/default_c99_handler.c 2005-10-17 17:55:45.000000000 +0000
+++ libspe-1.0.1/default_c99_handler.c 2005-11-25 13:22:32.000000000 +0000
@@ -206,7 +206,8 @@
void *ptr;
};
#else
-#error Missing ppc64 va_list!
+#warning Missing ppc64 va_list!
+#warning Some c99 functions will not work
#endif /* __powerpc64__ */
/* TO-DO: update these to support 64b PPC-ABI. */
@@ -217,8 +218,10 @@
ap.nr = 127;
ap.ptr = (void *) vlist;
-#endif
return vfprintf(stream, format, (void *) &ap);
+#else
+ return 0;
+#endif
}
static int __do_vsprintf(char *string, char *format, __va_elem * vlist)
@@ -228,8 +231,10 @@
ap.nr = 127;
ap.ptr = (void *) vlist;
-#endif
return vsprintf(string, format, (void *) &ap);
+#else
+ return 0;
+#endif
}
static int __do_vsnprintf(char *string, size_t size, char *format,
@@ -240,8 +245,10 @@
ap.nr = 127;
ap.ptr = (void *) vlist;
-#endif
return vsnprintf(string, size, format, (void *) &ap);
+#else
+ return 0;
+#endif
}
static int __do_vfscanf(FILE * stream, char *format, __va_elem * vlist)
@@ -251,8 +258,10 @@
ap.nr = 127;
ap.ptr = (void *) vlist;
-#endif
return vfscanf(stream, format, (void *) &ap);
+#else
+ return 0;
+#endif
}
static int __do_vsscanf(char *string, char *format, __va_elem * vlist)
@@ -262,8 +271,10 @@
ap.nr = 127;
ap.ptr = (void *) vlist;
-#endif
return vsscanf(string, format, (void *) &ap);
+#else
+ return 0;
+#endif
}
static inline FILE *get_FILE(int nr)
diff -u -rN --exclude=CVS libspe-1.0/libspe.spec libspe-1.0.1/libspe.spec
--- libspe-1.0/libspe.spec 2005-11-04 15:48:28.000000000 +0000
+++ libspe-1.0.1/libspe.spec 2005-11-25 13:42:13.000000000 +0000
@@ -1,6 +1,6 @@
Name: libspe
-Version: 1.0
-Release: 1
+Version: 1.0.1
+Release: 2
License: LGPL
Group: System Environment/Base
Source: %{name}-%{version}.tar.gz
@@ -45,7 +45,7 @@
%install
rm -rf $RPM_BUILD_ROOT%{sysroot}
-make install DESTDIR=$RPM_BUILD_ROOT SYSROOT=%{sysroot} prefix=%{_prefix}
+make install DESTDIR=$RPM_BUILD_ROOT SYSROOT=%{sysroot} prefix=%{_prefix} libdir=%{_libdir}
%clean
rm -rf $RPM_BUILD_ROOT
diff -u -rN --exclude=CVS libspe-1.0/spe.c libspe-1.0.1/spe.c
--- libspe-1.0/spe.c 2005-11-07 12:56:31.000000000 +0000
+++ libspe-1.0.1/spe.c 2005-11-23 20:04:14.000000000 +0000
@@ -34,6 +34,7 @@
#include <sys/select.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/syscall.h>
#include <sys/spe.h>
#include "libspe.h"
@@ -62,7 +63,7 @@
void env_check(void);
static int __env_spu_debug_start = 0;
static int __env_spu_info = 0;
-static int check_env = 0; /* set to 1 when ready to act on env settings. */
+static int check_env = 1;
/*Default SPE group options
@@ -321,6 +322,16 @@
{
pthread_mutex_lock(&grp_list.mutex);
+ if (gid->numListSize == 1)
+ {
+ struct grpListElem *p=gid->grp_members;
+ gid->numListSize--;
+ free(p);
+ gid->grp_members = NULL;
+ pthread_mutex_unlock(&grp_list.mutex);
+ return 0;
+ }
+
for (struct grpListElem *p=gid->grp_members; p->next!=NULL; p=p->next)
{
struct grpListElem *np=p->next;
@@ -465,6 +476,8 @@
return NULL;
}
+ thread_store->handle = *handle;
+
/* Add SPE exec program */
DEBUG_PRINTF ("Add exec prog dst:0x%04x size:0x%04x\n",
@@ -600,6 +613,8 @@
munmap(thread_store->mem_mmap_base,LS_SIZE);
close (thread_store->fd_mem);
#endif
+ close (thread_store->ev_pipe[0]);
+ close (thread_store->ev_pipe[1]);
#if defined(NOSYSCALL) && !defined(NODIRREMOVE)
rmdir (pathname);
@@ -965,6 +980,28 @@
static void *
spe_thread (void *ptr)
{
+ /* If the SPU_INFO (or SPU_DEBUG_START) environment variable is set,
+ output a message to stderr telling the user how to attach a debugger
+ to the new SPE thread. */
+ if (__env_spu_debug_start || __env_spu_info)
+ {
+ int tid = syscall (__NR_gettid);
+ fprintf (stderr, "Starting SPE thread %p, to attach debugger use: spu-gdb -p %d\n",
+ ptr, tid);
+
+ /* In the case of SPU_DEBUG_START, actually wait until the user *has*
+ attached a debugger to this thread. This is done here by doing an
+ sigwait on the empty set, which will return with EINTR after the
+ debugger has attached. */
+ if (__env_spu_debug_start)
+ {
+ sigset_t set;
+ int sig;
+ sigemptyset (&set);
+ sigwait (&set, &sig);
+ }
+ }
+
return (void *) (unsigned long) do_spe_run (ptr);
}
@@ -1369,6 +1406,7 @@
for(i=0; i < group->numListSize ; i++)
{
spe_ids[i] = elem->thread;
+ elem=elem->next;
}
}
diff -u -rN --exclude=CVS libspe-1.0/spe.h libspe-1.0.1/spe.h
--- libspe-1.0/spe.h 2005-10-21 17:44:41.000000000 +0000
+++ libspe-1.0.1/spe.h 2005-11-23 20:04:14.000000000 +0000
@@ -24,6 +24,12 @@
struct thread_store
{
+ /* Note: The debugger accesses this data structure, and assumes it
+ starts out with an spe_program_handle_t identifying the SPE
+ executable running within this SPE thread. Everything below
+ is private to libspe. */
+ spe_program_handle_t handle;
+
pthread_t spe_thread;
pthread_cond_t event_deliver;
pthread_mutex_t event_lock;
diff -u -rN --exclude=CVS libspe-1.0/tests/Makefile libspe-1.0.1/tests/Makefile
--- libspe-1.0/tests/Makefile 2005-10-21 17:44:41.000000000 +0000
+++ libspe-1.0.1/tests/Makefile 2005-11-08 16:31:31.000000000 +0000
@@ -21,8 +21,10 @@
make -C start-stop
make -C dma
make -C event
+ make -C ft
clean:
make -C start-stop clean
make -C dma clean
make -C event clean
+ make -C ft clean
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/Makefile libspe-1.0.1/tests/ft/Makefile
--- libspe-1.0/tests/ft/Makefile 1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/Makefile 2005-11-10 16:06:51.000000000 +0000
@@ -0,0 +1,47 @@
+#*
+#* libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+#* Copyright (C) 2005 IBM Corp.
+#*
+#* This library is free software; you can redistribute it and/or modify it
+#* under the terms of the GNU Lesser General Public License as published by
+#* the Free Software Foundation; either version 2.1 of the License,
+#* or (at your option) any later version.
+#*
+#* This library is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+#* License for more details.
+#*
+#* You should have received a copy of the GNU Lesser General Public License
+#* along with this library; if not, write to the Free Software Foundation,
+#* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#*
+
+CC := gcc
+SPECC := spu-gcc
+CTAGS = ctags
+
+CFLAGS := -O2 -m32 -Wall -I../.. -I../../include -g
+SPECFLAGS := -O2 -Wall -I../../include
+
+LDFLAGS := -m32
+LIBS := -L../.. -lspe -lpthread
+
+SPE_OBJS := spe-test-pause spe-test-start-stop
+OBJS := ft
+
+all: $(OBJS) $(SPE_OBJS)
+
+clean:
+ rm -f $(OBJS) $(SPE_OBJS)
+
+ft: ft.c
+ $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) $(LIBS)
+
+spe-test-pause: spe-test-pause.c
+ $(SPECC) $(SPECFLAGS) -o $@ $<
+
+spe-test-start-stop: spe-test-start-stop.c
+ $(SPECC) $(SPECFLAGS) -o $@ $<
+
+
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/ft.c libspe-1.0.1/tests/ft/ft.c
--- libspe-1.0/tests/ft/ft.c 1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/ft.c 2005-11-10 16:06:51.000000000 +0000
@@ -0,0 +1,261 @@
+/*
+ * libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+ * Copyright (C) 2005 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License,
+ * or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <sched.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <libspe.h>
+
+int main(int argc, char *argv[])
+{
+ spe_program_handle_t *binary[16];
+ speid_t spe_thread[16];
+ spe_gid_t spe_group;
+ int result = 0;
+ int i, j, max_spe, threads, status, ret;
+
+ static int test_result __attribute__ ((aligned(128)));
+
+ /* Basic Test */
+
+ printf("\nStep 1: spe_create_group() ");
+
+ spe_group = spe_create_group(SCHED_OTHER, 0, 0);
+ if (!spe_group)
+ {
+ printf("error: create_group.\n");
+ result++;
+ }
+ printf(" OK.\n");
+ printf(" spe_group=%p.\n",spe_group);
+
+ printf("\nStep 2: spe_group_max() returns:");
+
+ max_spe = spe_group_max(spe_group);
+ printf("%i\n", max_spe);
+
+ printf("\nStep 3: spe_get_threads(spe_gid_t,NULL) returns:");
+ threads = spe_get_threads(spe_group,NULL);
+ printf("%i ", threads);
+ if(threads)
+ {
+ printf(" ERROR.\n");
+ result++;
+ }
+ else
+ printf(" OK.\n");
+
+ printf("\nStep 4a: spe_open_image(\"spe-test-pause\") ");
+ binary[0] = spe_open_image("spe-test-pause");
+ if (!binary[0])
+ {
+ printf(" ERROR.\n");
+ exit(2);
+ }
+ printf(" OK.\n");
+
+
+ printf("\nStep 4b: spe_open_image(\"spe-test-pause\") (again) ");
+ binary[1] = spe_open_image("spe-test-pause");
+ if (!binary[1])
+ {
+ printf(" ERROR.\n");
+ exit(2);
+ }
+ printf(" OK.\n");
+
+
+ printf("\nStep 5a: spe_create_thread() ");
+ spe_thread[0] = spe_create_thread(spe_group, binary[0], &test_result, NULL, 0, 0);
+ if (!spe_thread[0])
+ {
+ printf(" ERROR.\n");
+ exit(2);
+ }
+ else
+ {
+ printf("OK.\n");
+ printf(" Returned speid=%p\n",spe_thread[0]);
+ }
+
+ usleep(500000);
+
+ printf("\nStep 5b: spe_create_thread() (again) ");
+ spe_thread[1] = spe_create_thread(spe_group, binary[1], &test_result, NULL, 0, 0);
+ if (!spe_thread[1])
+ {
+ printf(" ERROR.\n");
+ exit(2);
+ }
+ else
+ {
+ printf("OK.\n");
+ printf(" Returned speid=%p\n",spe_thread[1]);
+ }
+
+ printf("\nStep 6: spe_get_threads(spe_gid_t,NULL) returns:");
+ threads = spe_get_threads(spe_group,NULL);
+ printf("%i ", threads);
+ if (threads != 2)
+ {
+ printf(" ERROR.\n");
+ result++;
+ }
+ else
+ {
+ speid_t speids[16];
+ int i;
+
+ printf(" OK.\n");
+
+ threads=spe_get_threads(spe_group,speids);
+ for (i=0 ; i<threads ; i++)
+ {
+ printf(" Thread[%i] = %p\n",i,speids[i]);
+ }
+
+ }
+
+ printf("\nStep 7a: spe_wait() ");
+ ret = spe_wait(spe_thread[0], &status, 0);
+ if(!ret && status== 0)
+ {
+ speid_t speids[16];
+ int i;
+
+ printf("OK.\n");
+ printf(" Thread returned status=%i\n",status);
+ printf(" Remaining threads:\n");
+
+ threads=spe_get_threads(spe_group,speids);
+ for (i=0 ; i<threads ; i++)
+ {
+ printf(" Thread[%i] = %p\n",i,speids[i]);
+ }
+
+ }
+ else
+ {
+ printf("ERROR.\n");
+ result++;
+
+ }
+
+ printf("\nStep 7b: spe_wait() ");
+ ret = spe_wait(spe_thread[1], &status, 0);
+ if(!ret && status== 0)
+ {
+ speid_t speids[16];
+ int i;
+
+ printf("OK.\n");
+ printf(" Thread returned status=%i\n",status);
+ printf(" Remaining threads:\n");
+
+ threads=spe_get_threads(spe_group,speids);
+ for (i=0 ; i<threads ; i++)
+ {
+ printf(" Thread[%i] = %p\n",i,speids[i]);
+ }
+
+ }
+ else
+ {
+ printf("ERROR.\n");
+ result++;
+
+ }
+
+ printf("\nStep 8: spe_get_threads(spe_gid_t,NULL) returns:");
+ threads = spe_get_threads(spe_group,NULL);
+ printf("%i ", threads);
+ if(threads)
+ {
+ printf(" ERROR.\n");
+ result++;
+ }
+ else
+ printf(" OK.\n");
+
+ spe_close_image(binary[0]);
+ spe_close_image(binary[1]);
+
+ printf("\nStep 9: Load tests\n");
+
+ printf(" a.) lots of threads seqentially.");
+
+ binary[0] = spe_open_image("spe-test-start-stop");
+
+ for (i=0; i< 1024; i++)
+ {
+ spe_thread[0] = spe_create_thread(spe_group, binary[1],
+ &test_result, NULL, 0, 0);
+
+ if (!spe_thread[0])
+ {
+ printf("\n failed to create load thread %i.",i);
+ result++;
+ break;
+ }
+ spe_wait(spe_thread[0], &status, 0);
+ }
+ if (i==1024)
+ printf(" OK.\n");
+
+ printf(" b.) lots of threads seqentially and parallel in groups.");
+
+ binary[0] = spe_open_image("spe-test-start-stop");
+
+ for (i=0; i< 1024; i++)
+ {
+ for (j=0; j< 8; j++)
+ {
+ spe_thread[j] = spe_create_thread(spe_group, binary[1],
+ &test_result, NULL, 0, 0);
+
+ if (!spe_thread[j])
+ {
+ printf("\n failed to create load thread %i,%i.",i,j);
+ result++;
+ break;
+ }
+ }
+ for (j=0; j< 8; j++)
+ {
+ spe_wait(spe_thread[j], &status, 0);
+ }
+ }
+ if (i==1024)
+ printf(" OK.\n");
+
+ printf("\n\n\nTEST RESULT:.\n");
+ printf("-------------\n");
+ if (!result)
+ {
+ printf("All tests completed ok.\n");
+ }
+ else
+ {
+ printf("Errors were encountered - check your installation.\n");
+ }
+
+ return 0;
+}
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/spe-test-dma-write.c libspe-1.0.1/tests/ft/spe-test-dma-write.c
--- libspe-1.0/tests/ft/spe-test-dma-write.c 1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/spe-test-dma-write.c 2005-11-08 13:22:06.000000000 +0000
@@ -0,0 +1,24 @@
+#include "spu_intrinsics.h"
+
+typedef union {
+ unsigned long long ull;
+ unsigned int vp[2];
+} addr64;
+
+int result __attribute__ ((aligned (128)));
+
+int main ( int spuid, addr64 argp, addr64 envp)
+{
+ unsigned long long argAddress = argp.ull;
+
+ /* Write to specified address */
+ result = 42;
+
+ spu_mfcdma32 (&result, argAddress, 4, 0, (((0) << 24) | ((0) << 16) | (0x20)
+ ));
+ __builtin_si_wrch((22),__builtin_si_from_uint(1));
+ spu_mfcstat(0x2);
+
+ /* Done */
+ return 0;
+}
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/spe-test-event.c libspe-1.0.1/tests/ft/spe-test-event.c
--- libspe-1.0/tests/ft/spe-test-event.c 1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/spe-test-event.c 2005-11-08 13:22:06.000000000 +0000
@@ -0,0 +1,60 @@
+/*
+ * libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+ * Copyright (C) 2005 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License,
+ * or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <spu_intrinsics.h>
+
+int main(void)
+{
+ int i,j,a[128];
+
+ for(i=0; i< 1500000 ; i++)
+ {
+ for(j=0; j< 128; j++)
+ {
+ a[j] += i;
+ }
+
+ }
+
+ si_stop(0x1199);
+
+ for(i=0; i< 1500000 ; i++)
+ {
+ for(j=0; j< 128; j++)
+ {
+ a[j] += i;
+ }
+
+ }
+
+// spu_writech(mfc_wr_intr_mailbox, 0xaabd);
+ spu_writech(SPU_WrOutIntrMbox, 0xaabd);
+
+ for(i=0; i< 1500000 ; i++)
+ {
+ for(j=0; j< 128; j++)
+ {
+ a[j] += i;
+ }
+
+ }
+ si_stop(0x119A);
+
+ return 0;
+}
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/spe-test-pause.c libspe-1.0.1/tests/ft/spe-test-pause.c
--- libspe-1.0/tests/ft/spe-test-pause.c 1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/spe-test-pause.c 2005-11-08 13:22:06.000000000 +0000
@@ -0,0 +1,36 @@
+/*
+ * libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+ * Copyright (C) 2005 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License,
+ * or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <spu_intrinsics.h>
+
+int main(void)
+{
+ int i,j,a[128];
+
+ for(i=0; i< 1500000 ; i++)
+ {
+ for(j=0; j< 128; j++)
+ {
+ a[j] += i;
+ }
+
+ }
+
+ return 0;
+}
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/spe-test-start-stop.c libspe-1.0.1/tests/ft/spe-test-start-stop.c
--- libspe-1.0/tests/ft/spe-test-start-stop.c 1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/spe-test-start-stop.c 2005-11-10 16:06:51.000000000 +0000
@@ -0,0 +1,25 @@
+/*
+ * libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+ * Copyright (C) 2005 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License,
+ * or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <spu_intrinsics.h>
+
+int main(void)
+{
+ return 0;
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: libspe-1.0.1.tar.gz
Type: application/x-tgz
Size: 35886 bytes
Desc: not available
Url : http://ozlabs.org/pipermail/linuxppc64-dev/attachments/20051125/6678f511/attachment.bin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://ozlabs.org/pipermail/linuxppc64-dev/attachments/20051125/6678f511/attachment.pgp
More information about the Linuxppc64-dev
mailing list